diff --git a/dist/tangram.debug.js b/dist/tangram.debug.js index d7bc6747c..2d5a1baef 100644 --- a/dist/tangram.debug.js +++ b/dist/tangram.debug.js @@ -580,7 +580,7 @@ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.d },{"../core-js/symbol":19,"../core-js/symbol/iterator":20}],30:[function(_dereq_,module,exports){ module.exports = _dereq_("regenerator-runtime"); -},{"regenerator-runtime":279}],31:[function(_dereq_,module,exports){ +},{"regenerator-runtime":280}],31:[function(_dereq_,module,exports){ 'use strict' exports.toByteArray = toByteArray @@ -1026,7 +1026,7 @@ function boxIntersectWrapper(arg0, arg1, arg2) { throw new Error('box-intersect: Invalid arguments') } } -},{"./lib/intersect":35,"./lib/sweep":39,"typedarray-pool":284}],34:[function(_dereq_,module,exports){ +},{"./lib/intersect":35,"./lib/sweep":39,"typedarray-pool":285}],34:[function(_dereq_,module,exports){ 'use strict' var DIMENSION = 'd' @@ -1666,7 +1666,7 @@ function boxIntersectIter( } } } -},{"./brute":34,"./median":36,"./partition":37,"./sweep":39,"bit-twiddle":32,"typedarray-pool":284}],36:[function(_dereq_,module,exports){ +},{"./brute":34,"./median":36,"./partition":37,"./sweep":39,"bit-twiddle":32,"typedarray-pool":285}],36:[function(_dereq_,module,exports){ 'use strict' module.exports = findMedian @@ -2502,7 +2502,7 @@ red_loop: } } } -},{"./sort":38,"bit-twiddle":32,"typedarray-pool":284}],40:[function(_dereq_,module,exports){ +},{"./sort":38,"bit-twiddle":32,"typedarray-pool":285}],40:[function(_dereq_,module,exports){ },{}],41:[function(_dereq_,module,exports){ (function (global){ @@ -2673,6 +2673,8 @@ if (Buffer.TYPED_ARRAY_SUPPORT) { 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') } } @@ -2749,7 +2751,7 @@ function fromString (that, string, encoding) { } function fromArrayLike (that, array) { - var length = checked(array.length) | 0 + 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 @@ -2818,7 +2820,7 @@ function fromObject (that, obj) { } function checked (length) { - // Note: cannot use `length < kMaxLength` here because that fails when + // 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 ' + @@ -12558,7 +12560,7 @@ exports.uncompressWorker = function () { return new FlateWorker("Inflate", {}); }; -},{"./stream/GenericWorker":243,"./utils":247,"pako":252}],226:[function(_dereq_,module,exports){ +},{"./stream/GenericWorker":243,"./utils":247,"pako":259}],226:[function(_dereq_,module,exports){ 'use strict'; /** @@ -12812,7 +12814,7 @@ NodejsStreamOutputAdapter.prototype._read = function() { module.exports = NodejsStreamOutputAdapter; -},{"readable-stream":278,"util":287}],230:[function(_dereq_,module,exports){ +},{"readable-stream":257,"util":289}],230:[function(_dereq_,module,exports){ (function (Buffer){ 'use strict'; @@ -15688,9386 +15690,9408 @@ for(var i = 0; i < removedMethods.length; i++) { module.exports = ZipObject; },{"./compressedObject":220,"./stream/DataWorker":242,"./stream/GenericWorker":243,"./stream/StreamHelper":244,"./utf8":246}],251:[function(_dereq_,module,exports){ +arguments[4][189][0].apply(exports,arguments) +},{"dup":189}],252:[function(_dereq_,module,exports){ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + 'use strict'; -function notNull(x) { return x != null; } -function wrap(x) { return '(' + x + ')';} +/**/ -function maybeQuote(value) { - if (typeof value === 'string') { - return '"' + value + '"'; - } - return value; -} +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ -function lookUp(key) { - if (key[0] === '$') { - return 'context.' + key.substring(1); - } - return 'context.feature.properties.' + key; -} +module.exports = Duplex; -function nullValue(key, value) { - return ' true '; -} +/**/ +var processNextTick = _dereq_('process-nextick-args'); +/**/ -function propertyEqual(key, value) { - return wrap(maybeQuote(value) + ' === ' + lookUp(key)); -} +/**/ +var util = _dereq_('core-util-is'); +util.inherits = _dereq_('inherits'); +/**/ -function propertyOr(key, values) { - return wrap(values.map(function (x) { return propertyEqual(key, x); }).join(' || ')); -} +var Readable = _dereq_('./_stream_readable'); +var Writable = _dereq_('./_stream_writable'); -function printNested(values, joiner) { - return wrap(values.filter(notNull).map(function (x) { - return wrap(x.join(' && ')); - }).join(' ' + joiner + ' ')); -} +util.inherits(Duplex, Readable); -function any(_, values, options) { - return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '||') : 'true'; +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } -function all(_, values, options) { - return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '&&') : 'true'; -} +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); -function not(key, value, options) { - return '!' + wrap(parseFilter(value, options).join(' && ')); -} + Readable.call(this, options); + Writable.call(this, options); -function none(key, values, options) { - return '!' + wrap(any(null, values, options)); -} + if (options && options.readable === false) this.readable = false; -function propertyMatchesBoolean(key, value) { - return wrap(lookUp(key) + (value ? ' != ' : ' == ') + 'null'); + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); } -function rangeMatch(key, values, options) { - var expressions = []; - var transform = options && (typeof options.rangeTransform === 'function') && options.rangeTransform; +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; - if (values.max) { - var max = transform ? transform(values.max) : values.max; - expressions.push('' + lookUp(key) + ' < ' + max); - } + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} - if (values.min) { - var min = transform ? min = transform(values.min) : values.min; - expressions.push('' + lookUp(key) + ' >= ' + min); - } +function onEndNT(self) { + self.end(); +} - return wrap(expressions.join(' && ')); +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } } +},{"./_stream_readable":254,"./_stream_writable":256,"core-util-is":164,"inherits":187,"process-nextick-args":278}],253:[function(_dereq_,module,exports){ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. -function parseFilter(filter, options) { - var filterAST = []; +'use strict'; - // Function filter - if (typeof filter === 'function') { - return [wrap(filter.toString() + '(context)')]; - } - // Array filter, implicit 'any' - else if (Array.isArray(filter)) { - return [any(null, filter, options)]; - } - // Null filter object - else if (filter == null) { - return ['true']; - } +module.exports = PassThrough; - // Object filter, e.g. implicit 'all' - var keys = Object.keys(filter); - for (var k=0; k < keys.length; k++) { - var key = keys[k]; +var Transform = _dereq_('./_stream_transform'); - var value = filter[key], - type = typeof value; - if (type === 'string' || type === 'number') { - filterAST.push(propertyEqual(key, value)); - } else if (type === 'boolean') { - filterAST.push(propertyMatchesBoolean(key, value)); - } else if (key === 'not') { - filterAST.push(not(key, value, options)); - } else if (key === 'any') { - filterAST.push(any(key, value, options)); - } else if (key === 'all') { - filterAST.push(all(key, value, options)); - } else if (key === 'none') { - filterAST.push(none(key, value, options)); - } else if (Array.isArray(value)) { - filterAST.push(propertyOr(key, value)); - } else if (type === 'object' && value != null) { - if (value.max || value.min) { - filterAST.push(rangeMatch(key, value, options)); - } - } else if (value == null) { - filterAST.push(nullValue(key, value)); - } else { - throw new Error('Unknown Query sytnax: ' + value); - } - } +/**/ +var util = _dereq_('core-util-is'); +util.inherits = _dereq_('inherits'); +/**/ - return keys.length === 0 ? ['true'] : filterAST; -} +util.inherits(PassThrough, Transform); -function filterToString(filterAST) { - return wrap(filterAST.join(' && ')); -} +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); -function match(filter, options) { - if (filter == null) { return function () { return true; }; } - // jshint evil: true - return new Function('context', 'return ' + filterToString(parseFilter(filter, options)) + ';'); + Transform.call(this, options); } -module.exports = { - match: match, - filterToString: filterToString, - parseFilter: parseFilter +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); }; - -},{}],252:[function(_dereq_,module,exports){ -// Top level file is just a mixin of submodules & constants +},{"./_stream_transform":255,"core-util-is":164,"inherits":187}],254:[function(_dereq_,module,exports){ +(function (process){ 'use strict'; -var assign = _dereq_('./lib/utils/common').assign; - -var deflate = _dereq_('./lib/deflate'); -var inflate = _dereq_('./lib/inflate'); -var constants = _dereq_('./lib/zlib/constants'); +module.exports = Readable; -var pako = {}; +/**/ +var processNextTick = _dereq_('process-nextick-args'); +/**/ -assign(pako, deflate, inflate, constants); +/**/ +var isArray = _dereq_('isarray'); +/**/ -module.exports = pako; +/**/ +var Buffer = _dereq_('buffer').Buffer; +/**/ -},{"./lib/deflate":253,"./lib/inflate":254,"./lib/utils/common":255,"./lib/zlib/constants":258}],253:[function(_dereq_,module,exports){ -'use strict'; +Readable.ReadableState = ReadableState; +var EE = _dereq_('events'); -var zlib_deflate = _dereq_('./zlib/deflate'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var msg = _dereq_('./zlib/messages'); -var ZStream = _dereq_('./zlib/zstream'); +/**/ +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ -var toString = Object.prototype.toString; +/**/ +var Stream; +(function () { + try { + Stream = _dereq_('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = _dereq_('events').EventEmitter; + } +})(); +/**/ -/* Public constants ==========================================================*/ -/* ===========================================================================*/ +var Buffer = _dereq_('buffer').Buffer; -var Z_NO_FLUSH = 0; -var Z_FINISH = 4; +/**/ +var util = _dereq_('core-util-is'); +util.inherits = _dereq_('inherits'); +/**/ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_SYNC_FLUSH = 2; +/**/ +var debugUtil = _dereq_('util'); +var debug = undefined; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ -var Z_DEFAULT_COMPRESSION = -1; +var StringDecoder; -var Z_DEFAULT_STRATEGY = 0; +util.inherits(Readable, Stream); -var Z_DEFLATED = 8; +var Duplex; +function ReadableState(options, stream) { + Duplex = Duplex || _dereq_('./_stream_duplex'); -/* ===========================================================================*/ + options = options || {}; + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; -/** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; -/* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overriden. - **/ + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; -/** - * Deflate.result -> Uint8Array|Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you - * push a chunk with explicit flush (call [[Deflate#push]] with - * `Z_SYNC_FLUSH` param). - **/ + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; -/** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; -/** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; -/** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `to` (String) - if equal to 'string', then result will be "binary string" - * (each char code [0..255]) - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * var deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ -function Deflate(options) { - if (!(this instanceof Deflate)) return new Deflate(options); + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; - this.options = utils.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY, - to: '' - }, options || {}); + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; - var opt = this.options; + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } + // if true, a maybeReadMore has been scheduled + this.readingMore = false; - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = _dereq_('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; } +} - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data +var Duplex; +function Readable(options) { + Duplex = Duplex || _dereq_('./_stream_duplex'); - this.strm = new ZStream(); - this.strm.avail_out = 0; + if (!(this instanceof Readable)) return new Readable(options); - var status = zlib_deflate.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); + this._readableState = new ReadableState(options, this); - if (status !== Z_OK) { - throw new Error(msg[status]); - } + // legacy + this.readable = true; - if (opt.header) { - zlib_deflate.deflateSetHeader(this.strm, opt.header); - } + if (options && typeof options.read === 'function') this._read = options.read; - if (opt.dictionary) { - var dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } + Stream.call(this); +} - status = zlib_deflate.deflateSetDictionary(this.strm, dict); +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; - if (status !== Z_OK) { - throw new Error(msg[status]); + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; } - - this._dict_set = true; } -} -/** - * Deflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That will flush internal pending buffers and call - * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you - * can use mode Z_SYNC_FLUSH, keeping the compression context. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * We strongly recommend to use `Uint8Array` on input for best speed (output - * array format is detected automatically). Also, don't skip last param and always - * use the same type in your code (boolean or number). That will improve JS speed. - * - * For regular `Array`-s make sure all elements are [0..255]. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Deflate.prototype.push = function (data, mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var status, _mode; + return readableAddChunk(this, state, chunk, encoding, false); +}; - if (this.ended) { return false; } +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; - _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH); +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } - strm.next_in = 0; - strm.avail_in = strm.input.length; + if (!addToFront) state.reading = false; - do { - if (strm.avail_out === 0) { - strm.output = new utils.Buf8(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - if (status !== Z_STREAM_END && status !== Z_OK) { - this.onEnd(status); - this.ended = true; - return false; - } - if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) { - if (this.options.to === 'string') { - this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); - } else { - this.onData(utils.shrinkBuf(strm.output, strm.next_out)); + if (state.needReadable) emitReadable(stream); + } } - } - } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); - - // Finalize on the last chunk. - if (_mode === Z_FINISH) { - status = zlib_deflate.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK; - } - // callback interim results if Z_SYNC_FLUSH. - if (_mode === Z_SYNC_FLUSH) { - this.onEnd(Z_OK); - strm.avail_out = 0; - return true; + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; } - return true; -}; + return needMoreData(state); +} +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} -/** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array|Array|String): ouput data. Type of array depends - * on js engine support. When string output requested, each chunk - * will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Deflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = _dereq_('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; }; - -/** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) - * or if an error happened. By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Deflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = utils.flattenChunks(this.chunks); - } +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; + return n; +} +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) return 0; -/** - * deflate(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be "binary string" - * (each char code [0..255]) - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ -function deflate(input, options) { - var deflator = new Deflate(options); + if (state.objectMode) return n === 0 ? 0 : 1; - deflator.push(input, true); + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; + } - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg; } + if (n <= 0) return 0; - return deflator.result; -} + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else { + return state.length; + } + } -/** - * deflateRaw(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function deflateRaw(input, options) { - options = options || {}; - options.raw = true; - return deflate(input, options); + return n; } +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; -/** - * gzip(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ -function gzip(input, options) { - options = options || {}; - options.gzip = true; - return deflate(input, options); -} + if (typeof n !== 'number' || n > 0) state.emittedReadable = false; + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } -exports.Deflate = Deflate; -exports.deflate = deflate; -exports.deflateRaw = deflateRaw; -exports.gzip = gzip; + n = howMuchToRead(n, state); -},{"./utils/common":255,"./utils/strings":256,"./zlib/deflate":260,"./zlib/messages":265,"./zlib/zstream":267}],254:[function(_dereq_,module,exports){ -'use strict'; + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. -var zlib_inflate = _dereq_('./zlib/inflate'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var c = _dereq_('./zlib/constants'); -var msg = _dereq_('./zlib/messages'); -var ZStream = _dereq_('./zlib/zstream'); -var GZheader = _dereq_('./zlib/gzheader'); + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); -var toString = Object.prototype.toString; + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } -/** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } -/* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overriden. - **/ + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } -/** - * Inflate.result -> Uint8Array|Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you - * push a chunk with explicit flush (call [[Inflate#push]] with - * `Z_SYNC_FLUSH` param). - **/ + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) n = howMuchToRead(nOrig, state); -/** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; -/** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ + if (ret === null) { + state.needReadable = true; + n = 0; + } + state.length -= n; -/** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * var inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ -function Inflate(options) { - if (!(this instanceof Inflate)) return new Inflate(options); + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) state.needReadable = true; - this.options = utils.assign({ - chunkSize: 16384, - windowBits: 0, - to: '' - }, options || {}); + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) endReadable(this); - var opt = this.options; + if (ret !== null) this.emit('data', ret); - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } + return ret; +}; - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); } + return er; +} - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; } } + state.ended = true; - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} - this.strm = new ZStream(); - this.strm.avail_out = 0; +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } +} - var status = zlib_inflate.inflateInit2( - this.strm, - opt.windowBits - ); +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} - if (status !== c.Z_OK) { - throw new Error(msg[status]); +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); } +} - this.header = new GZheader(); - - zlib_inflate.inflateGetHeader(this.strm, this.header); +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; } -/** - * Inflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|ArrayBuffer|String): input data - * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That will flush internal pending buffers and call - * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you - * can use mode Z_SYNC_FLUSH, keeping the decompression context. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * We strongly recommend to use `Uint8Array` on input for best speed (output - * format is detected automatically). Also, don't skip last param and always - * use the same type in your code (boolean or number). That will improve JS speed. - * - * For regular `Array`-s make sure all elements are [0..255]. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Inflate.prototype.push = function (data, mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var dictionary = this.options.dictionary; - var status, _mode; - var next_out_utf8, tail, utf8str; - var dict; - - // Flag to properly process Z_BUF_ERROR on testing inflate call - // when we check that all output data was flushed. - var allowBufError = false; +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; - if (this.ended) { return false; } - _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; - // Convert data if needed - if (typeof data === 'string') { - // Only binary strings can be decompressed on practice - strm.input = strings.binstring2buf(data); - } else if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - strm.next_in = 0; - strm.avail_in = strm.input.length; - - do { - if (strm.avail_out === 0) { - strm.output = new utils.Buf8(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ - - if (status === c.Z_NEED_DICT && dictionary) { - // Convert data if needed - if (typeof dictionary === 'string') { - dict = strings.string2buf(dictionary); - } else if (toString.call(dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(dictionary); - } else { - dict = dictionary; - } - - status = zlib_inflate.inflateSetDictionary(this.strm, dict); - - } + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - if (status === c.Z_BUF_ERROR && allowBufError === true) { - status = c.Z_OK; - allowBufError = false; - } + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); - if (status !== c.Z_STREAM_END && status !== c.Z_OK) { - this.onEnd(status); - this.ended = true; - return false; + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); } + } - if (strm.next_out) { - if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) { - - if (this.options.to === 'string') { + function onend() { + debug('onend'); + dest.end(); + } - next_out_utf8 = strings.utf8border(strm.output, strm.next_out); + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); - tail = strm.next_out - next_out_utf8; - utf8str = strings.buf2string(strm.output, next_out_utf8); + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); - // move tail - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } + cleanedUp = true; - this.onData(utf8str); + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } - } else { - this.onData(utils.shrinkBuf(strm.output, strm.next_out)); - } + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; } + src.pause(); } + } - // When no more input data, we should check that internal inflate buffers - // are flushed. The only way to do it when avail_out = 0 - run one more - // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. - // Here we set flag to process this error properly. - // - // NOTE. Deflate does not return error in this case and does not needs such - // logic. - if (strm.avail_in === 0 && strm.avail_out === 0) { - allowBufError = true; - } - - } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END); - - if (status === c.Z_STREAM_END) { - _mode = c.Z_FINISH; + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; - // Finalize on the last chunk. - if (_mode === c.Z_FINISH) { - status = zlib_inflate.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === c.Z_OK; + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); } + dest.once('finish', onfinish); - // callback interim results if Z_SYNC_FLUSH. - if (_mode === c.Z_SYNC_FLUSH) { - this.onEnd(c.Z_OK); - strm.avail_out = 0; - return true; + function unpipe() { + debug('unpipe'); + src.unpipe(dest); } - return true; -}; + // tell the dest that it's being piped to + dest.emit('pipe', src); + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } -/** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|Array|String): ouput data. Type of array depends - * on js engine support. When string output requested, each chunk - * will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Inflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); + return dest; }; - -/** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) - * or if an error happened. By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Inflate.prototype.onEnd = function (status) { - // On success - join - if (status === c.Z_OK) { - if (this.options.to === 'string') { - // Glue & convert here, until we teach pako to send - // utf8 alligned strings to onData - this.result = this.chunks.join(''); - } else { - this.result = utils.flattenChunks(this.chunks); +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * inflate(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) - * , output; - * - * try { - * output = pako.inflate(input); - * } catch (err) - * console.log(err); - * } - * ``` - **/ -function inflate(input, options) { - var inflator = new Inflate(options); - - inflator.push(input, true); + }; +} - // That will never happens, if you don't cheat with options :) - if (inflator.err) { throw inflator.msg; } +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; - return inflator.result; -} + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; -/** - * inflateRaw(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function inflateRaw(input, options) { - options = options || {}; - options.raw = true; - return inflate(input, options); -} + if (!dest) dest = state.pipes; + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } -/** - * ungzip(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ + // slow case. multiple pipe destinations. + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; -exports.Inflate = Inflate; -exports.inflate = inflate; -exports.inflateRaw = inflateRaw; -exports.ungzip = inflate; + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } -},{"./utils/common":255,"./utils/strings":256,"./zlib/constants":258,"./zlib/gzheader":261,"./zlib/inflate":263,"./zlib/messages":265,"./zlib/zstream":267}],255:[function(_dereq_,module,exports){ -'use strict'; + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; -var TYPED_OK = (typeof Uint8Array !== 'undefined') && - (typeof Uint16Array !== 'undefined') && - (typeof Int32Array !== 'undefined'); + dest.emit('unpipe', this); + return this; +}; -exports.assign = function (obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { continue; } +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); + } - for (var p in source) { - if (source.hasOwnProperty(p)) { - obj[p] = source[p]; + if (ev === 'readable' && !this._readableState.endEmitted) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); } } } - return obj; + return res; }; +Readable.prototype.addListener = Readable.prototype.on; +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} -// reduce buffer size, avoiding mem copy -exports.shrinkBuf = function (buf, size) { - if (buf.length === size) { return buf; } - if (buf.subarray) { return buf.subarray(0, size); } - buf.length = size; - return buf; +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; }; +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} -var fnTyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs + len), dest_offs); - return; - } - // Fallback to ordinary array - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - var i, l, len, pos, chunk, result; - - // calculate data length - len = 0; - for (i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } - // join chunks - result = new Uint8Array(len); - pos = 0; - for (i = 0, l = chunks.length; i < l; i++) { - chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} - return result; +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); } + return this; }; -var fnUntyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - return [].concat.apply([], chunks); +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); } -}; +} +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; -// Enable/Disable typed arrays use, for testing -// -exports.setTyped = function (on) { - if (on) { - exports.Buf8 = Uint8Array; - exports.Buf16 = Uint16Array; - exports.Buf32 = Int32Array; - exports.assign(exports, fnTyped); - } else { - exports.Buf8 = Array; - exports.Buf16 = Array; - exports.Buf32 = Array; - exports.assign(exports, fnUntyped); - } -}; - -exports.setTyped(TYPED_OK); - -},{}],256:[function(_dereq_,module,exports){ -// String encode/decode helpers -'use strict'; - - -var utils = _dereq_('./common'); - - -// Quick check if we can use fast array to bin string conversion -// -// - apply(Array) can fail on Android 2.2 -// - apply(Uint8Array) can fail on iOS 5.1 Safary -// -var STR_APPLY_OK = true; -var STR_APPLY_UIA_OK = true; - -try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; } -try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } -// Table with utf8 lengths (calculated by first byte of sequence) -// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, -// because max possible codepoint is 0x10ffff -var _utf8len = new utils.Buf8(256); -for (var q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); -} -_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start + self.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); -// convert string to array (typed, when possible) -exports.string2buf = function (str) { - var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new utils.Buf8(buf_len); + }); - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); } } - return buf; -}; + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); -// Helper (used in 2 places) -function buf2binstring(buf, len) { - // use fallback for big arrays to avoid stack overflow - if (len < 65537) { - if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { - return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)); + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); } - } - - var result = ''; - for (var i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; -} - - -// Convert byte array to binary string -exports.buf2binstring = function (buf) { - return buf2binstring(buf, buf.length); -}; - + }; -// Convert binary string (typed, when possible) -exports.binstring2buf = function (str) { - var buf = new utils.Buf8(str.length); - for (var i = 0, len = buf.length; i < len; i++) { - buf[i] = str.charCodeAt(i); - } - return buf; + return self; }; +// exposed for testing purposes only. +Readable._fromList = fromList; -// convert array to string -exports.buf2string = function (buf, max) { - var i, out, c, c_len; - var len = max || buf.length; +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len * 2); + // nothing in the list, definitely empty. + if (list.length === 0) return null; - for (out = 0, i = 0; i < len;) { - c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } + if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) ret = '';else ret = new Buffer(n); - c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } + if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); + c += cpy; + } } } - return buf2binstring(utf16buf, out); -}; + return ret; +} +function endReadable(stream) { + var state = stream._readableState; -// Calculate max possible position in utf8 buffer, -// that will not break sequence. If that's not possible -// - (very small limits) return max size as is. -// -// buf[] - utf8 bytes array -// max - length limit (mandatory); -exports.utf8border = function (buf, max) { - var pos; + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('endReadable called on non-empty stream'); - max = max || buf.length; - if (max > buf.length) { max = buf.length; } + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); + } +} - // go back from last position, until start of sequence found - pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} - // Fuckup - very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} - // If we came to start of buffer - that means vuffer is too small, - // return max too. - if (pos === 0) { return max; } +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,_dereq_('_process')) - return (pos + _utf8len[buf[pos]] > max) ? pos : max; -}; +},{"./_stream_duplex":252,"_process":279,"buffer":41,"core-util-is":164,"events":168,"inherits":187,"isarray":251,"process-nextick-args":278,"string_decoder/":282,"util":40}],255:[function(_dereq_,module,exports){ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. -},{"./common":255}],257:[function(_dereq_,module,exports){ 'use strict'; -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It doesn't worth to make additional optimizationa as in original. -// Small size is preferable. +module.exports = Transform; -function adler32(adler, buf, len, pos) { - var s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; +var Duplex = _dereq_('./_stream_duplex'); - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; +/**/ +var util = _dereq_('core-util-is'); +util.inherits = _dereq_('inherits'); +/**/ - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); +util.inherits(Transform, Duplex); - s1 %= 65521; - s2 %= 65521; - } +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; - return (s1 | (s2 << 16)) |0; + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; } +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; -module.exports = adler32; - -},{}],258:[function(_dereq_,module,exports){ -'use strict'; - + var cb = ts.writecb; -module.exports = { + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, + ts.writechunk = null; + ts.writecb = null; - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - //Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, + if (data !== null && data !== undefined) stream.push(data); - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, + cb(er); + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, + Duplex.call(this, options); - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; + this._transformState = new TransformState(this); -},{}],259:[function(_dereq_,module,exports){ -'use strict'; + // when the writable side finishes, then flush out anything remaining. + var stream = this; -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; -// Use ordinary array, since untyped makes no boost here -function makeTable() { - var c, table = []; + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; + if (typeof options.flush === 'function') this._flush = options.flush; } - return table; + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); } -// Create table on load. Just 255 signed longs. Not a problem. -var crcTable = makeTable(); +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('not implemented'); +}; -function crc32(crc, buf, len, pos) { - var t = crcTable, - end = pos + len; +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; - crc ^= -1; +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; - for (var i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; } +}; - return (crc ^ (-1)); // >>> 0; -} +function done(stream, er) { + if (er) return stream.emit('error', er); + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; -module.exports = crc32; + if (ws.length) throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} +},{"./_stream_duplex":252,"core-util-is":164,"inherits":187}],256:[function(_dereq_,module,exports){ +(function (process){ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. -},{}],260:[function(_dereq_,module,exports){ 'use strict'; -var utils = _dereq_('../utils/common'); -var trees = _dereq_('./trees'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var msg = _dereq_('./messages'); +module.exports = Writable; -/* Public constants ==========================================================*/ -/* ===========================================================================*/ +/**/ +var processNextTick = _dereq_('process-nextick-args'); +/**/ +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ -/* Allowed flush values; see deflate() and inflate() below for details */ -var Z_NO_FLUSH = 0; -var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -//var Z_TREES = 6; +/**/ +var Buffer = _dereq_('buffer').Buffer; +/**/ +Writable.WritableState = WritableState; -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -//var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -//var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; +/**/ +var util = _dereq_('core-util-is'); +util.inherits = _dereq_('inherits'); +/**/ +/**/ +var internalUtil = { + deprecate: _dereq_('util-deprecate') +}; +/**/ -/* compression levels */ -//var Z_NO_COMPRESSION = 0; -//var Z_BEST_SPEED = 1; -//var Z_BEST_COMPRESSION = 9; -var Z_DEFAULT_COMPRESSION = -1; +/**/ +var Stream; +(function () { + try { + Stream = _dereq_('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = _dereq_('events').EventEmitter; + } +})(); +/**/ +var Buffer = _dereq_('buffer').Buffer; -var Z_FILTERED = 1; -var Z_HUFFMAN_ONLY = 2; -var Z_RLE = 3; -var Z_FIXED = 4; -var Z_DEFAULT_STRATEGY = 0; +util.inherits(Writable, Stream); -/* Possible values of the data_type field (though see inflate()) */ -//var Z_BINARY = 0; -//var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; +function nop() {} +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} -/* The deflate compression method */ -var Z_DEFLATED = 8; +var Duplex; +function WritableState(options, stream) { + Duplex = Duplex || _dereq_('./_stream_duplex'); -/*============================================================================*/ + options = options || {}; + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; -var MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_MEM_LEVEL = 8; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -var LITERALS = 256; -/* number of literal bytes 0..255 */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -var D_CODES = 30; -/* number of distance codes */ -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; -var MIN_MATCH = 3; -var MAX_MATCH = 258; -var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; -var PRESET_DICT = 0x20; + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; -var INIT_STATE = 42; -var EXTRA_STATE = 69; -var NAME_STATE = 73; -var COMMENT_STATE = 91; -var HCRC_STATE = 103; -var BUSY_STATE = 113; -var FINISH_STATE = 666; + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; -var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -var BS_BLOCK_DONE = 2; /* block flush performed */ -var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; -var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + // a flag to see when we're in the middle of a write. + this.writing = false; -function err(strm, errorCode) { - strm.msg = msg[errorCode]; - return errorCode; -} + // when true all writes will be buffered until .uncork() call + this.corked = 0; -function rank(f) { - return ((f) << 1) - ((f) > 4 ? 9 : 0); -} + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->output buffer and copying into it. - * (See also read_buf()). - */ -function flush_pending(strm) { - var s = strm.state; + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } + // the amount that is being written when _write is called. + this.writelen = 0; - utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -} + this.bufferedRequest = null; + this.lastBufferedRequest = null; + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; -function flush_block_only(s, last) { - trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -} + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + // count buffered requests + this.bufferedRequestCount = 0; -function put_byte(s, b) { - s.pending_buf[s.pending++] = b; + // create the two objects needed to store the corked requests + // they are not a linked list, as no new elements are inserted in there + this.corkedRequestsFree = new CorkedRequest(this); + this.corkedRequestsFree.next = new CorkedRequest(this); } +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -function putShortMSB(s, b) { -// put_byte(s, (Byte)(b >> 8)); -// put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -} +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); +var Duplex; +function Writable(options) { + Duplex = Duplex || _dereq_('./_stream_duplex'); -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -function read_buf(strm, buf, start, size) { - var len = strm.avail_in; + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); - if (len > size) { len = size; } - if (len === 0) { return 0; } + this._writableState = new WritableState(options, this); - strm.avail_in -= len; + // legacy. + this.writable = true; - // zmemcpy(buf, strm->next_in, len); - utils.arraySet(buf, strm.input, strm.next_in, len, start); - if (strm.state.wrap === 1) { - strm.adler = adler32(strm.adler, buf, len, start); - } + if (options) { + if (typeof options.write === 'function') this._write = options.write; - else if (strm.state.wrap === 2) { - strm.adler = crc32(strm.adler, buf, len, start); + if (typeof options.writev === 'function') this._writev = options.writev; } - strm.next_in += len; - strm.total_in += len; - - return len; + Stream.call(this); } +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); +} - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + processNextTick(cb, er); + valid = false; + } + return valid; +} - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; + if (typeof cb !== 'function') cb = nop; - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } + return ret; +}; - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); +Writable.prototype.cork = function () { + var state = this._writableState; - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); + state.corked++; +}; - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +Writable.prototype.uncork = function () { + var state = this._writableState; - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; + if (state.corked) { + state.corked--; - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; - if (best_len <= s.lookahead) { - return best_len; +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); } - return s.lookahead; + return chunk; } +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -function fill_window(s) { - var _w_size = s.w_size; - var p, n, m, more, str; + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + state.length += len; - do { - more = s.window_size - s.lookahead - s.strstart; + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + return ret; +} - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - utils.arraySet(s.window, s.window, _w_size, _w_size, 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= _w_size ? m - _w_size : 0); - } while (--n); + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} - n = _w_size; - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= _w_size ? m - _w_size : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; + onwriteStateUpdate(state); - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; -//#if MIN_MATCH != 3 -// Call update_hash() MIN_MATCH-3 more times -//#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ + } +} - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ -// if (s.high_water < s.window_size) { -// var curr = s.strstart + s.lookahead; -// var init = 0; -// -// if (s.high_water < curr) { -// /* Previous high water mark below current data -- zero WIN_INIT -// * bytes or up to end of window, whichever is less. -// */ -// init = s.window_size - curr; -// if (init > WIN_INIT) -// init = WIN_INIT; -// zmemzero(s->window + curr, (unsigned)init); -// s->high_water = curr + init; -// } -// else if (s->high_water < (ulg)curr + WIN_INIT) { -// /* High water mark at or above current data, but below current data -// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -// * to end of window, whichever is less. -// */ -// init = (ulg)curr + WIN_INIT - s->high_water; -// if (init > s->window_size - s->high_water) -// init = s->window_size - s->high_water; -// zmemzero(s->window + s->high_water, (unsigned)init); -// s->high_water += init; -// } -// } -// -// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -// "not enough room for search"); +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } } -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -function deflate_stored(s, flush) { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - var max_block_size = 0xffff; +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; - if (max_block_size > s.pending_buf_size - 5) { - max_block_size = s.pending_buf_size - 5; - } + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s.lookahead <= 1) { + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } - //Assert(s->strstart < s->w_size+MAX_DIST(s) || - // s->block_start >= (long)s->w_size, "slide too late"); -// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || -// s.block_start >= s.w_size)) { -// throw new Error("slide too late"); -// } + doWrite(stream, state, true, state.length, buffer, '', holder.finish); - fill_window(s); - if (s.lookahead === 0 && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } + // doWrite is always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; - if (s.lookahead === 0) { + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { break; } - /* flush the current block */ } - //Assert(s->block_start >= 0L, "block gone"); -// if (s.block_start < 0) throw new Error("block gone"); - s.strstart += s.lookahead; - s.lookahead = 0; + if (entry === null) state.lastBufferedRequest = null; + } - /* Emit a stored block if pending_buf will be full: */ - var max_start = s.block_start + max_block_size; + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} - if (s.strstart === 0 || s.strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s.lookahead = s.strstart - max_start; - s.strstart = max_start; - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); +}; +Writable.prototype._writev = null; - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; } - s.insert = 0; + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); } - if (s.strstart > s.block_start) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); } - /***/ } + return need; +} - return BS_NEED_MORE; +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) processNextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; } -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } + this.next = null; + this.entry = null; - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); + }; +} +}).call(this,_dereq_('_process')) - s.lookahead -= s.match_length; +},{"./_stream_duplex":252,"_process":279,"buffer":41,"core-util-is":164,"events":168,"inherits":187,"process-nextick-args":278,"util-deprecate":286}],257:[function(_dereq_,module,exports){ +var Stream = (function (){ + try { + return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = _dereq_('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = _dereq_('./lib/_stream_writable.js'); +exports.Duplex = _dereq_('./lib/_stream_duplex.js'); +exports.Transform = _dereq_('./lib/_stream_transform.js'); +exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; +},{"./lib/_stream_duplex.js":252,"./lib/_stream_passthrough.js":253,"./lib/_stream_readable.js":254,"./lib/_stream_transform.js":255,"./lib/_stream_writable.js":256}],258:[function(_dereq_,module,exports){ +'use strict'; -//#if MIN_MATCH != 3 -// Call UPDATE_HASH() MIN_MATCH-3 more times -//#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); +function notNull(x) { return x != null; } +function wrap(x) { return '(' + x + ')';} - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; +function maybeQuote(value) { + if (typeof value === 'string') { + return '"' + value + '"'; } - /***/ - } - return BS_BLOCK_DONE; + return value; } -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ +function lookUp(key) { + if (key[0] === '$') { + return 'context.' + key.substring(1); + } + return 'context.feature.properties.' + key; +} - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); +function nullValue(key, value) { + return ' true '; +} - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; +function propertyEqual(key, value) { + return wrap(maybeQuote(value) + ' === ' + lookUp(key)); +} - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } +function propertyOr(key, values) { + return wrap(values.map(function (x) { return propertyEqual(key, x); }).join(' || ')); +} - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); +function printNested(values, joiner) { + return wrap(values.filter(notNull).map(function (x) { + return wrap(x.join(' && ')); + }).join(' ' + joiner + ' ')); +} - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); +function any(_, values, options) { + return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '||') : 'true'; +} - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } +function all(_, values, options) { + return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '&&') : 'true'; +} - return BS_BLOCK_DONE; +function not(key, value, options) { + return '!' + wrap(parseFilter(value, options).join(' && ')); } +function none(key, values, options) { + return '!' + wrap(any(null, values, options)); +} -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ +function propertyMatchesBoolean(key, value) { + return wrap(lookUp(key) + (value ? ' != ' : ' == ') + 'null'); +} - var _win = s.window; +function rangeMatch(key, values, options) { + var expressions = []; + var transform = options && (typeof options.rangeTransform === 'function') && options.rangeTransform; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ + if (values.max) { + var max = transform ? transform(values.max) : values.max; + expressions.push('' + lookUp(key) + ' < ' + max); } - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + if (values.min) { + var min = transform ? min = transform(values.min) : values.min; + expressions.push('' + lookUp(key) + ' >= ' + min); } - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); + return wrap(expressions.join(' && ')); +} - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); +function parseFilter(filter, options) { + var filterAST = []; - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ + // Function filter + if (typeof filter === 'function') { + return [wrap(filter.toString() + '(context)')]; } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; + // Array filter, implicit 'any' + else if (Array.isArray(filter)) { + return [any(null, filter, options)]; } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; + // Null filter object + else if (filter == null) { + return ['true']; } - /***/ - } - return BS_BLOCK_DONE; -} -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ + // Object filter, e.g. implicit 'all' + var keys = Object.keys(filter); + for (var k=0; k < keys.length; k++) { + var key = keys[k]; - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; + var value = filter[key], + type = typeof value; + if (type === 'string' || type === 'number') { + filterAST.push(propertyEqual(key, value)); + } else if (type === 'boolean') { + filterAST.push(propertyMatchesBoolean(key, value)); + } else if (key === 'not') { + filterAST.push(not(key, value, options)); + } else if (key === 'any') { + filterAST.push(any(key, value, options)); + } else if (key === 'all') { + filterAST.push(all(key, value, options)); + } else if (key === 'none') { + filterAST.push(none(key, value, options)); + } else if (Array.isArray(value)) { + filterAST.push(propertyOr(key, value)); + } else if (type === 'object' && value != null) { + if (value.max || value.min) { + filterAST.push(rangeMatch(key, value, options)); + } + } else if (value == null) { + filterAST.push(nullValue(key, value)); + } else { + throw new Error('Unknown Query sytnax: ' + value); } - break; /* flush the current block */ - } } - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; + return keys.length === 0 ? ['true'] : filterAST; } -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; +function filterToString(filterAST) { + return wrap(filterAST.join(' && ')); } -var configuration_table; +function match(filter, options) { + if (filter == null) { return function () { return true; }; } + // jshint evil: true + return new Function('context', 'return ' + filterToString(parseFilter(filter, options)) + ';'); +} -configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ +module.exports = { + match: match, + filterToString: filterToString, + parseFilter: parseFilter +}; - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -]; +},{}],259:[function(_dereq_,module,exports){ +// Top level file is just a mixin of submodules & constants +'use strict'; +var assign = _dereq_('./lib/utils/common').assign; -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -function lm_init(s) { - s.window_size = 2 * s.w_size; +var deflate = _dereq_('./lib/deflate'); +var inflate = _dereq_('./lib/inflate'); +var constants = _dereq_('./lib/zlib/constants'); - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); +var pako = {}; - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; +assign(pako, deflate, inflate, constants); - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -} +module.exports = pako; +},{"./lib/deflate":260,"./lib/inflate":261,"./lib/utils/common":262,"./lib/zlib/constants":265}],260:[function(_dereq_,module,exports){ +'use strict'; -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ +var zlib_deflate = _dereq_('./zlib/deflate'); +var utils = _dereq_('./utils/common'); +var strings = _dereq_('./utils/strings'); +var msg = _dereq_('./zlib/messages'); +var ZStream = _dereq_('./zlib/zstream'); - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ +var toString = Object.prototype.toString; - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ +/* Public constants ==========================================================*/ +/* ===========================================================================*/ - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ +var Z_NO_FLUSH = 0; +var Z_FINISH = 4; - this.head = null; /* Heads of the hash chains or NIL. */ +var Z_OK = 0; +var Z_STREAM_END = 1; +var Z_SYNC_FLUSH = 2; - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ +var Z_DEFAULT_COMPRESSION = -1; - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ +var Z_DEFAULT_STRATEGY = 0; - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ +var Z_DEFLATED = 8; - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ +/* ===========================================================================*/ - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ +/** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ +/* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overriden. + **/ - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ +/** + * Deflate.result -> Uint8Array|Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Deflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); - this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); +/** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ +/** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ - //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils.Buf16(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); +/** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ +function Deflate(options) { + if (!(this instanceof Deflate)) return new Deflate(options); - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ + this.options = utils.assign({ + level: Z_DEFAULT_COMPRESSION, + method: Z_DEFLATED, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY, + to: '' + }, options || {}); - this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ + var opt = this.options; - this.l_buf = 0; /* buffer index for literals or lengths */ + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } - this.last_lit = 0; /* running index in l_buf */ + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data - this.d_buf = 0; - /* Buffer index for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + this.strm = new ZStream(); + this.strm.avail_out = 0; - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ + var status = zlib_deflate.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy + ); + if (status !== Z_OK) { + throw new Error(msg[status]); + } - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ + if (opt.header) { + zlib_deflate.deflateSetHeader(this.strm, opt.header); + } - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} + if (opt.dictionary) { + var dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings.string2buf(opt.dictionary); + } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + status = zlib_deflate.deflateSetDictionary(this.strm, dict); -function deflateResetKeep(strm) { - var s; + if (status !== Z_OK) { + throw new Error(msg[status]); + } - if (!strm || !strm.state) { - return err(strm, Z_STREAM_ERROR); + this._dict_set = true; } +} - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - s = strm.state; - s.pending = 0; - s.pending_out = 0; +/** + * Deflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the compression context. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * array format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ +Deflate.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var status, _mode; - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = (s.wrap ? INIT_STATE : BUSY_STATE); - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = Z_NO_FLUSH; - trees._tr_init(s); - return Z_OK; -} + if (this.ended) { return false; } + _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH); -function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK) { - lm_init(strm.state); + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings.string2buf(data); + } else if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; } - return ret; -} + strm.next_in = 0; + strm.avail_in = strm.input.length; -function deflateSetHeader(strm, head) { - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } - strm.state.gzhead = head; - return Z_OK; -} - + do { + if (strm.avail_out === 0) { + strm.output = new utils.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ -function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR; - } - var wrap = 1; + if (status !== Z_STREAM_END && status !== Z_OK) { + this.onEnd(status); + this.ended = true; + return false; + } + if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) { + if (this.options.to === 'string') { + this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); + } else { + this.onData(utils.shrinkBuf(strm.output, strm.next_out)); + } + } + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; + // Finalize on the last chunk. + if (_mode === Z_FINISH) { + status = zlib_deflate.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK; } - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; + // callback interim results if Z_SYNC_FLUSH. + if (_mode === Z_SYNC_FLUSH) { + this.onEnd(Z_OK); + strm.avail_out = 0; + return true; } - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } + return true; +}; - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return err(strm, Z_STREAM_ERROR); - } +/** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): ouput data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ +Deflate.prototype.onData = function (chunk) { + this.chunks.push(chunk); +}; - if (windowBits === 8) { - windowBits = 9; +/** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ +Deflate.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK) { + if (this.options.to === 'string') { + this.result = this.chunks.join(''); + } else { + this.result = utils.flattenChunks(this.chunks); + } } - /* until 256-byte window bug fixed */ + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; - var s = new DeflateState(); - strm.state = s; - s.strm = strm; +/** + * deflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ +function deflate(input, options) { + var deflator = new Deflate(options); - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; + deflator.push(input, true); - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg; } - s.window = new utils.Buf8(s.w_size * 2); - s.head = new utils.Buf16(s.hash_size); - s.prev = new utils.Buf16(s.w_size); + return deflator.result; +} - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ +/** + * deflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ +function deflateRaw(input, options) { + options = options || {}; + options.raw = true; + return deflate(input, options); +} - s.pending_buf_size = s.lit_bufsize * 4; - //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - //s->pending_buf = (uchf *) overlay; - s.pending_buf = new utils.Buf8(s.pending_buf_size); +/** + * gzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but create gzip wrapper instead of + * deflate one. + **/ +function gzip(input, options) { + options = options || {}; + options.gzip = true; + return deflate(input, options); +} - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s.d_buf = 1 * s.lit_bufsize; - //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - s.l_buf = (1 + 2) * s.lit_bufsize; +exports.Deflate = Deflate; +exports.deflate = deflate; +exports.deflateRaw = deflateRaw; +exports.gzip = gzip; - s.level = level; - s.strategy = strategy; - s.method = method; +},{"./utils/common":262,"./utils/strings":263,"./zlib/deflate":267,"./zlib/messages":272,"./zlib/zstream":274}],261:[function(_dereq_,module,exports){ +'use strict'; - return deflateReset(strm); -} -function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -} +var zlib_inflate = _dereq_('./zlib/inflate'); +var utils = _dereq_('./utils/common'); +var strings = _dereq_('./utils/strings'); +var c = _dereq_('./zlib/constants'); +var msg = _dereq_('./zlib/messages'); +var ZStream = _dereq_('./zlib/zstream'); +var GZheader = _dereq_('./zlib/gzheader'); +var toString = Object.prototype.toString; -function deflate(strm, flush) { - var old_flush, s; - var beg, val; // for gzip header write only +/** + * class Inflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[inflate]] + * and [[inflateRaw]]. + **/ - if (!strm || !strm.state || - flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } +/* internal + * inflate.chunks -> Array + * + * Chunks of output data, if [[Inflate#onData]] not overriden. + **/ - s = strm.state; +/** + * Inflate.result -> Uint8Array|Array|String + * + * Uncompressed result, generated by default [[Inflate#onData]] + * and [[Inflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Inflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ - if (!strm.output || - (!strm.input && strm.avail_in !== 0) || - (s.status === FINISH_STATE && flush !== Z_FINISH)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); - } +/** + * Inflate.err -> Number + * + * Error code after inflate finished. 0 (Z_OK) on success. + * Should be checked if broken data possible. + **/ - s.strm = strm; /* just in case */ - old_flush = s.last_flush; - s.last_flush = flush; +/** + * Inflate.msg -> String + * + * Error message, if [[Inflate.err]] != 0 + **/ - /* Write the header */ - if (s.status === INIT_STATE) { - if (s.wrap === 2) { // GZIP header - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - else // DEFLATE header - { - var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; - var level_flags = -1; +/** + * new Inflate(options) + * - options (Object): zlib inflate options. + * + * Creates new inflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `windowBits` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw inflate + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * By default, when no options set, autodetect deflate/gzip data format via + * wrapper header. + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var inflate = new pako.Inflate({ level: 3}); + * + * inflate.push(chunk1, false); + * inflate.push(chunk2, true); // true -> last chunk + * + * if (inflate.err) { throw new Error(inflate.err); } + * + * console.log(inflate.result); + * ``` + **/ +function Inflate(options) { + if (!(this instanceof Inflate)) return new Inflate(options); - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); + this.options = utils.assign({ + chunkSize: 16384, + windowBits: 0, + to: '' + }, options || {}); - s.status = BUSY_STATE; - putShortMSB(s, header); + var opt = this.options; - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - } + // Force window size for `raw` data, if not set directly, + // because we have no header for autodetect. + if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { opt.windowBits = -15; } } -//#ifdef GZIP - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ + // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate + if ((opt.windowBits >= 0) && (opt.windowBits < 16) && + !(options && options.windowBits)) { + opt.windowBits += 32; + } - while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - break; - } - } - put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); - s.gzindex++; - } - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (s.gzindex === s.gzhead.extra.length) { - s.gzindex = 0; - s.status = NAME_STATE; - } - } - else { - s.status = NAME_STATE; + // Gzip header has no info about windows size, we can do autodetect only + // for deflate. So, if window size not set, force it to max when gzip possible + if ((opt.windowBits > 15) && (opt.windowBits < 48)) { + // bit 3 (16) -> gzipped data + // bit 4 (32) -> autodetect gzip/deflate + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; } } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.gzindex = 0; - s.status = COMMENT_STATE; - } - } - else { - s.status = COMMENT_STATE; - } - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; + this.strm = new ZStream(); + this.strm.avail_out = 0; - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); + var status = zlib_inflate.inflateInit2( + this.strm, + opt.windowBits + ); - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.status = HCRC_STATE; - } - } - else { - s.status = HCRC_STATE; - } - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - } - if (s.pending + 2 <= s.pending_buf_size) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - } - } - else { - s.status = BUSY_STATE; - } + if (status !== c.Z_OK) { + throw new Error(msg[status]); } -//#endif - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK; - } + this.header = new GZheader(); - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH) { - return err(strm, Z_BUF_ERROR); - } + zlib_inflate.inflateGetHeader(this.strm, this.header); +} - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); +/** + * Inflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. + * + * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with + * new output chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the decompression context. + * + * On fail call [[Inflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ +Inflate.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var dictionary = this.options.dictionary; + var status, _mode; + var next_out_utf8, tail, utf8str; + var dict; + + // Flag to properly process Z_BUF_ERROR on testing inflate call + // when we check that all output data was flushed. + var allowBufError = false; + + if (this.ended) { return false; } + _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); + + // Convert data if needed + if (typeof data === 'string') { + // Only binary strings can be decompressed on practice + strm.input = strings.binstring2buf(data); + } else if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; } - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { - var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : - (s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush)); + strm.next_in = 0; + strm.avail_in = strm.input.length; - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; + do { + if (strm.avail_out === 0) { + strm.output = new utils.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ + + status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ + + if (status === c.Z_NEED_DICT && dictionary) { + // Convert data if needed + if (typeof dictionary === 'string') { + dict = strings.string2buf(dictionary); + } else if (toString.call(dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(dictionary); + } else { + dict = dictionary; } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ + + status = zlib_inflate.inflateSetDictionary(this.strm, dict); + } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - trees._tr_align(s); - } - else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - trees._tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); + if (status === c.Z_BUF_ERROR && allowBufError === true) { + status = c.Z_OK; + allowBufError = false; + } - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } + if (status !== c.Z_STREAM_END && status !== c.Z_OK) { + this.onEnd(status); + this.ended = true; + return false; } - } - //Assert(strm->avail_out > 0, "bug2"); - //if (strm.avail_out <= 0) { throw new Error("bug2");} - if (flush !== Z_FINISH) { return Z_OK; } - if (s.wrap <= 0) { return Z_STREAM_END; } + if (strm.next_out) { + if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) { - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } + if (this.options.to === 'string') { - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK : Z_STREAM_END; -} + next_out_utf8 = strings.utf8border(strm.output, strm.next_out); -function deflateEnd(strm) { - var status; + tail = strm.next_out - next_out_utf8; + utf8str = strings.buf2string(strm.output, next_out_utf8); - if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { - return Z_STREAM_ERROR; - } + // move tail + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } - status = strm.state.status; - if (status !== INIT_STATE && - status !== EXTRA_STATE && - status !== NAME_STATE && - status !== COMMENT_STATE && - status !== HCRC_STATE && - status !== BUSY_STATE && - status !== FINISH_STATE - ) { - return err(strm, Z_STREAM_ERROR); - } + this.onData(utf8str); - strm.state = null; + } else { + this.onData(utils.shrinkBuf(strm.output, strm.next_out)); + } + } + } - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; -} + // When no more input data, we should check that internal inflate buffers + // are flushed. The only way to do it when avail_out = 0 - run one more + // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. + // Here we set flag to process this error properly. + // + // NOTE. Deflate does not return error in this case and does not needs such + // logic. + if (strm.avail_in === 0 && strm.avail_out === 0) { + allowBufError = true; + } + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END); -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; + if (status === c.Z_STREAM_END) { + _mode = c.Z_FINISH; + } - var s; - var str, n; - var wrap; - var avail; - var next; - var input; - var tmpDict; + // Finalize on the last chunk. + if (_mode === c.Z_FINISH) { + status = zlib_inflate.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === c.Z_OK; + } - if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { - return Z_STREAM_ERROR; + // callback interim results if Z_SYNC_FLUSH. + if (_mode === c.Z_SYNC_FLUSH) { + this.onEnd(c.Z_OK); + strm.avail_out = 0; + return true; } - s = strm.state; - wrap = s.wrap; + return true; +}; - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR; - } - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32(strm.adler, dictionary, dictLength, 0); - } +/** + * Inflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): ouput data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ +Inflate.prototype.onData = function (chunk) { + this.chunks.push(chunk); +}; - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; +/** + * Inflate#onEnd(status) -> Void + * - status (Number): inflate status. 0 (Z_OK) on success, + * other if not. + * + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ +Inflate.prototype.onEnd = function (status) { + // On success - join + if (status === c.Z_OK) { + if (this.options.to === 'string') { + // Glue & convert here, until we teach pako to send + // utf8 alligned strings to onData + this.result = this.chunks.join(''); + } else { + this.result = utils.flattenChunks(this.chunks); } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - tmpDict = new utils.Buf8(s.w_size); - utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); - dictionary = tmpDict; - dictLength = s.w_size; } - /* insert dictionary into window and hash */ - avail = strm.avail_in; - next = strm.next_in; - input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - str = s.strstart; - n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK; -} +/** + * inflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Decompress `data` with inflate/ungzip and `options`. Autodetect + * format via wrapper header by default. That's why we don't provide + * separate `ungzip` method. + * + * Supported options are: + * + * - windowBits + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) + * , output; + * + * try { + * output = pako.inflate(input); + * } catch (err) + * console.log(err); + * } + * ``` + **/ +function inflate(input, options) { + var inflator = new Inflate(options); + inflator.push(input, true); -exports.deflateInit = deflateInit; -exports.deflateInit2 = deflateInit2; -exports.deflateReset = deflateReset; -exports.deflateResetKeep = deflateResetKeep; -exports.deflateSetHeader = deflateSetHeader; -exports.deflate = deflate; -exports.deflateEnd = deflateEnd; -exports.deflateSetDictionary = deflateSetDictionary; -exports.deflateInfo = 'pako deflate (from Nodeca project)'; + // That will never happens, if you don't cheat with options :) + if (inflator.err) { throw inflator.msg; } -/* Not implemented -exports.deflateBound = deflateBound; -exports.deflateCopy = deflateCopy; -exports.deflateParams = deflateParams; -exports.deflatePending = deflatePending; -exports.deflatePrime = deflatePrime; -exports.deflateTune = deflateTune; -*/ + return inflator.result; +} -},{"../utils/common":255,"./adler32":257,"./crc32":259,"./messages":265,"./trees":266}],261:[function(_dereq_,module,exports){ -'use strict'; +/** + * inflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * The same as [[inflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ +function inflateRaw(input, options) { + options = options || {}; + options.raw = true; + return inflate(input, options); +} -function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // +/** + * ungzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Just shortcut to [[inflate]], because it autodetects format + * by header.content. Done for convenience. + **/ - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; -} -module.exports = GZheader; +exports.Inflate = Inflate; +exports.inflate = inflate; +exports.inflateRaw = inflateRaw; +exports.ungzip = inflate; -},{}],262:[function(_dereq_,module,exports){ +},{"./utils/common":262,"./utils/strings":263,"./zlib/constants":265,"./zlib/gzheader":268,"./zlib/inflate":270,"./zlib/messages":272,"./zlib/zstream":274}],262:[function(_dereq_,module,exports){ 'use strict'; -// See state defs from inflate.js -var BAD = 30; /* got a data error -- remain here until reset */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. +var TYPED_OK = (typeof Uint8Array !== 'undefined') && + (typeof Uint16Array !== 'undefined') && + (typeof Int32Array !== 'undefined'); - Entry assumptions: - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 +exports.assign = function (obj /*from1, from2, from3, ...*/) { + var sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + var source = sources.shift(); + if (!source) { continue; } - On return, state.mode is one of: + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data + for (var p in source) { + if (source.hasOwnProperty(p)) { + obj[p] = source[p]; + } + } + } - Notes: + return obj; +}; - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -module.exports = function inflate_fast(strm, start) { - var state; - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ -//#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ -//#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; +// reduce buffer size, avoiding mem copy +exports.shrinkBuf = function (buf, size) { + if (buf.length === size) { return buf; } + if (buf.subarray) { return buf.subarray(0, size); } + buf.length = size; + return buf; +}; - var input, output; // JS specific, because we have no pointers +var fnTyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + if (src.subarray && dest.subarray) { + dest.set(src.subarray(src_offs, src_offs + len), dest_offs); + return; + } + // Fallback to ordinary array + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + var i, l, len, pos, chunk, result; - /* copy state to local variables */ - state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); -//#ifdef INFLATE_STRICT - dmax = state.dmax; -//#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; + // calculate data length + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + // join chunks + result = new Uint8Array(len); + pos = 0; + for (i = 0, l = chunks.length; i < l; i++) { + chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ + return result; + } +}; - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; +var fnUntyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + return [].concat.apply([], chunks); + } +}; - here = lcode[hold & lmask]; - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; +// Enable/Disable typed arrays use, for testing +// +exports.setTyped = function (on) { + if (on) { + exports.Buf8 = Uint8Array; + exports.Buf16 = Uint16Array; + exports.Buf32 = Int32Array; + exports.assign(exports, fnTyped); + } else { + exports.Buf8 = Array; + exports.Buf16 = Array; + exports.Buf32 = Array; + exports.assign(exports, fnUntyped); + } +}; - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; +exports.setTyped(TYPED_OK); - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); -//#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } -//#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } +},{}],263:[function(_dereq_,module,exports){ +// String encode/decode helpers +'use strict'; -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// if (len <= op - whave) { -// do { -// output[_out++] = 0; -// } while (--len); -// continue top; -// } -// len -= op - whave; -// do { -// output[_out++] = 0; -// } while (--op > whave); -// if (op === 0) { -// from = _out - dist; -// do { -// output[_out++] = output[from++]; -// } while (--len); -// continue top; -// } -//#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break top; - } - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break top; - } +var utils = _dereq_('./common'); - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; +// Quick check if we can use fast array to bin string conversion +// +// - apply(Array) can fail on Android 2.2 +// - apply(Uint8Array) can fail on iOS 5.1 Safary +// +var STR_APPLY_OK = true; +var STR_APPLY_UIA_OK = true; - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; -}; +try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; } +try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } -},{}],263:[function(_dereq_,module,exports){ -'use strict'; +// Table with utf8 lengths (calculated by first byte of sequence) +// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, +// because max possible codepoint is 0x10ffff +var _utf8len = new utils.Buf8(256); +for (var q = 0; q < 256; q++) { + _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); +} +_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start -var utils = _dereq_('../utils/common'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var inflate_fast = _dereq_('./inffast'); -var inflate_table = _dereq_('./inftrees'); -var CODES = 0; -var LENS = 1; -var DISTS = 2; +// convert string to array (typed, when possible) +exports.string2buf = function (str) { + var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; -/* Public constants ==========================================================*/ -/* ===========================================================================*/ + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + // allocate buffer + buf = new utils.Buf8(buf_len); -/* Allowed flush values; see deflate() and inflate() below for details */ -//var Z_NO_FLUSH = 0; -//var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -//var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -var Z_TREES = 6; + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + return buf; +}; -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; +// Helper (used in 2 places) +function buf2binstring(buf, len) { + // use fallback for big arrays to avoid stack overflow + if (len < 65537) { + if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { + return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)); + } + } -/* The deflate compression method */ -var Z_DEFLATED = 8; + var result = ''; + for (var i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; +} -/* STATES ====================================================================*/ -/* ===========================================================================*/ +// Convert byte array to binary string +exports.buf2binstring = function (buf) { + return buf2binstring(buf, buf.length); +}; -var HEAD = 1; /* i: waiting for magic header */ -var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -var TIME = 3; /* i: waiting for modification time (gzip) */ -var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -var EXLEN = 5; /* i: waiting for extra length (gzip) */ -var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -var NAME = 7; /* i: waiting for end of file name (gzip) */ -var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -var HCRC = 9; /* i: waiting for header crc (gzip) */ -var DICTID = 10; /* i: waiting for dictionary check value */ -var DICT = 11; /* waiting for inflateSetDictionary() call */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -var STORED = 14; /* i: waiting for stored size (length and complement) */ -var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -var TABLE = 17; /* i: waiting for dynamic block table lengths */ -var LENLENS = 18; /* i: waiting for code length code lengths */ -var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -var LEN_ = 20; /* i: same as LEN below, but only first time in */ -var LEN = 21; /* i: waiting for length/lit/eob code */ -var LENEXT = 22; /* i: waiting for length extra bits */ -var DIST = 23; /* i: waiting for distance code */ -var DISTEXT = 24; /* i: waiting for distance extra bits */ -var MATCH = 25; /* o: waiting for output space to copy string */ -var LIT = 26; /* o: waiting for output space to write literal */ -var CHECK = 27; /* i: waiting for 32-bit check value */ -var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -var DONE = 29; /* finished check, done -- remain here until reset */ -var BAD = 30; /* got a data error -- remain here until reset */ -var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ +// Convert binary string (typed, when possible) +exports.binstring2buf = function (str) { + var buf = new utils.Buf8(str.length); + for (var i = 0, len = buf.length; i < len; i++) { + buf[i] = str.charCodeAt(i); + } + return buf; +}; -/* ===========================================================================*/ +// convert array to string +exports.buf2string = function (buf, max) { + var i, out, c, c_len; + var len = max || buf.length; + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + var utf16buf = new Array(len * 2); -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + for (out = 0, i = 0; i < len;) { + c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_WBITS = MAX_WBITS; + c_len = _utf8len[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } -function zswap32(q) { - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); -} + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } -function InflateState() { - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib) */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ + return buf2binstring(utf16buf, out); +}; - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ +// Calculate max possible position in utf8 buffer, +// that will not break sequence. If that's not possible +// - (very small limits) return max size as is. +// +// buf[] - utf8 bytes array +// max - length limit (mandatory); +exports.utf8border = function (buf, max) { + var pos; - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ + max = max || buf.length; + if (max > buf.length) { max = buf.length; } - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ + // go back from last position, until start of sequence found + pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ + // Fuckup - very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ + // If we came to start of buffer - that means vuffer is too small, + // return max too. + if (pos === 0) { return max; } - this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ - this.work = new utils.Buf16(288); /* work area for code table building */ + return (pos + _utf8len[buf[pos]] > max) ? pos : max; +}; - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} +},{"./common":262}],264:[function(_dereq_,module,exports){ +'use strict'; -function inflateResetKeep(strm) { - var state; +// Note: adler32 takes 12% for level 0 and 2% for level 6. +// It doesn't worth to make additional optimizationa as in original. +// Small size is preferable. - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); - state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); +function adler32(adler, buf, len, pos) { + var s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; -function inflateReset(strm) { - var state; + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); + s1 %= 65521; + s2 %= 65521; + } + return (s1 | (s2 << 16)) |0; } -function inflateReset2(strm, windowBits) { - var wrap; - var state; - /* get the state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; +module.exports = adler32; - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; - if (windowBits < 48) { - windowBits &= 15; - } - } +},{}],265:[function(_dereq_,module,exports){ +'use strict'; - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -} +module.exports = { -function inflateInit2(strm, windowBits) { - var ret; - var state; + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, - if (!strm) { return Z_STREAM_ERROR; } - //strm.msg = Z_NULL; /* in case we return an error */ + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + //Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, - state = new InflateState(); + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.window = null/*Z_NULL*/; - ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null/*Z_NULL*/; + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type +}; + +},{}],266:[function(_dereq_,module,exports){ +'use strict'; + +// Note: we can't get significant speed boost here. +// So write code to minimize size - no pregenerated tables +// and array tools dependencies. + + +// Use ordinary array, since untyped makes no boost here +function makeTable() { + var c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; } - return ret; + + return table; } -function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); +// Create table on load. Just 255 signed longs. Not a problem. +var crcTable = makeTable(); + + +function crc32(crc, buf, len, pos) { + var t = crcTable, + end = pos + len; + + crc ^= -1; + + for (var i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; } -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. +module.exports = crc32; + +},{}],267:[function(_dereq_,module,exports){ +'use strict'; + +var utils = _dereq_('../utils/common'); +var trees = _dereq_('./trees'); +var adler32 = _dereq_('./adler32'); +var crc32 = _dereq_('./crc32'); +var msg = _dereq_('./messages'); + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + + +/* Allowed flush values; see deflate() and inflate() below for details */ +var Z_NO_FLUSH = 0; +var Z_PARTIAL_FLUSH = 1; +//var Z_SYNC_FLUSH = 2; +var Z_FULL_FLUSH = 3; +var Z_FINISH = 4; +var Z_BLOCK = 5; +//var Z_TREES = 6; + + +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. */ -var virgin = true; +var Z_OK = 0; +var Z_STREAM_END = 1; +//var Z_NEED_DICT = 2; +//var Z_ERRNO = -1; +var Z_STREAM_ERROR = -2; +var Z_DATA_ERROR = -3; +//var Z_MEM_ERROR = -4; +var Z_BUF_ERROR = -5; +//var Z_VERSION_ERROR = -6; -var lenfix, distfix; // We have no pointers in JS, so keep tables separate -function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - var sym; +/* compression levels */ +//var Z_NO_COMPRESSION = 0; +//var Z_BEST_SPEED = 1; +//var Z_BEST_COMPRESSION = 9; +var Z_DEFAULT_COMPRESSION = -1; - lenfix = new utils.Buf32(512); - distfix = new utils.Buf32(32); - /* literal/length table */ - sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } +var Z_FILTERED = 1; +var Z_HUFFMAN_ONLY = 2; +var Z_RLE = 3; +var Z_FIXED = 4; +var Z_DEFAULT_STRATEGY = 0; - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); +/* Possible values of the data_type field (though see inflate()) */ +//var Z_BINARY = 0; +//var Z_TEXT = 1; +//var Z_ASCII = 1; // = Z_TEXT +var Z_UNKNOWN = 2; - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); +/* The deflate compression method */ +var Z_DEFLATED = 8; - /* do this just once */ - virgin = false; - } +/*============================================================================*/ - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; + +var MAX_MEM_LEVEL = 9; +/* Maximum value for memLevel in deflateInit2 */ +var MAX_WBITS = 15; +/* 32K LZ77 window */ +var DEF_MEM_LEVEL = 8; + + +var LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ +var LITERALS = 256; +/* number of literal bytes 0..255 */ +var L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ +var D_CODES = 30; +/* number of distance codes */ +var BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ +var HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ +var MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ + +var MIN_MATCH = 3; +var MAX_MATCH = 258; +var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + +var PRESET_DICT = 0x20; + +var INIT_STATE = 42; +var EXTRA_STATE = 69; +var NAME_STATE = 73; +var COMMENT_STATE = 91; +var HCRC_STATE = 103; +var BUSY_STATE = 113; +var FINISH_STATE = 666; + +var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ +var BS_BLOCK_DONE = 2; /* block flush performed */ +var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ +var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ + +var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + +function err(strm, errorCode) { + strm.msg = msg[errorCode]; + return errorCode; } +function rank(f) { + return ((f) << 1) - ((f) > 4 ? 9 : 0); +} -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. +function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->output buffer and copying into it. + * (See also read_buf()). */ -function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; +function flush_pending(strm) { + var s = strm.state; - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; + //_tr_flush_bits(s); + var len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } - state.window = new utils.Buf8(state.wsize); + utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; } +} - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); - state.wnext = 0; - state.whave = state.wsize; + +function flush_block_only(s, last) { + trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending(s.strm); +} + + +function put_byte(s, b) { + s.pending_buf[s.pending++] = b; +} + + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +function putShortMSB(s, b) { +// put_byte(s, (Byte)(b >> 8)); +// put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; +} + + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ +function read_buf(strm, buf, start, size) { + var len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + utils.arraySet(buf, strm.input, strm.next_in, len, start); + if (strm.state.wrap === 1) { + strm.adler = adler32(strm.adler, buf, len, start); } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window, src, end - copy, dist, state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window, src, end - copy, copy, 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } + + else if (strm.state.wrap === 2) { + strm.adler = crc32(strm.adler, buf, len, start); } - return 0; + + strm.next_in += len; + strm.total_in += len; + + return len; } -function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //var last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ - var opts; - var n; // temporary var for NEED_BITS +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +function longest_match(s, cur_match) { + var chain_length = s.max_chain_length; /* max hash chain length */ + var scan = s.strstart; /* current string */ + var match; /* matched string */ + var len; /* length of current match */ + var best_len = s.prev_length; /* best match length so far */ + var nice_match = s.nice_match; /* stop if match long enough */ + var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - var order = /* permutation of code lengths */ - [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; + var _win = s.window; // shortcut + + var wmask = s.w_mask; + var prev = s.prev; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ - if (!strm || !strm.state || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR; + var strend = s.strstart + MAX_MATCH; + var scan_end1 = _win[scan + best_len - 1]; + var scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ - _in = have; - _out = left; - ret = Z_OK; + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (strend - scan); + scan = strend - MAX_MATCH; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { break; } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - state.flags = 0; /* expect zlib header */ - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - else if (len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - state.dmax = 1 << len; - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; +} + + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +function fill_window(s) { + var _w_size = s.w_size; + var p, n, m, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { + + utils.arraySet(s.window, s.window, _w_size, _w_size, 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= _w_size ? m - _w_size : 0); + } while (--n); + + n = _w_size; + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= _w_size ? m - _w_size : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); + + more += _w_size; + } + if (s.strm.avail_in === 0) { break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s.lookahead + s.insert >= MIN_MATCH) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; +//#if MIN_MATCH != 3 +// Call update_hash() MIN_MATCH-3 more times +//#endif + while (s.insert) { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH) { + break; + } } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ +// if (s.high_water < s.window_size) { +// var curr = s.strstart + s.lookahead; +// var init = 0; +// +// if (s.high_water < curr) { +// /* Previous high water mark below current data -- zero WIN_INIT +// * bytes or up to end of window, whichever is less. +// */ +// init = s.window_size - curr; +// if (init > WIN_INIT) +// init = WIN_INIT; +// zmemzero(s->window + curr, (unsigned)init); +// s->high_water = curr + init; +// } +// else if (s->high_water < (ulg)curr + WIN_INIT) { +// /* High water mark at or above current data, but below current data +// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up +// * to end of window, whichever is less. +// */ +// init = (ulg)curr + WIN_INIT - s->high_water; +// if (init > s->window_size - s->high_water) +// init = s->window_size - s->high_water; +// zmemzero(s->window + s->high_water, (unsigned)init); +// s->high_water += init; +// } +// } +// +// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, +// "not enough room for search"); +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +function deflate_stored(s, flush) { + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + var max_block_size = 0xffff; + + if (max_block_size > s.pending_buf_size - 5) { + max_block_size = s.pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s.lookahead <= 1) { + + //Assert(s->strstart < s->w_size+MAX_DIST(s) || + // s->block_start >= (long)s->w_size, "slide too late"); +// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || +// s.block_start >= s.w_size)) { +// throw new Error("slide too late"); +// } + + fill_window(s); + if (s.lookahead === 0 && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; + + if (s.lookahead === 0) { break; } - if (state.head) { - state.head.text = ((hold >> 8) & 1); + /* flush the current block */ + } + //Assert(s->block_start >= 0L, "block gone"); +// if (s.block_start < 0) throw new Error("block gone"); + + s.strstart += s.lookahead; + s.lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + var max_start = s.block_start + max_block_size; + + if (s.strstart === 0 || s.strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s.lookahead = s.strstart - max_start; + s.strstart = max_start; + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// + /***/ + + + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; + /***/ + } + } + + s.insert = 0; + + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + + if (s.strstart > s.block_start) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_NEED_MORE; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +function deflate_fast(s, flush) { + var hash_head; /* head of the hash chain */ + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; } - //===// - if (state.head) { - state.head.time = hold; + if (s.lookahead === 0) { + break; /* flush the current block */ } - if (state.flags & 0x0200) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; + +//#if MIN_MATCH != 3 +// Call UPDATE_HASH() MIN_MATCH-3 more times +//#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +} + +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +function deflate_slow(s, flush) { + var hash_head; /* head of hash chain */ + var bflush; /* set if current block must be flushed */ + + var max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH - 1; } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// + /***/ } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only(s, false); + /***/ } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more conveniend processing later - state.head.extra = new Array(state.head.extra_len); - } - utils.arraySet( - state.head.extra, - input, - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - copy, - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_BLOCK_DONE; +} + + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +function deflate_rle(s, flush) { + var bflush; /* set if current block must be flushed */ + var prev; /* byte at distance one to match */ + var scan, strend; /* scan goes up to strend for length of run */ + + var _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH) { + fill_window(s); + if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH; do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +} - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +function deflate_huff(s, flush) { + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH) { + return BS_NEED_MORE; } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; + break; /* flush the current block */ } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - utils.arraySet(output, input, next, copy, put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// -//#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } -//#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +} - opts = { bits: state.lenbits }; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +function Config(good_length, max_lazy, nice_length, max_chain, func) { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; +} - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; +var configuration_table; - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } +configuration_table = [ + /* good lazy nice chain */ + new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ + new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ + new Config(4, 5, 16, 8, deflate_fast), /* 2 */ + new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - /* handle error breaks in while */ - if (state.mode === BAD) { break; } + new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ + new Config(8, 16, 32, 32, deflate_slow), /* 5 */ + new Config(8, 16, 128, 128, deflate_slow), /* 6 */ + new Config(8, 32, 128, 256, deflate_slow), /* 7 */ + new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ + new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ +]; - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +function lm_init(s) { + s.window_size = 2 * s.w_size; - opts = { bits: state.lenbits }; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table[s.level].max_lazy; + s.good_match = configuration_table[s.level].good_length; + s.nice_match = configuration_table[s.level].nice_length; + s.max_chain_length = configuration_table[s.level].max_chain; - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + s.ins_h = 0; +} - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; +function DeflateState() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } -//#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -//#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// Trace((stderr, "inflate.c too far\n")); -// copy -= state.whave; -// if (copy > state.length) { copy = state.length; } -// if (copy > left) { copy = left; } -// left -= copy; -// state.length -= copy; -// do { -// output[put++] = 0; -// } while (--copy); -// if (state.length === 0) { state.mode = LEN; } -// break; -//#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' insdead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (_out) { - strm.adler = state.check = - /*UPDATE(state.check, put - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } + this.head = null; /* Heads of the hash chains or NIL. */ - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" + this.ins_h = 0; /* hash index of string to be inserted */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits */ - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -} + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ -function inflateEnd(strm) { + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -} + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ -function inflateGetHeader(strm, head) { - var state; + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ - /* check state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -} + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; + this.nice_match = 0; /* Stop searching when current match exceeds this */ - var state; - var dictid; - var ret; + /* used by trees.c: */ - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } - state = strm.state; + /* Didn't use ct_data typedef below to suppress compiler warning */ - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; - } + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); + this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); + this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); + zero(this.dyn_ltree); + zero(this.dyn_dtree); + zero(this.bl_tree); -exports.inflateReset = inflateReset; -exports.inflateReset2 = inflateReset2; -exports.inflateResetKeep = inflateResetKeep; -exports.inflateInit = inflateInit; -exports.inflateInit2 = inflateInit2; -exports.inflate = inflate; -exports.inflateEnd = inflateEnd; -exports.inflateGetHeader = inflateGetHeader; -exports.inflateSetDictionary = inflateSetDictionary; -exports.inflateInfo = 'pako inflate (from Nodeca project)'; + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ -/* Not implemented -exports.inflateCopy = inflateCopy; -exports.inflateGetDictionary = inflateGetDictionary; -exports.inflateMark = inflateMark; -exports.inflatePrime = inflatePrime; -exports.inflateSync = inflateSync; -exports.inflateSyncPoint = inflateSyncPoint; -exports.inflateUndermine = inflateUndermine; -*/ + //ush bl_count[MAX_BITS+1]; + this.bl_count = new utils.Buf16(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ -},{"../utils/common":255,"./adler32":257,"./crc32":259,"./inffast":262,"./inftrees":264}],264:[function(_dereq_,module,exports){ -'use strict'; + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ + zero(this.heap); + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ -var utils = _dereq_('../utils/common'); + this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; + zero(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ -var MAXBITS = 15; -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + this.l_buf = 0; /* buffer index for literals or lengths */ -var CODES = 0; -var LENS = 1; -var DISTS = 2; + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ -var lbase = [ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]; + this.last_lit = 0; /* running index in l_buf */ -var lext = [ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]; + this.d_buf = 0; + /* Buffer index for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ -var dbase = [ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]; + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ -var dext = [ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]; -module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -{ - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; -// var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ +} - var here_bits, here_op, here_val; - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. +function deflateResetKeep(strm) { + var s; - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. + if (!strm || !strm.state) { + return err(strm, Z_STREAM_ERROR); + } - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN; - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ + s = strm.state; + s.pending = 0; + s.pending_out = 0; - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ } + s.status = (s.wrap ? INIT_STATE : BUSY_STATE); + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = Z_NO_FLUSH; + trees._tr_init(s); + return Z_OK; +} - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; + +function deflateReset(strm) { + var ret = deflateResetKeep(strm); + if (ret === Z_OK) { + lm_init(strm.state); } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; + return ret; +} - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; +function deflateSetHeader(strm, head) { + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } + strm.state.gzhead = head; + return Z_OK; +} - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; + +function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR; } + var wrap = 1; - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ + if (level === Z_DEFAULT_COMPRESSION) { + level = 6; } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; } - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; } - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return err(strm, Z_STREAM_ERROR); } - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. + var s = new DeflateState(); - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. + strm.state = s; + s.strm = strm; - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; + s.window = new utils.Buf8(s.w_size * 2); + s.head = new utils.Buf16(s.hash_size); + s.prev = new utils.Buf16(s.w_size); - } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } + s.pending_buf_size = s.lit_bufsize * 4; - var i = 0; - /* process all codes and make table entries */ - for (;;) { - i++; - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } + //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + //s->pending_buf = (uchf *) overlay; + s.pending_buf = new utils.Buf8(s.pending_buf_size); - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s.d_buf = 1 * s.lit_bufsize; - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } + //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s.l_buf = (1 + 2) * s.lit_bufsize; - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } + s.level = level; + s.strategy = strategy; + s.method = method; - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } + return deflateReset(strm); +} - /* increment past last table */ - next += min; /* here min is 1 << curr */ +function deflateInit(strm, level) { + return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); +} - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } +function deflate(strm, flush) { + var old_flush, s; + var beg, val; // for gzip header write only - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } + if (!strm || !strm.state || + flush > Z_BLOCK || flush < 0) { + return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; } - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + s = strm.state; + + if (!strm.output || + (!strm.input && strm.avail_in !== 0) || + (s.status === FINISH_STATE && flush !== Z_FINISH)) { + return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); } - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; + s.strm = strm; /* just in case */ + old_flush = s.last_flush; + s.last_flush = flush; -},{"../utils/common":255}],265:[function(_dereq_,module,exports){ -'use strict'; + /* Write the header */ + if (s.status === INIT_STATE) { -module.exports = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; + if (s.wrap === 2) { // GZIP header + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s.status = BUSY_STATE; + } + else { + put_byte(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte(s, s.gzhead.time & 0xff); + put_byte(s, (s.gzhead.time >> 8) & 0xff); + put_byte(s, (s.gzhead.time >> 16) & 0xff); + put_byte(s, (s.gzhead.time >> 24) & 0xff); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte(s, s.gzhead.extra.length & 0xff); + put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE; + } + } + else // DEFLATE header + { + var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; + var level_flags = -1; -},{}],266:[function(_dereq_,module,exports){ -'use strict'; + if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT; } + header += 31 - (header % 31); + s.status = BUSY_STATE; + putShortMSB(s, header); -var utils = _dereq_('../utils/common'); + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + } + } -/* Public constants ==========================================================*/ -/* ===========================================================================*/ +//#ifdef GZIP + if (s.status === EXTRA_STATE) { + if (s.gzhead.extra/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + break; + } + } + put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); + s.gzindex++; + } + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (s.gzindex === s.gzhead.extra.length) { + s.gzindex = 0; + s.status = NAME_STATE; + } + } + else { + s.status = NAME_STATE; + } + } + if (s.status === NAME_STATE) { + if (s.gzhead.name/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED = 4; -//var Z_DEFAULT_STRATEGY = 0; + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.gzindex = 0; + s.status = COMMENT_STATE; + } + } + else { + s.status = COMMENT_STATE; + } + } + if (s.status === COMMENT_STATE) { + if (s.gzhead.comment/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; -/*============================================================================*/ + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.status = HCRC_STATE; + } + } + else { + s.status = HCRC_STATE; + } + } + if (s.status === HCRC_STATE) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending(strm); + } + if (s.pending + 2 <= s.pending_buf_size) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + s.status = BUSY_STATE; + } + } + else { + s.status = BUSY_STATE; + } + } +//#endif -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK; + } -// From zutil.h + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && + flush !== Z_FINISH) { + return err(strm, Z_BUF_ERROR); + } -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE && strm.avail_in !== 0) { + return err(strm, Z_BUF_ERROR); + } -var MIN_MATCH = 3; -var MAX_MATCH = 258; -/* The minimum and maximum match lengths */ + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { + var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : + (s.strategy === Z_RLE ? deflate_rle(s, flush) : + configuration_table[s.level].func(s, flush)); -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -var LITERALS = 256; -/* number of literal bytes 0..255 */ + if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { + s.status = FINISH_STATE; + } + if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE) { + if (flush === Z_PARTIAL_FLUSH) { + trees._tr_align(s); + } + else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ + trees._tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero(s.head); // Fill with NIL (= 0); -var D_CODES = 30; -/* number of distance codes */ + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + //Assert(strm->avail_out > 0, "bug2"); + //if (strm.avail_out <= 0) { throw new Error("bug2");} -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ + if (flush !== Z_FINISH) { return Z_OK; } + if (s.wrap <= 0) { return Z_STREAM_END; } -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ + /* Write the trailer */ + if (s.wrap === 2) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + put_byte(s, (strm.adler >> 16) & 0xff); + put_byte(s, (strm.adler >> 24) & 0xff); + put_byte(s, strm.total_in & 0xff); + put_byte(s, (strm.total_in >> 8) & 0xff); + put_byte(s, (strm.total_in >> 16) & 0xff); + put_byte(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK : Z_STREAM_END; +} -var Buf_size = 16; -/* size of bit buffer in bi_buf */ +function deflateEnd(strm) { + var status; + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR; + } -/* =========================================================================== - * Constants - */ + status = strm.state.status; + if (status !== INIT_STATE && + status !== EXTRA_STATE && + status !== NAME_STATE && + status !== COMMENT_STATE && + status !== HCRC_STATE && + status !== BUSY_STATE && + status !== FINISH_STATE + ) { + return err(strm, Z_STREAM_ERROR); + } -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ + strm.state = null; -var END_BLOCK = 256; -/* end of block literal code */ + return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; +} -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ +/* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ +function deflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ - [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR; + } -var extra_dbits = /* extra bits for each distance code */ - [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + s = strm.state; + wrap = s.wrap; -var extra_blbits = /* extra bits for each bit length code */ - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { + return Z_STREAM_ERROR; + } -var bl_order = - [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32(strm.adler, dictionary, dictLength, 0); + } -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ -/* =========================================================================== - * Local data. These are initialized only once. - */ + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + tmpDict = new utils.Buf8(s.w_size); + utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; -// We pre-fill arrays with 0 to avoid uninitialized gaps + s.prev[str & s.w_mask] = s.head[s.ins_h]; -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK; +} -// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES + 2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ -var static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ +exports.deflateInit = deflateInit; +exports.deflateInit2 = deflateInit2; +exports.deflateReset = deflateReset; +exports.deflateResetKeep = deflateResetKeep; +exports.deflateSetHeader = deflateSetHeader; +exports.deflate = deflate; +exports.deflateEnd = deflateEnd; +exports.deflateSetDictionary = deflateSetDictionary; +exports.deflateInfo = 'pako deflate (from Nodeca project)'; -var _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ +/* Not implemented +exports.deflateBound = deflateBound; +exports.deflateCopy = deflateCopy; +exports.deflateParams = deflateParams; +exports.deflatePending = deflatePending; +exports.deflatePrime = deflatePrime; +exports.deflateTune = deflateTune; +*/ -var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ +},{"../utils/common":262,"./adler32":264,"./crc32":266,"./messages":272,"./trees":273}],268:[function(_dereq_,module,exports){ +'use strict'; -var base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ -var base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ +function GZheader() { + /* true if compressed data believed to be text */ + this.text = 0; + /* modification time */ + this.time = 0; + /* extra flags (not used when writing a gzip file) */ + this.xflags = 0; + /* operating system */ + this.os = 0; + /* pointer to extra field or Z_NULL if none */ + this.extra = null; + /* extra field length (valid if extra != Z_NULL) */ + this.extra_len = 0; // Actually, we don't need it in JS, + // but leave for few code modifications + // + // Setup limits is not necessary because in js we should not preallocate memory + // for inflate use constant limit in 65536 bytes + // -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + /* space at extra (only when reading header) */ + // this.extra_max = 0; + /* pointer to zero-terminated file name or Z_NULL */ + this.name = ''; + /* space at name (only when reading header) */ + // this.name_max = 0; + /* pointer to zero-terminated comment or Z_NULL */ + this.comment = ''; + /* space at comment (only when reading header) */ + // this.comm_max = 0; + /* true if there was or will be a header crc */ + this.hcrc = 0; + /* true when done reading gzip header (not used when writing a gzip file) */ + this.done = false; +} - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ +module.exports = GZheader; - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} +},{}],269:[function(_dereq_,module,exports){ +'use strict'; +// See state defs from inflate.js +var BAD = 30; /* got a data error -- remain here until reset */ +var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var static_l_desc; -var static_d_desc; -var static_bl_desc; +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + Entry assumptions: -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} + state.mode === LEN + strm.avail_in >= 6 + strm.avail_out >= 258 + start >= strm.avail_out + state.bits < 8 + On return, state.mode is one of: + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -} + Notes: + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm.avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm.avail_out >= 258 for each loop to avoid checking for + output space. */ -function put_short(s, w) { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; -} +module.exports = function inflate_fast(strm, start) { + var state; + var _in; /* local strm.input */ + var last; /* have enough input while in < last */ + var _out; /* local strm.output */ + var beg; /* inflate()'s initial strm.output */ + var end; /* while out < end, enough space available */ +//#ifdef INFLATE_STRICT + var dmax; /* maximum distance from zlib header */ +//#endif + var wsize; /* window size or zero if not using window */ + var whave; /* valid bytes in the window */ + var wnext; /* window write index */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + var s_window; /* allocated sliding window, if wsize != 0 */ + var hold; /* local strm.hold */ + var bits; /* local strm.bits */ + var lcode; /* local strm.lencode */ + var dcode; /* local strm.distcode */ + var lmask; /* mask for first level of length codes */ + var dmask; /* mask for first level of distance codes */ + var here; /* retrieved table entry */ + var op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + var len; /* match length, unused bytes */ + var dist; /* match distance */ + var from; /* where to copy match from */ + var from_source; -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -function send_bits(s, value, length) { - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } -} + var input, output; // JS specific, because we have no pointers + /* copy state to local variables */ + state = strm.state; + //here = state.here; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); +//#ifdef INFLATE_STRICT + dmax = state.dmax; +//#endif + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; -function send_code(s, c, tree) { - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); -} + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -function bi_reverse(code, len) { - var res = 0; + top: do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -} - + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; + here = lcode[hold & lmask]; - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -} + dolen: + for (;;) { // Goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + if (op === 0) { /* literal */ + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + output[_out++] = here & 0xffff/*here.val*/; + } + else if (op & 16) { /* length base */ + len = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & ((1 << op) - 1); + hold >>>= op; + bits -= op; + } + //Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + for (;;) { // goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ + if (op & 16) { /* distance base */ + dist = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & ((1 << op) - 1); +//#ifdef INFLATE_STRICT + if (dist > dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break top; + } +//#endif + hold >>>= op; + bits -= op; + //Tracevv((stderr, "inflate: distance %u\n", dist)); + op = _out - beg; /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break top; + } - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } +// (!) This block is disabled in zlib defailts, +// don't enable it for binary compatibility +//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +// if (len <= op - whave) { +// do { +// output[_out++] = 0; +// } while (--len); +// continue top; +// } +// len -= op - whave; +// do { +// output[_out++] = 0; +// } while (--op > whave); +// if (op === 0) { +// from = _out - dist; +// do { +// output[_out++] = output[from++]; +// } while (--len); +// continue top; +// } +//#endif + } + from = 0; // window index + from_source = s_window; + if (wnext === 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } + else { + from = _out - dist; /* copy direct from output */ + do { /* minimum length is three */ + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } + else if ((op & 64) === 0) { /* 2nd level distance code */ + here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dodist; + } + else { + strm.msg = 'invalid distance code'; + state.mode = BAD; + break top; + } - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + break; // need to emulate goto via "continue" + } + } + else if ((op & 64) === 0) { /* 2nd level length code */ + here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dolen; + } + else if (op & 32) { /* end-of-block */ + //Tracevv((stderr, "inflate: end of block\n")); + state.mode = TYPE; + break top; + } + else { + strm.msg = 'invalid literal/length code'; + state.mode = BAD; + break top; + } - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; + break; // need to emulate goto via "continue" } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ + } while (_in < last && _out < end); - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ + /* update state and return */ + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); + strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); + state.hold = hold; + state.bits = bits; + return; +}; - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); +},{}],270:[function(_dereq_,module,exports){ +'use strict'; - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } -} +var utils = _dereq_('../utils/common'); +var adler32 = _dereq_('./adler32'); +var crc32 = _dereq_('./crc32'); +var inflate_fast = _dereq_('./inffast'); +var inflate_table = _dereq_('./inftrees'); -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ -{ - var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ +var CODES = 0; +var LENS = 1; +var DISTS = 2; - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits - 1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; +/* STATES ====================================================================*/ +/* ===========================================================================*/ - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } +var HEAD = 1; /* i: waiting for magic header */ +var FLAGS = 2; /* i: waiting for method and flags (gzip) */ +var TIME = 3; /* i: waiting for modification time (gzip) */ +var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ +var EXLEN = 5; /* i: waiting for extra length (gzip) */ +var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ +var NAME = 7; /* i: waiting for end of file name (gzip) */ +var COMMENT = 8; /* i: waiting for end of comment (gzip) */ +var HCRC = 9; /* i: waiting for header crc (gzip) */ +var DICTID = 10; /* i: waiting for dictionary check value */ +var DICT = 11; /* waiting for inflateSetDictionary() call */ +var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ +var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ +var STORED = 14; /* i: waiting for stored size (length and complement) */ +var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ +var COPY = 16; /* i/o: waiting for input or output to copy stored block */ +var TABLE = 17; /* i: waiting for dynamic block table lengths */ +var LENLENS = 18; /* i: waiting for code length code lengths */ +var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ +var LEN_ = 20; /* i: same as LEN below, but only first time in */ +var LEN = 21; /* i: waiting for length/lit/eob code */ +var LENEXT = 22; /* i: waiting for length extra bits */ +var DIST = 23; /* i: waiting for distance code */ +var DISTEXT = 24; /* i: waiting for distance extra bits */ +var MATCH = 25; /* o: waiting for output space to copy string */ +var LIT = 26; /* o: waiting for output space to write literal */ +var CHECK = 27; /* i: waiting for 32-bit check value */ +var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ +var DONE = 29; /* finished check, done -- remain here until reset */ +var BAD = 30; /* got a data error -- remain here until reset */ +var MEM = 31; /* got an inflate() memory error -- remain here until reset */ +var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES + 1, bl_count); +/* ===========================================================================*/ - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - //static_init_done = true; +var ENOUGH_LENS = 852; +var ENOUGH_DISTS = 592; +//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + +var MAX_WBITS = 15; +/* 32K LZ77 window */ +var DEF_WBITS = MAX_WBITS; + + +function zswap32(q) { + return (((q >>> 24) & 0xff) + + ((q >>> 8) & 0xff00) + + ((q & 0xff00) << 8) + + ((q & 0xff) << 24)); } -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ +function InflateState() { + this.mode = 0; /* current inflate mode */ + this.last = false; /* true if processing last block */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.havedict = false; /* true if dictionary provided */ + this.flags = 0; /* gzip header method and flags (0 if zlib) */ + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ + this.check = 0; /* protected copy of check value */ + this.total = 0; /* protected copy of output count */ + // TODO: may be {} + this.head = null; /* where to save gzip header information */ - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + /* sliding window */ + this.wbits = 0; /* log base 2 of requested window size */ + this.wsize = 0; /* window size or zero if not using window */ + this.whave = 0; /* valid bytes in the window */ + this.wnext = 0; /* window write index */ + this.window = null; /* allocated sliding window, if needed */ - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} + /* bit accumulator */ + this.hold = 0; /* input bit accumulator */ + this.bits = 0; /* number of bits in "in" */ + /* for string and stored block copying */ + this.length = 0; /* literal or length of data to copy */ + this.offset = 0; /* distance back to copy string from */ -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} + /* for table and code decoding */ + this.extra = 0; /* extra bits needed */ -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ + /* fixed and dynamic code tables */ + this.lencode = null; /* starting table for length/literal codes */ + this.distcode = null; /* starting table for distance codes */ + this.lenbits = 0; /* index bits for lencode */ + this.distbits = 0; /* index bits for distcode */ - if (header) { - put_short(s, len); - put_short(s, ~len); - } -// while (len--) { -// put_byte(s, *buf++); -// } - utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} + /* dynamic table building */ + this.ncode = 0; /* number of code length code lengths */ + this.nlen = 0; /* number of length code lengths */ + this.ndist = 0; /* number of distance code lengths */ + this.have = 0; /* number of code lengths in lens[] */ + this.next = null; /* next available space in codes[] */ -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -} + this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ + this.work = new utils.Buf16(288); /* work area for code table building */ -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } + /* + because we don't have pointers in js, we use lencode and distcode directly + as buffers so we don't need codes + */ + //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ + this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ + this.distdyn = null; /* dynamic table for distance codes (JS specific) */ + this.sane = 0; /* if false, allow invalid distance too far */ + this.back = 0; /* bits back of last unprocessed length/lit */ + this.was = 0; /* initial length of match */ +} - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; +function inflateResetKeep(strm) { + var state; - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ''; /*Z_NULL*/ + if (state.wrap) { /* to support ill-conceived Java test suite */ + strm.adler = state.wrap & 1; } - s.heap[k] = v; -} + state.mode = HEAD; + state.last = 0; + state.havedict = 0; + state.dmax = 32768; + state.head = null/*Z_NULL*/; + state.hold = 0; + state.bits = 0; + //state.lencode = state.distcode = state.next = state.codes; + state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); + state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); + state.sane = 1; + state.back = -1; + //Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} -// inlined manually -// var SMALLEST = 1; +function inflateReset(strm) { + var state; -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep(strm); - if (s.last_lit !== 0) { - do { - dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); - lc = s.pending_buf[s.l_buf + lx]; - lx++; +} - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); +function inflateReset2(strm, windowBits) { + var wrap; + var state; - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ + /* get the state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; + if (windowBits < 48) { + windowBits &= 15; + } + } - } while (lx < s.last_lit); + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; } - send_code(s, END_BLOCK, ltree); + /* update state and reset the rest of it */ + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset(strm); } +function inflateInit2(strm, windowBits) { + var ret; + var state; -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; + if (!strm) { return Z_STREAM_ERROR; } + //strm.msg = Z_NULL; /* in case we return an error */ - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; + state = new InflateState(); - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } + //if (state === Z_NULL) return Z_MEM_ERROR; + //Tracev((stderr, "inflate: allocated\n")); + strm.state = state; + state.window = null/*Z_NULL*/; + ret = inflateReset2(strm, windowBits); + if (ret !== Z_OK) { + strm.state = null/*Z_NULL*/; } + return ret; +} - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; +function inflateInit(strm) { + return inflateInit2(strm, DEF_WBITS); +} - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +var virgin = true; - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ +var lenfix, distfix; // We have no pointers in JS, so keep tables separate - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ +function fixedtables(state) { + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + var sym; - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; + lenfix = new utils.Buf32(512); + distfix = new utils.Buf32(32); - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + /* literal/length table */ + sym = 0; + while (sym < 144) { state.lens[sym++] = 8; } + while (sym < 256) { state.lens[sym++] = 9; } + while (sym < 280) { state.lens[sym++] = 7; } + while (sym < 288) { state.lens[sym++] = 8; } - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); + inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - } while (s.heap_len >= 2); + /* distance table */ + sym = 0; + while (sym < 32) { state.lens[sym++] = 5; } - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); + /* do this just once */ + virgin = false; + } - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); + state.lencode = lenfix; + state.lenbits = 9; + state.distcode = distfix; + state.distbits = 5; } -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +function updatewindow(strm, src, end, copy) { + var dist; + var state = strm.state; - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ + /* if it hasn't been done already, allocate space for the window */ + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; - if (nextlen === 0) { - max_count = 138; - min_count = 3; + state.window = new utils.Buf8(state.wsize); } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state.wsize) { + utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); + state.wnext = 0; + state.whave = state.wsize; + } + else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; + //zmemcpy(state->window + state->wnext, end - copy, dist); + utils.arraySet(state.window, src, end - copy, dist, state.wnext); + copy -= dist; + if (copy) { + //zmemcpy(state->window, end - copy, copy); + utils.arraySet(state.window, src, end - copy, copy, 0); + state.wnext = copy; + state.whave = state.wsize; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } } } + return 0; } +function inflate(strm, flush) { + var state; + var input, output; // input/output buffers + var next; /* next input INDEX */ + var put; /* next output INDEX */ + var have, left; /* available input and output */ + var hold; /* bit buffer */ + var bits; /* bits in bit buffer */ + var _in, _out; /* save starting available input and output */ + var copy; /* number of stored or match bytes to copy */ + var from; /* where to copy match bytes from */ + var from_source; + var here = 0; /* current decoding table entry */ + var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) + //var last; /* parent table entry */ + var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) + var len; /* length to copy for repeats, bits to drop */ + var ret; /* return code */ + var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ + var opts; -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ + var n; // temporary var for NEED_BITS - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + var order = /* permutation of code lengths */ + [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; + if (!strm || !strm.state || !strm.output || + (!strm.input && strm.avail_in !== 0)) { + return Z_STREAM_ERROR; } - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + state = strm.state; + if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } + _in = have; + _out = left; + ret = Z_OK; - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -} - - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ + inf_leave: // goto emulation + for (;;) { + switch (state.mode) { + case HEAD: + if (state.wrap === 0) { + state.mode = TYPEDO; + break; + } + //=== NEEDBITS(16); + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ + state.check = 0/*crc32(0L, Z_NULL, 0)*/; + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32(state.check, hbuf, 2, 0); + //===// - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = FLAGS; + break; + } + state.flags = 0; /* expect zlib header */ + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { + strm.msg = 'incorrect header check'; + state.mode = BAD; + break; + } + if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { + strm.msg = 'unknown compression method'; + state.mode = BAD; + break; + } + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + len = (hold & 0x0f)/*BITS(4)*/ + 8; + if (state.wbits === 0) { + state.wbits = len; + } + else if (len > state.wbits) { + strm.msg = 'invalid window size'; + state.mode = BAD; + break; + } + state.dmax = 1 << len; + //Tracev((stderr, "inflate: zlib header ok\n")); + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = hold & 0x200 ? DICTID : TYPE; + //=== INITBITS(); + hold = 0; + bits = 0; + //===// break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -} - - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - - -var static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) -{ - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -} - - -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len, true); /* with header */ -} - - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} - - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; - - s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; - - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility - -//#ifdef TRUNCATE_BLOCK -// /* Try to guess if it is profitable to stop the current block here */ -// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { -// /* Compute an upper bound for the compressed length */ -// out_length = s.last_lit*8; -// in_length = s.strstart - s.block_start; -// -// for (dcode = 0; dcode < D_CODES; dcode++) { -// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); -// } -// out_length >>>= 3; -// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -// // s->last_lit, in_length, out_length, -// // 100L - out_length*100L/in_length)); -// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { -// return true; -// } -// } -//#endif - - return (s.last_lit === s.lit_bufsize - 1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -exports._tr_init = _tr_init; -exports._tr_stored_block = _tr_stored_block; -exports._tr_flush_block = _tr_flush_block; -exports._tr_tally = _tr_tally; -exports._tr_align = _tr_align; - -},{"../utils/common":255}],267:[function(_dereq_,module,exports){ -'use strict'; - - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} - -module.exports = ZStream; - -},{}],268:[function(_dereq_,module,exports){ -'use strict'; - -// lightweight Buffer shim for pbf browser build -// based on code from github.com/feross/buffer (MIT-licensed) - -module.exports = Buffer; - -var ieee754 = _dereq_('ieee754'); - -var BufferMethods; - -function Buffer(length) { - var arr; - if (length && length.length) { - arr = length; - length = arr.length; - } - var buf = new Uint8Array(length || 0); - if (arr) buf.set(arr); - - buf.readUInt32LE = BufferMethods.readUInt32LE; - buf.writeUInt32LE = BufferMethods.writeUInt32LE; - buf.readInt32LE = BufferMethods.readInt32LE; - buf.writeInt32LE = BufferMethods.writeInt32LE; - buf.readFloatLE = BufferMethods.readFloatLE; - buf.writeFloatLE = BufferMethods.writeFloatLE; - buf.readDoubleLE = BufferMethods.readDoubleLE; - buf.writeDoubleLE = BufferMethods.writeDoubleLE; - buf.toString = BufferMethods.toString; - buf.write = BufferMethods.write; - buf.slice = BufferMethods.slice; - buf.copy = BufferMethods.copy; - - buf._isBuffer = true; - return buf; -} - -var lastStr, lastStrEncoded; - -BufferMethods = { - readUInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] * 0x1000000); - }, - - writeUInt32LE: function(val, pos) { - this[pos] = val; - this[pos + 1] = (val >>> 8); - this[pos + 2] = (val >>> 16); - this[pos + 3] = (val >>> 24); - }, - - readInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] << 24); - }, - - readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, - readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, - - writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, - writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - - toString: function(encoding, start, end) { - var str = '', - tmp = ''; - - start = start || 0; - end = Math.min(this.length, end || this.length); - - for (var i = start; i < end; i++) { - var ch = this[i]; - if (ch <= 0x7F) { - str += decodeURIComponent(tmp) + String.fromCharCode(ch); - tmp = ''; - } else { - tmp += '%' + ch.toString(16); + case FLAGS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.flags = hold; + if ((state.flags & 0xff) !== Z_DEFLATED) { + strm.msg = 'unknown compression method'; + state.mode = BAD; + break; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD; + break; + } + if (state.head) { + state.head.text = ((hold >> 8) & 1); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = TIME; + /* falls through */ + case TIME: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.time = hold; + } + if (state.flags & 0x0200) { + //=== CRC4(state.check, hold) + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + hbuf[2] = (hold >>> 16) & 0xff; + hbuf[3] = (hold >>> 24) & 0xff; + state.check = crc32(state.check, hbuf, 4, 0); + //=== + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = OS; + /* falls through */ + case OS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.xflags = (hold & 0xff); + state.head.os = (hold >> 8); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = EXLEN; + /* falls through */ + case EXLEN: + if (state.flags & 0x0400) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + else if (state.head) { + state.head.extra = null/*Z_NULL*/; + } + state.mode = EXTRA; + /* falls through */ + case EXTRA: + if (state.flags & 0x0400) { + copy = state.length; + if (copy > have) { copy = have; } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + // Use untyped array for more conveniend processing later + state.head.extra = new Array(state.head.extra_len); } + utils.arraySet( + state.head.extra, + input, + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + copy, + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + //zmemcpy(state.head.extra + len, next, + // len + copy > state.head.extra_max ? + // state.head.extra_max - len : copy); + } + if (state.flags & 0x0200) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; } + if (state.length) { break inf_leave; } + } + state.length = 0; + state.mode = NAME; + /* falls through */ + case NAME: + if (state.flags & 0x0800) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + // TODO: 2 or 1 bytes? + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.name_max*/)) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); - str += decodeURIComponent(tmp); - - return str; - }, + if (state.flags & 0x0200) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT; + /* falls through */ + case COMMENT: + if (state.flags & 0x1000) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.comm_max*/)) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 0x0200) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC; + /* falls through */ + case HCRC: + if (state.flags & 0x0200) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.check & 0xffff)) { + strm.msg = 'header crc mismatch'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + if (state.head) { + state.head.hcrc = ((state.flags >> 9) & 1); + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE; + break; + case DICTID: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + strm.adler = state.check = zswap32(hold); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = DICT; + /* falls through */ + case DICT: + if (state.havedict === 0) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + return Z_NEED_DICT; + } + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = TYPE; + /* falls through */ + case TYPE: + if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } + /* falls through */ + case TYPEDO: + if (state.last) { + //--- BYTEBITS() ---// + hold >>>= bits & 7; + bits -= bits & 7; + //---// + state.mode = CHECK; + break; + } + //=== NEEDBITS(3); */ + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.last = (hold & 0x01)/*BITS(1)*/; + //--- DROPBITS(1) ---// + hold >>>= 1; + bits -= 1; + //---// - write: function(str, pos) { - var bytes = str === lastStr ? lastStrEncoded : encodeString(str); - for (var i = 0; i < bytes.length; i++) { - this[pos + i] = bytes[i]; + switch ((hold & 0x03)/*BITS(2)*/) { + case 0: /* stored block */ + //Tracev((stderr, "inflate: stored block%s\n", + // state.last ? " (last)" : "")); + state.mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + //Tracev((stderr, "inflate: fixed codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = LEN_; /* decode codes */ + if (flush === Z_TREES) { + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break inf_leave; } - }, + break; + case 2: /* dynamic block */ + //Tracev((stderr, "inflate: dynamic codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = TABLE; + break; + case 3: + strm.msg = 'invalid block type'; + state.mode = BAD; + } + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break; + case STORED: + //--- BYTEBITS() ---// /* go to byte boundary */ + hold >>>= bits & 7; + bits -= bits & 7; + //---// + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { + strm.msg = 'invalid stored block lengths'; + state.mode = BAD; + break; + } + state.length = hold & 0xffff; + //Tracev((stderr, "inflate: stored length %u\n", + // state.length)); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = COPY_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case COPY_: + state.mode = COPY; + /* falls through */ + case COPY: + copy = state.length; + if (copy) { + if (copy > have) { copy = have; } + if (copy > left) { copy = left; } + if (copy === 0) { break inf_leave; } + //--- zmemcpy(put, next, copy); --- + utils.arraySet(output, input, next, copy, put); + //---// + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + //Tracev((stderr, "inflate: stored end\n")); + state.mode = TYPE; + break; + case TABLE: + //=== NEEDBITS(14); */ + while (bits < 14) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// +//#ifndef PKZIP_BUG_WORKAROUND + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = 'too many length or distance symbols'; + state.mode = BAD; + break; + } +//#endif + //Tracev((stderr, "inflate: table sizes ok\n")); + state.have = 0; + state.mode = LENLENS; + /* falls through */ + case LENLENS: + while (state.have < state.ncode) { + //=== NEEDBITS(3); + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + // We have separate tables & no pointers. 2 commented lines below not needed. + //state.next = state.codes; + //state.lencode = state.next; + // Switch to use dynamic table + state.lencode = state.lendyn; + state.lenbits = 7; - slice: function(start, end) { - return this.subarray(start, end); - }, + opts = { bits: state.lenbits }; + ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; - copy: function(buf, pos) { - pos = pos || 0; - for (var i = 0; i < this.length; i++) { - buf[pos + i] = this[i]; + if (ret) { + strm.msg = 'invalid code lengths set'; + state.mode = BAD; + break; + } + //Tracev((stderr, "inflate: code lengths ok\n")); + state.have = 0; + state.mode = CODELENS; + /* falls through */ + case CODELENS: + while (state.have < state.nlen + state.ndist) { + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_val < 16) { + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.lens[state.have++] = here_val; + } + else { + if (here_val === 16) { + //=== NEEDBITS(here.bits + 2); + n = here_bits + 2; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + if (state.have === 0) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 0x03);//BITS(2); + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + } + else if (here_val === 17) { + //=== NEEDBITS(here.bits + 3); + n = here_bits + 3; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 3 + (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + else { + //=== NEEDBITS(here.bits + 7); + n = here_bits + 7; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 11 + (hold & 0x7f);//BITS(7); + //--- DROPBITS(7) ---// + hold >>>= 7; + bits -= 7; + //---// + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } } - } -}; + } -BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; + /* handle error breaks in while */ + if (state.mode === BAD) { break; } -Buffer.byteLength = function(str) { - lastStr = str; - lastStrEncoded = encodeString(str); - return lastStrEncoded.length; -}; + /* check for end-of-block code (better have one) */ + if (state.lens[256] === 0) { + strm.msg = 'invalid code -- missing end-of-block'; + state.mode = BAD; + break; + } -Buffer.isBuffer = function(buf) { - return !!(buf && buf._isBuffer); -}; + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state.lenbits = 9; -function encodeString(str) { - var length = str.length, - bytes = []; + opts = { bits: state.lenbits }; + ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.lenbits = opts.bits; + // state.lencode = state.next; - for (var i = 0, c, lead; i < length; i++) { - c = str.charCodeAt(i); // code point + if (ret) { + strm.msg = 'invalid literal/lengths set'; + state.mode = BAD; + break; + } - if (c > 0xD7FF && c < 0xE000) { + state.distbits = 6; + //state.distcode.copy(state.codes); + // Switch to use dynamic table + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.distbits = opts.bits; + // state.distcode = state.next; - if (lead) { - if (c < 0xDC00) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = c; - continue; + if (ret) { + strm.msg = 'invalid distances set'; + state.mode = BAD; + break; + } + //Tracev((stderr, 'inflate: codes ok\n')); + state.mode = LEN_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case LEN_: + state.mode = LEN; + /* falls through */ + case LEN: + if (have >= 6 && left >= 258) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + inflate_fast(strm, _out); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- - } else { - c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; - lead = null; - } + if (state.mode === TYPE) { + state.back = -1; + } + break; + } + state.back = 0; + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; - } else { - if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); - else lead = c; + if (here_bits <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_op && (here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.lencode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; - continue; - } + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + state.mode = LIT; + break; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT; + /* falls through */ + case LENEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //Tracevv((stderr, "inflate: length %u\n", state.length)); + state.was = state.length; + state.mode = DIST; + /* falls through */ + case DIST: + for (;;) { + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; - } else if (lead) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = null; + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if ((here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.distcode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + if (here_op & 64) { + strm.msg = 'invalid distance code'; + state.mode = BAD; + break; + } + state.offset = here_val; + state.extra = (here_op) & 15; + state.mode = DISTEXT; + /* falls through */ + case DISTEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } +//#ifdef INFLATE_STRICT + if (state.offset > state.dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break; + } +//#endif + //Tracevv((stderr, "inflate: distance %u\n", state.offset)); + state.mode = MATCH; + /* falls through */ + case MATCH: + if (left === 0) { break inf_leave; } + copy = _out - left; + if (state.offset > copy) { /* copy from window */ + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break; + } +// (!) This block is disabled in zlib defailts, +// don't enable it for binary compatibility +//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +// Trace((stderr, "inflate.c too far\n")); +// copy -= state.whave; +// if (copy > state.length) { copy = state.length; } +// if (copy > left) { copy = left; } +// left -= copy; +// state.length -= copy; +// do { +// output[put++] = 0; +// } while (--copy); +// if (state.length === 0) { state.mode = LEN; } +// break; +//#endif + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } + else { + from = state.wnext - copy; + } + if (copy > state.length) { copy = state.length; } + from_source = state.window; + } + else { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { copy = left; } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { state.mode = LEN; } + break; + case LIT: + if (left === 0) { break inf_leave; } + output[put++] = state.length; + left--; + state.mode = LEN; + break; + case CHECK: + if (state.wrap) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + // Use '|' insdead of '+' to make sure that result is signed + hold |= input[next++] << bits; + bits += 8; } + //===// + _out -= left; + strm.total_out += _out; + state.total += _out; + if (_out) { + strm.adler = state.check = + /*UPDATE(state.check, put - _out, _out);*/ + (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); - if (c < 0x80) bytes.push(c); - else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); - else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + _out = left; + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.flags ? hold : zswap32(hold)) !== state.check) { + strm.msg = 'incorrect data check'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: check matches trailer\n")); + } + state.mode = LENGTH; + /* falls through */ + case LENGTH: + if (state.wrap && state.flags) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.total & 0xffffffff)) { + strm.msg = 'incorrect length check'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: length matches trailer\n")); + } + state.mode = DONE; + /* falls through */ + case DONE: + ret = Z_STREAM_END; + break inf_leave; + case BAD: + ret = Z_DATA_ERROR; + break inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* falls through */ + default: + return Z_STREAM_ERROR; } - return bytes; -} + } -},{"ieee754":186}],269:[function(_dereq_,module,exports){ -(function (global){ -'use strict'; + // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" -module.exports = Pbf; + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ -var Buffer = global.Buffer || _dereq_('./buffer'); + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- -function Pbf(buf) { - this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; - this.pos = 0; - this.length = this.buf.length; + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && + (state.mode < CHECK || flush !== Z_FINISH))) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { + state.mode = MEM; + return Z_MEM_ERROR; + } + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE ? 128 : 0) + + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { + ret = Z_BUF_ERROR; + } + return ret; } -Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum -Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 -Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields -Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 - -var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), - SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, - POW_2_63 = Math.pow(2, 63); - -Pbf.prototype = { - - destroy: function() { - this.buf = null; - }, - - // === READING ================================================================= - - readFields: function(readField, result, end) { - end = end || this.length; - - while (this.pos < end) { - var val = this.readVarint(), - tag = val >> 3, - startPos = this.pos; - - readField(tag, result, this); - - if (this.pos === startPos) this.skip(val); - } - return result; - }, - - readMessage: function(readField, result) { - return this.readFields(readField, result, this.readVarint() + this.pos); - }, +function inflateEnd(strm) { - readFixed32: function() { - var val = this.buf.readUInt32LE(this.pos); - this.pos += 4; - return val; - }, + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR; + } - readSFixed32: function() { - var val = this.buf.readInt32LE(this.pos); - this.pos += 4; - return val; - }, + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK; +} - // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) +function inflateGetHeader(strm, head) { + var state; - readFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - readSFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK; +} - readFloat: function() { - var val = this.buf.readFloatLE(this.pos); - this.pos += 4; - return val; - }, +function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; - readDouble: function() { - var val = this.buf.readDoubleLE(this.pos); - this.pos += 8; - return val; - }, + var state; + var dictid; + var ret; - readVarint: function() { - var buf = this.buf, - val, b, b0, b1, b2, b3; + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } + state = strm.state; - b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; - b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; - b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; - b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR; + } - val = b0 | b1 | b2 | (b3 & 0x7f) << 21; + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} - b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; +exports.inflateReset = inflateReset; +exports.inflateReset2 = inflateReset2; +exports.inflateResetKeep = inflateResetKeep; +exports.inflateInit = inflateInit; +exports.inflateInit2 = inflateInit2; +exports.inflate = inflate; +exports.inflateEnd = inflateEnd; +exports.inflateGetHeader = inflateGetHeader; +exports.inflateSetDictionary = inflateSetDictionary; +exports.inflateInfo = 'pako inflate (from Nodeca project)'; - throw new Error('Expected varint not more than 10 bytes'); - }, +/* Not implemented +exports.inflateCopy = inflateCopy; +exports.inflateGetDictionary = inflateGetDictionary; +exports.inflateMark = inflateMark; +exports.inflatePrime = inflatePrime; +exports.inflateSync = inflateSync; +exports.inflateSyncPoint = inflateSyncPoint; +exports.inflateUndermine = inflateUndermine; +*/ - readVarint64: function() { - var startPos = this.pos, - val = this.readVarint(); +},{"../utils/common":262,"./adler32":264,"./crc32":266,"./inffast":269,"./inftrees":271}],271:[function(_dereq_,module,exports){ +'use strict'; - if (val < POW_2_63) return val; - var pos = this.pos - 2; - while (this.buf[pos] === 0xff) pos--; - if (pos < startPos) pos = startPos; +var utils = _dereq_('../utils/common'); - val = 0; - for (var i = 0; i < pos - startPos + 1; i++) { - var b = ~this.buf[startPos + i] & 0x7f; - val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); - } +var MAXBITS = 15; +var ENOUGH_LENS = 852; +var ENOUGH_DISTS = 592; +//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - return -val - 1; - }, +var CODES = 0; +var LENS = 1; +var DISTS = 2; - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, +var lbase = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 +]; - readBoolean: function() { - return Boolean(this.readVarint()); - }, +var lext = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 +]; - readString: function() { - var end = this.readVarint() + this.pos, - str = this.buf.toString('utf8', this.pos, end); - this.pos = end; - return str; - }, +var dbase = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 +]; - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.slice(this.pos, end); - this.pos = end; - return buffer; - }, +var dext = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 +]; - // verbose for performance reasons; doesn't affect gzipped size +module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) +{ + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ - readPackedVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readVarint()); - return arr; - }, - readPackedSVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSVarint()); - return arr; - }, - readPackedBoolean: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readBoolean()); - return arr; - }, - readPackedFloat: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFloat()); - return arr; - }, - readPackedDouble: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readDouble()); - return arr; - }, - readPackedFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed32()); - return arr; - }, - readPackedSFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed32()); - return arr; - }, - readPackedFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed64()); - return arr; - }, - readPackedSFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed64()); - return arr; - }, + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; +// var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; - skip: function(val) { - var type = val & 0x7; - if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} - else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; - else if (type === Pbf.Fixed32) this.pos += 4; - else if (type === Pbf.Fixed64) this.pos += 8; - else throw new Error('Unimplemented type: ' + type); - }, + var here_bits, here_op, here_val; - // === WRITING ================================================================= + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. - realloc: function(min) { - var length = this.length || 16; + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. - while (length < this.pos + min) length *= 2; + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ - if (length !== this.length) { - var buf = new Buffer(length); - this.buf.copy(buf); - this.buf = buf; - this.length = length; - } - }, + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } - finish: function() { - this.length = this.pos; - this.pos = 0; - return this.buf.slice(0, this.length); - }, + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; - writeFixed32: function(val) { - this.realloc(4); - this.buf.writeUInt32LE(val, this.pos); - this.pos += 4; - }, - writeSFixed32: function(val) { - this.realloc(4); - this.buf.writeInt32LE(val, this.pos); - this.pos += 4; - }, + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; - writeFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } - writeSFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES || max !== 1)) { + return -1; /* incomplete set */ + } - writeVarint: function(val) { - val = +val; + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } - if (val <= 0x7f) { - this.realloc(1); - this.buf[this.pos++] = val; + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } - } else if (val <= 0x3fff) { - this.realloc(2); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f); + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. - } else if (val <= 0x1fffff) { - this.realloc(3); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f); + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. - } else if (val <= 0xfffffff) { - this.realloc(4); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 21) & 0x7f); + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. - } else { - var pos = this.pos; - while (val >= 0x80) { - this.realloc(1); - this.buf[this.pos++] = (val & 0xff) | 0x80; - val /= 0x80; - } - this.realloc(1); - this.buf[this.pos++] = val | 0; - if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); - } - }, + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES) { + base = extra = work; /* dummy value--not used */ + end = 19; - writeString: function(str) { - str = String(str); - var bytes = Buffer.byteLength(str); - this.writeVarint(bytes); - this.realloc(bytes); - this.buf.write(str, this.pos); - this.pos += bytes; - }, + } else if (type === LENS) { + base = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; - writeFloat: function(val) { - this.realloc(4); - this.buf.writeFloatLE(val, this.pos); - this.pos += 4; - }, + } else { /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } - writeDouble: function(val) { - this.realloc(8); - this.buf.writeDoubleLE(val, this.pos); - this.pos += 8; - }, + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ - writeBytes: function(buffer) { - var len = buffer.length; - this.writeVarint(len); - this.realloc(len); - for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; - }, + /* check available table space */ + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); + var i = 0; + /* process all codes and make table entries */ + for (;;) { + i++; + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); - this.pos++; // reserve 1 byte for short message length + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } - // write the message directly to the buffer and see how much was written - var startPos = this.pos; - fn(obj, this); - var len = this.pos - startPos; + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } - var varintLen = - len <= 0x7f ? 1 : - len <= 0x3fff ? 2 : - len <= 0x1fffff ? 3 : - len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } - // if 1 byte isn't enough for encoding message length, shift the data to the right - if (varintLen > 1) { - this.realloc(varintLen - 1); - for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; - } + /* increment past last table */ + next += min; /* here min is 1 << curr */ - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } - writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, - writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, - writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, - writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, - writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, - writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, - writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, - writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, - writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, + /* check for enough space */ + used += 1 << curr; + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } - writeBytesField: function(tag, buffer) { - this.writeTag(tag, Pbf.Bytes); - this.writeBytes(buffer); - }, - writeFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFixed32(val); - }, - writeSFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeSFixed32(val); - }, - writeFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeFixed64(val); - }, - writeSFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeSFixed64(val); - }, - writeVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeVarint(val); - }, - writeSVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeSVarint(val); - }, - writeStringField: function(tag, str) { - this.writeTag(tag, Pbf.Bytes); - this.writeString(str); - }, - writeFloatField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFloat(val); - }, - writeDoubleField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeDouble(val); - }, - writeBooleanField: function(tag, val) { - this.writeVarintField(tag, Boolean(val)); + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; } -}; + } -function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } -function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } -function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } -function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } -function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } -function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } -function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } -function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } -function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; +}; -},{"./buffer":268}],270:[function(_dereq_,module,exports){ +},{"../utils/common":262}],272:[function(_dereq_,module,exports){ 'use strict'; -module.exports = Point; - -function Point(x, y) { - this.x = x; - this.y = y; -} - -Point.prototype = { - clone: function() { return new Point(this.x, this.y); }, +module.exports = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ +}; - add: function(p) { return this.clone()._add(p); }, - sub: function(p) { return this.clone()._sub(p); }, - mult: function(k) { return this.clone()._mult(k); }, - div: function(k) { return this.clone()._div(k); }, - rotate: function(a) { return this.clone()._rotate(a); }, - matMult: function(m) { return this.clone()._matMult(m); }, - unit: function() { return this.clone()._unit(); }, - perp: function() { return this.clone()._perp(); }, - round: function() { return this.clone()._round(); }, +},{}],273:[function(_dereq_,module,exports){ +'use strict'; - mag: function() { - return Math.sqrt(this.x * this.x + this.y * this.y); - }, - equals: function(p) { - return this.x === p.x && - this.y === p.y; - }, +var utils = _dereq_('../utils/common'); - dist: function(p) { - return Math.sqrt(this.distSqr(p)); - }, +/* Public constants ==========================================================*/ +/* ===========================================================================*/ - distSqr: function(p) { - var dx = p.x - this.x, - dy = p.y - this.y; - return dx * dx + dy * dy; - }, - angle: function() { - return Math.atan2(this.y, this.x); - }, +//var Z_FILTERED = 1; +//var Z_HUFFMAN_ONLY = 2; +//var Z_RLE = 3; +var Z_FIXED = 4; +//var Z_DEFAULT_STRATEGY = 0; - angleTo: function(b) { - return Math.atan2(this.y - b.y, this.x - b.x); - }, +/* Possible values of the data_type field (though see inflate()) */ +var Z_BINARY = 0; +var Z_TEXT = 1; +//var Z_ASCII = 1; // = Z_TEXT +var Z_UNKNOWN = 2; - angleWith: function(b) { - return this.angleWithSep(b.x, b.y); - }, +/*============================================================================*/ - // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. - angleWithSep: function(x, y) { - return Math.atan2( - this.x * y - this.y * x, - this.x * x + this.y * y); - }, - _matMult: function(m) { - var x = m[0] * this.x + m[1] * this.y, - y = m[2] * this.x + m[3] * this.y; - this.x = x; - this.y = y; - return this; - }, +function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - _add: function(p) { - this.x += p.x; - this.y += p.y; - return this; - }, +// From zutil.h - _sub: function(p) { - this.x -= p.x; - this.y -= p.y; - return this; - }, +var STORED_BLOCK = 0; +var STATIC_TREES = 1; +var DYN_TREES = 2; +/* The three kinds of block type */ - _mult: function(k) { - this.x *= k; - this.y *= k; - return this; - }, +var MIN_MATCH = 3; +var MAX_MATCH = 258; +/* The minimum and maximum match lengths */ - _div: function(k) { - this.x /= k; - this.y /= k; - return this; - }, +// From deflate.h +/* =========================================================================== + * Internal compression state. + */ - _unit: function() { - this._div(this.mag()); - return this; - }, +var LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ - _perp: function() { - var y = this.y; - this.y = this.x; - this.x = -y; - return this; - }, +var LITERALS = 256; +/* number of literal bytes 0..255 */ - _rotate: function(angle) { - var cos = Math.cos(angle), - sin = Math.sin(angle), - x = cos * this.x - sin * this.y, - y = sin * this.x + cos * this.y; - this.x = x; - this.y = y; - return this; - }, +var L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ - _round: function() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - } -}; +var D_CODES = 30; +/* number of distance codes */ -// constructs Point from an array if necessary -Point.convert = function (a) { - if (a instanceof Point) { - return a; - } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); - } - return a; -}; +var BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ -},{}],271:[function(_dereq_,module,exports){ -(function (process){ -'use strict'; +var HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} +var MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} +var Buf_size = 16; +/* size of bit buffer in bi_buf */ -}).call(this,_dereq_('_process')) -},{"_process":272}],272:[function(_dereq_,module,exports){ -// shim for using process in browser -var process = module.exports = {}; +/* =========================================================================== + * Constants + */ -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. +var MAX_BL_BITS = 7; +/* Bit length codes must not exceed MAX_BL_BITS bits */ -var cachedSetTimeout; -var cachedClearTimeout; +var END_BLOCK = 256; +/* end of block literal code */ -(function () { - try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); - } - } - try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); - } - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } +var REP_3_6 = 16; +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ +var REPZ_3_10 = 17; +/* repeat a zero length 3-10 times (3 bits of repeat count) */ -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } +var REPZ_11_138 = 18; +/* repeat a zero length 11-138 times (7 bits of repeat count) */ +/* eslint-disable comma-spacing,array-bracket-spacing */ +var extra_lbits = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; +var extra_dbits = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; +var extra_blbits = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} +var bl_order = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; +/* eslint-enable comma-spacing,array-bracket-spacing */ -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} +/* =========================================================================== + * Local data. These are initialized only once. + */ -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; +// We pre-fill arrays with 0 to avoid uninitialized gaps -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; +var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ -function noop() {} +// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 +var static_ltree = new Array((L_CODES + 2) * 2); +zero(static_ltree); +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; +var static_dtree = new Array(D_CODES * 2); +zero(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; +var _dist_code = new Array(DIST_CODE_LEN); +zero(_dist_code); +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; +var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); +zero(_length_code); +/* length code for each normalized match length (0 == MIN_MATCH) */ -},{}],273:[function(_dereq_,module,exports){ -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. +var base_length = new Array(LENGTH_CODES); +zero(base_length); +/* First normalized length for each code (0 = MIN_MATCH) */ -'use strict'; +var base_dist = new Array(D_CODES); +zero(base_dist); +/* First normalized distance for each code (0 = distance of 1) */ -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { -module.exports = Duplex; + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ -/**/ -var processNextTick = _dereq_('process-nextick-args'); -/**/ + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; +} -/**/ -var util = _dereq_('core-util-is'); -util.inherits = _dereq_('inherits'); -/**/ -var Readable = _dereq_('./_stream_readable'); -var Writable = _dereq_('./_stream_writable'); +var static_l_desc; +var static_d_desc; +var static_bl_desc; -util.inherits(Duplex, Readable); -var keys = objectKeys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ } -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - Readable.call(this, options); - Writable.call(this, options); - if (options && options.readable === false) this.readable = false; +function d_code(dist) { + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; +} - if (options && options.writable === false) this.writable = false; - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +function put_short(s, w) { +// put_byte(s, (uch)((w) & 0xff)); +// put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +} - this.once('end', onend); + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +function send_bits(s, value, length) { + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } } -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - // no more data can be written. - // But allow more writes to happen in this tick. - processNextTick(onEndNT, this); +function send_code(s, c, tree) { + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); } -function onEndNT(self) { - self.end(); + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; } -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +function bi_flush(s) { + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; } } -},{"./_stream_readable":275,"./_stream_writable":277,"core-util-is":164,"inherits":187,"process-nextick-args":271}],274:[function(_dereq_,module,exports){ -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. -'use strict'; -module.exports = PassThrough; +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +function gen_bitlen(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ -var Transform = _dereq_('./_stream_transform'); + for (bits = 0; bits <= MAX_BITS; bits++) { + s.bl_count[bits] = 0; + } -/**/ -var util = _dereq_('core-util-is'); -util.inherits = _dereq_('inherits'); -/**/ + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ -util.inherits(PassThrough, Transform); + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); + if (n > max_code) { continue; } /* not a leaf node */ - Transform.call(this, options); + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } } -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; -},{"./_stream_transform":276,"core-util-is":164,"inherits":187}],275:[function(_dereq_,module,exports){ -(function (process){ -'use strict'; -module.exports = Readable; +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +function gen_codes(tree, max_code, bl_count) +// ct_data *tree; /* the tree to decorate */ +// int max_code; /* largest code with non zero frequency */ +// ushf *bl_count; /* number of codes at each bit length */ +{ + var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ -/**/ -var processNextTick = _dereq_('process-nextick-args'); -/**/ + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1<*/ -var isArray = _dereq_('isarray'); -/**/ + for (n = 0; n <= max_code; n++) { + var len = tree[n * 2 + 1]/*.Len*/; + if (len === 0) { continue; } + /* Now reverse the bits */ + tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len); -/**/ -var Buffer = _dereq_('buffer').Buffer; -/**/ + //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); + } +} -Readable.ReadableState = ReadableState; -var EE = _dereq_('events'); +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +function tr_static_init() { + var n; /* iterates over tree elements */ + var bits; /* bit counter */ + var length; /* length value */ + var code; /* code value */ + var dist; /* distance index */ + var bl_count = new Array(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ -/**/ -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ + // do check in _tr_init() + //if (static_init_done) return; -/**/ -var Stream; -(function () { - try { - Stream = _dereq_('st' + 'ream'); - } catch (_) {} finally { - if (!Stream) Stream = _dereq_('events').EventEmitter; + /* For some embedded targets, global variables are not initialized: */ +/*#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif*/ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } } -})(); -/**/ + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; -var Buffer = _dereq_('buffer').Buffer; + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); -/**/ -var util = _dereq_('core-util-is'); -util.inherits = _dereq_('inherits'); -/**/ + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) { + bl_count[bits] = 0; + } -/**/ -var debugUtil = _dereq_('util'); -var debug = undefined; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); + + //static_init_done = true; } -/**/ -var StringDecoder; -util.inherits(Readable, Stream); +/* =========================================================================== + * Initialize a new block. + */ +function init_block(s) { + var n; /* iterates over tree elements */ -var Duplex; -function ReadableState(options, stream) { - Duplex = Duplex || _dereq_('./_stream_duplex'); + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - options = options || {}; + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; +} - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +function bi_windup(s) +{ + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +function copy_block(s, buf, len, header) +//DeflateState *s; +//charf *buf; /* the input data */ +//unsigned len; /* its length */ +//int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, len); + put_short(s, ~len); + } +// while (len--) { +// put_byte(s, *buf++); +// } + utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +function smaller(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); +} + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +function pqdownheap(s, tree, k) +// deflate_state *s; +// ct_data *tree; /* the tree to restore */ +// int k; /* node to move down */ +{ + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; +} - this.buffer = []; - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; +// inlined manually +// var SMALLEST = 1; - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +function compress_block(s, ltree, dtree) +// deflate_state *s; +// const ct_data *ltree; /* literal tree */ +// const ct_data *dtree; /* distance tree */ +{ + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ - // if true, a maybeReadMore has been scheduled - this.readingMore = false; + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = _dereq_('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; + } while (lx < s.last_lit); } -} -var Duplex; -function Readable(options) { - Duplex = Duplex || _dereq_('./_stream_duplex'); + send_code(s, END_BLOCK, ltree); +} - if (!(this instanceof Readable)) return new Readable(options); - this._readableState = new ReadableState(options, this); +/* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ +function build_tree(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ - // legacy - this.readable = true; + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE; - if (options && typeof options.read === 'function') this._read = options.read; + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; - Stream.call(this); -} + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; - if (!state.objectMode && typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = new Buffer(chunk, encoding); - encoding = ''; + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; } + /* node is 0 or 1 so it does not have extra bits */ } + desc.max_code = max_code; - return readableAddChunk(this, state, chunk, encoding, false); -}; + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); -}; + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var e = new Error('stream.unshift() after end event'); - stream.emit('error', e); - } else { - var skipAdd; - if (state.decoder && !addToFront && !encoding) { - chunk = state.decoder.write(chunk); - skipAdd = !state.objectMode && chunk.length === 0; - } + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; - if (!addToFront) state.reading = false; + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - // Don't add to the buffer if we've decoded to an empty string chunk and - // we're not in object mode - if (!skipAdd) { - // if we want the data now, just emit it. - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); - if (state.needReadable) emitReadable(stream); - } - } + } while (s.heap_len >= 2); - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - return needMoreData(state); -} + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); } -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = _dereq_('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +function scan_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ -function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) return 0; + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - if (state.objectMode) return n === 0 ? 0 : 1; + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ - if (n === null || isNaN(n)) { - // only flow one buffer at a time - if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; + if (nextlen === 0) { + max_count = 138; + min_count = 3; } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - if (n <= 0) return 0; - - // If we're asking for more than the target buffer level, - // then raise the water mark. Bump up to the next highest - // power of 2, to prevent increasing it excessively in tiny - // amounts. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - // don't have that much. return null, unless we've ended. - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else { - return state.length; - } - } + if (++count < max_count && curlen === nextlen) { + continue; - return n; -} + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - var state = this._readableState; - var nOrig = n; + } else if (curlen !== 0) { - if (typeof n !== 'number' || n > 0) state.emittedReadable = false; + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - n = howMuchToRead(n, state); + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } + count = 0; + prevlen = curlen; - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. + if (nextlen === 0) { + max_count = 138; + min_count = 3; - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); + } else { + max_count = 7; + min_count = 4; + } } +} - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } - if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - } +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +function send_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (doRead && !state.reading) n = howMuchToRead(nOrig, state); + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ - if (ret === null) { - state.needReadable = true; - n = 0; + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; } - state.length -= n; - - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (state.length === 0 && !state.ended) state.needReadable = true; + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended && state.length === 0) endReadable(this); + if (++count < max_count && curlen === nextlen) { + continue; - if (ret !== null) this.emit('data', ret); + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - return ret; -}; + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); -function chunkInvalid(state, chunk) { - var er = null; - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); - } -} + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - processNextTick(maybeReadMore_, stream, state); + } else { + max_count = 7; + min_count = 4; + } } } -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('not implemented')); -}; +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +function build_bl_tree(s) { + var max_blindex; /* index of last bit length code of non zero freq */ -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { break; + } } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + return max_blindex; +} - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - debug('onunpipe'); - if (readable === src) { - cleanup(); - } - } +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +function send_all_trees(s, lcodes, dcodes, blcodes) +// deflate_state *s; +// int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + var rank; /* index in bl_order */ - function onend() { - debug('onend'); - dest.end(); + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - src.removeListener('data', ondata); + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} - cleanedUp = true; - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +function detect_data_type(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - var ret = dest.write(chunk); - if (false === ret) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - } - src.pause(); + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; } } - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. - if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); + for (n = 32; n < LITERALS; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } } - dest.once('finish', onfinish); - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} - // tell the dest that it's being piped to - dest.emit('pipe', src); - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } +var static_init_done = false; - return dest; -}; +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +function _tr_init(s) +{ -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} + if (!static_init_done) { + tr_static_init(); + static_init_done = true; + } -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; + s.bi_buf = 0; + s.bi_valid = 0; - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; + /* Initialize the first block of the first file: */ + init_block(s); +} - if (!dest) dest = state.pipes; - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this); - return this; - } +/* =========================================================================== + * Send a stored block + */ +function _tr_stored_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block(s, buf, stored_len, true); /* with header */ +} - // slow case. multiple pipe destinations. - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +function _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); +} - for (var _i = 0; _i < len; _i++) { - dests[_i].emit('unpipe', this); - }return this; - } - // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) return this; +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +function _tr_flush_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block, or NULL if too old */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ +{ + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { - dest.emit('unpipe', this); + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN) { + s.strm.data_type = detect_data_type(s); + } - return this; -}; + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ - // If listening to data, and it has not explicitly been paused, - // then call resume to start the flow of data on the next tick. - if (ev === 'data' && false !== this._readableState.flowing) { - this.resume(); - } + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); - if (ev === 'readable' && !this._readableState.endEmitted) { - var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; - state.emittedReadable = false; - state.needReadable = true; - if (!state.reading) { - processNextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this, state); - } - } - } + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } - return this; -}; -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - processNextTick(resume_, stream, state); - } -} + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); - state.resumeScheduled = false; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} + } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); } - return this; -}; + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - if (state.flowing) { - do { - var chunk = stream.read(); - } while (null !== chunk && state.flowing); + if (last) { + bi_windup(s); } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); } -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - - self.push(null); - }); +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +function _tr_tally(s, dist, lc) +// deflate_state *s; +// unsigned dist; /* distance of matched string */ +// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + //var out_length, in_length, dcode; - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; } - // proxy certain important events. - var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function (ev) { - stream.on(ev, self.emit.bind(self, ev)); - }); +// (!) This block is disabled in zlib defailts, +// don't enable it for binary compatibility - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; +//#ifdef TRUNCATE_BLOCK +// /* Try to guess if it is profitable to stop the current block here */ +// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { +// /* Compute an upper bound for the compressed length */ +// out_length = s.last_lit*8; +// in_length = s.strstart - s.block_start; +// +// for (dcode = 0; dcode < D_CODES; dcode++) { +// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); +// } +// out_length >>>= 3; +// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +// // s->last_lit, in_length, out_length, +// // 100L - out_length*100L/in_length)); +// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { +// return true; +// } +// } +//#endif - return self; -}; + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} -// exposed for testing purposes only. -Readable._fromList = fromList; +exports._tr_init = _tr_init; +exports._tr_stored_block = _tr_stored_block; +exports._tr_flush_block = _tr_flush_block; +exports._tr_tally = _tr_tally; +exports._tr_align = _tr_align; -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; - var ret; +},{"../utils/common":262}],274:[function(_dereq_,module,exports){ +'use strict'; - // nothing in the list, definitely empty. - if (list.length === 0) return null; - if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { - // read it all, truncate the array. - if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); - list.length = 0; - } else { - // read just some of it. - if (n < list[0].length) { - // just take a part of the first list item. - // slice is the same for buffers and strings. - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - // first list is a perfect match - ret = list.shift(); - } else { - // complex case. - // we have enough to cover it, but it spans past the first buffer. - if (stringMode) ret = '';else ret = new Buffer(n); +function ZStream() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; +} - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); +module.exports = ZStream; - if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); +},{}],275:[function(_dereq_,module,exports){ +'use strict'; - if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); +// lightweight Buffer shim for pbf browser build +// based on code from github.com/feross/buffer (MIT-licensed) - c += cpy; - } - } - } +module.exports = Buffer; - return ret; -} +var ieee754 = _dereq_('ieee754'); -function endReadable(stream) { - var state = stream._readableState; +var BufferMethods; - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('endReadable called on non-empty stream'); +function Buffer(length) { + var arr; + if (length && length.length) { + arr = length; + length = arr.length; + } + var buf = new Uint8Array(length || 0); + if (arr) buf.set(arr); - if (!state.endEmitted) { - state.ended = true; - processNextTick(endReadableNT, state, stream); - } -} + buf.readUInt32LE = BufferMethods.readUInt32LE; + buf.writeUInt32LE = BufferMethods.writeUInt32LE; + buf.readInt32LE = BufferMethods.readInt32LE; + buf.writeInt32LE = BufferMethods.writeInt32LE; + buf.readFloatLE = BufferMethods.readFloatLE; + buf.writeFloatLE = BufferMethods.writeFloatLE; + buf.readDoubleLE = BufferMethods.readDoubleLE; + buf.writeDoubleLE = BufferMethods.writeDoubleLE; + buf.toString = BufferMethods.toString; + buf.write = BufferMethods.write; + buf.slice = BufferMethods.slice; + buf.copy = BufferMethods.copy; -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } + buf._isBuffer = true; + return buf; } -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} +var lastStr, lastStrEncoded; -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} -}).call(this,_dereq_('_process')) +BufferMethods = { + readUInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] * 0x1000000); + }, -},{"./_stream_duplex":273,"_process":272,"buffer":41,"core-util-is":164,"events":168,"inherits":187,"isarray":189,"process-nextick-args":271,"string_decoder/":281,"util":40}],276:[function(_dereq_,module,exports){ -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. + writeUInt32LE: function(val, pos) { + this[pos] = val; + this[pos + 1] = (val >>> 8); + this[pos + 2] = (val >>> 16); + this[pos + 3] = (val >>> 24); + }, -'use strict'; + readInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] << 24); + }, -module.exports = Transform; + readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, + readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, -var Duplex = _dereq_('./_stream_duplex'); + writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, + writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, -/**/ -var util = _dereq_('core-util-is'); -util.inherits = _dereq_('inherits'); -/**/ + toString: function(encoding, start, end) { + var str = '', + tmp = ''; -util.inherits(Transform, Duplex); + start = start || 0; + end = Math.min(this.length, end || this.length); -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; + for (var i = start; i < end; i++) { + var ch = this[i]; + if (ch <= 0x7F) { + str += decodeURIComponent(tmp) + String.fromCharCode(ch); + tmp = ''; + } else { + tmp += '%' + ch.toString(16); + } + } - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} + str += decodeURIComponent(tmp); -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; + return str; + }, - var cb = ts.writecb; + write: function(str, pos) { + var bytes = str === lastStr ? lastStrEncoded : encodeString(str); + for (var i = 0; i < bytes.length; i++) { + this[pos + i] = bytes[i]; + } + }, - if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + slice: function(start, end) { + return this.subarray(start, end); + }, - ts.writechunk = null; - ts.writecb = null; + copy: function(buf, pos) { + pos = pos || 0; + for (var i = 0; i < this.length; i++) { + buf[pos + i] = this[i]; + } + } +}; - if (data !== null && data !== undefined) stream.push(data); +BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; - cb(er); +Buffer.byteLength = function(str) { + lastStr = str; + lastStrEncoded = encodeString(str); + return lastStrEncoded.length; +}; - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} +Buffer.isBuffer = function(buf) { + return !!(buf && buf._isBuffer); +}; -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); +function encodeString(str) { + var length = str.length, + bytes = []; - Duplex.call(this, options); + for (var i = 0, c, lead; i < length; i++) { + c = str.charCodeAt(i); // code point - this._transformState = new TransformState(this); + if (c > 0xD7FF && c < 0xE000) { - // when the writable side finishes, then flush out anything remaining. - var stream = this; + if (lead) { + if (c < 0xDC00) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = c; + continue; - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; + } else { + if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); + else lead = c; - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; + continue; + } - if (typeof options.flush === 'function') this._flush = options.flush; - } + } else if (lead) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = null; + } - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er) { - done(stream, er); - });else done(stream); - }); + if (c < 0x80) bytes.push(c); + else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); + else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + return bytes; } -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; +},{"ieee754":186}],276:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('not implemented'); -}; +module.exports = Pbf; -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; +var Buffer = global.Buffer || _dereq_('./buffer'); -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; +function Pbf(buf) { + this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; + this.pos = 0; + this.length = this.buf.length; +} - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 -function done(stream, er) { - if (er) return stream.emit('error', er); +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, + POW_2_63 = Math.pow(2, 63); - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; +Pbf.prototype = { - if (ws.length) throw new Error('calling transform done when ws.length != 0'); + destroy: function() { + this.buf = null; + }, - if (ts.transforming) throw new Error('calling transform done when still transforming'); + // === READING ================================================================= - return stream.push(null); -} -},{"./_stream_duplex":273,"core-util-is":164,"inherits":187}],277:[function(_dereq_,module,exports){ -(function (process){ -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. + readFields: function(readField, result, end) { + end = end || this.length; -'use strict'; + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; -module.exports = Writable; + readField(tag, result, this); -/**/ -var processNextTick = _dereq_('process-nextick-args'); -/**/ + if (this.pos === startPos) this.skip(val); + } + return result; + }, -/**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; -/**/ + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, -/**/ -var Buffer = _dereq_('buffer').Buffer; -/**/ + readFixed32: function() { + var val = this.buf.readUInt32LE(this.pos); + this.pos += 4; + return val; + }, -Writable.WritableState = WritableState; + readSFixed32: function() { + var val = this.buf.readInt32LE(this.pos); + this.pos += 4; + return val; + }, -/**/ -var util = _dereq_('core-util-is'); -util.inherits = _dereq_('inherits'); -/**/ + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) -/**/ -var internalUtil = { - deprecate: _dereq_('util-deprecate') -}; -/**/ + readFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, -/**/ -var Stream; -(function () { - try { - Stream = _dereq_('st' + 'ream'); - } catch (_) {} finally { - if (!Stream) Stream = _dereq_('events').EventEmitter; - } -})(); -/**/ + readSFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, -var Buffer = _dereq_('buffer').Buffer; + readFloat: function() { + var val = this.buf.readFloatLE(this.pos); + this.pos += 4; + return val; + }, -util.inherits(Writable, Stream); + readDouble: function() { + var val = this.buf.readDoubleLE(this.pos); + this.pos += 8; + return val; + }, -function nop() {} + readVarint: function() { + var buf = this.buf, + val, b, b0, b1, b2, b3; -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} + b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; + b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; + b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; + b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; -var Duplex; -function WritableState(options, stream) { - Duplex = Duplex || _dereq_('./_stream_duplex'); + val = b0 | b1 | b2 | (b3 & 0x7f) << 21; - options = options || {}; + b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; + throw new Error('Expected varint not more than 10 bytes'); + }, - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + readVarint64: function() { + var startPos = this.pos, + val = this.readVarint(); - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + if (val < POW_2_63) return val; - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; + var pos = this.pos - 2; + while (this.buf[pos] === 0xff) pos--; + if (pos < startPos) pos = startPos; - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; + val = 0; + for (var i = 0; i < pos - startPos + 1; i++) { + var b = ~this.buf[startPos + i] & 0x7f; + val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); + } - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; + return -val - 1; + }, - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; + readBoolean: function() { + return Boolean(this.readVarint()); + }, - // a flag to see when we're in the middle of a write. - this.writing = false; + readString: function() { + var end = this.readVarint() + this.pos, + str = this.buf.toString('utf8', this.pos, end); + this.pos = end; + return str; + }, - // when true all writes will be buffered until .uncork() call - this.corked = 0; + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.slice(this.pos, end); + this.pos = end; + return buffer; + }, - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; + // verbose for performance reasons; doesn't affect gzipped size - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; + readPackedVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readVarint()); + return arr; + }, + readPackedSVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; + // === WRITING ================================================================= - // the amount that is being written when _write is called. - this.writelen = 0; + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, - this.bufferedRequest = null; - this.lastBufferedRequest = null; + realloc: function(min) { + var length = this.length || 16; - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; + while (length < this.pos + min) length *= 2; - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; + if (length !== this.length) { + var buf = new Buffer(length); + this.buf.copy(buf); + this.buf = buf; + this.length = length; + } + }, - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.slice(0, this.length); + }, - // count buffered requests - this.bufferedRequestCount = 0; + writeFixed32: function(val) { + this.realloc(4); + this.buf.writeUInt32LE(val, this.pos); + this.pos += 4; + }, - // create the two objects needed to store the corked requests - // they are not a linked list, as no new elements are inserted in there - this.corkedRequestsFree = new CorkedRequest(this); - this.corkedRequestsFree.next = new CorkedRequest(this); -} + writeSFixed32: function(val) { + this.realloc(4); + this.buf.writeInt32LE(val, this.pos); + this.pos += 4; + }, -WritableState.prototype.getBuffer = function writableStateGetBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; + writeFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') - }); - } catch (_) {} -})(); + writeSFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, -var Duplex; -function Writable(options) { - Duplex = Duplex || _dereq_('./_stream_duplex'); + writeVarint: function(val) { + val = +val; - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + if (val <= 0x7f) { + this.realloc(1); + this.buf[this.pos++] = val; - this._writableState = new WritableState(options, this); + } else if (val <= 0x3fff) { + this.realloc(2); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f); - // legacy. - this.writable = true; + } else if (val <= 0x1fffff) { + this.realloc(3); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f); - if (options) { - if (typeof options.write === 'function') this._write = options.write; + } else if (val <= 0xfffffff) { + this.realloc(4); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 21) & 0x7f); - if (typeof options.writev === 'function') this._writev = options.writev; - } + } else { + var pos = this.pos; + while (val >= 0x80) { + this.realloc(1); + this.buf[this.pos++] = (val & 0xff) | 0x80; + val /= 0x80; + } + this.realloc(1); + this.buf[this.pos++] = val | 0; + if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + }, - Stream.call(this); -} + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe. Not readable.')); -}; + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - processNextTick(cb, er); -} + writeString: function(str) { + str = String(str); + var bytes = Buffer.byteLength(str); + this.writeVarint(bytes); + this.realloc(bytes); + this.buf.write(str, this.pos); + this.pos += bytes; + }, -// If we get something that is not a buffer, string, null, or undefined, -// and we're not in objectMode, then that's an error. -// Otherwise stream chunks are all considered to be of length=1, and the -// watermarks determine how many objects to keep in the buffer, rather than -// how many bytes or characters. -function validChunk(stream, state, chunk, cb) { - var valid = true; + writeFloat: function(val) { + this.realloc(4); + this.buf.writeFloatLE(val, this.pos); + this.pos += 4; + }, - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - var er = new TypeError('Invalid non-string/buffer chunk'); - stream.emit('error', er); - processNextTick(cb, er); - valid = false; - } - return valid; -} + writeDouble: function(val) { + this.realloc(8); + this.buf.writeDoubleLE(val, this.pos); + this.pos += 8; + }, -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); - if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + this.pos++; // reserve 1 byte for short message length - if (typeof cb !== 'function') cb = nop; + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; - if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, chunk, encoding, cb); - } + var varintLen = + len <= 0x7f ? 1 : + len <= 0x3fff ? 2 : + len <= 0x1fffff ? 3 : + len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); - return ret; -}; + // if 1 byte isn't enough for encoding message length, shift the data to the right + if (varintLen > 1) { + this.realloc(varintLen - 1); + for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; + } -Writable.prototype.cork = function () { - var state = this._writableState; + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, - state.corked++; -}; + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, -Writable.prototype.uncork = function () { - var state = this._writableState; + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; - if (state.corked) { - state.corked--; +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; -}; +},{"./buffer":275}],277:[function(_dereq_,module,exports){ +'use strict'; -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = new Buffer(chunk, encoding); - } - return chunk; +module.exports = Point; + +function Point(x, y) { + this.x = x; + this.y = y; } -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); +Point.prototype = { + clone: function() { return new Point(this.x, this.y); }, - if (Buffer.isBuffer(chunk)) encoding = 'buffer'; - var len = state.objectMode ? 1 : chunk.length; + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, - state.length += len; + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, - return ret; -} + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} + angle: function() { + return Math.atan2(this.y, this.x); + }, -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - if (sync) processNextTick(cb, er);else cb(er); + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, - onwriteStateUpdate(state); + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, - if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} + _unit: function() { + this._div(this.mag()); + return this; + }, -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; - var count = 0; - while (entry) { - buffer[count] = entry; - entry = entry.next; - count += 1; +// constructs Point from an array if necessary +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); } + return a; +}; - doWrite(stream, state, true, state.length, buffer, '', holder.finish); +},{}],278:[function(_dereq_,module,exports){ +(function (process){ +'use strict'; - // doWrite is always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; } - - if (entry === null) state.lastBufferedRequest = null; + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; } -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('not implemented')); -}; - -Writable.prototype._writev = null; +}).call(this,_dereq_('_process')) -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; +},{"_process":279}],279:[function(_dereq_,module,exports){ +// shim for using process in browser +var process = module.exports = {}; - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); +var cachedSetTimeout; +var cachedClearTimeout; - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + -function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit('prefinish'); - } } +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit('finish'); +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); } else { - prefinish(stream, state); + queueIndex = -1; + } + if (queue.length) { + drainQueue(); } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) processNextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; } -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; - this.next = null; - this.entry = null; + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} - this.finish = function (err) { - var entry = _this.entry; - _this.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = _this; - } else { - state.corkedRequestsFree = _this; + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); } - }; +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; } -}).call(this,_dereq_('_process')) +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; -},{"./_stream_duplex":273,"_process":272,"buffer":41,"core-util-is":164,"events":168,"inherits":187,"process-nextick-args":271,"util-deprecate":285}],278:[function(_dereq_,module,exports){ -var Stream = (function (){ - try { - return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify - } catch(_){} -}()); -exports = module.exports = _dereq_('./lib/_stream_readable.js'); -exports.Stream = Stream || exports; -exports.Readable = exports; -exports.Writable = _dereq_('./lib/_stream_writable.js'); -exports.Duplex = _dereq_('./lib/_stream_duplex.js'); -exports.Transform = _dereq_('./lib/_stream_transform.js'); -exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; -},{"./lib/_stream_duplex.js":273,"./lib/_stream_passthrough.js":274,"./lib/_stream_readable.js":275,"./lib/_stream_transform.js":276,"./lib/_stream_writable.js":277}],279:[function(_dereq_,module,exports){ +},{}],280:[function(_dereq_,module,exports){ (function (global){ // This method of obtaining a reference to the global object needs to be // kept identical to the way it is obtained in runtime.js @@ -25103,7 +25127,7 @@ if (hadRuntime) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./runtime":280}],280:[function(_dereq_,module,exports){ +},{"./runtime":281}],281:[function(_dereq_,module,exports){ (function (process,global){ /** * Copyright (c) 2014, Facebook, Inc. @@ -25776,7 +25800,7 @@ if (hadRuntime) { }).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"_process":272}],281:[function(_dereq_,module,exports){ +},{"_process":279}],282:[function(_dereq_,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -25999,7 +26023,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":41}],282:[function(_dereq_,module,exports){ +},{"buffer":41}],283:[function(_dereq_,module,exports){ /*! * strip-comments * @@ -26074,7 +26098,7 @@ strip.line = function(str, opts) { return str ? str.replace(re, '') : ''; }; -},{}],283:[function(_dereq_,module,exports){ +},{}],284:[function(_dereq_,module,exports){ !function() { var topojson = { version: "1.6.19", @@ -26610,7 +26634,7 @@ strip.line = function(str, opts) { else this.topojson = topojson; }(); -},{}],284:[function(_dereq_,module,exports){ +},{}],285:[function(_dereq_,module,exports){ (function (global,Buffer){ 'use strict' @@ -26828,7 +26852,7 @@ exports.clearCache = function clearCache() { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},_dereq_("buffer").Buffer) -},{"bit-twiddle":32,"buffer":41,"dup":166}],285:[function(_dereq_,module,exports){ +},{"bit-twiddle":32,"buffer":41,"dup":166}],286:[function(_dereq_,module,exports){ (function (global){ /** @@ -26900,14 +26924,16 @@ function config (name) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],286:[function(_dereq_,module,exports){ +},{}],287:[function(_dereq_,module,exports){ +arguments[4][187][0].apply(exports,arguments) +},{"dup":187}],288:[function(_dereq_,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],287:[function(_dereq_,module,exports){ +},{}],289:[function(_dereq_,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -27498,12 +27524,12 @@ function hasOwnProperty(obj, prop) { }).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":286,"_process":272,"inherits":187}],288:[function(_dereq_,module,exports){ +},{"./support/isBuffer":288,"_process":279,"inherits":287}],290:[function(_dereq_,module,exports){ module.exports.VectorTile = _dereq_('./lib/vectortile.js'); module.exports.VectorTileFeature = _dereq_('./lib/vectortilefeature.js'); module.exports.VectorTileLayer = _dereq_('./lib/vectortilelayer.js'); -},{"./lib/vectortile.js":289,"./lib/vectortilefeature.js":290,"./lib/vectortilelayer.js":291}],289:[function(_dereq_,module,exports){ +},{"./lib/vectortile.js":291,"./lib/vectortilefeature.js":292,"./lib/vectortilelayer.js":293}],291:[function(_dereq_,module,exports){ 'use strict'; var VectorTileLayer = _dereq_('./vectortilelayer'); @@ -27522,7 +27548,7 @@ function readTile(tag, layers, pbf) { } -},{"./vectortilelayer":291}],290:[function(_dereq_,module,exports){ +},{"./vectortilelayer":293}],292:[function(_dereq_,module,exports){ 'use strict'; var Point = _dereq_('point-geometry'); @@ -27686,7 +27712,7 @@ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { }; }; -},{"point-geometry":270}],291:[function(_dereq_,module,exports){ +},{"point-geometry":277}],293:[function(_dereq_,module,exports){ 'use strict'; var VectorTileFeature = _dereq_('./vectortilefeature.js'); @@ -27749,7 +27775,7 @@ VectorTileLayer.prototype.feature = function(i) { return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); }; -},{"./vectortilefeature.js":290}],292:[function(_dereq_,module,exports){ +},{"./vectortilefeature.js":292}],294:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27791,7 +27817,7 @@ function isCoordOutsideTile(coord, tolerance) { return coord[0] <= tile_min.x + tolerance || coord[0] >= tile_max.x - tolerance || coord[1] >= tile_min.y - tolerance || coord[1] <= tile_max.y + tolerance; } -},{"../geo":297}],293:[function(_dereq_,module,exports){ +},{"../geo":299}],295:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27884,7 +27910,7 @@ function buildQuadsForPoints(points, vertex_data, vertex_template, _ref, _ref2) } } // Point builders -},{"./common":292,"babel-runtime/helpers/slicedToArray":27}],294:[function(_dereq_,module,exports){ +},{"./common":294,"babel-runtime/helpers/slicedToArray":27}],296:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28093,7 +28119,7 @@ function triangulatePolygon(data) { return (0, _earcut2.default)(data.vertices, data.holes, data.dimensions); } -},{"../geo":297,"../vector":358,"./common":292,"babel-runtime/helpers/slicedToArray":27,"earcut":167}],295:[function(_dereq_,module,exports){ +},{"../geo":299,"../vector":361,"./common":294,"babel-runtime/helpers/slicedToArray":27,"earcut":167}],297:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28692,7 +28718,7 @@ function permuteLine(line, startIndex) { return newLine; } -},{"../geo":297,"../vector":358,"./common":292,"babel-runtime/core-js/math/log2":8}],296:[function(_dereq_,module,exports){ +},{"../geo":299,"../vector":361,"./common":294,"babel-runtime/core-js/math/log2":8}],298:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29065,7 +29091,7 @@ var FlatCamera = function (_IsometricCamera) { return FlatCamera; }(IsometricCamera); -},{"./gl/shader_program":303,"./utils/gl-matrix":349,"./utils/utils":355,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],297:[function(_dereq_,module,exports){ +},{"./gl/shader_program":305,"./utils/gl-matrix":351,"./utils/utils":358,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],299:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29406,7 +29432,7 @@ Geo.enforceWinding = function (geom, winding) { return geom; }; -},{"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/slicedToArray":27}],298:[function(_dereq_,module,exports){ +},{"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/slicedToArray":27}],300:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -29427,7 +29453,7 @@ gl.INT = 0x1404; gl.UNSIGNED_INT = 0x1405; gl.FLOAT = 0x1406; -},{}],299:[function(_dereq_,module,exports){ +},{}],301:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29480,7 +29506,7 @@ Context.resize = function (gl, width, height, device_pixel_ratio) { gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); }; -},{}],300:[function(_dereq_,module,exports){ +},{}],302:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -29513,7 +29539,7 @@ function getExtension(gl, name) { return exts.get(name); } -},{"babel-runtime/core-js/map":7}],301:[function(_dereq_,module,exports){ +},{"babel-runtime/core-js/map":7}],303:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29752,8 +29778,12 @@ GLSL.expandVec3 = function (v) { var z = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; var x = void 0; - if (Array.isArray(v) && v.length === 2) { - x = [].concat((0, _toConsumableArray3.default)(v), [z]).map(parseFloat); + if (Array.isArray(v)) { + if (v.length === 2) { + x = [].concat((0, _toConsumableArray3.default)(v), [z]).map(parseFloat); + } else { + return v; + } } else { x = [v, v, v].map(parseFloat); } @@ -29774,8 +29804,12 @@ GLSL.expandVec4 = function (v) { var w = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; var x = void 0; - if (Array.isArray(v) && v.length === 3) { - x = [].concat((0, _toConsumableArray3.default)(v), [w]).map(parseFloat); + if (Array.isArray(v)) { + if (v.length === 3) { + x = [].concat((0, _toConsumableArray3.default)(v), [w]).map(parseFloat); + } else { + return v; + } } else { x = [v, v, v, w].map(parseFloat); } @@ -29787,7 +29821,7 @@ GLSL.expandVec4 = function (v) { } }; -},{"babel-runtime/helpers/toConsumableArray":28}],302:[function(_dereq_,module,exports){ +},{"babel-runtime/helpers/toConsumableArray":28}],304:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -29900,7 +29934,7 @@ var RenderStateManager = function RenderStateManager(gl) { exports.default = RenderStateManager; -},{"babel-runtime/core-js/json/stringify":6,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],303:[function(_dereq_,module,exports){ +},{"babel-runtime/core-js/json/stringify":6,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],305:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -30796,7 +30830,7 @@ ShaderProgram.createShader = function (gl, source, stype) { return shader; }; -},{"../utils/log":350,"./extensions":300,"./glsl":301,"./texture":304,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28,"gl-shader-errors":185,"strip-comments":282}],304:[function(_dereq_,module,exports){ +},{"../utils/log":352,"./extensions":302,"./glsl":303,"./texture":306,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28,"gl-shader-errors":185,"strip-comments":283}],306:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31410,7 +31444,7 @@ Texture.base_url = null; // optional base URL to add to textures _worker_broker2.default.addTarget('Texture', Texture); (0, _subscribe2.default)(Texture); -},{"../utils/log":350,"../utils/subscribe":353,"../utils/utils":355,"../utils/worker_broker":357,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],305:[function(_dereq_,module,exports){ +},{"../utils/log":352,"../utils/subscribe":356,"../utils/utils":358,"../utils/worker_broker":360,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],307:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31495,7 +31529,7 @@ VertexArrayObject.destroy = function (gl, vao) { // destroy is a no-op if VAO extension isn't available }; -},{"../utils/log":350,"babel-runtime/core-js/map":7}],306:[function(_dereq_,module,exports){ +},{"../utils/log":352,"babel-runtime/core-js/map":7}],308:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31696,7 +31730,7 @@ var VBOMesh = function () { exports.default = VBOMesh; -},{"../utils/log":350,"./shader_program":303,"./vao":305,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/map":7,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],307:[function(_dereq_,module,exports){ +},{"../utils/log":352,"./shader_program":305,"./vao":307,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/map":7,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],309:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31927,7 +31961,7 @@ exports.default = VertexData; VertexData.array_pool = []; // pool of currently available (previously used) buffers (uint8) -},{"../utils/log":350,"./constants":298,"./vertex_elements":308,"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/defineProperty":23,"babel-runtime/helpers/toConsumableArray":28}],308:[function(_dereq_,module,exports){ +},{"../utils/log":352,"./constants":300,"./vertex_elements":310,"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/defineProperty":23,"babel-runtime/helpers/toConsumableArray":28}],310:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32007,7 +32041,7 @@ function createBuffer(array, overflown) { _worker_broker2.default.addTarget('VertexElements', VertexElements); -},{"../utils/worker_broker":357,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],309:[function(_dereq_,module,exports){ +},{"../utils/worker_broker":360,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],311:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32176,7 +32210,7 @@ var VertexLayout = function () { exports.default = VertexLayout; VertexLayout.enabled_attribs = {}; -},{"./constants":298,"./vertex_data":307,"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],310:[function(_dereq_,module,exports){ +},{"./constants":300,"./vertex_data":309,"babel-runtime/core-js/get-iterator":4,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],312:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32393,7 +32427,7 @@ exports.default = Collision = { } }; -},{"../utils/log":350,"./repeat_group":315,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/core-js/set":18}],311:[function(_dereq_,module,exports){ +},{"../utils/log":352,"./repeat_group":317,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/core-js/set":18}],313:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32439,8 +32473,11 @@ var Label = function () { this.position = null; this.anchor = Array.isArray(this.layout.anchor) ? this.layout.anchor[0] : this.layout.anchor; // initial anchor this.placed = null; + this.offset = layout.offset; this.aabb = null; this.obb = null; + this.align = 'center'; + this.throw_away = false; // if label does not fit (exceeds tile boundary, etc) this boolean will be true } (0, _createClass3.default)(Label, [{ @@ -32518,30 +32555,15 @@ var Label = function () { // Whether the label should be discarded // Depends on whether label must fit in the tile bounds, and if so, can it be moved to fit there - // `exclude` is an optional label to exclude from collisions with this label - // (e.g. useful for linked objects that shouldn't affect each other's placement) }, { key: 'discard', value: function discard(bboxes) { var exclude = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - // Should the label be culled if it can't fit inside the tile bounds? - if (this.layout.cull_from_tile) { - var in_tile = this.inTileBounds(); - - // If it doesn't fit, should we try to move it into the tile bounds? - if (!in_tile && this.layout.move_into_tile) { - // Can we fit the label into the tile? - if (!this.moveIntoTile()) { - return true; // can't fit in tile, discard - } - } else if (!in_tile) { - return true; // out of tile bounds, discard - } + if (this.throw_away) { + return true; } - - // If the label hasn't been discarded yet, check to see if it's occluded by other labels return this.occluded(bboxes, exclude); } }]); @@ -32553,16 +32575,16 @@ exports.default = Label; Label.epsilon = 0.9999; // tolerance around collision boxes, prevent perfectly adjacent objects from colliding -},{"../utils/obb":352,"../utils/utils":355,"./point_anchor":314,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"box-intersect":33}],312:[function(_dereq_,module,exports){ +},{"../utils/obb":355,"../utils/utils":358,"./point_anchor":316,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"box-intersect":33}],314:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var _getPrototypeOf = _dereq_('babel-runtime/core-js/object/get-prototype-of'); +var _create = _dereq_('babel-runtime/core-js/object/create'); -var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); +var _create2 = _interopRequireDefault(_create); var _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck'); @@ -32572,18 +32594,6 @@ var _createClass2 = _dereq_('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); -var _possibleConstructorReturn2 = _dereq_('babel-runtime/helpers/possibleConstructorReturn'); - -var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); - -var _get2 = _dereq_('babel-runtime/helpers/get'); - -var _get3 = _interopRequireDefault(_get2); - -var _inherits2 = _dereq_('babel-runtime/helpers/inherits'); - -var _inherits3 = _interopRequireDefault(_inherits2); - var _label = _dereq_('./label'); var _label2 = _interopRequireDefault(_label); @@ -32592,154 +32602,533 @@ var _vector = _dereq_('../vector'); var _vector2 = _interopRequireDefault(_vector); -var _obb = _dereq_('../utils/obb'); +var _obb3 = _dereq_('../utils/obb'); -var _obb2 = _interopRequireDefault(_obb); +var _obb4 = _interopRequireDefault(_obb3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var LabelLine = function (_Label) { - (0, _inherits3.default)(LabelLine, _Label); +var PLACEMENT = { + MID_POINT: 0, + CORNER: 1 +}; + +var MAX_ANGLE = Math.PI / 2; // maximum angle for articulated labels +var LINE_EXCEED_STRAIGHT = 0.7; // minimal ratio for straight labels (label length) / (line length) +var LINE_EXCEED_KINKED = 0.6; // minimal ratio for kinked labels +var LabelLine = function () { function LabelLine(size, lines, layout) { (0, _classCallCheck3.default)(this, LabelLine); - var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(LabelLine).call(this, size, layout)); - - _this.lines = lines; - _this.offset = [_this.layout.offset[0], _this.layout.offset[1]]; + this.size = size; + this.layout = layout; + this.lines = lines; + this.space_width = layout.space_width; // width of space for the font used + this.num_segments = size.length; // number of label segments + this.total_length = size.reduce(function (prev, next) { + return prev + next[0]; + }, 0) + (size.length - 1) * this.space_width; + this.total_height = size[0][1]; + this.placement = layout.placement === undefined ? PLACEMENT.MID_POINT : layout.placement; + + this.kink_index = 0; // index at which an articulated label will kink (e.g., 1 means a kink _after_ the first segment) + this.spread_factor = 0.5; // spaces out adjacent words to prevent overlap + this.fitness = 0; // measure of quality of fit + + // Arrays for Label properties. TODO: create array of Label types, where LabelLine acts as a "grouped label" + this.position = []; + this.angle = []; + this.offsets = []; + this.obbs = []; + this.aabbs = []; // optionally limit the line segments that the label may be placed in, by specifying a segment index range // used as a coarse subdivide for placing multiple labels per line geometry - _this.segment_index = layout.segment_start || 0; - _this.segment_max = layout.segment_end || _this.lines.length; - _this.update(); - return _this; + this.segment_index = layout.segment_index || layout.segment_start || 0; + this.segment_max = layout.segment_end || this.lines.length; + + // First fitting segment + var segment = this.getNextFittingSegment(this.getCurrentSegment()); + this.throw_away = !segment; } + // Iterate through the line geometry creating the next valid label. + + (0, _createClass3.default)(LabelLine, [{ - key: 'update', - value: function update() { - (0, _get3.default)((0, _getPrototypeOf2.default)(LabelLine.prototype), 'update', this).call(this); - var segment = this.currentSegment(); - this.angle = this.computeAngle(); - this.position = [(segment[0][0] + segment[1][0]) / 2, (segment[0][1] + segment[1][1]) / 2]; - this.updateBBoxes(); + key: 'getNextSegment', + + + // Strategy for returning the next segment. Assumes an "ordering" of possible segments + // taking into account both straight and articulated segments. Returns false if all possibilities + // have been exhausted + value: function getNextSegment() { + switch (this.placement) { + case PLACEMENT.CORNER: + this.placement = PLACEMENT.MID_POINT; + break; + case PLACEMENT.MID_POINT: + if (this.segment_index >= this.lines.length - 2) { + return false; + } else if (this.size.length > 1) { + this.placement = PLACEMENT.CORNER; + } + this.segment_index++; + break; + } + + return this.getCurrentSegment(); + } + + // Returns the line segments necessary for other calculations at the current line segment index. + // This is the current and next segment for a straight line, and the previous, current and next + // for an articulated segment. + + }, { + key: 'getCurrentSegment', + value: function getCurrentSegment() { + var p1 = void 0, + p2 = void 0, + segment = void 0; + switch (this.placement) { + case PLACEMENT.CORNER: + p1 = this.lines[this.segment_index - 1]; + p2 = this.lines[this.segment_index]; + var p3 = this.lines[this.segment_index + 1]; + segment = [p1, p2, p3]; + break; + case PLACEMENT.MID_POINT: + p1 = this.lines[this.segment_index]; + p2 = this.lines[this.segment_index + 1]; + segment = [p1, p2]; + break; + } + + return segment; } + + // Returns next segment that is valid (within tile, inside angle requirements and within line geometry). + }, { - key: 'moveNextSegment', - value: function moveNextSegment() { - if (this.segment_index + 1 >= this.segment_max - 1) { + key: 'getNextFittingSegment', + value: function getNextFittingSegment(segment) { + segment = segment || this.getNextSegment(); + if (!segment) { return false; } - this.segment_index++; - this.update(); + if (this.doesSegmentFit(segment)) { + this.update(); + if (this.inTileBounds() && this.inAngleBounds()) { + return segment; + } + } - return true; + return this.getNextFittingSegment(); } + + // Returns boolean indicating whether current segment is valid + + }, { + key: 'doesSegmentFit', + value: function doesSegmentFit(segment) { + switch (this.placement) { + case PLACEMENT.CORNER: + return this.fitKinkedSegment(segment); + case PLACEMENT.MID_POINT: + return this.fitStraightSegment(segment); + } + } + + // Returns boolean indicating whether kinked segment is valid + // Cycles through various ways of kinking the labels around the segment's pivot, + // finding the best fit, and determines the kink_index. + }, { - key: 'computeAngle', - value: function computeAngle() { - var segment = this.currentSegment(); + key: 'fitKinkedSegment', + value: function fitKinkedSegment(segment) { + var upp = this.layout.units_per_pixel; + var p0p1 = _vector2.default.sub(segment[0], segment[1]); + var p1p2 = _vector2.default.sub(segment[1], segment[2]); - p0p1 = _vector2.default.normalize(p0p1); + // Don't fit if segment doesn't pass the vertical line test, resulting in upside-down labels + if (p0p1[0] * p1p2[0] < 0 && p0p1[1] * p1p2[1] > 0) { + return false; + } + + var line_length1 = _vector2.default.length(p0p1) / upp; + var line_length2 = _vector2.default.length(p1p2) / upp; + + // break up multiple segments into two chunks (N-1 options) + var label_length1 = this.total_length; + var label_length2 = 0; + var width = void 0, + fitness = 0; + var kink_index = this.num_segments - 1; + var fitnesses = []; + + while (kink_index > 0) { + width = this.size[kink_index][0] + this.space_width; - var PI_2 = Math.PI / 2; - var theta = Math.atan2(p0p1[0], p0p1[1]) + PI_2; + label_length1 -= width; + label_length2 += width; - if (theta > PI_2 || theta < -PI_2) { - theta += Math.PI; + fitness = Math.max(calcFitness(line_length1, label_length1), calcFitness(line_length2, label_length2)); + fitnesses.unshift(fitness); + + kink_index--; } - theta %= Math.PI * 2; - return theta; + var max_fitness = Math.max.apply(null, fitnesses); + + if (max_fitness < LINE_EXCEED_KINKED) { + this.kink_index = fitnesses.indexOf(max_fitness) + 1; + this.fitness = max_fitness; + return true; + } else { + this.kink_index = 0; + return false; + } } + + // Returns boolean indicating whether straight segment is valid + // A straight segment is placed at the midpoint and is valid if the label's length is greater than a + // factor (LINE_EXCEED_STRAIGHT) of the line segment's length + }, { - key: 'fitToSegment', - value: function fitToSegment() { - var segment = this.currentSegment(); - var p0p1 = _vector2.default.sub(segment[0], segment[1]); - var length = _vector2.default.length(p0p1); + key: 'fitStraightSegment', + value: function fitStraightSegment(segment) { + var upp = this.layout.units_per_pixel; + var line_length = _vector2.default.length(_vector2.default.sub(segment[0], segment[1])) / upp; + var fitness = calcFitness(line_length, this.total_length); + + if (fitness < LINE_EXCEED_STRAIGHT) { + this.fitness = fitness; + return true; + } else { + return false; + } + } - var label_length = this.size[0] * this.layout.units_per_pixel; + // Once a fitting segment is found, determine its angles, positions and bounding boxes - if (label_length > length) { - // an exceed heurestic of 100% would let the label fit in any cases - var exceed = (1 - length / label_length) * 100; - return exceed < this.layout.line_exceed; + }, { + key: 'update', + value: function update() { + this.angle = this.getCurrentAngle(); + this.position = this.getCurrentPosition(); + this.updateBBoxes(); + } + }, { + key: 'getCurrentAngle', + value: function getCurrentAngle() { + var segment = this.getCurrentSegment(); + var angles = []; + + switch (this.placement) { + case PLACEMENT.CORNER: + var theta1 = getAngleFromSegment(segment[0], segment[1]); + var theta2 = getAngleFromSegment(segment[1], segment[2]); + + var p0p1 = _vector2.default.sub(segment[0], segment[1]); + var p1p2 = _vector2.default.sub(segment[1], segment[2]); + + var orientation = p0p1[0] >= 0 && p1p2[0] >= 0 ? 1 : -1; + var angle = void 0; + + for (var i = 0; i < this.num_segments; i++) { + if (i < this.kink_index) { + angle = orientation > 0 ? theta2 : theta1; + } else { + angle = orientation > 0 ? theta1 : theta2; + } + angles.push(angle); + } + break; + case PLACEMENT.MID_POINT: + var theta = getAngleFromSegment(segment[0], segment[1]); + for (var _i = 0; _i < this.num_segments; _i++) { + angles.push(theta); + } + break; } - return label_length <= length; + return angles; } + + // Return the position of the center of the label + }, { - key: 'currentSegment', - value: function currentSegment() { - var p1 = this.lines[this.segment_index]; - var p2 = this.lines[this.segment_index + 1]; + key: 'getCurrentPosition', + value: function getCurrentPosition() { + var segment = this.getCurrentSegment(); + var position = void 0; + + switch (this.placement) { + case PLACEMENT.CORNER: + position = segment[1].slice(); + break; + case PLACEMENT.MID_POINT: + position = [0.5 * (segment[0][0] + segment[1][0]), 0.5 * (segment[0][1] + segment[1][1])]; + break; + } - return [p1, p2]; + return position; } + + // Check for articulated labels to be within an angle range [-MAX_ANGLE, +MAX_ANGLE] + + }, { + key: 'inAngleBounds', + value: function inAngleBounds() { + switch (this.placement) { + case PLACEMENT.CORNER: + var angle0 = this.angle[0]; + if (angle0 < 0) { + angle0 += 2 * Math.PI; + } + + var angle1 = this.angle[1]; + if (angle1 < 0) { + angle1 += 2 * Math.PI; + } + + var theta = Math.abs(angle1 - angle0); + theta = Math.min(2 * Math.PI - theta, theta); + + return theta <= MAX_ANGLE; + case PLACEMENT.MID_POINT: + return true; + } + } + + // Calculate bounding boxes + }, { key: 'updateBBoxes', value: function updateBBoxes() { var upp = this.layout.units_per_pixel; - var width = (this.size[0] + this.layout.buffer[0] * 2) * upp * _label2.default.epsilon; - var height = (this.size[1] + this.layout.buffer[1] * 2) * upp * _label2.default.epsilon; + var height = (this.total_height + this.layout.buffer[1] * 2) * upp * _label2.default.epsilon; - // apply offset, x positive, y pointing down - var offset = _vector2.default.rot(this.offset, this.angle); - var p = [this.position[0] + offset[0] * upp, this.position[1] - offset[1] * upp]; + // reset bounding boxes + this.obbs = []; + this.aabbs = []; - // the angle of the obb is negative since it's the tile system y axis is pointing down - this.obb = new _obb2.default(p[0], p[1], -this.angle, width, height); - this.aabb = this.obb.getExtent(); + switch (this.placement) { + case PLACEMENT.CORNER: + var angle0 = this.angle[this.kink_index - 1]; // angle before kink + var angle1 = this.angle[this.kink_index]; // angle after kink + var theta = Math.abs(angle1 - angle0); // angle delta + + // A spread factor of 0 pivots the boxes on their horizontal center, looking like: "X" + // a spread factor of 1 offsets the boxes so that their corners touch, looking like: "\/" or "/\" + var dx = this.spread_factor * Math.abs(this.total_height * Math.tan(0.5 * theta)); + var nudge = 0.5 * (-dx - this.space_width); + + // Place labels backwards from kink index + for (var i = this.kink_index - 1; i >= 0; i--) { + var width_px = this.size[i][0]; + var angle = this.angle[i]; + + var width = (width_px + 2 * this.layout.buffer[0]) * upp * _label2.default.epsilon; + + nudge -= 0.5 * width_px; + + var offset = _vector2.default.rot([nudge * upp, 0], -angle); + var position = _vector2.default.add(this.position, offset); + + var obb = getOBB(position, width, height, angle, this.offset, upp); + var aabb = obb.getExtent(); + + this.obbs.push(obb); + this.aabbs.push(aabb); + + this.offsets[i] = [this.layout.offset[0] + nudge, this.layout.offset[1]]; + + nudge -= 0.5 * width_px + this.space_width; + } + + // Place labels forwards from kink index + nudge = 0.5 * (dx + this.space_width); + + for (var _i2 = this.kink_index; _i2 < this.num_segments; _i2++) { + var _width_px = this.size[_i2][0]; + var _angle = this.angle[_i2]; + + var _width = (_width_px + 2 * this.layout.buffer[0]) * upp * _label2.default.epsilon; + + nudge += 0.5 * _width_px; + + var _offset = _vector2.default.rot([nudge * upp, 0], -_angle); + var _position = _vector2.default.add(this.position, _offset); + + var _obb = getOBB(_position, _width, height, _angle, this.offset, upp); + var _aabb = _obb.getExtent(); + + this.obbs.push(_obb); + this.aabbs.push(_aabb); + + this.offsets[_i2] = [this.layout.offset[0] + nudge, this.layout.offset[1]]; + + nudge += 0.5 * _width_px + this.space_width; + } + break; + case PLACEMENT.MID_POINT: + var shift = -0.5 * this.total_length; // shift for centering the labels + + for (var _i3 = 0; _i3 < this.num_segments; _i3++) { + var _width_px2 = this.size[_i3][0]; + var _width2 = (_width_px2 + 2 * this.layout.buffer[0]) * upp * _label2.default.epsilon; + var _angle2 = this.angle[_i3]; + + shift += 0.5 * _width_px2; + + var _offset2 = _vector2.default.rot([shift * upp, 0], -_angle2); + var _position2 = _vector2.default.add(this.position, _offset2); + + var _obb2 = getOBB(_position2, _width2, height, _angle2, this.offset, upp); + var _aabb2 = _obb2.getExtent(); + + this.obbs.push(_obb2); + this.aabbs.push(_aabb2); + + this.offsets[_i3] = [this.layout.offset[0] + shift, this.layout.offset[1]]; + + shift += 0.5 * _width_px2 + this.space_width; + } + + break; + } } - // Try to move the label into the tile bounds - // Returns true if label was moved into tile, false if it couldn't be moved + // Checks each segment to see if it is within the tile. If any segment fails this test, they all fail. + // TODO: label group }, { - key: 'moveIntoTile', - value: function moveIntoTile() { - var in_tile = false; - var fits_to_segment = this.fitToSegment(); - - // Try line segments until we find one that fits the label (and is inside the tile) - while (!in_tile || !fits_to_segment) { - if (!this.moveNextSegment()) { - break; // we can't move further in this line + key: 'inTileBounds', + value: function inTileBounds() { + for (var i = 0; i < this.aabbs.length; i++) { + var aabb = this.aabbs[i]; + var obj = { aabb: aabb }; + var in_bounds = _label2.default.prototype.inTileBounds.call(obj); + if (!in_bounds) { + return false; } - - in_tile = this.inTileBounds(); - fits_to_segment = this.fitToSegment(); } + return true; + } + + // Adds each segment to the collision pass as its own bounding box + // TODO: label group - return in_tile && fits_to_segment; + }, { + key: 'add', + value: function add(bboxes) { + this.placed = true; + for (var i = 0; i < this.aabbs.length; i++) { + var aabb = this.aabbs[i]; + var obb = this.obbs[i]; + var obj = { aabb: aabb, obb: obb }; + _label2.default.prototype.add.call(obj, bboxes); + } } + + // Checks each segment to see if it should be discarded (via collision). If any segment fails this test, they all fail. + // TODO: label group + }, { key: 'discard', value: function discard(bboxes) { - // First find a line segment that fits the label - if (this.lines && !this.fitToSegment()) { - while (!this.fitToSegment()) { - if (!this.moveNextSegment()) { - return true; - } + var exclude = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + if (this.throw_away) { + return true; + } + + for (var i = 0; i < this.obbs.length; i++) { + var aabb = this.aabbs[i]; + var obb = this.obbs[i]; + var obj = { aabb: aabb, obb: obb }; + + var shouldDiscard = _label2.default.prototype.occluded.call(obj, bboxes, exclude); + if (shouldDiscard) { + return true; } } + return false; + } + }], [{ + key: 'nextLabel', + value: function nextLabel(label) { + // increment segment + var hasNext = label.getNextSegment(); + if (!hasNext) { + return false; + } + + // clone options + var layout = (0, _create2.default)(label.layout); + layout.segment_index = label.segment_index; + layout.placement = label.placement; - // If label fits in line, run standard discard tests - return (0, _get3.default)((0, _getPrototypeOf2.default)(LabelLine.prototype), 'discard', this).call(this, bboxes); + // create new label + var nextLabel = new LabelLine(label.size, label.lines, layout); + + return nextLabel.throw_away ? false : nextLabel; } }]); return LabelLine; -}(_label2.default); +}(); + +// Private method to calculate oriented bounding box + exports.default = LabelLine; +function getOBB(position, width, height, angle, offset, upp) { + var p0 = void 0, + p1 = void 0; + // apply offset, x positive, y pointing down + if (offset && (offset[0] !== 0 || offset[1] !== 0)) { + offset = _vector2.default.rot(offset, angle); + p0 = position[0] + offset[0] * upp; + p1 = position[1] - offset[1] * upp; + } else { + p0 = position[0]; + p1 = position[1]; + } + + // the angle of the obb is negative since it's the tile system y axis is pointing down + return new _obb4.default(p0, p1, -angle, width, height); +} + +// Private method to calculate the angle of a segment. +// Transforms the angle to lie within the range [0, PI/2] and [3*PI/2, 2*PI] (1st or 4th quadrants) +// as other ranges produce "upside down" labels +function getAngleFromSegment(pt1, pt2) { + var PI = Math.PI; + var PI_2 = PI / 2; + var p1p2 = _vector2.default.sub(pt1, pt2); + var theta = Math.atan2(p1p2[0], p1p2[1]) + PI_2; + + if (theta > PI_2) { + // If in 2nd quadrant, move to 4th quadrant + theta += PI; + theta %= 2 * Math.PI; + } else if (theta < 0) { + // If in 4th quadrant, make a positive angle + theta += 2 * PI; + } -},{"../utils/obb":352,"../vector":358,"./label":311,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],313:[function(_dereq_,module,exports){ + return theta; +} + +function calcFitness(line_length, label_length) { + return 1 - line_length / label_length; +} + +},{"../utils/obb":355,"../vector":361,"./label":313,"babel-runtime/core-js/object/create":10,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],315:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32801,6 +33190,13 @@ var LabelPoint = function (_Label) { _this.position = [position[0], position[1]]; _this.parent = _this.layout.parent; _this.update(); + + if (_this.layout.anchor) { + _this.start_anchor_index = 1; + } + + var hasNext = _this.getNextFit(); + _this.throw_away = !hasNext; return _this; } @@ -32881,7 +33277,35 @@ var LabelPoint = function (_Label) { this.updateBBoxes(); } - return this.inTileBounds(); + return updated; + } + }, { + key: 'getNextFit', + value: function getNextFit() { + if (!this.layout.cull_from_tile || this.inTileBounds()) { + return true; + } + + if (this.layout.move_into_tile) { + this.moveIntoTile(); + return true; + } else { + if (Array.isArray(this.layout.anchor)) { + // Start on second anchor (first anchor was set on creation) + for (var i = 1; i < this.layout.anchor.length; i++) { + this.anchor = this.layout.anchor[i]; + this.update(); + + this.start_anchor_index = i; + + if (this.inTileBounds()) { + return true; + } + } + } + // no anchors result in fit + return false; + } } }, { key: 'discard', @@ -32892,7 +33316,7 @@ var LabelPoint = function (_Label) { // If more than one anchor specified, try them in order if (Array.isArray(this.layout.anchor)) { // Start on second anchor (first anchor was set on creation) - for (var i = 1; i < this.layout.anchor.length; i++) { + for (var i = this.start_anchor_index; i < this.layout.anchor.length; i++) { this.anchor = this.layout.anchor[i]; this.update(); @@ -32915,7 +33339,7 @@ var LabelPoint = function (_Label) { exports.default = LabelPoint; -},{"../geo":297,"../styles/style_parser":338,"../utils/obb":352,"./label":311,"./point_anchor":314,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],314:[function(_dereq_,module,exports){ +},{"../geo":299,"../styles/style_parser":340,"../utils/obb":355,"./label":313,"./point_anchor":316,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],316:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32998,7 +33422,7 @@ exports.default = PointAnchor = { }; -},{}],315:[function(_dereq_,module,exports){ +},{}],317:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33126,7 +33550,7 @@ RepeatGroup.groups = {}; // will be allowed per group, e.g. set to tile size for one-label-per-tile RepeatGroup.max_repeat_dist = _geo2.default.tile_scale; -},{"../geo":297,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],316:[function(_dereq_,module,exports){ +},{"../geo":299,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],318:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33498,7 +33922,7 @@ function extendLeaflet(options) { } } -},{"./geo":297,"./scene":320,"./utils/thread":354,"./utils/utils":355,"babel-runtime/core-js/object/assign":9,"babel-runtime/helpers/typeof":29}],317:[function(_dereq_,module,exports){ +},{"./geo":299,"./scene":322,"./utils/thread":357,"./utils/utils":358,"babel-runtime/core-js/object/assign":9,"babel-runtime/helpers/typeof":29}],319:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33549,16 +33973,20 @@ var _geo = _dereq_('./geo'); var _geo2 = _interopRequireDefault(_geo); +var _vector = _dereq_('./vector'); + +var _vector2 = _interopRequireDefault(_vector); + var _style_parser = _dereq_('./styles/style_parser'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var shaderSrc_ambientLight = "/*\n\nExpected globals:\nlight_accumulator_*\n\n*/\n\nstruct AmbientLight {\n vec4 ambient;\n};\n\nvoid calculateLight(in AmbientLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n light_accumulator_ambient += _light.ambient;\n}\n"; -var shaderSrc_directionalLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct DirectionalLight {\n vec4 ambient;\n vec4 diffuse;\n vec4 specular;\n vec3 direction;\n};\n\nvoid calculateLight(in DirectionalLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n light_accumulator_ambient += _light.ambient;\n\n float nDotVP = clamp(dot(_normal, -normalize(_light.direction)), 0.0, 1.0);\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse += _light.diffuse * nDotVP;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n float pf = 0.0;\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(normalize(_light.direction), _normal);\n float eyeDotR = max(dot(normalize(_eyeToPoint), reflectVector), 0.0);\n pf = pow(eyeDotR, material.shininess);\n }\n light_accumulator_specular += _light.specular * pf;\n #endif\n}\n"; -var shaderSrc_pointLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct PointLight {\n vec4 ambient;\n vec4 diffuse;\n vec4 specular;\n vec4 position;\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float attenuationExponent;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n float innerRadius;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float outerRadius;\n#endif\n};\n\nvoid calculateLight(in PointLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n float dist = length(_light.position.xyz - _eyeToPoint);\n\n // Compute vector from surface to light position\n vec3 VP = (_light.position.xyz - _eyeToPoint) / dist;\n\n // Normalize the vector from surface to light position\n float nDotVP = clamp(dot(VP, _normal), 0.0, 1.0);\n\n // Attenuation defaults\n float attenuation = 1.0;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float Rin = 1.0;\n float e = _light.attenuationExponent;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #endif\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-(pow(d,e));\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/(pow(d,e)), 0.0, 1.0);\n #endif\n #else\n float Rin = 0.0;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/d, 0.0, 1.0);\n #endif\n #else\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float d = clamp(dist/_light.outerRadius, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n attenuation = 1.0;\n #endif\n #endif\n #endif\n\n // Computer accumulators\n light_accumulator_ambient += _light.ambient * attenuation;\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse += _light.diffuse * nDotVP * attenuation;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n float pf = 0.0; // power factor for shiny speculars\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(-VP, _normal);\n float eyeDotR = max(0.0, dot(-normalize(_eyeToPoint), reflectVector));\n pf = pow(eyeDotR, material.shininess);\n }\n\n light_accumulator_specular += _light.specular * pf * attenuation;\n #endif\n}\n"; -var shaderSrc_spotLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct SpotLight {\n vec4 ambient;\n vec4 diffuse;\n vec4 specular;\n vec4 position;\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float attenuationExponent;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n float innerRadius;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float outerRadius;\n#endif\n\n vec3 direction;\n float spotCosCutoff;\n float spotExponent;\n};\n\nvoid calculateLight(in SpotLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n float dist = length(_light.position.xyz - _eyeToPoint);\n\n // Compute vector from surface to light position\n vec3 VP = (_light.position.xyz - _eyeToPoint) / dist;\n\n // normal . light direction\n float nDotVP = clamp(dot(_normal, VP), 0.0, 1.0);\n\n // Attenuation defaults\n float attenuation = 1.0;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float Rin = 1.0;\n float e = _light.attenuationExponent;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #endif\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-(pow(d,e));\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/(pow(d,e)), 0.0, 1.0);\n #endif\n #else\n float Rin = 0.0;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/d, 0.0, 1.0);\n #endif\n #else\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float d = clamp(dist/_light.outerRadius, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n attenuation = 1.0;\n #endif\n #endif\n #endif\n\n // spotlight attenuation factor\n float spotAttenuation = 0.0;\n\n // See if point on surface is inside cone of illumination\n float spotDot = clamp(dot(-VP, normalize(_light.direction)), 0.0, 1.0);\n\n if (spotDot >= _light.spotCosCutoff) {\n spotAttenuation = pow(spotDot, _light.spotExponent);\n }\n\n light_accumulator_ambient += _light.ambient * attenuation * spotAttenuation;\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse += _light.diffuse * nDotVP * attenuation * spotAttenuation;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n // Power factor for shiny speculars\n float pf = 0.0;\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(-VP, _normal);\n float eyeDotR = max(dot(-normalize(_eyeToPoint), reflectVector), 0.0);\n pf = pow(eyeDotR, material.shininess);\n }\n light_accumulator_specular += _light.specular * pf * attenuation * spotAttenuation;\n #endif\n}\n"; +var shaderSrc_ambientLight = "/*\n\nExpected globals:\nlight_accumulator_*\n\n*/\n\nstruct AmbientLight {\n vec3 ambient;\n};\n\nvoid calculateLight(in AmbientLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n light_accumulator_ambient.rgb += _light.ambient;\n}\n"; +var shaderSrc_directionalLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct DirectionalLight {\n vec3 ambient;\n vec3 diffuse;\n vec3 specular;\n vec3 direction;\n};\n\nvoid calculateLight(in DirectionalLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n light_accumulator_ambient.rgb += _light.ambient;\n\n float nDotVP = clamp(dot(_normal, -_light.direction), 0.0, 1.0);\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse.rgb += _light.diffuse * nDotVP;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n float pf = 0.0;\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(_light.direction, _normal);\n float eyeDotR = max(dot(normalize(_eyeToPoint), reflectVector), 0.0);\n pf = pow(eyeDotR, material.shininess);\n }\n light_accumulator_specular.rgb += _light.specular * pf;\n #endif\n}\n"; +var shaderSrc_pointLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct PointLight {\n vec3 ambient;\n vec3 diffuse;\n vec3 specular;\n vec4 position;\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float attenuationExponent;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n float innerRadius;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float outerRadius;\n#endif\n};\n\nvoid calculateLight(in PointLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n float dist = length(_light.position.xyz - _eyeToPoint);\n\n // Compute vector from surface to light position\n vec3 VP = (_light.position.xyz - _eyeToPoint) / dist;\n\n // Normalize the vector from surface to light position\n float nDotVP = clamp(dot(VP, _normal), 0.0, 1.0);\n\n // Attenuation defaults\n float attenuation = 1.0;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float Rin = 1.0;\n float e = _light.attenuationExponent;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #endif\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-(pow(d,e));\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/(pow(d,e)), 0.0, 1.0);\n #endif\n #else\n float Rin = 0.0;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/d, 0.0, 1.0);\n #endif\n #else\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float d = clamp(dist/_light.outerRadius, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n attenuation = 1.0;\n #endif\n #endif\n #endif\n\n // Computer accumulators\n light_accumulator_ambient.rgb += _light.ambient * attenuation;\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse.rgb += _light.diffuse * nDotVP * attenuation;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n float pf = 0.0; // power factor for shiny speculars\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(-VP, _normal);\n float eyeDotR = max(0.0, dot(-normalize(_eyeToPoint), reflectVector));\n pf = pow(eyeDotR, material.shininess);\n }\n\n light_accumulator_specular.rgb += _light.specular * pf * attenuation;\n #endif\n}\n"; +var shaderSrc_spotLight = "/*\n\nExpected globals:\nmaterial\nlight_accumulator_*\n\n*/\n\nstruct SpotLight {\n vec3 ambient;\n vec3 diffuse;\n vec3 specular;\n vec4 position;\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float attenuationExponent;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n float innerRadius;\n#endif\n\n#ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float outerRadius;\n#endif\n\n vec3 direction;\n float spotCosCutoff;\n float spotExponent;\n};\n\nvoid calculateLight(in SpotLight _light, in vec3 _eyeToPoint, in vec3 _normal) {\n\n float dist = length(_light.position.xyz - _eyeToPoint);\n\n // Compute vector from surface to light position\n vec3 VP = (_light.position.xyz - _eyeToPoint) / dist;\n\n // normal . light direction\n float nDotVP = clamp(dot(_normal, VP), 0.0, 1.0);\n\n // Attenuation defaults\n float attenuation = 1.0;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_EXPONENT\n float Rin = 1.0;\n float e = _light.attenuationExponent;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #endif\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-(pow(d,e));\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/(pow(d,e)), 0.0, 1.0);\n #endif\n #else\n float Rin = 0.0;\n\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_INNER_RADIUS\n Rin = _light.innerRadius;\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float Rdiff = _light.outerRadius-Rin;\n float d = clamp(max(0.0,dist-Rin)/Rdiff, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n // If no outer is provide behaves like:\n // https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/\n float d = max(0.0,dist-Rin)/Rin+1.0;\n attenuation = clamp(1.0/d, 0.0, 1.0);\n #endif\n #else\n #ifdef TANGRAM_POINTLIGHT_ATTENUATION_OUTER_RADIUS\n float d = clamp(dist/_light.outerRadius, 0.0, 1.0);\n attenuation = 1.0-d*d;\n #else\n attenuation = 1.0;\n #endif\n #endif\n #endif\n\n // spotlight attenuation factor\n float spotAttenuation = 0.0;\n\n // See if point on surface is inside cone of illumination\n float spotDot = clamp(dot(-VP, _light.direction), 0.0, 1.0);\n\n if (spotDot >= _light.spotCosCutoff) {\n spotAttenuation = pow(spotDot, _light.spotExponent);\n }\n\n light_accumulator_ambient.rgb += _light.ambient * attenuation * spotAttenuation;\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse.rgb += _light.diffuse * nDotVP * attenuation * spotAttenuation;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n // Power factor for shiny speculars\n float pf = 0.0;\n if (nDotVP > 0.0) {\n vec3 reflectVector = reflect(-VP, _normal);\n float eyeDotR = max(dot(-normalize(_eyeToPoint), reflectVector), 0.0);\n pf = pow(eyeDotR, material.shininess);\n }\n light_accumulator_specular.rgb += _light.specular * pf * attenuation * spotAttenuation;\n #endif\n}\n"; // Abstract light @@ -33570,21 +33998,21 @@ var Light = function () { this.view = view; if (config.ambient == null || typeof config.ambient === 'number') { - this.ambient = _glsl2.default.expandVec4(config.ambient || 0); + this.ambient = _glsl2.default.expandVec3(config.ambient || 0); } else { - this.ambient = _style_parser.StyleParser.parseColor(config.ambient); + this.ambient = _style_parser.StyleParser.parseColor(config.ambient).slice(0, 3); } if (config.diffuse == null || typeof config.diffuse === 'number') { - this.diffuse = _glsl2.default.expandVec4(config.diffuse != null ? config.diffuse : 1); + this.diffuse = _glsl2.default.expandVec3(config.diffuse != null ? config.diffuse : 1); } else { - this.diffuse = _style_parser.StyleParser.parseColor(config.diffuse); + this.diffuse = _style_parser.StyleParser.parseColor(config.diffuse).slice(0, 3); } if (config.specular == null || typeof config.specular === 'number') { - this.specular = _glsl2.default.expandVec4(config.specular || 0); + this.specular = _glsl2.default.expandVec3(config.specular || 0); } else { - this.specular = _style_parser.StyleParser.parseColor(config.specular); + this.specular = _style_parser.StyleParser.parseColor(config.specular).slice(0, 3); } } @@ -33618,9 +34046,9 @@ var Light = function () { key: 'setupProgram', value: function setupProgram(_program) { // Three common light properties - _program.uniform('4fv', 'u_' + this.name + '.ambient', this.ambient); - _program.uniform('4fv', 'u_' + this.name + '.diffuse', this.diffuse); - _program.uniform('4fv', 'u_' + this.name + '.specular', this.specular); + _program.uniform('3fv', 'u_' + this.name + '.ambient', this.ambient); + _program.uniform('3fv', 'u_' + this.name + '.diffuse', this.diffuse); + _program.uniform('3fv', 'u_' + this.name + '.specular', this.specular); } }], [{ key: 'create', @@ -33678,13 +34106,10 @@ var Light = function () { // Add the calculation function to the list calculateLights += 'calculateLight(' + _light_name + ', _eyeToPoint, _normal);\n'; } - } else { - // If no light is defined, use 100% omnidirectional diffuse light - calculateLights = '\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n light_accumulator_diffuse = vec4(1.);\n #endif\n '; } // Glue together the final lighting function that sums all the lights - var calculateFunction = '\n vec4 calculateLighting(in vec3 _eyeToPoint, in vec3 _normal, in vec4 _color) {\n\n // Do initial material calculations over normal, emission, ambient, diffuse and specular values\n calculateMaterial(_eyeToPoint,_normal);\n\n // Un roll the loop of individual ligths to calculate\n ' + calculateLights + '\n\n // Final light intensity calculation\n vec4 color = vec4(0.0);\n\n #ifdef TANGRAM_MATERIAL_EMISSION\n color = material.emission;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color += light_accumulator_ambient * _color * material.ambient;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_ambient * _color * material.diffuse;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_diffuse * _color * material.diffuse;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color += light_accumulator_specular * material.specular;\n #endif\n\n // Clamp final color\n color = clamp(color, 0.0, 1.0);\n\n return color;\n }'; + var calculateFunction = '\n vec4 calculateLighting(in vec3 _eyeToPoint, in vec3 _normal, in vec4 _color) {\n\n // Do initial material calculations over normal, emission, ambient, diffuse and specular values\n calculateMaterial(_eyeToPoint,_normal);\n\n // Un roll the loop of individual ligths to calculate\n ' + calculateLights + '\n\n // Final light intensity calculation\n vec4 color = vec4(0.0);\n\n // Keep material alpha channel when alpha blending is on\n #if !defined(TANGRAM_BLEND_OPAQUE)\n #ifdef TANGRAM_MATERIAL_EMISSION\n color = material.emission;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color += light_accumulator_ambient * _color * material.ambient;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_ambient * _color * material.diffuse;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_diffuse * _color * material.diffuse;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color += light_accumulator_specular * material.specular;\n #endif\n // Multiply material alpha channel into material RGB when alpha blending is off\n #else\n color.a = _color.a; // use vertex color alpha\n\n #ifdef TANGRAM_MATERIAL_EMISSION\n color.rgb = material.emission.rgb * material.emission.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.ambient.rgb * material.ambient.a;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.diffuse.rgb * material.diffuse.a;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_diffuse.rgb * _color.rgb * material.diffuse.rgb * material.diffuse.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color.rgb += light_accumulator_specular.rgb * material.specular.rgb * material.specular.a;\n #endif\n #endif\n\n // Clamp final color\n color = clamp(color, 0.0, 1.0);\n\n return color;\n }'; _shader_program2.default.addBlock(Light.block, calculateFunction); } @@ -33721,7 +34146,7 @@ var AmbientLight = function (_Light) { (0, _createClass3.default)(AmbientLight, [{ key: 'setupProgram', value: function setupProgram(_program) { - _program.uniform('4fv', 'u_' + this.name + '.ambient', this.ambient); + _program.uniform('3fv', 'u_' + this.name + '.ambient', this.ambient); } }], [{ key: 'inject', @@ -33745,19 +34170,39 @@ var DirectionalLight = function (_Light2) { _this2.type = 'directional'; _this2.struct_name = 'DirectionalLight'; - _this2.direction = (config.direction || [0.2, 0.7, -0.5]).map(parseFloat); // [x, y, z] + if (config.direction) { + _this2._direction = config.direction; + } else { + // Default directional light maintains full intensity on ground, with basic extrusion shading + var theta = 135; // angle of light in xy plane (rotated around z axis) + var scale = Math.sin(Math.PI * 60 / 180); // scaling factor to keep total directional intensity to 0.5 + _this2._direction = [Math.cos(Math.PI * theta / 180) * scale, Math.sin(Math.PI * theta / 180) * scale, -0.5]; + + if (config.ambient == null) { + _this2.ambient = _glsl2.default.expandVec3(0.5); + } + } + _this2.direction = _this2._direction.map(parseFloat); return _this2; } - // Inject struct and calculate function - - (0, _createClass3.default)(DirectionalLight, [{ key: 'setupProgram', value: function setupProgram(_program) { (0, _get3.default)((0, _getPrototypeOf2.default)(DirectionalLight.prototype), 'setupProgram', this).call(this, _program); _program.uniform('3fv', 'u_' + this.name + '.direction', this.direction); } + }, { + key: 'direction', + get: function get() { + return this._direction; + }, + set: function set(v) { + this._direction = _vector2.default.normalize(v); + } + + // Inject struct and calculate function + }], [{ key: 'inject', value: function inject() { @@ -33890,15 +34335,12 @@ var SpotLight = function (_PointLight) { _this4.type = 'spotlight'; _this4.struct_name = 'SpotLight'; - _this4.direction = (config.direction || [0, 0, -1]).map(parseFloat); // [x, y, z] + _this4.direction = _this4._direction = (config.direction || [0, 0, -1]).map(parseFloat); // [x, y, z] _this4.exponent = config.exponent ? parseFloat(config.exponent) : 0.2; _this4.angle = config.angle ? parseFloat(config.angle) : 20; return _this4; } - // Inject struct and calculate function - - (0, _createClass3.default)(SpotLight, [{ key: 'setupProgram', value: function setupProgram(_program) { @@ -33908,6 +34350,17 @@ var SpotLight = function (_PointLight) { _program.uniform('1f', 'u_' + this.name + '.spotCosCutoff', Math.cos(this.angle * 3.14159 / 180)); _program.uniform('1f', 'u_' + this.name + '.spotExponent', this.exponent); } + }, { + key: 'direction', + get: function get() { + return this._direction; + }, + set: function set(v) { + this._direction = _vector2.default.normalize(v); + } + + // Inject struct and calculate function + }], [{ key: 'inject', value: function inject() { @@ -33919,7 +34372,7 @@ var SpotLight = function (_PointLight) { Light.types['spotlight'] = SpotLight; -},{"./geo":297,"./gl/glsl":301,"./gl/shader_program":303,"./styles/style_parser":338,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27}],318:[function(_dereq_,module,exports){ +},{"./geo":299,"./gl/glsl":303,"./gl/shader_program":305,"./styles/style_parser":340,"./vector":361,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27}],320:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33943,7 +34396,7 @@ var _style_parser = _dereq_('./styles/style_parser'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var shaderSrc_material = "/*\n\nDefines globals:\nmaterial\nlight_accumulator_*\n\n*/\n\n\n// MATERIALS\n//\nstruct Material {\n #ifdef TANGRAM_MATERIAL_EMISSION\n vec4 emission;\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\n vec3 emissionScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n vec4 ambient;\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\n vec3 ambientScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n vec4 diffuse;\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\n vec3 diffuseScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n vec4 specular;\n float shininess;\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\n vec3 specularScale;\n #endif\n #endif\n\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\n vec3 normalScale;\n float normalAmount;\n #endif\n};\n\n// Note: uniform is copied to a global instance to allow modification\nuniform Material u_material;\nMaterial material;\n\n#ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\nuniform sampler2D u_material_emission_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\nuniform sampler2D u_material_ambient_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\nuniform sampler2D u_material_diffuse_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\nuniform sampler2D u_material_specular_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\nuniform sampler2D u_material_normal_texture;\n#endif\n\n// Global light accumulators for each property\nvec4 light_accumulator_ambient = vec4(0.0);\nvec4 light_accumulator_diffuse = vec4(0.0);\n#ifdef TANGRAM_MATERIAL_SPECULAR\n vec4 light_accumulator_specular = vec4(0.0);\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_SPHEREMAP\nvec4 getSphereMap (in sampler2D _tex, in vec3 _eyeToPoint, in vec3 _normal, in vec2 _skew) {\n vec3 eye = normalize(_eyeToPoint);\n eye.xy -= _skew;\n eye = normalize(eye);\n\n vec3 r = reflect(eye, _normal);\n r.z += 1.0;\n float m = 2. * length(r);\n vec2 uv = r.xy / m + .5;\n return texture2D(_tex, uv);\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_TRIPLANAR\nvec3 getTriPlanarBlend (in vec3 _normal) {\n vec3 blending = abs(_normal);\n blending = normalize(max(blending, 0.00001));\n float b = (blending.x + blending.y + blending.z);\n return blending / b;\n}\n\nvec4 getTriPlanar (in sampler2D _tex, in vec3 _pos, in vec3 _normal, in vec3 _scale) {\n vec3 blending = getTriPlanarBlend(_normal);\n vec4 xaxis = texture2D(_tex, fract(_pos.yz * _scale.x));\n vec4 yaxis = texture2D(_tex, fract(_pos.xz * _scale.y));\n vec4 zaxis = texture2D(_tex, fract(_pos.xy * _scale.z));\n return xaxis * blending.x + yaxis * blending.y + zaxis * blending.z;\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_PLANAR\nvec4 getPlanar (in sampler2D _tex, in vec3 _pos, in vec2 _scale) {\n return texture2D( _tex, fract(_pos.xy * _scale.x) );\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\nvoid calculateNormal (inout vec3 _normal) {\n // Get NORMALMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_UV\n _normal += texture2D(u_material_normal_texture, fract(v_texcoord*material.normalScale.xy)).rgb*2.0-1.0;\n #endif\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_PLANAR\n vec3 normalTex = getPlanar(u_material_normal_texture, v_world_position.xyz, material.normalScale.xy).rgb*2.0-1.0;\n _normal += normalTex;\n #endif\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_TRIPLANAR\n vec3 normalTex = getTriPlanar(u_material_normal_texture, v_world_position.xyz, _normal, material.normalScale).rgb*2.0-1.0;\n _normal += normalTex;\n #endif\n\n _normal = normalize(_normal);\n}\n#endif\n\nvoid calculateMaterial (in vec3 _eyeToPoint, inout vec3 _normal) {\n // get EMISSION TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_UV\n material.emission *= texture2D(u_material_emission_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_PLANAR\n material.emission *= getPlanar(u_material_emission_texture, v_world_position.xyz, material.emissionScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_TRIPLANAR\n material.emission *= getTriPlanar(u_material_emission_texture, v_world_position.xyz, _normal, material.emissionScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_SPHEREMAP\n material.emission *= getSphereMap(u_material_emission_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get AMBIENT TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_UV\n material.ambient *= texture2D(u_material_ambient_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_PLANAR\n material.ambient *= getPlanar(u_material_ambient_texture, v_world_position.xyz, material.ambientScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_TRIPLANAR\n material.ambient *= getTriPlanar(u_material_ambient_texture, v_world_position.xyz, _normal, material.ambientScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_SPHEREMAP\n material.ambient *= getSphereMap(u_material_ambient_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get DIFFUSE TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_UV\n material.diffuse *= texture2D(u_material_diffuse_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_PLANAR\n material.diffuse *= getPlanar(u_material_diffuse_texture, v_world_position.xyz, material.diffuseScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_TRIPLANAR\n material.diffuse *= getTriPlanar(u_material_diffuse_texture, v_world_position.xyz, _normal, material.diffuseScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_SPHEREMAP\n material.diffuse *= getSphereMap(u_material_diffuse_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get SPECULAR TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_UV\n material.specular *= texture2D(u_material_specular_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_PLANAR\n material.specular *= getPlanar(u_material_specular_texture, v_world_position.xyz, material.specularScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_TRIPLANAR\n material.specular *= getTriPlanar(u_material_specular_texture, v_world_position.xyz, _normal, material.specularScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_SPHEREMAP\n material.specular *= getSphereMap(u_material_specular_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n}\n"; +var shaderSrc_material = "/*\n\nDefines globals:\nmaterial\nlight_accumulator_*\n\n*/\n\n\n// MATERIALS\n//\nstruct Material {\n #ifdef TANGRAM_MATERIAL_EMISSION\n vec4 emission;\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\n vec3 emissionScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n vec4 ambient;\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\n vec3 ambientScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n vec4 diffuse;\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\n vec3 diffuseScale;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n vec4 specular;\n float shininess;\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\n vec3 specularScale;\n #endif\n #endif\n\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\n vec3 normalScale;\n float normalAmount;\n #endif\n};\n\n// Note: uniform is copied to a global instance to allow modification\nuniform Material u_material;\nMaterial material;\n\n#ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\nuniform sampler2D u_material_emission_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\nuniform sampler2D u_material_ambient_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\nuniform sampler2D u_material_diffuse_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\nuniform sampler2D u_material_specular_texture;\n#endif\n\n#ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\nuniform sampler2D u_material_normal_texture;\n#endif\n\n// Global light accumulators for each property\nvec4 light_accumulator_ambient = vec4(vec3(0.0), 1.);\nvec4 light_accumulator_diffuse = vec4(vec3(0.0), 1.);\n#ifdef TANGRAM_MATERIAL_SPECULAR\n vec4 light_accumulator_specular = vec4(vec3(0.0), 1.);\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_SPHEREMAP\nvec4 getSphereMap (in sampler2D _tex, in vec3 _eyeToPoint, in vec3 _normal, in vec2 _skew) {\n vec3 eye = normalize(_eyeToPoint);\n eye.xy -= _skew;\n eye = normalize(eye);\n\n vec3 r = reflect(eye, _normal);\n r.z += 1.0;\n float m = 2. * length(r);\n vec2 uv = r.xy / m + .5;\n return texture2D(_tex, uv);\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_TRIPLANAR\nvec3 getTriPlanarBlend (in vec3 _normal) {\n vec3 blending = abs(_normal);\n blending = normalize(max(blending, 0.00001));\n float b = (blending.x + blending.y + blending.z);\n return blending / b;\n}\n\nvec4 getTriPlanar (in sampler2D _tex, in vec3 _pos, in vec3 _normal, in vec3 _scale) {\n vec3 blending = getTriPlanarBlend(_normal);\n vec4 xaxis = texture2D(_tex, fract(_pos.yz * _scale.x));\n vec4 yaxis = texture2D(_tex, fract(_pos.xz * _scale.y));\n vec4 zaxis = texture2D(_tex, fract(_pos.xy * _scale.z));\n return xaxis * blending.x + yaxis * blending.y + zaxis * blending.z;\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_TEXTURE_PLANAR\nvec4 getPlanar (in sampler2D _tex, in vec3 _pos, in vec2 _scale) {\n return texture2D( _tex, fract(_pos.xy * _scale.x) );\n}\n#endif\n\n\n#ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE\nvoid calculateNormal (inout vec3 _normal) {\n // Get NORMALMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_UV\n _normal += texture2D(u_material_normal_texture, fract(v_texcoord*material.normalScale.xy)).rgb*2.0-1.0;\n #endif\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_PLANAR\n vec3 normalTex = getPlanar(u_material_normal_texture, v_world_position.xyz, material.normalScale.xy).rgb*2.0-1.0;\n _normal += normalTex;\n #endif\n\n #ifdef TANGRAM_MATERIAL_NORMAL_TEXTURE_TRIPLANAR\n vec3 normalTex = getTriPlanar(u_material_normal_texture, v_world_position.xyz, _normal, material.normalScale).rgb*2.0-1.0;\n _normal += normalTex;\n #endif\n\n _normal = normalize(_normal);\n}\n#endif\n\nvoid calculateMaterial (in vec3 _eyeToPoint, inout vec3 _normal) {\n // get EMISSION TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_UV\n material.emission *= texture2D(u_material_emission_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_PLANAR\n material.emission *= getPlanar(u_material_emission_texture, v_world_position.xyz, material.emissionScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_TRIPLANAR\n material.emission *= getTriPlanar(u_material_emission_texture, v_world_position.xyz, _normal, material.emissionScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_EMISSION_TEXTURE_SPHEREMAP\n material.emission *= getSphereMap(u_material_emission_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get AMBIENT TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_UV\n material.ambient *= texture2D(u_material_ambient_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_PLANAR\n material.ambient *= getPlanar(u_material_ambient_texture, v_world_position.xyz, material.ambientScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_TRIPLANAR\n material.ambient *= getTriPlanar(u_material_ambient_texture, v_world_position.xyz, _normal, material.ambientScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT_TEXTURE_SPHEREMAP\n material.ambient *= getSphereMap(u_material_ambient_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get DIFFUSE TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_UV\n material.diffuse *= texture2D(u_material_diffuse_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_PLANAR\n material.diffuse *= getPlanar(u_material_diffuse_texture, v_world_position.xyz, material.diffuseScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_TRIPLANAR\n material.diffuse *= getTriPlanar(u_material_diffuse_texture, v_world_position.xyz, _normal, material.diffuseScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE_TEXTURE_SPHEREMAP\n material.diffuse *= getSphereMap(u_material_diffuse_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n\n // get SPECULAR TEXTUREMAP\n //------------------------------------------------\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_UV\n material.specular *= texture2D(u_material_specular_texture,v_texcoord);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_PLANAR\n material.specular *= getPlanar(u_material_specular_texture, v_world_position.xyz, material.specularScale.xy);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_TRIPLANAR\n material.specular *= getTriPlanar(u_material_specular_texture, v_world_position.xyz, _normal, material.specularScale);\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR_TEXTURE_SPHEREMAP\n material.specular *= getSphereMap(u_material_specular_texture, _eyeToPoint, _normal, u_vanishing_point);\n #endif\n #endif\n}\n"; var Material = function () { function Material(config) { @@ -34082,7 +34535,7 @@ exports.default = Material; Material.block = 'material'; -},{"./gl/glsl":301,"./styles/style_parser":338,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],319:[function(_dereq_,module,exports){ +},{"./gl/glsl":303,"./styles/style_parser":340,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],321:[function(_dereq_,module,exports){ 'use strict'; var _promise = _dereq_('babel-runtime/core-js/promise'); @@ -34117,6 +34570,10 @@ var _geo = _dereq_('./geo'); var _geo2 = _interopRequireDefault(_geo); +var _vector = _dereq_('./vector'); + +var _vector2 = _interopRequireDefault(_vector); + var _data_source = _dereq_('./sources/data_source'); var _data_source2 = _interopRequireDefault(_data_source); @@ -34190,18 +34647,16 @@ var _jszip2 = _interopRequireDefault(_jszip); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Make some modules accessible for debugging +/*jshint worker: true*/ - -// Additional modules are exposed for debugging - - -// The scene worker is only activated when a worker thread is instantiated, but must always be loaded +// The leaflet layer plugin is currently the primary public API var debug = { log: _log2.default, yaml: _jsYaml2.default, Thread: _thread2.default, Utils: _utils2.default, Geo: _geo2.default, + Vector: _vector2.default, DataSource: _data_source2.default, GLSL: _glsl2.default, ShaderProgram: _shader_program2.default, @@ -34219,9 +34674,12 @@ var debug = { FeatureSelection: _selection2.default, CanvasText: _canvas_text2.default, debugSettings: _debug_settings2.default -}; /*jshint worker: true*/ +}; -// The leaflet layer plugin is currently the primary public API +// Additional modules are exposed for debugging + + +// The scene worker is only activated when a worker thread is instantiated, but must always be loaded if (_thread2.default.is_main) { @@ -34241,7 +34699,7 @@ module.exports = { version: _version2.default }; -},{"./geo":297,"./gl/glsl":301,"./gl/shader_program":303,"./gl/texture":304,"./gl/vertex_data":307,"./labels/collision":310,"./leaflet_layer":316,"./light":317,"./material":318,"./scene":320,"./scene_worker":323,"./selection":324,"./sources/data_source":325,"./sources/geojson":326,"./sources/mvt":327,"./sources/raster":328,"./sources/topojson":329,"./styles/layer":330,"./styles/style_manager":337,"./styles/style_parser":338,"./styles/text/canvas_text":339,"./utils/debug_settings":347,"./utils/log":350,"./utils/thread":354,"./utils/utils":355,"./utils/version":356,"./utils/worker_broker":357,"babel-runtime/core-js/promise":17,"js-yaml":190,"jszip":226}],320:[function(_dereq_,module,exports){ +},{"./geo":299,"./gl/glsl":303,"./gl/shader_program":305,"./gl/texture":306,"./gl/vertex_data":309,"./labels/collision":312,"./leaflet_layer":318,"./light":319,"./material":320,"./scene":322,"./scene_worker":325,"./selection":326,"./sources/data_source":327,"./sources/geojson":328,"./sources/mvt":329,"./sources/raster":330,"./sources/topojson":331,"./styles/layer":332,"./styles/style_manager":339,"./styles/style_parser":340,"./styles/text/canvas_text":341,"./utils/debug_settings":349,"./utils/log":352,"./utils/thread":357,"./utils/utils":358,"./utils/version":359,"./utils/worker_broker":360,"./vector":361,"babel-runtime/core-js/promise":17,"js-yaml":190,"jszip":226}],322:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34354,6 +34812,10 @@ var _font_manager = _dereq_('./styles/text/font_manager'); var _font_manager2 = _interopRequireDefault(_font_manager); +var _media_capture = _dereq_('./utils/media_capture'); + +var _media_capture2 = _interopRequireDefault(_media_capture); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Load scene definition: pass an object directly, or a URL as string to load remotely @@ -34401,7 +34863,7 @@ var Scene = function () { this.last_render_count = 0; this.render_count_changed = false; this.frame = 0; - this.queue_screenshot = null; + this.media_capture = new _media_capture2.default(); this.selection = null; this.introspection = false; this.resetTime(); @@ -34447,11 +34909,11 @@ var Scene = function () { }).then(function () { _this.resetFeatureSelection(); - // Scene loaded from a JS object may contain functions which need to be serialized, - // while one loaded from a URL does not - return _this.updateConfig({ - serialize_funcs: (0, _typeof3.default)(_this.config_source) === 'object' - }); + // Scene loaded from a JS object, or modified by a `load` event, may contain compiled JS functions + // which need to be serialized, while one loaded only from a URL does not. + var serialize_funcs = (0, _typeof3.default)(_this.config_source) === 'object' || _this.hasSubscribersFor('load'); + + return _this.updateConfig({ serialize_funcs: serialize_funcs }); }).then(function () { _this.updating--; _this.initializing = null; @@ -34569,6 +35031,7 @@ var Scene = function () { this.resizeMap(this.container.clientWidth, this.container.clientHeight); _vao2.default.init(this.gl); this.render_states = new _render_state2.default(this.gl); + this.media_capture.setCanvas(this.canvas); } // Get the URL to load the web worker from @@ -34813,7 +35276,7 @@ var Scene = function () { this.updateDevicePixelRatio(); this.render(); this.updateViewComplete(); // fires event when rendered tile set or style changes - this.completeScreenshot(); // completes screenshot capture if requested + this.media_capture.completeScreenshot(); // completes screenshot capture if requested // Post-render loop hook if (typeof this.postUpdate === 'function') { @@ -35327,7 +35790,7 @@ var Scene = function () { }); } - // Mark sources that generate geometry tiles + // Mark sources that will generate geometry tiles // (all except those that are only raster sources attached to other sources) var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; @@ -35338,7 +35801,7 @@ var Scene = function () { var layer = _step2.value; if (layer.data && this.sources[layer.data.source]) { - this.sources[layer.data.source].geometry_tiles = true; + this.sources[layer.data.source].builds_geometry_tiles = true; } } } catch (err) { @@ -35599,7 +36062,6 @@ var Scene = function () { this.generation = ++Scene.generation; this.updating++; - this.config.scene = this.config.scene || {}; this.style_manager.init(); this.view.reset(); @@ -35745,44 +36207,19 @@ var Scene = function () { }, { key: 'screenshot', value: function screenshot() { - var _this15 = this; - - if (this.queue_screenshot != null) { - return this.queue_screenshot.promise; // only capture one screenshot at a time - } - this.requestRedraw(); - - // Will resolve once rendering is complete and render buffer is captured - this.queue_screenshot = {}; - this.queue_screenshot.promise = new _promise2.default(function (resolve, reject) { - _this15.queue_screenshot.resolve = resolve; - _this15.queue_screenshot.reject = reject; - }); - return this.queue_screenshot.promise; + return this.media_capture.screenshot(); } - - // Called after rendering, captures render buffer and resolves promise with image data - }, { - key: 'completeScreenshot', - value: function completeScreenshot() { - if (this.queue_screenshot != null) { - // Get data URL, convert to blob - // Strip host/mimetype/etc., convert base64 to binary without UTF-8 mangling - // Adapted from: https://gist.github.com/unconed/4370822 - var url = this.canvas.toDataURL('image/png'); - var data = atob(url.slice(22)); - var buffer = new Uint8Array(data.length); - for (var i = 0; i < data.length; ++i) { - buffer[i] = data.charCodeAt(i); - } - var blob = new Blob([buffer], { type: 'image/png' }); - - // Resolve with screenshot data - this.queue_screenshot.resolve({ url: url, blob: blob }); - this.queue_screenshot = null; - } + key: 'startVideoCapture', + value: function startVideoCapture() { + this.requestRedraw(); + return this.media_capture.startVideoCapture(); + } + }, { + key: 'stopVideoCapture', + value: function stopVideoCapture() { + return this.media_capture.stopVideoCapture(); } // Stats/debug/profiling methods @@ -35896,7 +36333,7 @@ exports.default = Scene; Scene.id = 0; // unique id for a scene instance Scene.generation = 0; // id that is incremented each time a scene config is re-parsed -},{"./gl/context":299,"./gl/render_state":302,"./gl/texture":304,"./gl/vao":305,"./light":317,"./scene_loader":322,"./selection":324,"./sources/data_source":325,"./styles/style":336,"./styles/style_manager":337,"./styles/style_parser":338,"./styles/text/font_manager":340,"./tile_manager":345,"./utils/log":350,"./utils/subscribe":353,"./utils/utils":355,"./utils/worker_broker":357,"./view":359,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],321:[function(_dereq_,module,exports){ +},{"./gl/context":301,"./gl/render_state":304,"./gl/texture":306,"./gl/vao":307,"./light":319,"./scene_loader":324,"./selection":326,"./sources/data_source":327,"./styles/style":338,"./styles/style_manager":339,"./styles/style_parser":340,"./styles/text/font_manager":342,"./tile_manager":347,"./utils/log":352,"./utils/media_capture":353,"./utils/subscribe":356,"./utils/utils":358,"./utils/worker_broker":360,"./view":362,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],323:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36178,7 +36615,7 @@ function createSceneBundle(url, path, parent) { return new SceneBundle(url, path, parent); } -},{"./utils/utils":355,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"jszip":226}],322:[function(_dereq_,module,exports){ +},{"./utils/utils":358,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"jszip":226}],324:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36588,6 +37025,13 @@ exports.default = SceneLoader = { return; } + // Ensure top-level properties + config.scene = config.scene || {}; + config.cameras = config.cameras || {}; + config.lights = config.lights || {}; + config.styles = config.styles || {}; + config.layers = config.layers || {}; + // Replace global scene properties config = this.applyGlobalProperties(config); @@ -36598,7 +37042,6 @@ exports.default = SceneLoader = { } // If only one camera specified, set it as default - config.cameras = config.cameras || {}; if (config.camera) { config.cameras.default = config.camera; } @@ -36642,10 +37085,14 @@ exports.default = SceneLoader = { config.cameras[(0, _keys2.default)(config.cameras)[0]].active = true; } - // Ensure top-level properties - config.lights = config.lights || {}; - config.styles = config.styles || {}; - config.layers = config.layers || {}; + // If no lights specified, create default + if ((0, _keys2.default)(config.lights).length === 0 || (0, _keys2.default)(config.lights).every(function (i) { + return config.lights[i].visible === false; + })) { + config.lights.default_light = { + type: 'directional' + }; + } return config; } @@ -36675,7 +37122,7 @@ function flattenProperties(obj) { (0, _subscribe2.default)(SceneLoader); -},{"./gl/glsl":301,"./scene_bundle":321,"./utils/log":350,"./utils/merge":351,"./utils/subscribe":353,"./utils/utils":355,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],323:[function(_dereq_,module,exports){ +},{"./gl/glsl":303,"./scene_bundle":323,"./utils/log":352,"./utils/merge":354,"./utils/subscribe":356,"./utils/utils":358,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],325:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37037,7 +37484,7 @@ if (_thread2.default.is_worker) { _worker_broker2.default.addTarget('self', self); } -},{"./gl/texture":304,"./selection":324,"./sources/data_source":325,"./styles/layer":330,"./styles/style_manager":337,"./styles/style_parser":338,"./tile":344,"./utils/log":350,"./utils/merge":351,"./utils/thread":354,"./utils/utils":355,"./utils/worker_broker":357,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28}],324:[function(_dereq_,module,exports){ +},{"./gl/texture":306,"./selection":326,"./sources/data_source":327,"./styles/layer":332,"./styles/style_manager":339,"./styles/style_parser":340,"./tile":346,"./utils/log":352,"./utils/merge":354,"./utils/thread":357,"./utils/utils":358,"./utils/worker_broker":360,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28}],326:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37368,7 +37815,7 @@ FeatureSelection.map_entry = 0; FeatureSelection.map_prefix = 0; // set by worker to worker id # FeatureSelection.defaultColor = [0, 0, 0, 1]; -},{"./gl/texture":304,"./utils/log":350,"./utils/worker_broker":357,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],325:[function(_dereq_,module,exports){ +},{"./gl/texture":306,"./utils/log":352,"./utils/worker_broker":360,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],327:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37376,6 +37823,10 @@ Object.defineProperty(exports, "__esModule", { }); exports.NetworkTileSource = exports.NetworkSource = undefined; +var _get2 = _dereq_('babel-runtime/helpers/get'); + +var _get3 = _interopRequireDefault(_get2); + var _promise = _dereq_('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); @@ -37404,6 +37855,10 @@ var _assign = _dereq_('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); +var _getIterator2 = _dereq_('babel-runtime/core-js/get-iterator'); + +var _getIterator3 = _interopRequireDefault(_getIterator2); + var _set = _dereq_('babel-runtime/core-js/set'); var _set2 = _interopRequireDefault(_set); @@ -37459,7 +37914,11 @@ var DataSource = function () { this.scripts = config.scripts; // overzoom will apply for zooms higher than this - this.max_zoom = config.max_zoom || _geo2.default.default_source_max_zoom; + this.max_zoom = config.max_zoom != null ? config.max_zoom : _geo2.default.default_source_max_zoom; + + // no tiles will be requested or displayed outside of these min/max values + this.min_display_zoom = config.min_display_zoom != null ? config.min_display_zoom : 0; + this.max_display_zoom = config.max_display_zoom != null ? config.max_display_zoom : null; } // Create a tile source by type, factory-style @@ -37526,6 +37985,47 @@ var DataSource = function () { return this.default_winding; } + // All data sources support a min zoom, tiled sources can subclass for more specific limits (e.g. bounding box) + + }, { + key: 'includesTile', + value: function includesTile(coords, style_zoom) { + // Limit by this data source + if (coords.z < this.min_display_zoom || this.max_display_zoom != null && style_zoom > this.max_display_zoom) { + return false; + } + + // Limit by any dependent raster sources + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = (0, _getIterator3.default)(this.rasters), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var source_name = _step.value; + + if (this.sources[source_name] && this.sources[source_name] !== this && !this.sources[source_name].includesTile(coords, coords.z)) { + return false; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return true; + } + // Register a new data source type, under a type name }], [{ @@ -37628,10 +38128,10 @@ DataSource.types = {}; // set of supported data source classes, referenced by ty var NetworkSource = exports.NetworkSource = function (_DataSource) { (0, _inherits3.default)(NetworkSource, _DataSource); - function NetworkSource(source) { + function NetworkSource(source, sources) { (0, _classCallCheck3.default)(this, NetworkSource); - var _this2 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(NetworkSource).call(this, source)); + var _this2 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(NetworkSource).call(this, source, sources)); _this2.url = _utils2.default.addParamsToURL(source.url, source.url_params); _this2.response_type = ""; // use to set explicit XHR type @@ -37700,12 +38200,19 @@ var NetworkSource = exports.NetworkSource = function (_DataSource) { var NetworkTileSource = exports.NetworkTileSource = function (_NetworkSource) { (0, _inherits3.default)(NetworkTileSource, _NetworkSource); - function NetworkTileSource(source) { + function NetworkTileSource(source, sources) { (0, _classCallCheck3.default)(this, NetworkTileSource); - var _this4 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(NetworkTileSource).call(this, source)); + var _this4 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(NetworkTileSource).call(this, source, sources)); _this4.tiled = true; + _this4.parseBounds(source); + + // indicates if source should build geometry tiles, enabled for sources referenced in the scene's layers, + // and left disabled for sources that are never referenced, or only used as raster textures + _this4.builds_geometry_tiles = false; + + _this4.tms = source.tms === true; // optionally flip tile coords for TMS _this4.url_hosts = null; var host_match = _this4.url.match(/{s:\[([^}+]+)\]}/); if (host_match != null && host_match.length > 1) { @@ -37715,10 +38222,77 @@ var NetworkTileSource = exports.NetworkTileSource = function (_NetworkSource) { return _this4; } + // Get bounds from source config parameters + + (0, _createClass3.default)(NetworkTileSource, [{ + key: 'parseBounds', + value: function parseBounds(source) { + if (Array.isArray(source.bounds) && source.bounds.length === 4) { + this.bounds = source.bounds; + + var _bounds = (0, _slicedToArray3.default)(this.bounds, 4); + + var w = _bounds[0]; + var s = _bounds[1]; + var e = _bounds[2]; + var n = _bounds[3]; + + this.bounds_meters = { + min: _geo2.default.latLngToMeters([w, n]), + max: _geo2.default.latLngToMeters([e, s]) + }; + this.bounds_tiles = { min: {}, max: {} }; // max tile bounds per zoom (lazily evaluated) + } + } + + // Returns false if tile is outside data source's bounds, true if within + + }, { + key: 'checkBounds', + value: function checkBounds(coords) { + // Check tile bounds + if (this.bounds) { + coords = _geo2.default.wrapTile(coords, { x: true }); + + var min = this.bounds_tiles.min[coords.z]; + if (!min) { + min = this.bounds_tiles.min[coords.z] = _geo2.default.tileForMeters(this.bounds_meters.min, coords.z); + } + + var max = this.bounds_tiles.max[coords.z]; + if (!max) { + max = this.bounds_tiles.max[coords.z] = _geo2.default.tileForMeters(this.bounds_meters.max, coords.z); + } + + if (coords.x < min.x || coords.x > max.x || coords.y < min.y || coords.y > max.y) { + return false; + } + } + return true; + } + }, { + key: 'includesTile', + value: function includesTile(coords, style_zoom) { + if (!(0, _get3.default)((0, _getPrototypeOf2.default)(NetworkTileSource.prototype), 'includesTile', this).call(this, coords, style_zoom)) { + return false; + } + + // Check tile bounds + if (!this.checkBounds(coords)) { + return false; + } + return true; + } + }, { key: 'formatUrl', value: function formatUrl(url_template, tile) { var coords = _geo2.default.wrapTile(tile.coords, { x: true }); + + if (this.tms) { + coords.y = Math.pow(2, coords.z) - 1 - coords.y; // optionally flip tile coords for TMS + } + var url = url_template.replace('{x}', coords.x).replace('{y}', coords.y).replace('{z}', coords.z); if (this.url_hosts != null) { @@ -37739,7 +38313,7 @@ var NetworkTileSource = exports.NetworkTileSource = function (_NetworkSource) { return NetworkTileSource; }(NetworkSource); -},{"../geo":297,"../utils/errors":348,"../utils/utils":355,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/promise":17,"babel-runtime/core-js/set":18,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28}],326:[function(_dereq_,module,exports){ +},{"../geo":299,"../utils/errors":350,"../utils/utils":358,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/promise":17,"babel-runtime/core-js/set":18,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28}],328:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37803,10 +38377,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var GeoJSONSource = exports.GeoJSONSource = function (_NetworkSource) { (0, _inherits3.default)(GeoJSONSource, _NetworkSource); - function GeoJSONSource(source) { + function GeoJSONSource(source, sources) { (0, _classCallCheck3.default)(this, GeoJSONSource); - var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(GeoJSONSource).call(this, source)); + var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(GeoJSONSource).call(this, source, sources)); _this.tiled = true; _this.load_data = null; @@ -37953,7 +38527,7 @@ var GeoJSONSource = exports.GeoJSONSource = function (_NetworkSource) { if (this.config.generate_label_centroids) { (function () { var features_centroid = []; - var centroid_properties = { "label_placement": "yes" }; + var centroid_properties = { "label_placement": true }; features.forEach(function (feature) { var coordinates = void 0, @@ -38017,13 +38591,13 @@ var GeoJSONSource = exports.GeoJSONSource = function (_NetworkSource) { var GeoJSONTileSource = exports.GeoJSONTileSource = function (_NetworkTileSource) { (0, _inherits3.default)(GeoJSONTileSource, _NetworkTileSource); - function GeoJSONTileSource(source) { + function GeoJSONTileSource(source, sources) { var _ret4; (0, _classCallCheck3.default)(this, GeoJSONTileSource); // Check for URL tile pattern, if not found, treat as standalone GeoJSON/TopoJSON object - var _this3 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(GeoJSONTileSource).call(this, source)); + var _this3 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(GeoJSONTileSource).call(this, source, sources)); if (!_this3.urlHasTilePattern(_this3.url)) { // Check instance type from parent class @@ -38091,7 +38665,7 @@ function getCentroidFeatureForPolygon(coordinates, properties, newProperties) { }; } -},{"../geo":297,"./data_source":325,"./mvt":327,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"geojson-vt":172}],327:[function(_dereq_,module,exports){ +},{"../geo":299,"./data_source":327,"./mvt":329,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"geojson-vt":172}],329:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38144,10 +38718,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var MVTSource = exports.MVTSource = function (_NetworkTileSource) { (0, _inherits3.default)(MVTSource, _NetworkTileSource); - function MVTSource(source) { + function MVTSource(source, sources) { (0, _classCallCheck3.default)(this, MVTSource); - var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(MVTSource).call(this, source)); + var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(MVTSource).call(this, source, sources)); _this.response_type = "arraybuffer"; // binary data return _this; @@ -38264,7 +38838,7 @@ function decodeMultiPolygon(geom) { _data_source2.default.register(MVTSource, 'MVT'); -},{"../geo":297,"./data_source":325,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"pbf":269,"vector-tile":288}],328:[function(_dereq_,module,exports){ +},{"../geo":299,"./data_source":327,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"pbf":276,"vector-tile":290}],330:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38317,10 +38891,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var RasterTileSource = exports.RasterTileSource = function (_NetworkTileSource) { (0, _inherits3.default)(RasterTileSource, _NetworkTileSource); - function RasterTileSource(source) { + function RasterTileSource(source, sources) { (0, _classCallCheck3.default)(this, RasterTileSource); - var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(RasterTileSource).call(this, source)); + var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(RasterTileSource).call(this, source, sources)); if (_this.rasters.indexOf(_this.name) === -1) { _this.rasters.unshift(_this.name); // add this raster as the first @@ -38379,7 +38953,7 @@ var RasterTileSource = exports.RasterTileSource = function (_NetworkTileSource) _data_source2.default.register(RasterTileSource, 'Raster'); -},{"../geo":297,"../tile":344,"./data_source":325,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/toConsumableArray":28}],329:[function(_dereq_,module,exports){ +},{"../geo":299,"../tile":346,"./data_source":327,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/toConsumableArray":28}],331:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38493,11 +39067,11 @@ function getTopoJSONFeature(topology, object) { var TopoJSONTileSource = exports.TopoJSONTileSource = function (_GeoJSONTileSource) { (0, _inherits3.default)(TopoJSONTileSource, _GeoJSONTileSource); - function TopoJSONTileSource(source) { + function TopoJSONTileSource(source, sources) { (0, _classCallCheck3.default)(this, TopoJSONTileSource); // Replace with non-tiled source if tiled source failed to instantiate - var _this2 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(TopoJSONTileSource).call(this, source)); + var _this2 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(TopoJSONTileSource).call(this, source, sources)); if (!_this2.urlHasTilePattern(_this2.url)) { var _ret; @@ -38520,7 +39094,7 @@ var TopoJSONTileSource = exports.TopoJSONTileSource = function (_GeoJSONTileSour _data_source2.default.register(TopoJSONTileSource, 'TopoJSON'); // prefered shorter name -},{"./data_source":325,"./geojson":326,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"topojson":283}],330:[function(_dereq_,module,exports){ +},{"./data_source":327,"./geojson":328,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/get":24,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"topojson":284}],332:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38739,7 +39313,7 @@ var Layer = function () { this.buildZooms(); this.buildPropMatches(); if (this.filter != null && (typeof this.filter === 'function' || (0, _keys2.default)(this.filter).length > 0)) { - this.filter = (0, _matchFeature.match)(this.filter); + this.filter = (0, _matchFeature.match)(this.filter, FilterOptions); } else { this.filter = null; } @@ -38967,6 +39541,16 @@ var LayerTree = exports.LayerTree = function (_Layer2) { return LayerTree; }(Layer); +var FilterOptions = { + // Handle unit conversions on filter ranges + rangeTransform: function rangeTransform(val) { + if (typeof val === 'string' && val.trim().slice(-3) === 'px2') { + return parseFloat(val) + ' * context.meters_per_pixel_sq'; + } + return val; + } +}; + function isWhiteListed(key) { return whiteList.indexOf(key) > -1; } @@ -39101,7 +39685,7 @@ function matchFeature(context, layers, collected_layers, collected_layers_ids) { return matched; } -},{"../utils/log":350,"../utils/merge":351,"../utils/utils":355,"./style_manager":337,"./style_parser":338,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29,"match-feature":251}],331:[function(_dereq_,module,exports){ +},{"../utils/log":352,"../utils/merge":354,"../utils/utils":358,"./style_manager":339,"./style_parser":340,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29,"match-feature":258}],333:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -39129,6 +39713,7 @@ function renderDashArray(pattern) { var dash_pixel = options.dash_color || default_dash_color; var background_color = options.background_color || default_background_color; var dashes = pattern; + var scale = options.scale || 1; // If pattern is odd, repeat it to make it even (see SVG spec) if (dashes.length % 2 === 1) { @@ -39138,7 +39723,7 @@ function renderDashArray(pattern) { var dash = true; var pixels = []; for (var i = 0; i < dashes.length; i++) { - var segment = dashes[i]; + var segment = Math.floor(dashes[i] * scale); for (var s = 0; s < segment; s++) { Array.prototype.push.apply(pixels, dash ? dash_pixel : background_color); } @@ -39151,7 +39736,7 @@ function renderDashArray(pattern) { return { pixels: pixels, length: length }; } -},{}],332:[function(_dereq_,module,exports){ +},{}],334:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39233,7 +39818,8 @@ var Lines = exports.Lines = (0, _create2.default)(_style.Style); // Line renderi this.defines.TANGRAM_TEXTURE_COORDS = true; // Scaling factor to add precision to line texture V coordinate packed as normalized short - this.defines.TANGRAM_V_SCALE_ADJUST = _geo2.default.tile_scale; + this.defines.TANGRAM_DASH_SCALE = 1; + this.defines.TANGRAM_V_SCALE_ADJUST = _geo2.default.tile_scale * this.defines.TANGRAM_DASH_SCALE; // Add vertex attribute for UVs only when needed attribs.push({ name: 'a_texcoord', size: 2, type: _constants2.default.UNSIGNED_SHORT, normalized: true }); @@ -39268,8 +39854,12 @@ var Lines = exports.Lines = (0, _create2.default)(_style.Style); // Line renderi this.defines.TANGRAM_LINE_BACKGROUND_COLOR = 'vec3(' + this.dash_background_color.slice(0, 3).join(', ') + ')'; } + // Adjust texcoord scale to allow for dash patterns that are a fraction of line width + this.defines.TANGRAM_DASH_SCALE = 20; + this.defines.TANGRAM_V_SCALE_ADJUST = _geo2.default.tile_scale * this.defines.TANGRAM_DASH_SCALE; + // Render line pattern - var dash = (0, _dasharray2.default)(this.dash); + var dash = (0, _dasharray2.default)(this.dash, { scale: this.defines.TANGRAM_DASH_SCALE }); this.texture = '_' + this.name + '_dasharray'; _texture2.default.create(this.gl, this.texture, { data: dash.pixels, @@ -39505,7 +40095,7 @@ var Lines = exports.Lines = (0, _create2.default)(_style.Style); // Line renderi } }); -},{"../../builders/polylines":295,"../../geo":297,"../../gl/constants":298,"../../gl/texture":304,"../../gl/vertex_layout":309,"../polygons/polygons":334,"../style":336,"../style_parser":338,"./dasharray":331,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],333:[function(_dereq_,module,exports){ +},{"../../builders/polylines":297,"../../geo":299,"../../gl/constants":300,"../../gl/texture":306,"../../gl/vertex_layout":311,"../polygons/polygons":336,"../style":338,"../style_parser":340,"./dasharray":333,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],335:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39733,7 +40323,7 @@ var Points = exports.Points = (0, _create2.default)(_style.Style); // size will be scaled to 16-bit signed int, so max allowed width + height of 256 pixels style.size = [Math.min(style.size[0] || style.size, 256), Math.min(style.size[1] || style.size, 256)]; - style.angle = _style_parser.StyleParser.evalProperty(draw.angle, context) || 0; + style.angle = _style_parser.StyleParser.evalProperty(draw.angle, context) * Math.PI / 180 || 0; style.sampler = 0; // 0 = sprites this.computeLayout(style, feature, draw, context, tile); @@ -39865,9 +40455,9 @@ var Points = exports.Points = (0, _create2.default)(_style.Style); var style = _this.feature_style; style.label = q.label; style.size = text_info.size.logical_size; + style.texcoords = text_info.align[q.label.align].texcoords; style.angle = q.label.angle || 0; style.sampler = 1; // non-0 = labels - style.texcoords = text_info.align[q.label.align].texcoords; _style.Style.addFeature.call(_this, q.feature, q.draw, q.context); }); @@ -39971,7 +40561,8 @@ var Points = exports.Points = (0, _create2.default)(_style.Style); for (var f = 0; f < feature_queue.length; f++) { var fq = feature_queue[f]; var text_info = this.texts[tile_key][fq.text_settings_key][fq.text]; - fq.label = new _label_point2.default(fq.point_label.position, text_info.size.collision_size, fq.layout); + var size = text_info.size.collision_size; + fq.label = new _label_point2.default(fq.point_label.position, size, fq.layout); labels.push(fq); } return labels; @@ -40082,28 +40673,54 @@ var Points = exports.Points = (0, _create2.default)(_style.Style); // Build quad for point sprite build: function build(style, vertex_data) { - var vertex_template = this.makeVertexTemplate(style); var label = style.label; + if (label.num_segments) { + this.buildArticulatedLabel(label, style, vertex_data); + } else { + this.buildLabel(label, style, vertex_data); + } + }, + buildLabel: function buildLabel(label, style, vertex_data) { + var vertex_template = this.makeVertexTemplate(style); this.buildQuad([label.position], // position style.size, // size in pixels - style.angle, // angle in degrees + style.angle, // angle in radians style.sampler, // texture sampler to use label.offset, // offset from center in pixels style.texcoords, // texture UVs vertex_data, vertex_template // VBO and data for current vertex ); }, + buildArticulatedLabel: function buildArticulatedLabel(label, style, vertex_data) { + var vertex_template = this.makeVertexTemplate(style); + + for (var i = 0; i < label.num_segments; i++) { + var angle = label.angle[i]; + var size = style.size[i]; + var offset = label.offsets[i]; + var texcoord = style.texcoords[i]; + + this.buildQuad([label.position], // position + size, // size in pixels + angle, // angle in degrees + style.sampler, // texture sampler to use + offset, // offset from center in pixels + texcoord, // texture UVs + vertex_data, vertex_template // VBO and data for current vertex + ); + } + }, // Override to pass-through to generic point builder - buildLines: function buildLines(lines, style, vertex_data) { + buildLines: function buildLines(lines, style, vertex_data, context) { this.build(style, vertex_data); }, - buildPoints: function buildPoints(points, style, vertex_data) { + buildPoints: function buildPoints(points, style, vertex_data, context) { this.build(style, vertex_data); }, - buildPolygons: function buildPolygons(points, style, vertex_data) { + buildPolygons: function buildPolygons(points, style, vertex_data, context) { this.build(style, vertex_data); }, makeMesh: function makeMesh(vertex_data, vertex_elements) { @@ -40115,7 +40732,7 @@ var Points = exports.Points = (0, _create2.default)(_style.Style); } }); -},{"../../builders/points":293,"../../geo":297,"../../gl/constants":298,"../../gl/texture":304,"../../gl/vertex_layout":309,"../../labels/collision":310,"../../labels/label_point":313,"../../utils/debug_settings":347,"../../utils/log":350,"../../vector":358,"../style":336,"../style_parser":338,"../text/text_labels":342,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27}],334:[function(_dereq_,module,exports){ +},{"../../builders/points":295,"../../geo":299,"../../gl/constants":300,"../../gl/texture":306,"../../gl/vertex_layout":311,"../../labels/collision":312,"../../labels/label_point":315,"../../utils/debug_settings":349,"../../utils/log":352,"../../vector":361,"../style":338,"../style_parser":340,"../text/text_labels":344,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27}],336:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40306,7 +40923,7 @@ exports.shaderSrc_polygonsFragment = shaderSrc_polygonsFragment; } }); -},{"../../builders/polygons":294,"../../geo":297,"../../gl/constants":298,"../../gl/vertex_layout":309,"../style":336,"../style_parser":338,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],335:[function(_dereq_,module,exports){ +},{"../../builders/polygons":296,"../../geo":299,"../../gl/constants":300,"../../gl/vertex_layout":311,"../style":338,"../style_parser":340,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],337:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40351,7 +40968,7 @@ var RasterStyle = exports.RasterStyle = (0, _create2.default)(_polygons.Polygons } }); -},{"../polygons/polygons":334,"../style_parser":338,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],336:[function(_dereq_,module,exports){ +},{"../polygons/polygons":336,"../style_parser":340,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],338:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41058,7 +41675,7 @@ var Style = exports.Style = { } }; -},{"../gl/shader_program":303,"../gl/texture":304,"../gl/vbo_mesh":306,"../light":317,"../material":318,"../selection":324,"../sources/raster":328,"../utils/log":350,"../utils/thread":354,"../utils/worker_broker":357,"./style_parser":338,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27}],337:[function(_dereq_,module,exports){ +},{"../gl/shader_program":305,"../gl/texture":306,"../gl/vbo_mesh":308,"../light":319,"../material":320,"../selection":326,"../sources/raster":330,"../utils/log":352,"../utils/thread":357,"../utils/worker_broker":360,"./style_parser":340,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27}],339:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41769,7 +42386,7 @@ var StyleManager = exports.StyleManager = function () { return StyleManager; }(); -},{"../geo":297,"../gl/shader_program":303,"../utils/log":350,"../utils/merge":351,"../utils/utils":355,"./lines/lines":332,"./points/points":333,"./polygons/polygons":334,"./raster/raster":335,"./text/text":341,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10,"babel-runtime/core-js/object/define-property":11,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28}],338:[function(_dereq_,module,exports){ +},{"../geo":299,"../gl/shader_program":305,"../utils/log":352,"../utils/merge":354,"../utils/utils":358,"./lines/lines":334,"./points/points":335,"./polygons/polygons":336,"./raster/raster":337,"./text/text":343,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10,"babel-runtime/core-js/object/define-property":11,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28}],340:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41853,6 +42470,7 @@ StyleParser.getFeatureParseContext = function (feature, tile, global) { zoom: tile.style_zoom, geometry: _geo2.default.geometryType(feature.geometry.type), meters_per_pixel: tile.meters_per_pixel, + meters_per_pixel_sq: tile.meters_per_pixel_sq, units_per_meter_overzoom: tile.units_per_meter_overzoom }; }; @@ -42182,7 +42800,7 @@ StyleParser.evalProperty = function (prop, context) { return prop; }; -},{"../geo":297,"../utils/utils":355,"babel-runtime/core-js/object/freeze":12,"csscolorparser":165}],339:[function(_dereq_,module,exports){ +},{"../geo":299,"../utils/utils":358,"babel-runtime/core-js/object/freeze":12,"csscolorparser":165}],341:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42193,10 +42811,6 @@ var _slicedToArray2 = _dereq_('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); -var _assign = _dereq_('babel-runtime/core-js/object/assign'); - -var _assign2 = _interopRequireDefault(_assign); - var _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); @@ -42230,7 +42844,8 @@ var CanvasText = function () { this.canvas = document.createElement('canvas'); this.canvas.style.backgroundColor = 'transparent'; // render text on transparent background this.context = this.canvas.getContext('2d'); - this.text_buffer = 8; // pixel padding around text + this.vertical_text_buffer = 8; // vertical pixel padding around text + this.horizontal_text_buffer = 4; // text styling such as italic emphasis is not measured by the Canvas API, so padding is necessary } (0, _createClass3.default)(CanvasText, [{ @@ -42254,10 +42869,11 @@ var CanvasText = function () { this.px_size = px_size; var ctx = this.context; + var dpr = _utils2.default.device_pixel_ratio; if (stroke && stroke_width > 0) { ctx.strokeStyle = stroke; - ctx.lineWidth = stroke_width; + ctx.lineWidth = stroke_width * dpr; } ctx.fillStyle = fill; @@ -42269,30 +42885,54 @@ var CanvasText = function () { value: function textSizes(texts) { var _this = this; + var dpr = _utils2.default.device_pixel_ratio; return _font_manager2.default.loadFonts().then(function () { for (var style in texts) { + CanvasText.text_cache[style] = CanvasText.text_cache[style] || {}; + var text_infos = texts[style]; var first = true; + var space_width = void 0; for (var text in text_infos) { - // Use cached size, or compute via canvas - if (!CanvasText.text_cache[style] || !CanvasText.text_cache[style][text]) { - var text_settings = text_infos[text].text_settings; - if (first) { - _this.setFont(text_settings); - first = false; - } + var text_info = text_infos[text]; + var text_settings = text_info.text_settings; - CanvasText.text_cache[style] = CanvasText.text_cache[style] || {}; - CanvasText.text_cache[style][text] = _this.textSize(text, text_settings.transform, text_settings.text_wrap); - CanvasText.cache_stats.misses++; - } else { - CanvasText.cache_stats.hits++; + if (first) { + _this.setFont(text_settings); + space_width = _this.context.measureText(' ').width / dpr; + first = false; } - // Only send text sizes back to worker (keep computed text line info - // on main thread, for future rendering) - text_infos[text].size = CanvasText.text_cache[style][text].size; + text_info.space_width = space_width; + + if (text_settings.can_articulate) { + var segments = splitLabelText(text); + + text_info.segments = segments; + text_info.size = []; + + for (var i = 0; i < segments.length; i++) { + var segment = segments[i]; + if (!CanvasText.text_cache[style][segment]) { + CanvasText.text_cache[style][segment] = _this.textSize(segment, text_settings); + CanvasText.cache_stats.misses++; + } else { + CanvasText.cache_stats.hits++; + } + text_info.size.push(CanvasText.text_cache[style][segment].size); + } + } else { + if (!CanvasText.text_cache[style][text]) { + CanvasText.text_cache[style][text] = _this.textSize(text, text_settings); + CanvasText.cache_stats.misses++; + } else { + CanvasText.cache_stats.hits++; + } + // Only send text sizes back to worker (keep computed text line info + // on main thread, for future rendering) + text_info.size = CanvasText.text_cache[style][text].size; + } } } @@ -42305,75 +42945,34 @@ var CanvasText = function () { }, { key: 'textSize', - value: function textSize(text, transform, text_wrap) { + value: function textSize(text, _ref2) { + var transform = _ref2.transform; + var text_wrap = _ref2.text_wrap; + var max_lines = _ref2.max_lines; + var _ref2$stroke_width = _ref2.stroke_width; + var stroke_width = _ref2$stroke_width === undefined ? 0 : _ref2$stroke_width; + + var dpr = _utils2.default.device_pixel_ratio; var str = this.applyTextTransform(text, transform); var ctx = this.context; - var buffer = this.text_buffer * _utils2.default.device_pixel_ratio; - var leading = 2 * _utils2.default.device_pixel_ratio; // make configurable and/or use Canvas TextMetrics when available + var vertical_buffer = this.vertical_text_buffer * dpr; + var horizontal_buffer = dpr * (stroke_width + this.horizontal_text_buffer); + var leading = 2 * dpr; // make configurable and/or use Canvas TextMetrics when available var line_height = this.px_size + leading; // px_size already in device pixels - // Word wrapping - // Line breaks can be caused by: - // - implicit line break when a maximum character threshold is exceeded per line (text_wrap) - // - explicit line break in the label text (\n) - var words = void 0; - if (typeof text_wrap === 'number') { - words = str.split(' '); // split words on spaces - } else { - words = [str]; // no max line word wrapping (but new lines will still be in effect) - } - var new_line_template = { width: 0, chars: 0, text: '' }; - var line = (0, _assign2.default)({}, new_line_template); // current line - var lines = []; // completed lines - var max_width = 0; // max width to fit all lines - - // add current line buffer to completed lines, optionally start new line - function addLine(new_line) { - line.text = line.text.trim(); - if (line.text.length > 0) { - line.width = ctx.measureText(line.text).width; - max_width = Math.max(max_width, Math.ceil(line.width)); - lines.push(line); - } - if (new_line) { - line = (0, _assign2.default)({}, new_line_template); - } - } - - // First iterate on space-break groups (will be one if max line length off), then iterate on line-break groups - for (var w = 0; w < words.length; w++) { - var breaks = words[w].split('\n'); // split on line breaks - - for (var n = 0; n < breaks.length; n++) { - var word = breaks[n]; - - // if adding current word would overflow, add a new line instead - if (line.chars + word.length > text_wrap && line.chars > 0) { - addLine(true); - } - - // add current word (plus space) - line.chars += word.length + 1; - line.text += word + ' '; - - // if line breaks present, add new line (unless on last line) - if (breaks.length > 1 && n < breaks.length - 1) { - addLine(true); - } - } - } - addLine(false); + // Parse string into series of lines if it exceeds the text wrapping value or contains line breaks + var multiline = MultiLine.parse(str, text_wrap, max_lines, line_height, ctx); // Final dimensions of text - var height = lines.length * line_height; + var height = multiline.height; + var width = multiline.width; + var lines = multiline.lines; - var collision_size = [max_width / _utils2.default.device_pixel_ratio, height / _utils2.default.device_pixel_ratio]; + var collision_size = [width / dpr, height / dpr]; - var texture_size = [max_width + buffer * 2, height + buffer * 2]; + var texture_size = [width + 2 * horizontal_buffer, height + 2 * vertical_buffer]; - var logical_size = texture_size.map(function (v) { - return v / _utils2.default.device_pixel_ratio; - }); + var logical_size = [texture_size[0] / dpr, texture_size[1] / dpr]; // Returns lines (w/per-line info for drawing) and text's overall bounding box + canvas size return { @@ -42382,47 +42981,27 @@ var CanvasText = function () { }; } - // Draw one or more lines of text at specified location, adjusting for buffer and baseline + // Draw multiple lines of text }, { - key: 'drawText', - value: function drawText(lines, _ref2, size, _ref3) { - var _ref4 = (0, _slicedToArray3.default)(_ref2, 2); + key: 'drawTextMultiLine', + value: function drawTextMultiLine(lines, _ref3, size, _ref4) { + var _ref5 = (0, _slicedToArray3.default)(_ref3, 2); - var x = _ref4[0]; - var y = _ref4[1]; - var stroke = _ref3.stroke; - var stroke_width = _ref3.stroke_width; - var transform = _ref3.transform; - var align = _ref3.align; - - align = align || 'center'; + var x = _ref5[0]; + var y = _ref5[1]; + var stroke = _ref4.stroke; + var _ref4$stroke_width = _ref4.stroke_width; + var stroke_width = _ref4$stroke_width === undefined ? 0 : _ref4$stroke_width; + var transform = _ref4.transform; + var align = _ref4.align; + var line_height = size.line_height; + var height = y; for (var line_num = 0; line_num < lines.length; line_num++) { var line = lines[line_num]; - var str = this.applyTextTransform(line.text, transform); - var buffer = this.text_buffer * _utils2.default.device_pixel_ratio; - var texture_size = size.texture_size; - var line_height = size.line_height; - - // Text alignment - var tx = void 0; - if (align === 'left') { - tx = x + buffer; - } else if (align === 'center') { - tx = x + texture_size[0] / 2 - line.width / 2; - } else if (align === 'right') { - tx = x + texture_size[0] - line.width - buffer; - } - - // In the absence of better Canvas TextMetrics (not supported by browsers yet), - // 0.75 buffer produces a better approximate vertical centering of text - var ty = y + buffer * 0.75 + (line_num + 1) * line_height; - - if (stroke && stroke_width > 0) { - this.context.strokeText(str, tx, ty); - } - this.context.fillText(str, tx, ty); + this.drawTextLine(line, [x, height], size, { stroke: stroke, stroke_width: stroke_width, transform: transform, align: align }); + height += line_height; } // Draw bounding boxes for debugging @@ -42430,13 +43009,14 @@ var CanvasText = function () { this.context.save(); var dpr = _utils2.default.device_pixel_ratio; - var _buffer = dpr * this.text_buffer; + var horizontal_buffer = dpr * (this.horizontal_text_buffer + stroke_width); + var vertical_buffer = dpr * this.vertical_text_buffer; var collision_size = size.collision_size; var lineWidth = 2; this.context.strokeStyle = 'blue'; this.context.lineWidth = lineWidth; - this.context.strokeRect(x + _buffer, y + _buffer, dpr * collision_size[0], dpr * collision_size[1]); + this.context.strokeRect(x + horizontal_buffer, y + vertical_buffer, dpr * collision_size[0], dpr * collision_size[1]); this.context.restore(); } @@ -42444,44 +43024,115 @@ var CanvasText = function () { if (_debug_settings2.default.draw_label_texture_boxes) { this.context.save(); - var _texture_size = size.texture_size; + var texture_size = size.texture_size; var _lineWidth = 2; this.context.strokeStyle = 'green'; this.context.lineWidth = _lineWidth; // stroke is applied internally, so the outer border is the edge of the texture - this.context.strokeRect(x + _lineWidth, y + _lineWidth, _texture_size[0] - 2 * _lineWidth, _texture_size[1] - 2 * _lineWidth); + this.context.strokeRect(x + _lineWidth, y + _lineWidth, texture_size[0] - 2 * _lineWidth, texture_size[1] - 2 * _lineWidth); this.context.restore(); } } + + // Draw single line of text at specified location, adjusting for buffer and baseline + + }, { + key: 'drawTextLine', + value: function drawTextLine(line, _ref6, size, _ref7) { + var _ref8 = (0, _slicedToArray3.default)(_ref6, 2); + + var x = _ref8[0]; + var y = _ref8[1]; + var stroke = _ref7.stroke; + var _ref7$stroke_width = _ref7.stroke_width; + var stroke_width = _ref7$stroke_width === undefined ? 0 : _ref7$stroke_width; + var transform = _ref7.transform; + var align = _ref7.align; + + var dpr = _utils2.default.device_pixel_ratio; + align = align || 'center'; + + var vertical_buffer = this.vertical_text_buffer * dpr; + var texture_size = size.texture_size; + var line_height = size.line_height; + var horizontal_buffer = dpr * (stroke_width + this.horizontal_text_buffer); + + var str = this.applyTextTransform(line.text, transform); + + // Text alignment + var tx = void 0; + if (align === 'left') { + tx = x + horizontal_buffer; + } else if (align === 'center') { + tx = x + texture_size[0] / 2 - line.width / 2; + } else if (align === 'right') { + tx = x + texture_size[0] - line.width - horizontal_buffer; + } + + // In the absence of better Canvas TextMetrics (not supported by browsers yet), + // 0.75 buffer produces a better approximate vertical centering of text + var ty = y + vertical_buffer * 0.75 + line_height; + + if (stroke && stroke_width > 0) { + this.context.strokeText(str, tx, ty); + } + this.context.fillText(str, tx, ty); + } }, { key: 'rasterize', - value: function rasterize(texts, texture_size) { + value: function rasterize(texts, texture_size, tile_key) { for (var style in texts) { var text_infos = texts[style]; var first = true; for (var text in text_infos) { - var info = text_infos[text]; - var text_settings = info.text_settings; - var lines = CanvasText.text_cache[style][text].lines; // get previously computed lines of text + var text_info = text_infos[text]; + var text_settings = text_info.text_settings; + // set font on first occurence of new font style if (first) { this.setFont(text_settings); first = false; } - // each alignment needs to be rendered separately - for (var align in info.align) { - this.drawText(lines, info.align[align].texture_position, info.size, { - stroke: text_settings.stroke, - stroke_width: text_settings.stroke_width, - transform: text_settings.transform, - align: align - }); + if (text_settings.can_articulate) { + var words = text_info.segments; + text_info.texcoords = []; + + for (var i = 0; i < words.length; i++) { + var word = words[i]; + var texcoord = void 0; + + if (CanvasText.texcoord_cache[tile_key][style][word].texcoord) { + texcoord = CanvasText.texcoord_cache[tile_key][style][word].texcoord; + } else { + var texture_position = CanvasText.texcoord_cache[tile_key][style][word].texture_position; + var size = CanvasText.text_cache[style][word].size; + var line = CanvasText.text_cache[style][word].lines; + + this.drawTextMultiLine(line, texture_position, size, text_settings); + + texcoord = _texture2.default.getTexcoordsForSprite(texture_position, size.texture_size, texture_size); + + CanvasText.texcoord_cache[tile_key][style][word].texcoord = texcoord; + } + + text_info.texcoords.push(texcoord); + } + } else { + var lines = CanvasText.text_cache[style][text].lines; // get previously computed lines of text + for (var align in text_info.align) { + this.drawTextMultiLine(lines, text_info.align[align].texture_position, text_info.size, { + stroke: text_settings.stroke, + stroke_width: text_settings.stroke_width, + transform: text_settings.transform, + align: align + }); - info.align[align].texcoords = _texture2.default.getTexcoordsForSprite(info.align[align].texture_position, info.size.texture_size, texture_size); + text_info.align[align].texcoords = _texture2.default.getTexcoordsForSprite(text_info.align[align].texture_position, text_info.size.texture_size, texture_size); + } } } } @@ -42491,50 +43142,86 @@ var CanvasText = function () { }, { key: 'setTextureTextPositions', - value: function setTextureTextPositions(texts, max_texture_size) { - // Find widest label - var widest = 0; - for (var style in texts) { - var text_infos = texts[style]; - for (var text in text_infos) { - var size = text_infos[text].size.texture_size; - if (size[0] > widest) { - widest = size[0]; - } - } + value: function setTextureTextPositions(texts, max_texture_size, tile_key) { + if (!CanvasText.texcoord_cache[tile_key]) { + CanvasText.texcoord_cache[tile_key] = {}; } + // Keep track of column width + var column_width = 0; + // Layout labels, stacked in columns var cx = 0, cy = 0; // current x/y position in atlas var height = 0; // overall atlas height - for (var _style in texts) { - var _text_infos = texts[_style]; - - for (var _text in _text_infos) { - var text_info = _text_infos[_text]; - // rendered size is same for all alignments - var _size = text_info.size.texture_size; - - // but each alignment needs to be rendered separately - for (var align in text_info.align) { - if (cy + _size[1] < max_texture_size) { - text_info.align[align].texture_position = [cx, cy]; // add label to current column - cy += _size[1]; - if (cy > height) { - height = cy; + for (var style in texts) { + if (!CanvasText.texcoord_cache[tile_key][style]) { + CanvasText.texcoord_cache[tile_key][style] = {}; + } + + var text_infos = texts[style]; + + for (var text in text_infos) { + var text_info = text_infos[text]; + + if (text_info.text_settings.can_articulate) { + var texture_position = void 0; + for (var i = 0; i < text_info.size.length; i++) { + var word = text_info.segments[i]; + + if (!CanvasText.texcoord_cache[tile_key][style][word]) { + var size = text_info.size[i].texture_size; + if (size[0] > column_width) { + column_width = size[0]; + } + if (cy + size[1] < max_texture_size) { + texture_position = [cx, cy]; + + cy += size[1]; + if (cy > height) { + height = cy; + } + } else { + // start new column if taller than texture + cx += column_width; + column_width = 0; + cy = 0; + texture_position = [cx, cy]; + } + + CanvasText.texcoord_cache[tile_key][style][word] = { + texture_position: texture_position + }; + } + } + } else { + // rendered size is same for all alignments + var _size = text_info.size.texture_size; + if (_size[0] > column_width) { + column_width = _size[0]; + } + + // but each alignment needs to be rendered separately + for (var align in text_info.align) { + if (cy + _size[1] < max_texture_size) { + text_info.align[align].texture_position = [cx, cy]; // add label to current column + cy += _size[1]; + if (cy > height) { + height = cy; + } + } else { + // start new column if taller than texture + cx += column_width; + column_width = 0; + cy = 0; + text_info.align[align].texture_position = [cx, cy]; } - } else { - // start new column if taller than texture - cx += widest; - cy = 0; - text_info.align[align].texture_position = [cx, cy]; } } } } - return [cx + widest, height]; // overall atlas size + return [cx + column_width, height]; // overall atlas size } // Called before rasterization @@ -42557,6 +43244,11 @@ var CanvasText = function () { // Convert font CSS-style size ('12px', '14pt', '1.5em', etc.) to pixel size (adjusted for device pixel ratio) // Defaults units to pixels if not specified + }, { + key: 'clearTexcoordCache', + value: function clearTexcoordCache(tile_key) { + CanvasText.texcoord_cache[tile_key] = {}; + } }], [{ key: 'fontPixelSize', value: function fontPixelSize(size) { @@ -42565,12 +43257,12 @@ var CanvasText = function () { } size = typeof size === 'string' ? size : String(size); // need a string for regex - var _ref5 = size.match(CanvasText.font_size_re) || []; + var _ref9 = size.match(CanvasText.font_size_re) || []; - var _ref6 = (0, _slicedToArray3.default)(_ref5, 3); + var _ref10 = (0, _slicedToArray3.default)(_ref9, 3); - var px_size = _ref6[1]; - var units = _ref6[2]; + var px_size = _ref10[1]; + var units = _ref10[2]; units = units || 'px'; @@ -42599,8 +43291,232 @@ CanvasText.font_size_re = /((?:[0-9]*\.)?[0-9]+)\s*(px|pt|em|%)?/; // Cache sizes of rendered text CanvasText.text_cache = {}; // by text style, then text string CanvasText.cache_stats = { hits: 0, misses: 0 }; +CanvasText.texcoord_cache = {}; -},{"../../gl/texture":304,"../../utils/debug_settings":347,"../../utils/utils":355,"./font_manager":340,"babel-runtime/core-js/object/assign":9,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27}],340:[function(_dereq_,module,exports){ +// Right-to-left / bi-directional text handling +// Taken from http://stackoverflow.com/questions/12006095/javascript-how-to-check-if-character-is-rtl +function isRTL(s) { + var weakChars = '\u0000-@[-`{-¿×÷ʹ-˿ -⯿‐-\u2029‬ -⯿', + rtlChars = '֑-߿‏‫‮יִ-﷽ﹰ-ﻼ', + rtlDirCheck = new RegExp('^[' + weakChars + ']*[' + rtlChars + ']'); + + return rtlDirCheck.test(s); +} + +function reorderWordsLTR(words) { + var words_LTR = []; + var words_RTL = []; + + // loop through words and re-order RTL groups in reverse order (but in LTR visual order) + for (var i = 0; i < words.length; i++) { + var str = words[i]; + var rtl = isRTL(str); + if (rtl) { + words_RTL.push(str); + } else { + while (words_RTL.length > 0) { + words_LTR.push(words_RTL.pop()); + } + words_LTR.push(str); + } + } + + while (words_RTL.length > 0) { + words_LTR.push(words_RTL.pop()); + } + + return words_LTR; +} + +// Splitting strategy for chopping a label into segments +function splitLabelText(text) { + var words = text.split(' '); + return reorderWordsLTR(words); +} + +// Private class to arrange text labels into multiple lines based on +// "text wrap" and "max line" values + +var MultiLine = function () { + function MultiLine(context) { + var max_lines = arguments.length <= 1 || arguments[1] === undefined ? Infinity : arguments[1]; + var text_wrap = arguments.length <= 2 || arguments[2] === undefined ? Infinity : arguments[2]; + (0, _classCallCheck3.default)(this, MultiLine); + + this.width = 0; + this.height = 0; + this.lines = []; + + this.ellipsis = '...'; + this.ellipsis_width = context.measureText(this.ellipsis).width; + + this.max_lines = max_lines; + this.text_wrap = text_wrap; + this.context = context; + } + + (0, _createClass3.default)(MultiLine, [{ + key: 'createLine', + value: function createLine(line_height) { + if (this.lines.length < this.max_lines) { + return new Line(line_height, this.text_wrap); + } else { + return false; + } + } + }, { + key: 'push', + value: function push(line) { + if (this.lines.length < this.max_lines) { + // measure line width + var line_width = this.context.measureText(line.text).width; + line.width = line_width; + + if (line_width > this.width) { + this.width = Math.ceil(line_width); + } + + // add to lines and increment height + this.lines.push(line); + this.height += line.height; + return true; + } else { + this.addEllipsis(); + return false; + } + } + + // pushes to the lines array and returns a new line if possible (false otherwise) + + }, { + key: 'advance', + value: function advance(line, line_height) { + var can_push = this.push(line); + if (can_push) { + return this.createLine(line_height); + } else { + return false; + } + } + }, { + key: 'addEllipsis', + value: function addEllipsis() { + var last_line = this.lines[this.lines.length - 1]; + + last_line.append(this.ellipsis); + last_line.width += this.ellipsis_width; + + if (last_line.width > this.width) { + this.width = last_line.width; + } + } + }, { + key: 'finish', + value: function finish(line) { + if (line) { + this.push(line); + } else { + this.addEllipsis(); + } + } + }], [{ + key: 'parse', + value: function parse(str, text_wrap, max_lines, line_height, ctx) { + // Word wrapping + // Line breaks can be caused by: + // - implicit line break when a maximum character threshold is exceeded per line (text_wrap) + // - explicit line break in the label text (\n) + var words = void 0; + if (typeof text_wrap === 'number') { + words = str.split(' '); // split words on spaces + } else { + words = [str]; // no max line word wrapping (but new lines will still be in effect) + } + + var multiline = new MultiLine(ctx, max_lines, text_wrap); + var line = multiline.createLine(line_height); + + // First iterate on space-break groups (will be one if max line length off), then iterate on line-break groups + for (var i = 0; i < words.length; i++) { + var breaks = words[i].split('\n'); // split on line breaks + var new_line = i === 0 ? true : false; + + for (var n = 0; n < breaks.length; n++) { + if (!line) { + break; + } + + var word = breaks[n].trim(); + + if (!word) { + continue; + } + + var spaced_word = new_line ? word : ' ' + word; + + // if adding current word would overflow, add a new line instead + // first word (i === 0) always appends + if (text_wrap && i > 0 && line.exceedsTextwrap(spaced_word)) { + line = multiline.advance(line, line_height); + if (!line) { + break; + } + line.append(word); + new_line = true; + } else { + line.append(spaced_word); + } + + // if line breaks present, add new line (unless on last line) + if (n < breaks.length - 1) { + line = multiline.advance(line, line_height); + new_line = true; + } + } + + if (i === words.length - 1) { + multiline.finish(line); + } + } + return multiline; + } + }]); + return MultiLine; +}(); + +// A Private class used by MultiLine to contain the logic for a single line +// including character count, width, height and text + + +var Line = function () { + function Line() { + var height = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var text_wrap = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + (0, _classCallCheck3.default)(this, Line); + + this.chars = 0; + this.text = ''; + + this.height = height; + this.text_wrap = text_wrap; + } + + (0, _createClass3.default)(Line, [{ + key: 'append', + value: function append(text) { + this.chars += text.length; + this.text += text; + } + }, { + key: 'exceedsTextwrap', + value: function exceedsTextwrap(text) { + return text.length + this.chars > this.text_wrap; + } + }]); + return Line; +}(); + +},{"../../gl/texture":306,"../../utils/debug_settings":349,"../../utils/utils":358,"./font_manager":342,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27}],342:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42778,7 +43694,7 @@ var FontManager = { }; /* global FontFace */ exports.default = FontManager; -},{"../../utils/log":350,"../../utils/utils":355,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/typeof":29,"fontfaceobserver":169}],341:[function(_dereq_,module,exports){ +},{"../../utils/log":352,"../../utils/utils":358,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/typeof":29,"fontfaceobserver":169}],343:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42865,6 +43781,9 @@ var TextStyle = exports.TextStyle = (0, _create2.default)(_points.Points); return; } + var type = feature.geometry.type; + draw.can_articulate = type === "LineString" || type === "MultiLineString"; + var q = this.parseTextFeature(feature, draw, context, tile); if (!q) { return; @@ -42914,9 +43833,18 @@ var TextStyle = exports.TextStyle = (0, _create2.default)(_points.Points); // setup styling object expected by Style class var style = _this.feature_style; style.label = q.label; - style.size = text_info.size.logical_size; - style.angle = q.label.angle || 0; - style.texcoords = text_info.align[q.label.align].texcoords; + + if (text_info.text_settings.can_articulate) { + // unpack logical sizes of each segment into an array for the style + style.size = text_info.size.map(function (size) { + return size.logical_size; + }); + style.texcoords = text_info.texcoords; + } else { + style.size = text_info.size.logical_size; + style.angle = q.label.angle || 0; + style.texcoords = text_info.align[q.label.align].texcoords; + } _style.Style.addFeature.call(_this, q.feature, q.draw, q.context); }); @@ -42948,7 +43876,16 @@ var TextStyle = exports.TextStyle = (0, _create2.default)(_points.Points); for (var f = 0; f < feature_queue.length; f++) { var fq = feature_queue[f]; var text_info = this.texts[tile_key][fq.text_settings_key][fq.text]; - var feature_labels = this.buildLabels(text_info.size.collision_size, fq.feature.geometry, fq.layout); + var feature_labels = void 0; + if (text_info.text_settings.can_articulate) { + var sizes = text_info.size.map(function (size) { + return size.collision_size; + }); + fq.layout.space_width = text_info.space_width; + feature_labels = this.buildLabels(sizes, fq.feature.geometry, fq.layout); + } else { + feature_labels = this.buildLabels(text_info.size.collision_size, fq.feature.geometry, fq.layout); + } for (var i = 0; i < feature_labels.length; i++) { var fql = (0, _create2.default)(fq); fql.label = feature_labels[i]; @@ -42999,19 +43936,75 @@ var TextStyle = exports.TextStyle = (0, _create2.default)(_points.Points); for (var i = 0; i < subdiv; i++) { layout.segment_start = Math.floor(i * seg_per_div); layout.segment_end = Math.floor((i + 1) * seg_per_div); - labels.push(new _label_line2.default(size, line, layout)); // TODO: swap constructor arg order + + labels.push(new _label_line2.default(size, line, layout)); } layout.segment_start = null; layout.segment_end = null; } else { - labels.push(new _label_line2.default(size, line, layout)); // TODO: swap constructor arg order + var label = new _label_line2.default(size, line, layout); + if (!label.throw_away) { + var chosen_label = placementStrategy(label); + if (chosen_label) { + labels.push(chosen_label); + } + } } } }); +var TARGET_STRAIGHT = 0.4; // Optimistic target ratio for straight labels (label length / line length) +var TARGET_KINKED = 0.5; // Optimistic target ratio for kinked labels (label length / line length) + +// Place labels according to the following strategy: +// - choose the best straight label that satisfies the optimistic straight cutoff (if any) +// - else choose the best kinked label that satisfies the optimistic kinked cutoff (if any) +// - else choose the best straight label that satisfies its internal (less optimistic) cutoff (if any) +// - else choose the best kinked labels that satisfies its internal (less optimistic) cutoff (if any) +// - else don't place a label +function placementStrategy(label) { + var labels_straight = []; + var labels_kinked = []; + var best_straight_fitness = Infinity; + var best_kinked_fitness = Infinity; + + // loop through all labels + while (label && !label.throw_away) { + if (label.kink_index > 0) { + // check if articulated label is above lowest cutoff + if (label.fitness < best_kinked_fitness) { + best_kinked_fitness = label.fitness; + labels_kinked.unshift(label); + } + } else { + // check if straight label is above lowest straight cutoff + if (label.fitness < best_straight_fitness) { + best_straight_fitness = label.fitness; + labels_straight.unshift(label); + } + } + + label = _label_line2.default.nextLabel(label); + } + + var best_straight = labels_straight[0]; + var best_kinked = labels_kinked[0]; + + if (labels_straight.length && best_straight.fitness < TARGET_STRAIGHT) { + // return the best straight segment if it is above the stricter straight cutoff + return best_straight; + } else if (labels_kinked.length && best_kinked.fitness < TARGET_KINKED) { + // return the best kinked segment if it is above the stricter kinked cutoff + return best_kinked; + } else { + // otherwise return best of what's left (if any) + return best_straight || best_kinked; + } +} + TextStyle.texture_id = 0; // namespaces per-tile label textures -},{"../../geo":297,"../../labels/collision":310,"../../labels/label_line":312,"../../labels/label_point":313,"../points/points":333,"../style":336,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],342:[function(_dereq_,module,exports){ +},{"../../geo":299,"../../labels/collision":312,"../../labels/label_line":314,"../../labels/label_point":315,"../points/points":335,"../style":338,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/create":10}],344:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -43193,8 +44186,10 @@ var TextLabels = exports.TextLabels = { labels.forEach(function (q) { var text_settings_key = q.text_settings_key; var text_info = texts[text_settings_key] && texts[text_settings_key][q.text]; - text_info.align = text_info.align || {}; - text_info.align[q.label.align] = {}; + if (!text_info.text_settings.can_articulate) { + text_info.align = text_info.align || {}; + text_info.align[q.label.align] = {}; + } }); // second call to main thread, for rasterizing the set of texts @@ -43251,14 +44246,16 @@ var TextLabels = exports.TextLabels = { // Called on main thread from worker, to create atlas of labels for a tile rasterizeTexts: function rasterizeTexts(tile_key, texts) { var canvas = new _canvas_text2.default(); - var texture_size = canvas.setTextureTextPositions(texts, this.max_texture_size); + canvas.clearTexcoordCache(tile_key); + + var texture_size = canvas.setTextureTextPositions(texts, this.max_texture_size, tile_key); (0, _log2.default)('trace', 'text summary for tile ' + tile_key + ': fits in ' + texture_size[0] + 'x' + texture_size[1] + 'px'); // fits in max texture size? if (texture_size[0] < this.max_texture_size && texture_size[1] < this.max_texture_size) { // update canvas size & rasterize all the text strings we need canvas.resize.apply(canvas, (0, _toConsumableArray3.default)(texture_size)); - canvas.rasterize(texts, texture_size); + canvas.rasterize(texts, texture_size, tile_key); } else { (0, _log2.default)('error', ['Label atlas for tile ' + tile_key + ' is ' + texture_size[0] + 'x' + texture_size[1] + 'px, ', 'but max GL texture size is ' + this.max_texture_size + 'x' + this.max_texture_size + 'px'].join('')); } @@ -43320,13 +44317,6 @@ var TextLabels = exports.TextLabels = { layout.cull_from_tile = draw.cull_from_tile != null ? draw.cull_from_tile : true; layout.move_into_tile = draw.move_into_tile != null ? draw.move_into_tile : true; - // label line exceed percentage - if (draw.line_exceed && draw.line_exceed.substr(-1) === '%') { - layout.line_exceed = parseFloat(draw.line_exceed.substr(0, draw.line_exceed.length - 1)); - } else { - layout.line_exceed = 80; - } - // repeat minimum distance layout.repeat_distance = _style_parser.StyleParser.evalCachedProperty(draw.repeat_distance, context); if (layout.repeat_distance == null) { @@ -43353,7 +44343,7 @@ var TextLabels = exports.TextLabels = { } }; -},{"../../geo":297,"../../gl/texture":304,"../../labels/collision":310,"../../utils/log":350,"../../utils/thread":354,"../../utils/worker_broker":357,"../style_parser":338,"../text/canvas_text":339,"../text/text_settings":343,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],343:[function(_dereq_,module,exports){ +},{"../../geo":299,"../../gl/texture":306,"../../labels/collision":312,"../../utils/log":352,"../../utils/thread":357,"../../utils/worker_broker":360,"../style_parser":340,"../text/canvas_text":341,"../text/text_settings":345,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],345:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -43378,7 +44368,7 @@ exports.default = TextSettings = { // A key for grouping all labels of the same text style (e.g. same Canvas state, to minimize state changes) key: function key(settings) { - return [settings.style, settings.weight, settings.family, settings.px_size, settings.fill, settings.stroke, settings.stroke_width, settings.transform, settings.text_wrap, _utils2.default.device_pixel_ratio].join('/'); + return [settings.style, settings.weight, settings.family, settings.px_size, settings.fill, settings.stroke, settings.stroke_width, settings.transform, settings.text_wrap, settings.max_lines, _utils2.default.device_pixel_ratio].join('/'); }, @@ -43390,6 +44380,7 @@ exports.default = TextSettings = { family: 'Helvetica', fill: 'white', text_wrap: 15, + max_lines: 5, align: 'center', stroke: null, stroke_width: 0 @@ -43400,6 +44391,9 @@ exports.default = TextSettings = { draw.font = draw.font || this.defaults; + // LineString labels can articulate while point labels cannot. Needed for future texture coordinate calculations. + style.can_articulate = draw.can_articulate; + // Use fill if specified, or default style.fill = draw.font.fill && _utils2.default.toCSSColor(_style_parser.StyleParser.evalCachedColorProperty(draw.font.fill, context)) || this.defaults.fill; @@ -43432,7 +44426,6 @@ exports.default = TextSettings = { if (draw.font.stroke && draw.font.stroke.color) { style.stroke = _utils2.default.toCSSColor(_style_parser.StyleParser.evalCachedColorProperty(draw.font.stroke.color, context) || this.defaults.stroke); style.stroke_width = _style_parser.StyleParser.evalCachedProperty(draw.font.stroke.width, context) || this.defaults.stroke_width; - style.stroke_width *= _utils2.default.device_pixel_ratio; } style.font_css = this.fontCSS(style); @@ -43440,6 +44433,7 @@ exports.default = TextSettings = { // Word wrap and text alignment // Not a font properties, but affect atlas of unique text textures var text_wrap = draw.text_wrap; // use explicitly set value + if (text_wrap == null && _geo2.default.geometryType(feature.geometry.type) !== 'line') { // point labels (for point and polygon features) have word wrap on w/default max length, // line labels default off @@ -43452,6 +44446,9 @@ exports.default = TextSettings = { } style.text_wrap = text_wrap; + // max_lines setting to truncate very long labels with an ellipsis + style.max_lines = draw.max_lines || this.defaults.max_lines; + return style; }, @@ -43470,7 +44467,7 @@ exports.default = TextSettings = { } }; -},{"../../geo":297,"../../utils/utils":355,"../style_parser":338}],344:[function(_dereq_,module,exports){ +},{"../../geo":299,"../../utils/utils":358,"../style_parser":340}],346:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -43579,7 +44576,8 @@ var Tile = function () { this.bounds = { sw: { x: this.min.x, y: this.max.y }, ne: { x: this.max.x, y: this.min.y } }; this.center_dist = 0; - this.meters_per_pixel = _geo2.default.metersPerPixel(this.coords.z); + this.meters_per_pixel = _geo2.default.metersPerPixel(this.style_zoom); + this.meters_per_pixel_sq = this.meters_per_pixel * this.meters_per_pixel; this.units_per_pixel = _geo2.default.units_per_pixel / this.overzoom2; // adjusted for overzoom this.units_per_meter_overzoom = _geo2.default.unitsPerMeter(this.coords.z) * this.overzoom2; // adjusted for overzoom @@ -43647,6 +44645,7 @@ var Tile = function () { max: this.max, units_per_pixel: this.units_per_pixel, meters_per_pixel: this.meters_per_pixel, + meters_per_pixel_sq: this.meters_per_pixel_sq, units_per_meter_overzoom: this.units_per_meter_overzoom, style_zoom: this.style_zoom, overzoom: this.overzoom, @@ -44258,7 +45257,7 @@ exports.default = Tile; Tile.coord_children = {}; // only allocate children coordinates once per coordinate -},{"./geo":297,"./gl/texture":304,"./labels/collision":310,"./styles/style_manager":337,"./styles/style_parser":338,"./utils/gl-matrix":349,"./utils/log":350,"./utils/worker_broker":357,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28}],345:[function(_dereq_,module,exports){ +},{"./geo":299,"./gl/texture":306,"./labels/collision":312,"./styles/style_manager":339,"./styles/style_parser":340,"./utils/gl-matrix":351,"./utils/log":352,"./utils/worker_broker":360,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28}],347:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -44618,7 +45617,8 @@ var TileManager = function () { // Determine necessary tiles for each source for (var s in this.scene.sources) { var source = this.scene.sources[s]; - if (!source.tiled || !source.geometry_tiles) { + // Check if data source should build this tile + if (!source.builds_geometry_tiles || !source.includesTile(coords, this.view.tile_zoom)) { continue; } @@ -44767,7 +45767,7 @@ var TileManager = function () { exports.default = TileManager; -},{"./tile":344,"./tile_pyramid":346,"./utils/log":350,"./utils/worker_broker":357,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],346:[function(_dereq_,module,exports){ +},{"./tile":346,"./tile_pyramid":348,"./utils/log":352,"./utils/worker_broker":360,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/keys":15,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],348:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -44981,7 +45981,7 @@ var TilePyramid = function () { exports.default = TilePyramid; -},{"./geo":297,"./tile":344,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/map":7,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28}],347:[function(_dereq_,module,exports){ +},{"./geo":299,"./tile":346,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/map":7,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/toConsumableArray":28}],349:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -44996,7 +45996,7 @@ exports.default = { suppress_label_fade_in: false }; -},{}],348:[function(_dereq_,module,exports){ +},{}],350:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45038,7 +46038,7 @@ var MethodNotImplemented = exports.MethodNotImplemented = function (_Error) { return MethodNotImplemented; }(Error); -},{"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],349:[function(_dereq_,module,exports){ +},{"babel-runtime/core-js/object/get-prototype-of":14,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/inherits":25,"babel-runtime/helpers/possibleConstructorReturn":26}],351:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45125,7 +46125,7 @@ exports.vec3 = vec3; exports.mat3 = mat3; exports.mat4 = mat4; -},{"gl-mat3/invert":176,"gl-mat3/normal-from-mat4":177,"gl-mat4/copy":178,"gl-mat4/identity":179,"gl-mat4/lookAt":180,"gl-mat4/multiply":181,"gl-mat4/perspective":182,"gl-mat4/scale":183,"gl-mat4/translate":184}],350:[function(_dereq_,module,exports){ +},{"gl-mat3/invert":176,"gl-mat3/normal-from-mat4":177,"gl-mat4/copy":178,"gl-mat4/identity":179,"gl-mat4/lookAt":180,"gl-mat4/multiply":181,"gl-mat4/perspective":182,"gl-mat4/scale":183,"gl-mat4/translate":184}],352:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45212,7 +46212,179 @@ if (_thread2.default.is_main) { _worker_broker2.default.addTarget('_logProxy', log); // proxy log messages from worker to main thread _worker_broker2.default.addTarget('_logSetLevelProxy', log.setLevel); // proxy log level setting from main to worker thread -},{"./thread":354,"./version":356,"./worker_broker":357,"babel-runtime/helpers/toConsumableArray":28}],351:[function(_dereq_,module,exports){ +},{"./thread":357,"./version":359,"./worker_broker":360,"babel-runtime/helpers/toConsumableArray":28}],353:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _promise = _dereq_('babel-runtime/core-js/promise'); + +var _promise2 = _interopRequireDefault(_promise); + +var _classCallCheck2 = _dereq_('babel-runtime/helpers/classCallCheck'); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _createClass2 = _dereq_('babel-runtime/helpers/createClass'); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _log = _dereq_('./log'); + +var _log2 = _interopRequireDefault(_log); + +var _utils = _dereq_('./utils'); + +var _utils2 = _interopRequireDefault(_utils); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* global MediaRecorder */ +var MediaCapture = function () { + function MediaCapture() { + (0, _classCallCheck3.default)(this, MediaCapture); + + this.queue_screenshot = null; + this.video_capture = null; + } + + (0, _createClass3.default)(MediaCapture, [{ + key: 'setCanvas', + value: function setCanvas(canvas) { + this.canvas = canvas; + } + + // Take a screenshot, returns a promise that resolves with the screenshot data when available + + }, { + key: 'screenshot', + value: function screenshot() { + var _this = this; + + if (this.queue_screenshot != null) { + return this.queue_screenshot.promise; // only capture one screenshot at a time + } + + // Will resolve once rendering is complete and render buffer is captured + this.queue_screenshot = {}; + this.queue_screenshot.promise = new _promise2.default(function (resolve, reject) { + _this.queue_screenshot.resolve = resolve; + _this.queue_screenshot.reject = reject; + }); + return this.queue_screenshot.promise; + } + + // Called after rendering, captures render buffer and resolves promise with the image data + + }, { + key: 'completeScreenshot', + value: function completeScreenshot() { + if (this.queue_screenshot != null) { + // Get data URL, convert to blob + // Strip host/mimetype/etc., convert base64 to binary without UTF-8 mangling + // Adapted from: https://gist.github.com/unconed/4370822 + var url = this.canvas.toDataURL('image/png'); + var data = atob(url.slice(22)); + var buffer = new Uint8Array(data.length); + for (var i = 0; i < data.length; ++i) { + buffer[i] = data.charCodeAt(i); + } + var blob = new Blob([buffer], { type: 'image/png' }); + + // Resolve with screenshot data + this.queue_screenshot.resolve({ url: url, blob: blob, type: 'png' }); + this.queue_screenshot = null; + } + } + + // Starts capturing a video stream from the canvas + + }, { + key: 'startVideoCapture', + value: function startVideoCapture() { + var _this2 = this; + + if (typeof window.MediaRecorder !== 'function' || !this.canvas || typeof this.canvas.captureStream !== 'function') { + (0, _log2.default)('warn', 'Video capture (Canvas.captureStream and/or MediaRecorder APIs) not supported by browser'); + return false; + } else if (this.video_capture) { + (0, _log2.default)('warn', 'Video capture already in progress, call Scene.stopVideoCapture() first'); + return false; + } + + // Start a new capture + try { + (function () { + var cap = _this2.video_capture = {}; + cap.chunks = []; + cap.stream = _this2.canvas.captureStream(); + cap.options = { mimeType: 'video/webm' }; // TODO: support other format options + cap.media_recorder = new MediaRecorder(cap.stream, cap.options); + cap.media_recorder.ondataavailable = function (event) { + if (event.data.size > 0) { + cap.chunks.push(event.data); + } + + // Stopped recording? Create the final capture file blob + if (cap.resolve) { + var blob = new Blob(cap.chunks, { type: cap.options.mimeType }); + var url = _utils2.default.createObjectURL(blob); + + // Explicitly remove all stream tracks, and set objects to null + var tracks = cap.stream.getTracks(); + tracks.forEach(function (track) { + track.stop(); + cap.stream.removeTrack(track); + }); + cap.stream = null; + cap.media_recorder = null; + _this2.video_capture = null; + + cap.resolve({ url: url, blob: blob, type: 'webm' }); + } + }; + cap.media_recorder.start(); + })(); + } catch (e) { + this.video_capture = null; + (0, _log2.default)('error', 'Scene video capture failed', e); + return false; + } + return true; + } + + // Stops capturing a video stream from the canvas, returns a promise that resolves with the video when available + + }, { + key: 'stopVideoCapture', + value: function stopVideoCapture() { + var _this3 = this; + + if (!this.video_capture) { + (0, _log2.default)('warn', 'No scene video capture in progress, call Scene.startVideoCapture() first'); + return _promise2.default.resolve({}); + } + + // Promise that will resolve when final stream is available + this.video_capture.promise = new _promise2.default(function (resolve, reject) { + _this3.video_capture.resolve = resolve; + _this3.video_capture.reject = reject; + }); + + // Stop recording + this.video_capture.media_recorder.stop(); + + return this.video_capture.promise; + } + }]); + return MediaCapture; +}(); + +exports.default = MediaCapture; + +},{"./log":352,"./utils":358,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],354:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45261,7 +46433,7 @@ function mergeObjects(dest) { return dest; } -},{"babel-runtime/helpers/typeof":29}],352:[function(_dereq_,module,exports){ +},{"babel-runtime/helpers/typeof":29}],355:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45381,7 +46553,7 @@ var OBB = function () { exports.default = OBB; -},{"../vector":358,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],353:[function(_dereq_,module,exports){ +},{"../vector":361,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],356:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -45407,23 +46579,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function subscribeMixin(target) { var listeners = new _set2.default(); - // var listeners = []; return (0, _assign2.default)(target, { subscribe: function subscribe(listener) { listeners.add(listener); - // listeners.push(listener); }, unsubscribe: function unsubscribe(listener) { listeners.delete(listener); - // var index = listeners.indexOf(listener); - // if (index > -1) { - // listeners.splice(index, 1); - // } }, unsubscribeAll: function unsubscribeAll() { listeners.clear(); - // listeners = []; }, trigger: function trigger(event) { for (var _len = arguments.length, data = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { @@ -45456,11 +46621,41 @@ function subscribeMixin(target) { } } } + }, + hasSubscribersFor: function hasSubscribersFor(event) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = (0, _getIterator3.default)(listeners), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var listener = _step2.value; + + if (typeof listener[event] === 'function') { + return true; + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return false; } }); } -},{"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/set":18}],354:[function(_dereq_,module,exports){ +},{"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/object/assign":9,"babel-runtime/core-js/set":18}],357:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -45492,7 +46687,7 @@ try { } } -},{}],355:[function(_dereq_,module,exports){ +},{}],358:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -46379,18 +47574,18 @@ Utils.debounce = function (func, wait, immediate) { }; }; -},{"../geo":297,"./log":350,"./thread":354,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/math/log2":8,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29,"babel-runtime/regenerator":30,"js-yaml":190}],356:[function(_dereq_,module,exports){ +},{"../geo":299,"./log":352,"./thread":357,"babel-runtime/core-js/get-iterator":4,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/math/log2":8,"babel-runtime/core-js/object/keys":15,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29,"babel-runtime/regenerator":30,"js-yaml":190}],359:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.9.5\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] --plugins transform-runtime ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] --plugins transform-runtime ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"babel-runtime\": \"6.11.6\",\n \"box-intersect\": \"1.0.0\",\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"match-feature\": \"tangrams/match-feature#v1.2.0\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson\": \"1.6.19\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-plugin-transform-runtime\": \"6.12.0\",\n \"babel-preset-es2015\": \"6.13.2\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); +var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.10.0\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] --plugins transform-runtime ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] --plugins transform-runtime ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"babel-runtime\": \"6.11.6\",\n \"box-intersect\": \"1.0.0\",\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"match-feature\": \"tangrams/match-feature#v1.3.1\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson\": \"1.6.19\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-plugin-transform-runtime\": \"6.12.0\",\n \"babel-preset-es2015\": \"6.13.2\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); var version = void 0; exports.default = version = 'v' + pkg.version; -},{}],357:[function(_dereq_,module,exports){ +},{}],360:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -47005,7 +48200,7 @@ if (_thread2.default.is_worker) { setupWorkerThread(); } -},{"./log":350,"./thread":354,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/map":7,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],358:[function(_dereq_,module,exports){ +},{"./log":352,"./thread":357,"babel-runtime/core-js/json/stringify":6,"babel-runtime/core-js/map":7,"babel-runtime/core-js/promise":17,"babel-runtime/helpers/slicedToArray":27,"babel-runtime/helpers/toConsumableArray":28,"babel-runtime/helpers/typeof":29}],361:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -47153,9 +48348,10 @@ Vector.isEqual = function (v1, v2) { Vector.lengthSq = function (v) { if (v.length === 2) { return v[0] * v[0] + v[1] * v[1]; - } else { + } else if (v.length >= 3) { return v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; } + return 0; }; // Vector length @@ -47174,15 +48370,15 @@ Vector.normalize = function (v) { return [v[0] / d, v[1] / d]; } return [0, 0]; - } else { + } else if (v.length >= 3) { d = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; d = Math.sqrt(d); if (d !== 0) { return [v[0] / d, v[1] / d, v[2] / d]; } - return [0, 0, 0]; } + return [0, 0, 0]; }; // Cross product of two vectors @@ -47200,7 +48396,7 @@ Vector.dot = function (v1, v2) { return n; }; -},{"babel-runtime/helpers/slicedToArray":27}],359:[function(_dereq_,module,exports){ +},{"babel-runtime/helpers/slicedToArray":27}],362:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -47615,6 +48811,6 @@ var View = function () { exports.default = View; -},{"./camera":296,"./geo":297,"./tile":344,"./utils/log":350,"./utils/subscribe":353,"./utils/utils":355,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27}]},{},[319])(319) +},{"./camera":298,"./geo":299,"./tile":346,"./utils/log":352,"./utils/subscribe":356,"./utils/utils":358,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22,"babel-runtime/helpers/slicedToArray":27}]},{},[321])(321) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9pcy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvbWF0aC9sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zZXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9nZXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCJub2RlX21vZHVsZXMvYml0LXR3aWRkbGUvdHdpZGRsZS5qcyIsIm5vZGVfbW9kdWxlcy9ib3gtaW50ZXJzZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL2JydXRlLmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL2ludGVyc2VjdC5qcyIsIm5vZGVfbW9kdWxlcy9ib3gtaW50ZXJzZWN0L2xpYi9tZWRpYW4uanMiLCJub2RlX21vZHVsZXMvYm94LWludGVyc2VjdC9saWIvcGFydGl0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL3NvcnQuanMiLCJub2RlX21vZHVsZXMvYm94LWludGVyc2VjdC9saWIvc3dlZXAuanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vbWF0aC9sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hhcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ludm9rZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fa2V5b2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21ldGEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2R1cC9kdXAuanMiLCJub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9mb250ZmFjZW9ic2VydmVyL2ZvbnRmYWNlb2JzZXJ2ZXIuc3RhbmRhbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvc2ltcGxpZnkuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvaW52ZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2NvcHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2xvb2tBdC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L211bHRpcGx5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvcGVyc3BlY3RpdmUuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9zY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3RyYW5zbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1zaGFkZXItZXJyb3JzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYmluYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy91bmRlZmluZWQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWVyZ2UuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3BhaXJzLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2Jhc2U2NC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvY29tcHJlc3NlZE9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvY29tcHJlc3Npb25zLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZGVmYXVsdHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2V4dGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2xvYWQuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9ub2RlanNVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvQXJyYXlSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9EYXRhUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvTm9kZUJ1ZmZlclJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL1N0cmluZ1JlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL1VpbnQ4QXJyYXlSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9yZWFkZXJGb3IuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3NpZ25hdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NvbnZlcnRXb3JrZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9DcmMzMlByb2JlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vRGF0YVdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0dlbmVyaWNXb3JrZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9TdHJlYW1IZWxwZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N1cHBvcnQuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3V0ZjguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBFbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBFbnRyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvemlwT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL21hdGNoLWZlYXR1cmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24vdG9wb2pzb24uanMiLCJub2RlX21vZHVsZXMvdHlwZWRhcnJheS1wb29sL3Bvb2wuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsInNyYy9idWlsZGVycy9jb21tb24uanMiLCJzcmMvYnVpbGRlcnMvcG9pbnRzLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlnb25zLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlsaW5lcy5qcyIsInNyYy9jYW1lcmEuanMiLCJzcmMvZ2VvLmpzIiwic3JjL2dsL2NvbnN0YW50cy5qcyIsInNyYy9nbC9jb250ZXh0LmpzIiwic3JjL2dsL2V4dGVuc2lvbnMuanMiLCJzcmMvZ2wvZ2xzbC5qcyIsInNyYy9nbC9yZW5kZXJfc3RhdGUuanMiLCJzcmMvZ2wvc2hhZGVyX3Byb2dyYW0uanMiLCJzcmMvZ2wvdGV4dHVyZS5qcyIsInNyYy9nbC92YW8uanMiLCJzcmMvZ2wvdmJvX21lc2guanMiLCJzcmMvZ2wvdmVydGV4X2RhdGEuanMiLCJzcmMvZ2wvdmVydGV4X2VsZW1lbnRzLmpzIiwic3JjL2dsL3ZlcnRleF9sYXlvdXQuanMiLCJzcmMvbGFiZWxzL2NvbGxpc2lvbi5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3JlcGVhdF9ncm91cC5qcyIsInNyYy9sZWFmbGV0X2xheWVyLmpzIiwic3JjL2xpZ2h0LmpzIiwic3JjL21hdGVyaWFsLmpzIiwic3JjL21vZHVsZS5qcyIsInNyYy9zY2VuZS5qcyIsInNyYy9zY2VuZV9idW5kbGUuanMiLCJzcmMvc2NlbmVfbG9hZGVyLmpzIiwic3JjL3NjZW5lX3dvcmtlci5qcyIsInNyYy9zZWxlY3Rpb24uanMiLCJzcmMvc291cmNlcy9kYXRhX3NvdXJjZS5qcyIsInNyYy9zb3VyY2VzL2dlb2pzb24uanMiLCJzcmMvc291cmNlcy9tdnQuanMiLCJzcmMvc291cmNlcy9yYXN0ZXIuanMiLCJzcmMvc291cmNlcy90b3BvanNvbi5qcyIsInNyYy9zdHlsZXMvbGF5ZXIuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2Rhc2hhcnJheS5qcyIsInNyYy9zdHlsZXMvbGluZXMvbGluZXMuanMiLCJzcmMvc3R5bGVzL3BvaW50cy9wb2ludHMuanMiLCJzcmMvc3R5bGVzL3BvbHlnb25zL3BvbHlnb25zLmpzIiwic3JjL3N0eWxlcy9yYXN0ZXIvcmFzdGVyLmpzIiwic3JjL3N0eWxlcy9zdHlsZS5qcyIsInNyYy9zdHlsZXMvc3R5bGVfbWFuYWdlci5qcyIsInNyYy9zdHlsZXMvc3R5bGVfcGFyc2VyLmpzIiwic3JjL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0LmpzIiwic3JjL3N0eWxlcy90ZXh0L2ZvbnRfbWFuYWdlci5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0LmpzIiwic3JjL3N0eWxlcy90ZXh0L3RleHRfbGFiZWxzLmpzIiwic3JjL3N0eWxlcy90ZXh0L3RleHRfc2V0dGluZ3MuanMiLCJzcmMvdGlsZS5qcyIsInNyYy90aWxlX21hbmFnZXIuanMiLCJzcmMvdGlsZV9weXJhbWlkLmpzIiwic3JjL3V0aWxzL2RlYnVnX3NldHRpbmdzLmpzIiwic3JjL3V0aWxzL2Vycm9ycy5qcyIsInNyYy91dGlscy9nbC1tYXRyaXguanMiLCJzcmMvdXRpbHMvbG9nLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9zdWJzY3JpYmUuanMiLCJzcmMvdXRpbHMvdGhyZWFkLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVOQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYkE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzN2REE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7O0FDQUE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBOztBQ0ZBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1cEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LEVBQXVCLGdCQUF2QixFQUF5QyxDQUFDLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBcEIsRUFBdUIsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUExQyxFQUE2QyxLQUFLLElBQWxELENBQXpDO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixvQkFBdEIsRUFBNEMsS0FBSyxnQkFBakQ7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLHNCQUF0QixFQUE4QyxnQkFBTSxrQkFBcEQ7O0FBRUEsaUJBQUssTUFBTCxDQUFZLFlBQVosQ0FBeUIsT0FBekI7QUFDSDs7Ozs7a0JBalRnQixJIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxudmFyIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbi8vIE11dGF0aW9uT2JzZXJ2ZXJzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGhhdmUgaGlnaCBwcmlvcml0eSBhbmQgd29ya1xuLy8gcmVsaWFibHkgZXZlcnl3aGVyZSB0aGV5IGFyZSBpbXBsZW1lbnRlZC5cbi8vIFRoZXkgYXJlIGltcGxlbWVudGVkIGluIGFsbCBtb2Rlcm4gYnJvd3NlcnMuXG4vL1xuLy8gLSBBbmRyb2lkIDQtNC4zXG4vLyAtIENocm9tZSAyNi0zNFxuLy8gLSBGaXJlZm94IDE0LTI5XG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDExXG4vLyAtIGlQYWQgU2FmYXJpIDYtNy4xXG4vLyAtIGlQaG9uZSBTYWZhcmkgNy03LjFcbi8vIC0gU2FmYXJpIDYtN1xuaWYgKHR5cGVvZiBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuXG4vLyBNZXNzYWdlQ2hhbm5lbHMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgZ2l2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBIVE1MXG4vLyB0YXNrIHF1ZXVlLCBhcmUgaW1wbGVtZW50ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAsIFNhZmFyaSA1LjAtMSwgYW5kIE9wZXJhXG4vLyAxMS0xMiwgYW5kIGluIHdlYiB3b3JrZXJzIGluIG1hbnkgZW5naW5lcy5cbi8vIEFsdGhvdWdoIG1lc3NhZ2UgY2hhbm5lbHMgeWllbGQgdG8gYW55IHF1ZXVlZCByZW5kZXJpbmcgYW5kIElPIHRhc2tzLCB0aGV5XG4vLyB3b3VsZCBiZSBiZXR0ZXIgdGhhbiBpbXBvc2luZyB0aGUgNG1zIGRlbGF5IG9mIHRpbWVycy5cbi8vIEhvd2V2ZXIsIHRoZXkgZG8gbm90IHdvcmsgcmVsaWFibHkgaW4gSW50ZXJuZXQgRXhwbG9yZXIgb3IgU2FmYXJpLlxuXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMCBpcyB0aGUgb25seSBicm93c2VyIHRoYXQgaGFzIHNldEltbWVkaWF0ZSBidXQgZG9lc1xuLy8gbm90IGhhdmUgTXV0YXRpb25PYnNlcnZlcnMuXG4vLyBBbHRob3VnaCBzZXRJbW1lZGlhdGUgeWllbGRzIHRvIHRoZSBicm93c2VyJ3MgcmVuZGVyZXIsIGl0IHdvdWxkIGJlXG4vLyBwcmVmZXJyYWJsZSB0byBmYWxsaW5nIGJhY2sgdG8gc2V0VGltZW91dCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlXG4vLyB0aGUgbWluaW11bSA0bXMgcGVuYWx0eS5cbi8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCBNb2JpbGUgKGFuZFxuLy8gRGVza3RvcCB0byBhIGxlc3NlciBleHRlbnQpIHRoYXQgcmVuZGVycyBib3RoIHNldEltbWVkaWF0ZSBhbmRcbi8vIE1lc3NhZ2VDaGFubmVsIHVzZWxlc3MgZm9yIHRoZSBwdXJwb3NlcyBvZiBBU0FQLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL2lzc3Vlcy8zOTZcblxuLy8gVGltZXJzIGFyZSBpbXBsZW1lbnRlZCB1bml2ZXJzYWxseS5cbi8vIFdlIGZhbGwgYmFjayB0byB0aW1lcnMgaW4gd29ya2VycyBpbiBtb3N0IGVuZ2luZXMsIGFuZCBpbiBmb3JlZ3JvdW5kXG4vLyBjb250ZXh0cyBpbiB0aGUgZm9sbG93aW5nIGJyb3dzZXJzLlxuLy8gSG93ZXZlciwgbm90ZSB0aGF0IGV2ZW4gdGhpcyBzaW1wbGUgY2FzZSByZXF1aXJlcyBudWFuY2VzIHRvIG9wZXJhdGUgaW4gYVxuLy8gYnJvYWQgc3BlY3RydW0gb2YgYnJvd3NlcnMuXG4vL1xuLy8gLSBGaXJlZm94IDMtMTNcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgNi05XG4vLyAtIGlQYWQgU2FmYXJpIDQuM1xuLy8gLSBMeW54IDIuOC43XG59IGVsc2Uge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihmbHVzaCk7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIHJlcXVlc3RzIHRoYXQgdGhlIGhpZ2ggcHJpb3JpdHkgZXZlbnQgcXVldWUgYmUgZmx1c2hlZCBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZS5cbi8vIFRoaXMgaXMgdXNlZnVsIHRvIHByZXZlbnQgYW4gZXJyb3IgdGhyb3duIGluIGEgdGFzayBmcm9tIHN0YWxsaW5nIHRoZSBldmVudFxuLy8gcXVldWUgaWYgdGhlIGV4Y2VwdGlvbiBoYW5kbGVkIGJ5IE5vZGUuanPigJlzXG4vLyBgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIpYCBvciBieSBhIGRvbWFpbi5cbnJhd0FzYXAucmVxdWVzdEZsdXNoID0gcmVxdWVzdEZsdXNoO1xuXG4vLyBUbyByZXF1ZXN0IGEgaGlnaCBwcmlvcml0eSBldmVudCwgd2UgaW5kdWNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgYnkgdG9nZ2xpbmdcbi8vIHRoZSB0ZXh0IG9mIGEgdGV4dCBub2RlIGJldHdlZW4gXCIxXCIgYW5kIFwiLTFcIi5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRvZ2dsZSA9IDE7XG4gICAgdmFyIG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIHRvZ2dsZSA9IC10b2dnbGU7XG4gICAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZTtcbiAgICB9O1xufVxuXG4vLyBUaGUgbWVzc2FnZSBjaGFubmVsIHRlY2huaXF1ZSB3YXMgZGlzY292ZXJlZCBieSBNYWx0ZSBVYmwgYW5kIHdhcyB0aGVcbi8vIG9yaWdpbmFsIGZvdW5kYXRpb24gZm9yIHRoaXMgbGlicmFyeS5cbi8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG5cbi8vIFNhZmFyaSA2LjAuNSAoYXQgbGVhc3QpIGludGVybWl0dGVudGx5IGZhaWxzIHRvIGNyZWF0ZSBtZXNzYWdlIHBvcnRzIG9uIGFcbi8vIHBhZ2UncyBmaXJzdCBsb2FkLiBUaGFua2Z1bGx5LCB0aGlzIHZlcnNpb24gb2YgU2FmYXJpIHN1cHBvcnRzXG4vLyBNdXRhdGlvbk9ic2VydmVycywgc28gd2UgZG9uJ3QgbmVlZCB0byBmYWxsIGJhY2sgaW4gdGhhdCBjYXNlLlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTWVzc2FnZUNoYW5uZWwoY2FsbGJhY2spIHtcbi8vICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuLy8gICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIEZvciByZWFzb25zIGV4cGxhaW5lZCBhYm92ZSwgd2UgYXJlIGFsc28gdW5hYmxlIHRvIHVzZSBgc2V0SW1tZWRpYXRlYFxuLy8gdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuXG4vLyBFdmVuIGlmIHdlIHdlcmUsIHRoZXJlIGlzIGFub3RoZXIgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwLlxuLy8gSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gYXNzaWduIGBzZXRJbW1lZGlhdGVgIHRvIGByZXF1ZXN0Rmx1c2hgIGJlY2F1c2Vcbi8vIGBzZXRJbW1lZGlhdGVgIG11c3QgYmUgY2FsbGVkICpieSBuYW1lKiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgd3JhcHBlZCBpbiBhXG4vLyBjbG9zdXJlLlxuLy8gTmV2ZXIgZm9yZ2V0LlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tU2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIFNhZmFyaSA2LjAgaGFzIGEgcHJvYmxlbSB3aGVyZSB0aW1lcnMgd2lsbCBnZXQgbG9zdCB3aGlsZSB0aGUgdXNlciBpc1xuLy8gc2Nyb2xsaW5nLiBUaGlzIHByb2JsZW0gZG9lcyBub3QgaW1wYWN0IEFTQVAgYmVjYXVzZSBTYWZhcmkgNi4wIHN1cHBvcnRzXG4vLyBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHRoYXQgaW1wbGVtZW50YXRpb24gaXMgdXNlZCBpbnN0ZWFkLlxuLy8gSG93ZXZlciwgaWYgd2UgZXZlciBlbGVjdCB0byB1c2UgdGltZXJzIGluIFNhZmFyaSwgdGhlIHByZXZhbGVudCB3b3JrLWFyb3VuZFxuLy8gaXMgdG8gYWRkIGEgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyIHRoYXQgY2FsbHMgZm9yIGEgZmx1c2guXG5cbi8vIGBzZXRUaW1lb3V0YCBkb2VzIG5vdCBjYWxsIHRoZSBwYXNzZWQgY2FsbGJhY2sgaWYgdGhlIGRlbGF5IGlzIGxlc3MgdGhhblxuLy8gYXBwcm94aW1hdGVseSA3IGluIHdlYiB3b3JrZXJzIGluIEZpcmVmb3ggOCB0aHJvdWdoIDE4LCBhbmQgc29tZXRpbWVzIG5vdFxuLy8gZXZlbiB0aGVuLlxuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIC8vIFdlIGRpc3BhdGNoIGEgdGltZW91dCB3aXRoIGEgc3BlY2lmaWVkIGRlbGF5IG9mIDAgZm9yIGVuZ2luZXMgdGhhdFxuICAgICAgICAvLyBjYW4gcmVsaWFibHkgYWNjb21tb2RhdGUgdGhhdCByZXF1ZXN0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSBzbmFwcGVkXG4gICAgICAgIC8vIHRvIGEgNCBtaWxpc2Vjb25kIGRlbGF5LCBidXQgb25jZSB3ZSdyZSBmbHVzaGluZywgdGhlcmUncyBubyBkZWxheVxuICAgICAgICAvLyBiZXR3ZWVuIGV2ZW50cy5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGhhbmRsZVRpbWVyLCAwKTtcbiAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhpcyB0aW1lciBnZXRzIGZyZXF1ZW50bHkgZHJvcHBlZCBpbiBGaXJlZm94XG4gICAgICAgIC8vIHdvcmtlcnMsIHdlIGVubGlzdCBhbiBpbnRlcnZhbCBoYW5kbGUgdGhhdCB3aWxsIHRyeSB0byBmaXJlXG4gICAgICAgIC8vIGFuIGV2ZW50IDIwIHRpbWVzIHBlciBzZWNvbmQgdW50aWwgaXQgc3VjY2VlZHMuXG4gICAgICAgIHZhciBpbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKGhhbmRsZVRpbWVyLCA1MCk7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVGltZXIoKSB7XG4gICAgICAgICAgICAvLyBXaGljaGV2ZXIgdGltZXIgc3VjY2VlZHMgd2lsbCBjYW5jZWwgYm90aCB0aW1lcnMgYW5kXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRoaXMgaXMgZm9yIGBhc2FwLmpzYCBvbmx5LlxuLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb25cbi8vIGl0cyBleGlzdGVuY2UuXG5yYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcjtcblxuLy8gQVNBUCB3YXMgb3JpZ2luYWxseSBhIG5leHRUaWNrIHNoaW0gaW5jbHVkZWQgaW4gUS4gVGhpcyB3YXMgZmFjdG9yZWQgb3V0XG4vLyBpbnRvIHRoaXMgQVNBUCBwYWNrYWdlLiBJdCB3YXMgbGF0ZXIgYWRhcHRlZCB0byBSU1ZQIHdoaWNoIG1hZGUgZnVydGhlclxuLy8gYW1lbmRtZW50cy4gVGhlc2UgZGVjaXNpb25zLCBwYXJ0aWN1bGFybHkgdG8gbWFyZ2luYWxpemUgTWVzc2FnZUNoYW5uZWwgYW5kXG4vLyB0byBjYXB0dXJlIHRoZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIGluIGEgY2xvc3VyZSwgd2VyZSBpbnRlZ3JhdGVkXG4vLyBiYWNrIGludG8gQVNBUCBwcm9wZXIuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvY2RkZjcyMzI1NDZhOWNmODU4NTI0Yjc1Y2RlNmY5ZWRmNzI2MjBhNy9saWIvcnN2cC9hc2FwLmpzXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vaXMtaXRlcmFibGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vbWFwXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hdGgvbG9nMlwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9jcmVhdGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zZXRcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKTtcblxudmFyIF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xuXG52YXIgX2dldE93blByb3BlcnR5RGVzY3JpcHRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICB2YXIgZGVzYyA9ICgwLCBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yMi5kZWZhdWx0KShvYmplY3QsIHByb3BlcnR5KTtcblxuICBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHBhcmVudCA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9zZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpO1xuXG52YXIgX3NldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NldFByb3RvdHlwZU9mKTtcblxudmFyIF9jcmVhdGUgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvY3JlYXRlXCIpO1xuXG52YXIgX2NyZWF0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGUpO1xuXG52YXIgX3R5cGVvZjIgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgKHR5cGVvZiBzdXBlckNsYXNzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KShzdXBlckNsYXNzKSkpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gKDAsIF9jcmVhdGUyLmRlZmF1bHQpKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2YyLmRlZmF1bHQgPyAoMCwgX3NldFByb3RvdHlwZU9mMi5kZWZhdWx0KShzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YyID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKCh0eXBlb2YgY2FsbCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoY2FsbCkpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2lzSXRlcmFibGUyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvaXMtaXRlcmFibGVcIik7XG5cbnZhciBfaXNJdGVyYWJsZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc0l0ZXJhYmxlMik7XG5cbnZhciBfZ2V0SXRlcmF0b3IyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvZ2V0LWl0ZXJhdG9yXCIpO1xuXG52YXIgX2dldEl0ZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEl0ZXJhdG9yMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gKDAsIF9nZXRJdGVyYXRvcjMuZGVmYXVsdCkoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzSXRlcmFibGUzLmRlZmF1bHQpKE9iamVjdChhcnIpKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2Zyb20gPSByZXF1aXJlKFwiLi4vY29yZS1qcy9hcnJheS9mcm9tXCIpO1xuXG52YXIgX2Zyb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycjJbaV0gPSBhcnJbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICgwLCBfZnJvbTIuZGVmYXVsdCkoYXJyKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbmZ1bmN0aW9uIGluaXQgKCkge1xuICB2YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbiAgfVxuXG4gIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcbn1cblxuaW5pdCgpXG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcGxhY2VIb2xkZXJzID0gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyoqXG4gKiBCaXQgdHdpZGRsaW5nIGhhY2tzIGZvciBKYXZhU2NyaXB0LlxuICpcbiAqIEF1dGhvcjogTWlrb2xhIEx5c2Vua29cbiAqXG4gKiBQb3J0ZWQgZnJvbSBTdGFuZm9yZCBiaXQgdHdpZGRsaW5nIGhhY2sgbGlicmFyeTpcbiAqICAgIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbFxuICovXG5cblwidXNlIHN0cmljdFwiOyBcInVzZSByZXN0cmljdFwiO1xuXG4vL051bWJlciBvZiBiaXRzIGluIGFuIGludGVnZXJcbnZhciBJTlRfQklUUyA9IDMyO1xuXG4vL0NvbnN0YW50c1xuZXhwb3J0cy5JTlRfQklUUyAgPSBJTlRfQklUUztcbmV4cG9ydHMuSU5UX01BWCAgID0gIDB4N2ZmZmZmZmY7XG5leHBvcnRzLklOVF9NSU4gICA9IC0xPDwoSU5UX0JJVFMtMSk7XG5cbi8vUmV0dXJucyAtMSwgMCwgKzEgZGVwZW5kaW5nIG9uIHNpZ24gb2YgeFxuZXhwb3J0cy5zaWduID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gKHYgPiAwKSAtICh2IDwgMCk7XG59XG5cbi8vQ29tcHV0ZXMgYWJzb2x1dGUgdmFsdWUgb2YgaW50ZWdlclxuZXhwb3J0cy5hYnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBtYXNrID0gdiA+PiAoSU5UX0JJVFMtMSk7XG4gIHJldHVybiAodiBeIG1hc2spIC0gbWFzaztcbn1cblxuLy9Db21wdXRlcyBtaW5pbXVtIG9mIGludGVnZXJzIHggYW5kIHlcbmV4cG9ydHMubWluID0gZnVuY3Rpb24oeCwgeSkge1xuICByZXR1cm4geSBeICgoeCBeIHkpICYgLSh4IDwgeSkpO1xufVxuXG4vL0NvbXB1dGVzIG1heGltdW0gb2YgaW50ZWdlcnMgeCBhbmQgeVxuZXhwb3J0cy5tYXggPSBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiB4IF4gKCh4IF4geSkgJiAtKHggPCB5KSk7XG59XG5cbi8vQ2hlY2tzIGlmIGEgbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvXG5leHBvcnRzLmlzUG93MiA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuICEodiAmICh2LTEpKSAmJiAoISF2KTtcbn1cblxuLy9Db21wdXRlcyBsb2cgYmFzZSAyIG9mIHZcbmV4cG9ydHMubG9nMiA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHIsIHNoaWZ0O1xuICByID0gICAgICh2ID4gMHhGRkZGKSA8PCA0OyB2ID4+Pj0gcjtcbiAgc2hpZnQgPSAodiA+IDB4RkYgICkgPDwgMzsgdiA+Pj49IHNoaWZ0OyByIHw9IHNoaWZ0O1xuICBzaGlmdCA9ICh2ID4gMHhGICAgKSA8PCAyOyB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7XG4gIHNoaWZ0ID0gKHYgPiAweDMgICApIDw8IDE7IHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdDtcbiAgcmV0dXJuIHIgfCAodiA+PiAxKTtcbn1cblxuLy9Db21wdXRlcyBsb2cgYmFzZSAxMCBvZiB2XG5leHBvcnRzLmxvZzEwID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gICh2ID49IDEwMDAwMDAwMDApID8gOSA6ICh2ID49IDEwMDAwMDAwMCkgPyA4IDogKHYgPj0gMTAwMDAwMDApID8gNyA6XG4gICAgICAgICAgKHYgPj0gMTAwMDAwMCkgPyA2IDogKHYgPj0gMTAwMDAwKSA/IDUgOiAodiA+PSAxMDAwMCkgPyA0IDpcbiAgICAgICAgICAodiA+PSAxMDAwKSA/IDMgOiAodiA+PSAxMDApID8gMiA6ICh2ID49IDEwKSA/IDEgOiAwO1xufVxuXG4vL0NvdW50cyBudW1iZXIgb2YgYml0c1xuZXhwb3J0cy5wb3BDb3VudCA9IGZ1bmN0aW9uKHYpIHtcbiAgdiA9IHYgLSAoKHYgPj4+IDEpICYgMHg1NTU1NTU1NSk7XG4gIHYgPSAodiAmIDB4MzMzMzMzMzMpICsgKCh2ID4+PiAyKSAmIDB4MzMzMzMzMzMpO1xuICByZXR1cm4gKCh2ICsgKHYgPj4+IDQpICYgMHhGMEYwRjBGKSAqIDB4MTAxMDEwMSkgPj4+IDI0O1xufVxuXG4vL0NvdW50cyBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3NcbmZ1bmN0aW9uIGNvdW50VHJhaWxpbmdaZXJvcyh2KSB7XG4gIHZhciBjID0gMzI7XG4gIHYgJj0gLXY7XG4gIGlmICh2KSBjLS07XG4gIGlmICh2ICYgMHgwMDAwRkZGRikgYyAtPSAxNjtcbiAgaWYgKHYgJiAweDAwRkYwMEZGKSBjIC09IDg7XG4gIGlmICh2ICYgMHgwRjBGMEYwRikgYyAtPSA0O1xuICBpZiAodiAmIDB4MzMzMzMzMzMpIGMgLT0gMjtcbiAgaWYgKHYgJiAweDU1NTU1NTU1KSBjIC09IDE7XG4gIHJldHVybiBjO1xufVxuZXhwb3J0cy5jb3VudFRyYWlsaW5nWmVyb3MgPSBjb3VudFRyYWlsaW5nWmVyb3M7XG5cbi8vUm91bmRzIHRvIG5leHQgcG93ZXIgb2YgMlxuZXhwb3J0cy5uZXh0UG93MiA9IGZ1bmN0aW9uKHYpIHtcbiAgdiArPSB2ID09PSAwO1xuICAtLXY7XG4gIHYgfD0gdiA+Pj4gMTtcbiAgdiB8PSB2ID4+PiAyO1xuICB2IHw9IHYgPj4+IDQ7XG4gIHYgfD0gdiA+Pj4gODtcbiAgdiB8PSB2ID4+PiAxNjtcbiAgcmV0dXJuIHYgKyAxO1xufVxuXG4vL1JvdW5kcyBkb3duIHRvIHByZXZpb3VzIHBvd2VyIG9mIDJcbmV4cG9ydHMucHJldlBvdzIgPSBmdW5jdGlvbih2KSB7XG4gIHYgfD0gdiA+Pj4gMTtcbiAgdiB8PSB2ID4+PiAyO1xuICB2IHw9IHYgPj4+IDQ7XG4gIHYgfD0gdiA+Pj4gODtcbiAgdiB8PSB2ID4+PiAxNjtcbiAgcmV0dXJuIHYgLSAodj4+PjEpO1xufVxuXG4vL0NvbXB1dGVzIHBhcml0eSBvZiB3b3JkXG5leHBvcnRzLnBhcml0eSA9IGZ1bmN0aW9uKHYpIHtcbiAgdiBePSB2ID4+PiAxNjtcbiAgdiBePSB2ID4+PiA4O1xuICB2IF49IHYgPj4+IDQ7XG4gIHYgJj0gMHhmO1xuICByZXR1cm4gKDB4Njk5NiA+Pj4gdikgJiAxO1xufVxuXG52YXIgUkVWRVJTRV9UQUJMRSA9IG5ldyBBcnJheSgyNTYpO1xuXG4oZnVuY3Rpb24odGFiKSB7XG4gIGZvcih2YXIgaT0wOyBpPDI1NjsgKytpKSB7XG4gICAgdmFyIHYgPSBpLCByID0gaSwgcyA9IDc7XG4gICAgZm9yICh2ID4+Pj0gMTsgdjsgdiA+Pj49IDEpIHtcbiAgICAgIHIgPDw9IDE7XG4gICAgICByIHw9IHYgJiAxO1xuICAgICAgLS1zO1xuICAgIH1cbiAgICB0YWJbaV0gPSAociA8PCBzKSAmIDB4ZmY7XG4gIH1cbn0pKFJFVkVSU0VfVEFCTEUpO1xuXG4vL1JldmVyc2UgYml0cyBpbiBhIDMyIGJpdCB3b3JkXG5leHBvcnRzLnJldmVyc2UgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiAgKFJFVkVSU0VfVEFCTEVbIHYgICAgICAgICAmIDB4ZmZdIDw8IDI0KSB8XG4gICAgICAgICAgKFJFVkVSU0VfVEFCTEVbKHYgPj4+IDgpICAmIDB4ZmZdIDw8IDE2KSB8XG4gICAgICAgICAgKFJFVkVSU0VfVEFCTEVbKHYgPj4+IDE2KSAmIDB4ZmZdIDw8IDgpICB8XG4gICAgICAgICAgIFJFVkVSU0VfVEFCTEVbKHYgPj4+IDI0KSAmIDB4ZmZdO1xufVxuXG4vL0ludGVybGVhdmUgYml0cyBvZiAyIGNvb3JkaW5hdGVzIHdpdGggMTYgYml0cy4gIFVzZWZ1bCBmb3IgZmFzdCBxdWFkdHJlZSBjb2Rlc1xuZXhwb3J0cy5pbnRlcmxlYXZlMiA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgeCAmPSAweEZGRkY7XG4gIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgeSAmPSAweEZGRkY7XG4gIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy9FeHRyYWN0cyB0aGUgbnRoIGludGVybGVhdmVkIGNvbXBvbmVudFxuZXhwb3J0cy5kZWludGVybGVhdmUyID0gZnVuY3Rpb24odiwgbikge1xuICB2ID0gKHYgPj4+IG4pICYgMHg1NTU1NTU1NTtcbiAgdiA9ICh2IHwgKHYgPj4+IDEpKSAgJiAweDMzMzMzMzMzO1xuICB2ID0gKHYgfCAodiA+Pj4gMikpICAmIDB4MEYwRjBGMEY7XG4gIHYgPSAodiB8ICh2ID4+PiA0KSkgICYgMHgwMEZGMDBGRjtcbiAgdiA9ICh2IHwgKHYgPj4+IDE2KSkgJiAweDAwMEZGRkY7XG4gIHJldHVybiAodiA8PCAxNikgPj4gMTY7XG59XG5cblxuLy9JbnRlcmxlYXZlIGJpdHMgb2YgMyBjb29yZGluYXRlcywgZWFjaCB3aXRoIDEwIGJpdHMuICBVc2VmdWwgZm9yIGZhc3Qgb2N0cmVlIGNvZGVzXG5leHBvcnRzLmludGVybGVhdmUzID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICB4ICY9IDB4M0ZGO1xuICB4ICA9ICh4IHwgKHg8PDE2KSkgJiA0Mjc4MTkwMzM1O1xuICB4ICA9ICh4IHwgKHg8PDgpKSAgJiAyNTE3MTk2OTU7XG4gIHggID0gKHggfCAoeDw8NCkpICAmIDMyNzIzNTYwMzU7XG4gIHggID0gKHggfCAoeDw8MikpICAmIDEyMjcxMzM1MTM7XG5cbiAgeSAmPSAweDNGRjtcbiAgeSAgPSAoeSB8ICh5PDwxNikpICYgNDI3ODE5MDMzNTtcbiAgeSAgPSAoeSB8ICh5PDw4KSkgICYgMjUxNzE5Njk1O1xuICB5ICA9ICh5IHwgKHk8PDQpKSAgJiAzMjcyMzU2MDM1O1xuICB5ICA9ICh5IHwgKHk8PDIpKSAgJiAxMjI3MTMzNTEzO1xuICB4IHw9ICh5IDw8IDEpO1xuICBcbiAgeiAmPSAweDNGRjtcbiAgeiAgPSAoeiB8ICh6PDwxNikpICYgNDI3ODE5MDMzNTtcbiAgeiAgPSAoeiB8ICh6PDw4KSkgICYgMjUxNzE5Njk1O1xuICB6ICA9ICh6IHwgKHo8PDQpKSAgJiAzMjcyMzU2MDM1O1xuICB6ICA9ICh6IHwgKHo8PDIpKSAgJiAxMjI3MTMzNTEzO1xuICBcbiAgcmV0dXJuIHggfCAoeiA8PCAyKTtcbn1cblxuLy9FeHRyYWN0cyBudGggaW50ZXJsZWF2ZWQgY29tcG9uZW50IG9mIGEgMy10dXBsZVxuZXhwb3J0cy5kZWludGVybGVhdmUzID0gZnVuY3Rpb24odiwgbikge1xuICB2ID0gKHYgPj4+IG4pICAgICAgICYgMTIyNzEzMzUxMztcbiAgdiA9ICh2IHwgKHY+Pj4yKSkgICAmIDMyNzIzNTYwMzU7XG4gIHYgPSAodiB8ICh2Pj4+NCkpICAgJiAyNTE3MTk2OTU7XG4gIHYgPSAodiB8ICh2Pj4+OCkpICAgJiA0Mjc4MTkwMzM1O1xuICB2ID0gKHYgfCAodj4+PjE2KSkgICYgMHgzRkY7XG4gIHJldHVybiAodjw8MjIpPj4yMjtcbn1cblxuLy9Db21wdXRlcyBuZXh0IGNvbWJpbmF0aW9uIGluIGNvbGV4aWNvZ3JhcGhpYyBvcmRlciAodGhpcyBpcyBtaXN0YWtlbmx5IGNhbGxlZCBuZXh0UGVybXV0YXRpb24gb24gdGhlIGJpdCB0d2lkZGxpbmcgaGFja3MgcGFnZSlcbmV4cG9ydHMubmV4dENvbWJpbmF0aW9uID0gZnVuY3Rpb24odikge1xuICB2YXIgdCA9IHYgfCAodiAtIDEpO1xuICByZXR1cm4gKHQgKyAxKSB8ICgoKH50ICYgLX50KSAtIDEpID4+PiAoY291bnRUcmFpbGluZ1plcm9zKHYpICsgMSkpO1xufVxuXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBib3hJbnRlcnNlY3RXcmFwcGVyXG5cbnZhciBwb29sID0gcmVxdWlyZSgndHlwZWRhcnJheS1wb29sJylcbnZhciBzd2VlcCA9IHJlcXVpcmUoJy4vbGliL3N3ZWVwJylcbnZhciBib3hJbnRlcnNlY3RJdGVyID0gcmVxdWlyZSgnLi9saWIvaW50ZXJzZWN0JylcblxuZnVuY3Rpb24gYm94RW1wdHkoZCwgYm94KSB7XG4gIGZvcih2YXIgaj0wOyBqPGQ7ICsraikge1xuICAgIGlmKCEoYm94W2pdIDw9IGJveFtqK2RdKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vVW5wYWNrIGJveGVzIGludG8gYSBmbGF0IHR5cGVkIGFycmF5LCByZW1vdmUgZW1wdHkgYm94ZXNcbmZ1bmN0aW9uIGNvbnZlcnRCb3hlcyhib3hlcywgZCwgZGF0YSwgaWRzKSB7XG4gIHZhciBwdHIgPSAwXG4gIHZhciBjb3VudCA9IDBcbiAgZm9yKHZhciBpPTAsIG49Ym94ZXMubGVuZ3RoOyBpPG47ICsraSkge1xuICAgIHZhciBiID0gYm94ZXNbaV1cbiAgICBpZihib3hFbXB0eShkLCBiKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgZm9yKHZhciBqPTA7IGo8MipkOyArK2opIHtcbiAgICAgIGRhdGFbcHRyKytdID0gYltqXVxuICAgIH1cbiAgICBpZHNbY291bnQrK10gPSBpXG4gIH1cbiAgcmV0dXJuIGNvdW50XG59XG5cbi8vUGVyZm9ybSB0eXBlIGNvbnZlcnNpb25zLCBjaGVjayBib3VuZHNcbmZ1bmN0aW9uIGJveEludGVyc2VjdChyZWQsIGJsdWUsIHZpc2l0LCBmdWxsKSB7XG4gIHZhciBuID0gcmVkLmxlbmd0aFxuICB2YXIgbSA9IGJsdWUubGVuZ3RoXG5cbiAgLy9JZiBlaXRoZXIgYXJyYXkgaXMgZW1wdHksIHRoZW4gd2UgY2FuIHNraXAgdGhpcyB3aG9sZSB0aGluZ1xuICBpZihuIDw9IDAgfHwgbSA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvL0NvbXB1dGUgZGltZW5zaW9uLCBpZiBpdCBpcyAwIHRoZW4gd2Ugc2tpcFxuICB2YXIgZCA9IChyZWRbMF0ubGVuZ3RoKT4+PjFcbiAgaWYoZCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgcmV0dmFsXG5cbiAgLy9Db252ZXJ0IHJlZCBib3hlc1xuICB2YXIgcmVkTGlzdCAgPSBwb29sLm1hbGxvY0RvdWJsZSgyKmQqbilcbiAgdmFyIHJlZElkcyAgID0gcG9vbC5tYWxsb2NJbnQzMihuKVxuICBuID0gY29udmVydEJveGVzKHJlZCwgZCwgcmVkTGlzdCwgcmVkSWRzKVxuXG4gIGlmKG4gPiAwKSB7XG4gICAgaWYoZCA9PT0gMSAmJiBmdWxsKSB7XG4gICAgICAvL1NwZWNpYWwgY2FzZTogMWQgY29tcGxldGVcbiAgICAgIHN3ZWVwLmluaXQobilcbiAgICAgIHJldHZhbCA9IHN3ZWVwLnN3ZWVwQ29tcGxldGUoXG4gICAgICAgIGQsIHZpc2l0LCBcbiAgICAgICAgMCwgbiwgcmVkTGlzdCwgcmVkSWRzLFxuICAgICAgICAwLCBuLCByZWRMaXN0LCByZWRJZHMpXG4gICAgfSBlbHNlIHtcblxuICAgICAgLy9Db252ZXJ0IGJsdWUgYm94ZXNcbiAgICAgIHZhciBibHVlTGlzdCA9IHBvb2wubWFsbG9jRG91YmxlKDIqZCptKVxuICAgICAgdmFyIGJsdWVJZHMgID0gcG9vbC5tYWxsb2NJbnQzMihtKVxuICAgICAgbSA9IGNvbnZlcnRCb3hlcyhibHVlLCBkLCBibHVlTGlzdCwgYmx1ZUlkcylcblxuICAgICAgaWYobSA+IDApIHtcbiAgICAgICAgc3dlZXAuaW5pdChuK20pXG5cbiAgICAgICAgaWYoZCA9PT0gMSkge1xuICAgICAgICAgIC8vU3BlY2lhbCBjYXNlOiAxZCBiaXBhcnRpdGVcbiAgICAgICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcEJpcGFydGl0ZShcbiAgICAgICAgICAgIGQsIHZpc2l0LCBcbiAgICAgICAgICAgIDAsIG4sIHJlZExpc3QsICByZWRJZHMsXG4gICAgICAgICAgICAwLCBtLCBibHVlTGlzdCwgYmx1ZUlkcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL0dlbmVyYWwgY2FzZTogIGQ+MVxuICAgICAgICAgIHJldHZhbCA9IGJveEludGVyc2VjdEl0ZXIoXG4gICAgICAgICAgICBkLCB2aXNpdCwgICAgZnVsbCxcbiAgICAgICAgICAgIG4sIHJlZExpc3QsICByZWRJZHMsXG4gICAgICAgICAgICBtLCBibHVlTGlzdCwgYmx1ZUlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIHBvb2wuZnJlZShibHVlTGlzdClcbiAgICAgICAgcG9vbC5mcmVlKGJsdWVJZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcG9vbC5mcmVlKHJlZExpc3QpXG4gICAgcG9vbC5mcmVlKHJlZElkcylcbiAgfVxuXG4gIHJldHVybiByZXR2YWxcbn1cblxuLy9Vc2VyLWZyaWVuZGx5IHdyYXBwZXIsIGhhbmRsZSBmdWxsIGlucHV0IGFuZCBuby12aXNpdG9yIGNhc2VzXG5mdW5jdGlvbiBib3hJbnRlcnNlY3RXcmFwcGVyKGFyZzAsIGFyZzEsIGFyZzIpIHtcbiAgdmFyIHJlc3VsdFxuICBzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJlc3VsdCA9IFtdXG4gICAgICBib3hJbnRlcnNlY3QoYXJnMCwgYXJnMCwgZnVuY3Rpb24oaSxqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFtpLCBqXSlcbiAgICAgIH0sIHRydWUpXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgY2FzZSAyOlxuICAgICAgaWYodHlwZW9mIGFyZzEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHZpc2l0ID0gYXJnMVxuICAgICAgICByZXR1cm4gYm94SW50ZXJzZWN0KGFyZzAsIGFyZzAsIHZpc2l0LCB0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gW11cbiAgICAgICAgYm94SW50ZXJzZWN0KGFyZzAsIGFyZzEsIGZ1bmN0aW9uKGksaikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFtpLCBqXSlcbiAgICAgICAgfSwgZmFsc2UpXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gYm94SW50ZXJzZWN0KGFyZzAsIGFyZzEsIGFyZzIsIGZhbHNlKVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JveC1pbnRlcnNlY3Q6IEludmFsaWQgYXJndW1lbnRzJylcbiAgfVxufSIsIid1c2Ugc3RyaWN0J1xuXG52YXIgRElNRU5TSU9OICAgPSAnZCdcbnZhciBBWElTICAgICAgICA9ICdheCdcbnZhciBWSVNJVCAgICAgICA9ICd2didcbnZhciBGTElQICAgICAgICA9ICdmcCdcblxudmFyIEVMRU1fU0laRSAgID0gJ2VzJ1xuXG52YXIgUkVEX1NUQVJUICAgPSAncnMnXG52YXIgUkVEX0VORCAgICAgPSAncmUnXG52YXIgUkVEX0JPWEVTICAgPSAncmInXG52YXIgUkVEX0lOREVYICAgPSAncmknXG52YXIgUkVEX1BUUiAgICAgPSAncnAnXG5cbnZhciBCTFVFX1NUQVJUICA9ICdicydcbnZhciBCTFVFX0VORCAgICA9ICdiZSdcbnZhciBCTFVFX0JPWEVTICA9ICdiYidcbnZhciBCTFVFX0lOREVYICA9ICdiaSdcbnZhciBCTFVFX1BUUiAgICA9ICdicCdcblxudmFyIFJFVFZBTCAgICAgID0gJ3J2J1xuXG52YXIgSU5ORVJfTEFCRUwgPSAnUSdcblxudmFyIEFSR1MgPSBbXG4gIERJTUVOU0lPTixcbiAgQVhJUyxcbiAgVklTSVQsXG4gIFJFRF9TVEFSVCxcbiAgUkVEX0VORCxcbiAgUkVEX0JPWEVTLFxuICBSRURfSU5ERVgsXG4gIEJMVUVfU1RBUlQsXG4gIEJMVUVfRU5ELFxuICBCTFVFX0JPWEVTLFxuICBCTFVFX0lOREVYXG5dXG5cbmZ1bmN0aW9uIGdlbmVyYXRlQnJ1dGVGb3JjZShyZWRNYWpvciwgZmxpcCwgZnVsbCkge1xuICB2YXIgZnVuY05hbWUgPSAnYnJ1dGVGb3JjZScgKyBcbiAgICAocmVkTWFqb3IgPyAnUmVkJyA6ICdCbHVlJykgKyBcbiAgICAoZmxpcCA/ICdGbGlwJyA6ICcnKSArXG4gICAgKGZ1bGwgPyAnRnVsbCcgOiAnJylcblxuICB2YXIgY29kZSA9IFsnZnVuY3Rpb24gJywgZnVuY05hbWUsICcoJywgQVJHUy5qb2luKCksICcpeycsXG4gICAgJ3ZhciAnLCBFTEVNX1NJWkUsICc9MionLCBESU1FTlNJT04sICc7J11cblxuICB2YXIgcmVkTG9vcCA9IFxuICAgICdmb3IodmFyIGk9JyArIFJFRF9TVEFSVCArICcsJyArIFJFRF9QVFIgKyAnPScgKyBFTEVNX1NJWkUgKyAnKicgKyBSRURfU1RBUlQgKyAnOycgK1xuICAgICAgICAnaTwnICsgUkVEX0VORCArJzsnICtcbiAgICAgICAgJysraSwnICsgUkVEX1BUUiArICcrPScgKyBFTEVNX1NJWkUgKyAnKXsnICtcbiAgICAgICAgJ3ZhciB4MD0nICsgUkVEX0JPWEVTICsgJ1snICsgQVhJUyArICcrJyArIFJFRF9QVFIgKyAnXSwnICtcbiAgICAgICAgICAgICd4MT0nICsgUkVEX0JPWEVTICsgJ1snICsgQVhJUyArICcrJyArIFJFRF9QVFIgKyAnKycgKyBESU1FTlNJT04gKyAnXSwnICtcbiAgICAgICAgICAgICd4aT0nICsgUkVEX0lOREVYICsgJ1tpXTsnXG5cbiAgdmFyIGJsdWVMb29wID0gXG4gICAgJ2Zvcih2YXIgaj0nICsgQkxVRV9TVEFSVCArICcsJyArIEJMVUVfUFRSICsgJz0nICsgRUxFTV9TSVpFICsgJyonICsgQkxVRV9TVEFSVCArICc7JyArXG4gICAgICAgICdqPCcgKyBCTFVFX0VORCArICc7JyArXG4gICAgICAgICcrK2osJyArIEJMVUVfUFRSICsgJys9JyArIEVMRU1fU0laRSArICcpeycgK1xuICAgICAgICAndmFyIHkwPScgKyBCTFVFX0JPWEVTICsgJ1snICsgQVhJUyArICcrJyArIEJMVUVfUFRSICsgJ10sJyArXG4gICAgICAgICAgICAoZnVsbCA/ICd5MT0nICsgQkxVRV9CT1hFUyArICdbJyArIEFYSVMgKyAnKycgKyBCTFVFX1BUUiArICcrJyArIERJTUVOU0lPTiArICddLCcgOiAnJykgK1xuICAgICAgICAgICAgJ3lpPScgKyBCTFVFX0lOREVYICsgJ1tqXTsnXG5cbiAgaWYocmVkTWFqb3IpIHtcbiAgICBjb2RlLnB1c2gocmVkTG9vcCwgSU5ORVJfTEFCRUwsICc6JywgYmx1ZUxvb3ApXG4gIH0gZWxzZSB7XG4gICAgY29kZS5wdXNoKGJsdWVMb29wLCBJTk5FUl9MQUJFTCwgJzonLCByZWRMb29wKVxuICB9XG5cbiAgaWYoZnVsbCkge1xuICAgIGNvZGUucHVzaCgnaWYoeTE8eDB8fHgxPHkwKWNvbnRpbnVlOycpXG4gIH0gZWxzZSBpZihmbGlwKSB7XG4gICAgY29kZS5wdXNoKCdpZih5MDw9eDB8fHgxPHkwKWNvbnRpbnVlOycpXG4gIH0gZWxzZSB7XG4gICAgY29kZS5wdXNoKCdpZih5MDx4MHx8eDE8eTApY29udGludWU7JylcbiAgfVxuXG4gIGNvZGUucHVzaCgnZm9yKHZhciBrPScrQVhJUysnKzE7azwnK0RJTUVOU0lPTisnOysrayl7JytcbiAgICAndmFyIHIwPScrUkVEX0JPWEVTKydbaysnK1JFRF9QVFIrJ10sJytcbiAgICAgICAgJ3IxPScrUkVEX0JPWEVTKydbaysnK0RJTUVOU0lPTisnKycrUkVEX1BUUisnXSwnK1xuICAgICAgICAnYjA9JytCTFVFX0JPWEVTKydbaysnK0JMVUVfUFRSKyddLCcrXG4gICAgICAgICdiMT0nK0JMVUVfQk9YRVMrJ1trKycrRElNRU5TSU9OKycrJytCTFVFX1BUUisnXTsnK1xuICAgICAgJ2lmKHIxPGIwfHxiMTxyMCljb250aW51ZSAnICsgSU5ORVJfTEFCRUwgKyAnO30nICtcbiAgICAgICd2YXIgJyArIFJFVFZBTCArICc9JyArIFZJU0lUICsgJygnKVxuXG4gIGlmKGZsaXApIHtcbiAgICBjb2RlLnB1c2goJ3lpLHhpJylcbiAgfSBlbHNlIHtcbiAgICBjb2RlLnB1c2goJ3hpLHlpJylcbiAgfVxuXG4gIGNvZGUucHVzaCgnKTtpZignICsgUkVUVkFMICsgJyE9PXZvaWQgMClyZXR1cm4gJyArIFJFVFZBTCArICc7fX19JylcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGZ1bmNOYW1lLCBcbiAgICBjb2RlOiBjb2RlLmpvaW4oJycpXG4gIH1cbn1cblxuZnVuY3Rpb24gYnJ1dGVGb3JjZVBsYW5uZXIoZnVsbCkge1xuICB2YXIgZnVuY05hbWUgPSAnYnJ1dGVGb3JjZScgKyAoZnVsbCA/ICdGdWxsJyA6ICdQYXJ0aWFsJylcbiAgdmFyIHByZWZpeCA9IFtdXG4gIHZhciBmYXJncyA9IEFSR1Muc2xpY2UoKVxuICBpZighZnVsbCkge1xuICAgIGZhcmdzLnNwbGljZSgzLCAwLCBGTElQKVxuICB9XG5cbiAgdmFyIGNvZGUgPSBbJ2Z1bmN0aW9uICcgKyBmdW5jTmFtZSArICcoJyArIGZhcmdzLmpvaW4oKSArICcpeyddXG5cbiAgZnVuY3Rpb24gaW52b2tlKHJlZE1ham9yLCBmbGlwKSB7XG4gICAgdmFyIHJlcyA9IGdlbmVyYXRlQnJ1dGVGb3JjZShyZWRNYWpvciwgZmxpcCwgZnVsbClcbiAgICBwcmVmaXgucHVzaChyZXMuY29kZSlcbiAgICBjb2RlLnB1c2goJ3JldHVybiAnICsgcmVzLm5hbWUgKyAnKCcgKyBBUkdTLmpvaW4oKSArICcpOycpXG4gIH1cblxuICBjb2RlLnB1c2goJ2lmKCcgKyBSRURfRU5EICsgJy0nICsgUkVEX1NUQVJUICsgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgQkxVRV9FTkQgKyAnLScgKyBCTFVFX1NUQVJUICsgJyl7JylcblxuICBpZihmdWxsKSB7XG4gICAgaW52b2tlKHRydWUsIGZhbHNlKVxuICAgIGNvZGUucHVzaCgnfWVsc2V7JylcbiAgICBpbnZva2UoZmFsc2UsIGZhbHNlKVxuICB9IGVsc2Uge1xuICAgIGNvZGUucHVzaCgnaWYoJyArIEZMSVAgKyAnKXsnKVxuICAgIGludm9rZSh0cnVlLCB0cnVlKVxuICAgIGNvZGUucHVzaCgnfWVsc2V7JylcbiAgICBpbnZva2UodHJ1ZSwgZmFsc2UpXG4gICAgY29kZS5wdXNoKCd9fWVsc2V7aWYoJyArIEZMSVAgKyAnKXsnKVxuICAgIGludm9rZShmYWxzZSwgdHJ1ZSlcbiAgICBjb2RlLnB1c2goJ31lbHNleycpXG4gICAgaW52b2tlKGZhbHNlLCBmYWxzZSlcbiAgICBjb2RlLnB1c2goJ30nKVxuICB9XG4gIGNvZGUucHVzaCgnfX1yZXR1cm4gJyArIGZ1bmNOYW1lKVxuXG4gIHZhciBjb2RlU3RyID0gcHJlZml4LmpvaW4oJycpICsgY29kZS5qb2luKCcnKVxuICB2YXIgcHJvYyA9IG5ldyBGdW5jdGlvbihjb2RlU3RyKVxuICByZXR1cm4gcHJvYygpXG59XG5cblxuZXhwb3J0cy5wYXJ0aWFsID0gYnJ1dGVGb3JjZVBsYW5uZXIoZmFsc2UpXG5leHBvcnRzLmZ1bGwgICAgPSBicnV0ZUZvcmNlUGxhbm5lcih0cnVlKSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJveEludGVyc2VjdEl0ZXJcblxudmFyIHBvb2wgPSByZXF1aXJlKCd0eXBlZGFycmF5LXBvb2wnKVxudmFyIGJpdHMgPSByZXF1aXJlKCdiaXQtdHdpZGRsZScpXG52YXIgYnJ1dGVGb3JjZSA9IHJlcXVpcmUoJy4vYnJ1dGUnKVxudmFyIGJydXRlRm9yY2VQYXJ0aWFsID0gYnJ1dGVGb3JjZS5wYXJ0aWFsXG52YXIgYnJ1dGVGb3JjZUZ1bGwgPSBicnV0ZUZvcmNlLmZ1bGxcbnZhciBzd2VlcCA9IHJlcXVpcmUoJy4vc3dlZXAnKVxudmFyIGZpbmRNZWRpYW4gPSByZXF1aXJlKCcuL21lZGlhbicpXG52YXIgZ2VuUGFydGl0aW9uID0gcmVxdWlyZSgnLi9wYXJ0aXRpb24nKVxuXG4vL1R3aWRkbGUgcGFyYW1ldGVyc1xudmFyIEJSVVRFX0ZPUkNFX0NVVE9GRiAgICA9IDEyOCAgICAgICAvL0N1dCBvZmYgZm9yIGJydXRlIGZvcmNlIHNlYXJjaFxudmFyIFNDQU5fQ1VUT0ZGICAgICAgICAgICA9ICgxPDwyMikgICAvL0N1dCBvZmYgZm9yIHR3byB3YXkgc2NhblxudmFyIFNDQU5fQ09NUExFVEVfQ1VUT0ZGICA9ICgxPDwyMikgIFxuXG4vL1BhcnRpdGlvbiBmdW5jdGlvbnNcbnZhciBwYXJ0aXRpb25JbnRlcmlvckNvbnRhaW5zSW50ZXJ2YWwgPSBnZW5QYXJ0aXRpb24oXG4gICchKGxvPj1wMCkmJiEocDE+PWhpKScsIFxuICBbJ3AwJywgJ3AxJ10pXG5cbnZhciBwYXJ0aXRpb25TdGFydEVxdWFsID0gZ2VuUGFydGl0aW9uKFxuICAnbG89PT1wMCcsXG4gIFsncDAnXSlcblxudmFyIHBhcnRpdGlvblN0YXJ0TGVzc1RoYW4gPSBnZW5QYXJ0aXRpb24oXG4gICdsbzxwMCcsXG4gIFsncDAnXSlcblxudmFyIHBhcnRpdGlvbkVuZExlc3NUaGFuRXF1YWwgPSBnZW5QYXJ0aXRpb24oXG4gICdoaTw9cDAnLFxuICBbJ3AwJ10pXG5cbnZhciBwYXJ0aXRpb25Db250YWluc1BvaW50ID0gZ2VuUGFydGl0aW9uKFxuICAnbG88PXAwJiZwMDw9aGknLFxuICBbJ3AwJ10pXG5cbnZhciBwYXJ0aXRpb25Db250YWluc1BvaW50UHJvcGVyID0gZ2VuUGFydGl0aW9uKFxuICAnbG88cDAmJnAwPD1oaScsXG4gIFsncDAnXSlcblxuLy9GcmFtZSBzaXplIGZvciBpdGVyYXRpdmUgbG9vcFxudmFyIElGUkFNRV9TSVpFID0gNlxudmFyIERGUkFNRV9TSVpFID0gMlxuXG4vL0RhdGEgZm9yIGJveCBzdGF0Y2tcbnZhciBJTklUX0NBUEFDSVRZID0gMTAyNFxudmFyIEJPWF9JU1RBQ0sgID0gcG9vbC5tYWxsb2NJbnQzMihJTklUX0NBUEFDSVRZKVxudmFyIEJPWF9EU1RBQ0sgID0gcG9vbC5tYWxsb2NEb3VibGUoSU5JVF9DQVBBQ0lUWSlcblxuLy9Jbml0aWFsaXplIGl0ZXJhdGl2ZSBsb29wIHF1ZXVlXG5mdW5jdGlvbiBpdGVySW5pdChkLCBjb3VudCkge1xuICB2YXIgbGV2ZWxzID0gKDggKiBiaXRzLmxvZzIoY291bnQrMSkgKiAoZCsxKSl8MFxuICB2YXIgbWF4SW50cyA9IGJpdHMubmV4dFBvdzIoSUZSQU1FX1NJWkUqbGV2ZWxzKVxuICBpZihCT1hfSVNUQUNLLmxlbmd0aCA8IG1heEludHMpIHtcbiAgICBwb29sLmZyZWUoQk9YX0lTVEFDSylcbiAgICBCT1hfSVNUQUNLID0gcG9vbC5tYWxsb2NJbnQzMihtYXhJbnRzKVxuICB9XG4gIHZhciBtYXhEb3VibGVzID0gYml0cy5uZXh0UG93MihERlJBTUVfU0laRSpsZXZlbHMpXG4gIGlmKEJPWF9EU1RBQ0sgPCBtYXhEb3VibGVzKSB7XG4gICAgcG9vbC5mcmVlKEJPWF9EU1RBQ0spXG4gICAgQk9YX0RTVEFDSyA9IHBvb2wubWFsbG9jRG91YmxlKG1heERvdWJsZXMpXG4gIH1cbn1cblxuLy9BcHBlbmQgaXRlbSB0byBxdWV1ZVxuZnVuY3Rpb24gaXRlclB1c2gocHRyLFxuICBheGlzLCBcbiAgcmVkU3RhcnQsIHJlZEVuZCwgXG4gIGJsdWVTdGFydCwgYmx1ZUVuZCwgXG4gIHN0YXRlLCBcbiAgbG8sIGhpKSB7XG5cbiAgdmFyIGlwdHIgPSBJRlJBTUVfU0laRSAqIHB0clxuICBCT1hfSVNUQUNLW2lwdHJdICAgPSBheGlzXG4gIEJPWF9JU1RBQ0tbaXB0cisxXSA9IHJlZFN0YXJ0XG4gIEJPWF9JU1RBQ0tbaXB0cisyXSA9IHJlZEVuZFxuICBCT1hfSVNUQUNLW2lwdHIrM10gPSBibHVlU3RhcnRcbiAgQk9YX0lTVEFDS1tpcHRyKzRdID0gYmx1ZUVuZFxuICBCT1hfSVNUQUNLW2lwdHIrNV0gPSBzdGF0ZVxuXG4gIHZhciBkcHRyID0gREZSQU1FX1NJWkUgKiBwdHJcbiAgQk9YX0RTVEFDS1tkcHRyXSAgID0gbG9cbiAgQk9YX0RTVEFDS1tkcHRyKzFdID0gaGlcbn1cblxuLy9TcGVjaWFsIGNhc2U6ICBJbnRlcnNlY3Qgc2luZ2xlIHBvaW50IHdpdGggbGlzdCBvZiBpbnRlcnZhbHNcbmZ1bmN0aW9uIG9uZVBvaW50UGFydGlhbChcbiAgZCwgYXhpcywgdmlzaXQsIGZsaXAsXG4gIHJlZFN0YXJ0LCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gIGJsdWVPZmZzZXQsIGJsdWUsIGJsdWVJZCkge1xuXG4gIHZhciBlbGVtU2l6ZSA9IDIgKiBkXG4gIHZhciBibHVlUHRyICA9IGJsdWVPZmZzZXQgKiBlbGVtU2l6ZVxuICB2YXIgYmx1ZVggICAgPSBibHVlW2JsdWVQdHIgKyBheGlzXVxuXG5yZWRfbG9vcDpcbiAgZm9yKHZhciBpPXJlZFN0YXJ0LCByZWRQdHI9cmVkU3RhcnQqZWxlbVNpemU7IGk8cmVkRW5kOyArK2ksIHJlZFB0cis9ZWxlbVNpemUpIHtcbiAgICB2YXIgcjAgPSByZWRbcmVkUHRyK2F4aXNdXG4gICAgdmFyIHIxID0gcmVkW3JlZFB0citheGlzK2RdXG4gICAgaWYoYmx1ZVggPCByMCB8fCByMSA8IGJsdWVYKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZihmbGlwICYmIGJsdWVYID09PSByMCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgdmFyIHJlZElkID0gcmVkSW5kZXhbaV1cbiAgICBmb3IodmFyIGo9YXhpcysxOyBqPGQ7ICsraikge1xuICAgICAgdmFyIHIwID0gcmVkW3JlZFB0citqXVxuICAgICAgdmFyIHIxID0gcmVkW3JlZFB0citqK2RdXG4gICAgICB2YXIgYjAgPSBibHVlW2JsdWVQdHIral1cbiAgICAgIHZhciBiMSA9IGJsdWVbYmx1ZVB0citqK2RdXG4gICAgICBpZihyMSA8IGIwIHx8IGIxIDwgcjApIHtcbiAgICAgICAgY29udGludWUgcmVkX2xvb3BcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJldHZhbFxuICAgIGlmKGZsaXApIHtcbiAgICAgIHJldHZhbCA9IHZpc2l0KGJsdWVJZCwgcmVkSWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHZhbCA9IHZpc2l0KHJlZElkLCBibHVlSWQpXG4gICAgfVxuICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmV0dmFsXG4gICAgfVxuICB9XG59XG5cbi8vU3BlY2lhbCBjYXNlOiAgSW50ZXJzZWN0IG9uZSBwb2ludCB3aXRoIGxpc3Qgb2YgaW50ZXJ2YWxzXG5mdW5jdGlvbiBvbmVQb2ludEZ1bGwoXG4gIGQsIGF4aXMsIHZpc2l0LFxuICByZWRTdGFydCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICBibHVlT2Zmc2V0LCBibHVlLCBibHVlSWQpIHtcblxuICB2YXIgZWxlbVNpemUgPSAyICogZFxuICB2YXIgYmx1ZVB0ciAgPSBibHVlT2Zmc2V0ICogZWxlbVNpemVcbiAgdmFyIGJsdWVYICAgID0gYmx1ZVtibHVlUHRyICsgYXhpc11cblxucmVkX2xvb3A6XG4gIGZvcih2YXIgaT1yZWRTdGFydCwgcmVkUHRyPXJlZFN0YXJ0KmVsZW1TaXplOyBpPHJlZEVuZDsgKytpLCByZWRQdHIrPWVsZW1TaXplKSB7XG4gICAgdmFyIHJlZElkID0gcmVkSW5kZXhbaV1cbiAgICBpZihyZWRJZCA9PT0gYmx1ZUlkKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICB2YXIgcjAgPSByZWRbcmVkUHRyK2F4aXNdXG4gICAgdmFyIHIxID0gcmVkW3JlZFB0citheGlzK2RdXG4gICAgaWYoYmx1ZVggPCByMCB8fCByMSA8IGJsdWVYKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IodmFyIGo9YXhpcysxOyBqPGQ7ICsraikge1xuICAgICAgdmFyIHIwID0gcmVkW3JlZFB0citqXVxuICAgICAgdmFyIHIxID0gcmVkW3JlZFB0citqK2RdXG4gICAgICB2YXIgYjAgPSBibHVlW2JsdWVQdHIral1cbiAgICAgIHZhciBiMSA9IGJsdWVbYmx1ZVB0citqK2RdXG4gICAgICBpZihyMSA8IGIwIHx8IGIxIDwgcjApIHtcbiAgICAgICAgY29udGludWUgcmVkX2xvb3BcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJldHZhbCA9IHZpc2l0KHJlZElkLCBibHVlSWQpXG4gICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXR2YWxcbiAgICB9XG4gIH1cbn1cblxuLy9UaGUgbWFpbiBib3ggaW50ZXJzZWN0aW9uIHJvdXRpbmVcbmZ1bmN0aW9uIGJveEludGVyc2VjdEl0ZXIoXG4gIGQsIHZpc2l0LCBpbml0RnVsbCxcbiAgeFNpemUsIHhCb3hlcywgeEluZGV4LFxuICB5U2l6ZSwgeUJveGVzLCB5SW5kZXgpIHtcblxuICAvL1Jlc2VydmUgbWVtb3J5IGZvciBzdGFja1xuICBpdGVySW5pdChkLCB4U2l6ZSArIHlTaXplKVxuXG4gIHZhciB0b3AgID0gMFxuICB2YXIgZWxlbVNpemUgPSAyICogZFxuICB2YXIgcmV0dmFsXG5cbiAgaXRlclB1c2godG9wKyssXG4gICAgICAwLFxuICAgICAgMCwgeFNpemUsXG4gICAgICAwLCB5U2l6ZSxcbiAgICAgIGluaXRGdWxsID8gMTYgOiAwLCBcbiAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gIGlmKCFpbml0RnVsbCkge1xuICAgIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgMCxcbiAgICAgIDAsIHlTaXplLFxuICAgICAgMCwgeFNpemUsXG4gICAgICAxLCBcbiAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gIH1cblxuICB3aGlsZSh0b3AgPiAwKSB7XG4gICAgdG9wICAtPSAxXG5cbiAgICB2YXIgaXB0ciA9IHRvcCAqIElGUkFNRV9TSVpFXG4gICAgdmFyIGF4aXMgICAgICA9IEJPWF9JU1RBQ0tbaXB0cl1cbiAgICB2YXIgcmVkU3RhcnQgID0gQk9YX0lTVEFDS1tpcHRyKzFdXG4gICAgdmFyIHJlZEVuZCAgICA9IEJPWF9JU1RBQ0tbaXB0cisyXVxuICAgIHZhciBibHVlU3RhcnQgPSBCT1hfSVNUQUNLW2lwdHIrM11cbiAgICB2YXIgYmx1ZUVuZCAgID0gQk9YX0lTVEFDS1tpcHRyKzRdXG4gICAgdmFyIHN0YXRlICAgICA9IEJPWF9JU1RBQ0tbaXB0cis1XVxuXG4gICAgdmFyIGRwdHIgPSB0b3AgKiBERlJBTUVfU0laRVxuICAgIHZhciBsbyAgICAgICAgPSBCT1hfRFNUQUNLW2RwdHJdXG4gICAgdmFyIGhpICAgICAgICA9IEJPWF9EU1RBQ0tbZHB0cisxXVxuXG4gICAgLy9VbnBhY2sgc3RhdGUgaW5mb1xuICAgIHZhciBmbGlwICAgICAgPSAoc3RhdGUgJiAxKVxuICAgIHZhciBmdWxsICAgICAgPSAhIShzdGF0ZSAmIDE2KVxuXG4gICAgLy9VbnBhY2sgaW5kaWNlc1xuICAgIHZhciByZWQgICAgICAgPSB4Qm94ZXNcbiAgICB2YXIgcmVkSW5kZXggID0geEluZGV4XG4gICAgdmFyIGJsdWUgICAgICA9IHlCb3hlc1xuICAgIHZhciBibHVlSW5kZXggPSB5SW5kZXhcbiAgICBpZihmbGlwKSB7XG4gICAgICByZWQgICAgICAgICA9IHlCb3hlc1xuICAgICAgcmVkSW5kZXggICAgPSB5SW5kZXhcbiAgICAgIGJsdWUgICAgICAgID0geEJveGVzXG4gICAgICBibHVlSW5kZXggICA9IHhJbmRleFxuICAgIH1cblxuICAgIGlmKHN0YXRlICYgMikge1xuICAgICAgcmVkRW5kID0gcGFydGl0aW9uU3RhcnRMZXNzVGhhbihcbiAgICAgICAgZCwgYXhpcyxcbiAgICAgICAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgaGkpXG4gICAgICBpZihyZWRTdGFydCA+PSByZWRFbmQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoc3RhdGUgJiA0KSB7XG4gICAgICByZWRTdGFydCA9IHBhcnRpdGlvbkVuZExlc3NUaGFuRXF1YWwoXG4gICAgICAgIGQsIGF4aXMsXG4gICAgICAgIHJlZFN0YXJ0LCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgIGxvKVxuICAgICAgaWYocmVkU3RhcnQgPj0gcmVkRW5kKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciByZWRDb3VudCAgPSByZWRFbmQgIC0gcmVkU3RhcnRcbiAgICB2YXIgYmx1ZUNvdW50ID0gYmx1ZUVuZCAtIGJsdWVTdGFydFxuXG4gICAgaWYoZnVsbCkge1xuICAgICAgaWYoZCAqIHJlZENvdW50ICogKHJlZENvdW50ICsgYmx1ZUNvdW50KSA8IFNDQU5fQ09NUExFVEVfQ1VUT0ZGKSB7XG4gICAgICAgIHJldHZhbCA9IHN3ZWVwLnNjYW5Db21wbGV0ZShcbiAgICAgICAgICBkLCBheGlzLCB2aXNpdCwgXG4gICAgICAgICAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZCAqIE1hdGgubWluKHJlZENvdW50LCBibHVlQ291bnQpIDwgQlJVVEVfRk9SQ0VfQ1VUT0ZGKSB7XG4gICAgICAgIC8vSWYgaW5wdXQgc21hbGwsIHRoZW4gdXNlIGJydXRlIGZvcmNlXG4gICAgICAgIHJldHZhbCA9IGJydXRlRm9yY2VQYXJ0aWFsKFxuICAgICAgICAgICAgZCwgYXhpcywgdmlzaXQsIGZsaXAsXG4gICAgICAgICAgICByZWRTdGFydCwgIHJlZEVuZCwgIHJlZCwgIHJlZEluZGV4LFxuICAgICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYoZCAqIHJlZENvdW50ICogYmx1ZUNvdW50IDwgU0NBTl9DVVRPRkYpIHtcbiAgICAgICAgLy9JZiBpbnB1dCBtZWRpdW0gc2l6ZWQsIHRoZW4gdXNlIHN3ZWVwIGFuZCBwcnVuZVxuICAgICAgICByZXR2YWwgPSBzd2VlcC5zY2FuQmlwYXJ0aXRlKFxuICAgICAgICAgIGQsIGF4aXMsIHZpc2l0LCBmbGlwLCBcbiAgICAgICAgICByZWRTdGFydCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvL0ZpcnN0LCBmaW5kIGFsbCByZWQgaW50ZXJ2YWxzIHdob3NlIGludGVyaW9yIGNvbnRhaW5zIChsbyxoaSlcbiAgICB2YXIgcmVkMCA9IHBhcnRpdGlvbkludGVyaW9yQ29udGFpbnNJbnRlcnZhbChcbiAgICAgIGQsIGF4aXMsIFxuICAgICAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgIGxvLCBoaSlcblxuICAgIC8vTG93ZXIgZGltZW5zaW9uYWwgY2FzZVxuICAgIGlmKHJlZFN0YXJ0IDwgcmVkMCkge1xuXG4gICAgICBpZihkICogKHJlZDAgLSByZWRTdGFydCkgPCBCUlVURV9GT1JDRV9DVVRPRkYpIHtcbiAgICAgICAgLy9TcGVjaWFsIGNhc2UgZm9yIHNtYWxsIGlucHV0czogdXNlIGJydXRlIGZvcmNlXG4gICAgICAgIHJldHZhbCA9IGJydXRlRm9yY2VGdWxsKFxuICAgICAgICAgIGQsIGF4aXMrMSwgdmlzaXQsXG4gICAgICAgICAgcmVkU3RhcnQsIHJlZDAsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoYXhpcyA9PT0gZC0yKSB7XG4gICAgICAgIGlmKGZsaXApIHtcbiAgICAgICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcEJpcGFydGl0ZShcbiAgICAgICAgICAgIGQsIHZpc2l0LFxuICAgICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgsXG4gICAgICAgICAgICByZWRTdGFydCwgcmVkMCwgcmVkLCByZWRJbmRleClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcEJpcGFydGl0ZShcbiAgICAgICAgICAgIGQsIHZpc2l0LFxuICAgICAgICAgICAgcmVkU3RhcnQsIHJlZDAsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgYXhpcysxLFxuICAgICAgICAgIHJlZFN0YXJ0LCByZWQwLFxuICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCxcbiAgICAgICAgICBmbGlwLFxuICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICAgIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgICAgIGF4aXMrMSxcbiAgICAgICAgICBibHVlU3RhcnQsIGJsdWVFbmQsXG4gICAgICAgICAgcmVkU3RhcnQsIHJlZDAsXG4gICAgICAgICAgZmxpcF4xLFxuICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9EaXZpZGUgYW5kIGNvbnF1ZXIgcGhhc2VcbiAgICBpZihyZWQwIDwgcmVkRW5kKSB7XG5cbiAgICAgIC8vQ3V0IGJsdWUgaW50byAzIHBhcnRzOlxuICAgICAgLy9cbiAgICAgIC8vICBQb2ludHMgPCBtaWQgcG9pbnRcbiAgICAgIC8vICBQb2ludHMgPSBtaWQgcG9pbnRcbiAgICAgIC8vICBQb2ludHMgPiBtaWQgcG9pbnRcbiAgICAgIC8vXG4gICAgICB2YXIgYmx1ZTAgPSBmaW5kTWVkaWFuKFxuICAgICAgICBkLCBheGlzLCBcbiAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICB2YXIgbWlkID0gYmx1ZVtlbGVtU2l6ZSAqIGJsdWUwICsgYXhpc11cbiAgICAgIHZhciBibHVlMSA9IHBhcnRpdGlvblN0YXJ0RXF1YWwoXG4gICAgICAgIGQsIGF4aXMsXG4gICAgICAgIGJsdWUwLCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgsXG4gICAgICAgIG1pZClcblxuICAgICAgLy9SaWdodCBjYXNlXG4gICAgICBpZihibHVlMSA8IGJsdWVFbmQpIHtcbiAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgYXhpcyxcbiAgICAgICAgICByZWQwLCByZWRFbmQsXG4gICAgICAgICAgYmx1ZTEsIGJsdWVFbmQsXG4gICAgICAgICAgKGZsaXB8NCkgKyAoZnVsbCA/IDE2IDogMCksXG4gICAgICAgICAgbWlkLCBoaSlcbiAgICAgIH1cblxuICAgICAgLy9MZWZ0IGNhc2VcbiAgICAgIGlmKGJsdWVTdGFydCA8IGJsdWUwKSB7XG4gICAgICAgIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgICAgIGF4aXMsXG4gICAgICAgICAgcmVkMCwgcmVkRW5kLFxuICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZTAsXG4gICAgICAgICAgKGZsaXB8MikgKyAoZnVsbCA/IDE2IDogMCksXG4gICAgICAgICAgbG8sIG1pZClcbiAgICAgIH1cblxuICAgICAgLy9DZW50ZXIgY2FzZSAodGhlIGhhcmQgcGFydClcbiAgICAgIGlmKGJsdWUwICsgMSA9PT0gYmx1ZTEpIHtcbiAgICAgICAgLy9PcHRpbWl6YXRpb246IFJhbmdlIHdpdGggZXhhY3RseSAxIHBvaW50LCB1c2UgYSBicnV0ZSBmb3JjZSBzY2FuXG4gICAgICAgIGlmKGZ1bGwpIHtcbiAgICAgICAgICByZXR2YWwgPSBvbmVQb2ludEZ1bGwoXG4gICAgICAgICAgICBkLCBheGlzLCB2aXNpdCxcbiAgICAgICAgICAgIHJlZDAsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICAgIGJsdWUwLCBibHVlLCBibHVlSW5kZXhbYmx1ZTBdKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHZhbCA9IG9uZVBvaW50UGFydGlhbChcbiAgICAgICAgICAgIGQsIGF4aXMsIHZpc2l0LCBmbGlwLFxuICAgICAgICAgICAgcmVkMCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgYmx1ZTAsIGJsdWUsIGJsdWVJbmRleFtibHVlMF0pXG4gICAgICAgIH1cbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihibHVlMCA8IGJsdWUxKSB7XG4gICAgICAgIHZhciByZWQxXG4gICAgICAgIGlmKGZ1bGwpIHtcbiAgICAgICAgICAvL0lmIGZ1bGwgaW50ZXJzZWN0aW9uLCBuZWVkIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VcbiAgICAgICAgICByZWQxID0gcGFydGl0aW9uQ29udGFpbnNQb2ludChcbiAgICAgICAgICAgIGQsIGF4aXMsXG4gICAgICAgICAgICByZWQwLCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICBtaWQpXG4gICAgICAgICAgaWYocmVkMCA8IHJlZDEpIHtcbiAgICAgICAgICAgIHZhciByZWRYID0gcGFydGl0aW9uU3RhcnRFcXVhbChcbiAgICAgICAgICAgICAgZCwgYXhpcyxcbiAgICAgICAgICAgICAgcmVkMCwgcmVkMSwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICAgICAgbWlkKVxuICAgICAgICAgICAgaWYoYXhpcyA9PT0gZC0yKSB7XG4gICAgICAgICAgICAgIC8vRGVnZW5lcmF0ZSBzd2VlcCBpbnRlcnNlY3Rpb246XG4gICAgICAgICAgICAgIC8vICBbcmVkMCwgcmVkWF0gd2l0aCBbYmx1ZTAsIGJsdWUxXVxuICAgICAgICAgICAgICBpZihyZWQwIDwgcmVkWCkge1xuICAgICAgICAgICAgICAgIHJldHZhbCA9IHN3ZWVwLnN3ZWVwQ29tcGxldGUoXG4gICAgICAgICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgICAgICAgIHJlZDAsIHJlZFgsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vTm9ybWFsIHN3ZWVwIGludGVyc2VjdGlvbjpcbiAgICAgICAgICAgICAgLy8gIFtyZWRYLCByZWQxXSB3aXRoIFtibHVlMCwgYmx1ZTFdXG4gICAgICAgICAgICAgIGlmKHJlZFggPCByZWQxKSB7XG4gICAgICAgICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgICAgICAgIHJlZFgsIHJlZDEsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYocmVkMCA8IHJlZFgpIHtcbiAgICAgICAgICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICAgICAgICAgIGF4aXMrMSxcbiAgICAgICAgICAgICAgICAgIHJlZDAsIHJlZFgsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsXG4gICAgICAgICAgICAgICAgICAxNixcbiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYocmVkWCA8IHJlZDEpIHtcbiAgICAgICAgICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICAgICAgICAgIGF4aXMrMSxcbiAgICAgICAgICAgICAgICAgIHJlZFgsIHJlZDEsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgLUluZmluaXR5LCBJbmZpbml0eSlcbiAgICAgICAgICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICAgICAgICAgIGF4aXMrMSxcbiAgICAgICAgICAgICAgICAgIGJsdWUwLCBibHVlMSxcbiAgICAgICAgICAgICAgICAgIHJlZFgsIHJlZDEsXG4gICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgLUluZmluaXR5LCBJbmZpbml0eSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZihmbGlwKSB7XG4gICAgICAgICAgICByZWQxID0gcGFydGl0aW9uQ29udGFpbnNQb2ludFByb3BlcihcbiAgICAgICAgICAgICAgZCwgYXhpcyxcbiAgICAgICAgICAgICAgcmVkMCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgICBtaWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZDEgPSBwYXJ0aXRpb25Db250YWluc1BvaW50KFxuICAgICAgICAgICAgICBkLCBheGlzLFxuICAgICAgICAgICAgICByZWQwLCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICAgIG1pZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVkMCA8IHJlZDEpIHtcbiAgICAgICAgICAgIGlmKGF4aXMgPT09IGQtMikge1xuICAgICAgICAgICAgICBpZihmbGlwKSB7XG4gICAgICAgICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgICAgICAgIGJsdWUwLCBibHVlMSwgYmx1ZSwgYmx1ZUluZGV4LFxuICAgICAgICAgICAgICAgICAgcmVkMCwgcmVkMSwgcmVkLCByZWRJbmRleClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcEJpcGFydGl0ZShcbiAgICAgICAgICAgICAgICAgIGQsIHZpc2l0LFxuICAgICAgICAgICAgICAgICAgcmVkMCwgcmVkMSwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICAgICAgICAgIGJsdWUwLCBibHVlMSwgYmx1ZSwgYmx1ZUluZGV4KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgICAgICAgcmVkMCwgcmVkMSxcbiAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsXG4gICAgICAgICAgICAgICAgZmxpcCxcbiAgICAgICAgICAgICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICAgICAgICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLFxuICAgICAgICAgICAgICAgIHJlZDAsIHJlZDEsXG4gICAgICAgICAgICAgICAgZmxpcF4xLFxuICAgICAgICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZmluZE1lZGlhblxuXG52YXIgZ2VuUGFydGl0aW9uID0gcmVxdWlyZSgnLi9wYXJ0aXRpb24nKVxuXG52YXIgcGFydGl0aW9uU3RhcnRMZXNzVGhhbiA9IGdlblBhcnRpdGlvbignbG88cDAnLCBbJ3AwJ10pXG5cbnZhciBQQVJUSVRJT05fVEhSRVNIT0xEID0gOCAgIC8vQ3V0IG9mZiBmb3IgdXNpbmcgaW5zZXJ0aW9uIHNvcnQgaW4gZmluZE1lZGlhblxuXG4vL0Jhc2UgY2FzZSBmb3IgbWVkaWFuIGZpbmRpbmc6ICBVc2UgaW5zZXJ0aW9uIHNvcnRcbmZ1bmN0aW9uIGluc2VydGlvblNvcnQoZCwgYXhpcywgc3RhcnQsIGVuZCwgYm94ZXMsIGlkcykge1xuICB2YXIgZWxlbVNpemUgPSAyICogZFxuICB2YXIgYm94UHRyID0gZWxlbVNpemUgKiAoc3RhcnQrMSkgKyBheGlzXG4gIGZvcih2YXIgaT1zdGFydCsxOyBpPGVuZDsgKytpLCBib3hQdHIrPWVsZW1TaXplKSB7XG4gICAgdmFyIHggPSBib3hlc1tib3hQdHJdXG4gICAgZm9yKHZhciBqPWksIHB0cj1lbGVtU2l6ZSooaS0xKTsgXG4gICAgICAgIGo+c3RhcnQgJiYgYm94ZXNbcHRyK2F4aXNdID4geDsgXG4gICAgICAgIC0taiwgcHRyLT1lbGVtU2l6ZSkge1xuICAgICAgLy9Td2FwXG4gICAgICB2YXIgYVB0ciA9IHB0clxuICAgICAgdmFyIGJQdHIgPSBwdHIrZWxlbVNpemVcbiAgICAgIGZvcih2YXIgaz0wOyBrPGVsZW1TaXplOyArK2ssICsrYVB0ciwgKytiUHRyKSB7XG4gICAgICAgIHZhciB5ID0gYm94ZXNbYVB0cl1cbiAgICAgICAgYm94ZXNbYVB0cl0gPSBib3hlc1tiUHRyXVxuICAgICAgICBib3hlc1tiUHRyXSA9IHlcbiAgICAgIH1cbiAgICAgIHZhciB0bXAgPSBpZHNbal1cbiAgICAgIGlkc1tqXSA9IGlkc1tqLTFdXG4gICAgICBpZHNbai0xXSA9IHRtcFxuICAgIH1cbiAgfVxufVxuXG4vL0ZpbmQgbWVkaWFuIHVzaW5nIHF1aWNrIHNlbGVjdCBhbGdvcml0aG1cbi8vICB0YWtlcyBPKG4pIHRpbWUgd2l0aCBoaWdoIHByb2JhYmlsaXR5XG5mdW5jdGlvbiBmaW5kTWVkaWFuKGQsIGF4aXMsIHN0YXJ0LCBlbmQsIGJveGVzLCBpZHMpIHtcbiAgaWYoZW5kIDw9IHN0YXJ0KzEpIHtcbiAgICByZXR1cm4gc3RhcnRcbiAgfVxuXG4gIHZhciBsbyAgICAgICA9IHN0YXJ0XG4gIHZhciBoaSAgICAgICA9IGVuZFxuICB2YXIgbWlkICAgICAgPSAoKGVuZCArIHN0YXJ0KSA+Pj4gMSlcbiAgdmFyIGVsZW1TaXplID0gMipkXG4gIHZhciBwaXZvdCAgICA9IG1pZFxuICB2YXIgdmFsdWUgICAgPSBib3hlc1tlbGVtU2l6ZSptaWQrYXhpc11cbiAgXG4gIHdoaWxlKGxvIDwgaGkpIHtcbiAgICBpZihoaSAtIGxvIDwgUEFSVElUSU9OX1RIUkVTSE9MRCkge1xuICAgICAgaW5zZXJ0aW9uU29ydChkLCBheGlzLCBsbywgaGksIGJveGVzLCBpZHMpXG4gICAgICB2YWx1ZSA9IGJveGVzW2VsZW1TaXplKm1pZCtheGlzXVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgXG4gICAgLy9TZWxlY3QgcGl2b3QgdXNpbmcgbWVkaWFuLW9mLTNcbiAgICB2YXIgY291bnQgID0gaGkgLSBsb1xuICAgIHZhciBwaXZvdDAgPSAoTWF0aC5yYW5kb20oKSpjb3VudCtsbyl8MFxuICAgIHZhciB2YWx1ZTAgPSBib3hlc1tlbGVtU2l6ZSpwaXZvdDAgKyBheGlzXVxuICAgIHZhciBwaXZvdDEgPSAoTWF0aC5yYW5kb20oKSpjb3VudCtsbyl8MFxuICAgIHZhciB2YWx1ZTEgPSBib3hlc1tlbGVtU2l6ZSpwaXZvdDEgKyBheGlzXVxuICAgIHZhciBwaXZvdDIgPSAoTWF0aC5yYW5kb20oKSpjb3VudCtsbyl8MFxuICAgIHZhciB2YWx1ZTIgPSBib3hlc1tlbGVtU2l6ZSpwaXZvdDIgKyBheGlzXVxuICAgIGlmKHZhbHVlMCA8PSB2YWx1ZTEpIHtcbiAgICAgIGlmKHZhbHVlMiA+PSB2YWx1ZTEpIHtcbiAgICAgICAgcGl2b3QgPSBwaXZvdDFcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTFcbiAgICAgIH0gZWxzZSBpZih2YWx1ZTAgPj0gdmFsdWUyKSB7XG4gICAgICAgIHBpdm90ID0gcGl2b3QwXG4gICAgICAgIHZhbHVlID0gdmFsdWUwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaXZvdCA9IHBpdm90MlxuICAgICAgICB2YWx1ZSA9IHZhbHVlMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih2YWx1ZTEgPj0gdmFsdWUyKSB7XG4gICAgICAgIHBpdm90ID0gcGl2b3QxXG4gICAgICAgIHZhbHVlID0gdmFsdWUxXG4gICAgICB9IGVsc2UgaWYodmFsdWUyID49IHZhbHVlMCkge1xuICAgICAgICBwaXZvdCA9IHBpdm90MFxuICAgICAgICB2YWx1ZSA9IHZhbHVlMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGl2b3QgPSBwaXZvdDJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTJcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1N3YXAgcGl2b3QgdG8gZW5kIG9mIGFycmF5XG4gICAgdmFyIGFQdHIgPSBlbGVtU2l6ZSAqIChoaS0xKVxuICAgIHZhciBiUHRyID0gZWxlbVNpemUgKiBwaXZvdFxuICAgIGZvcih2YXIgaT0wOyBpPGVsZW1TaXplOyArK2ksICsrYVB0ciwgKytiUHRyKSB7XG4gICAgICB2YXIgeCA9IGJveGVzW2FQdHJdXG4gICAgICBib3hlc1thUHRyXSA9IGJveGVzW2JQdHJdXG4gICAgICBib3hlc1tiUHRyXSA9IHhcbiAgICB9XG4gICAgdmFyIHkgPSBpZHNbaGktMV1cbiAgICBpZHNbaGktMV0gPSBpZHNbcGl2b3RdXG4gICAgaWRzW3Bpdm90XSA9IHlcblxuICAgIC8vUGFydGl0aW9uIHVzaW5nIHBpdm90XG4gICAgcGl2b3QgPSBwYXJ0aXRpb25TdGFydExlc3NUaGFuKFxuICAgICAgZCwgYXhpcywgXG4gICAgICBsbywgaGktMSwgYm94ZXMsIGlkcyxcbiAgICAgIHZhbHVlKVxuXG4gICAgLy9Td2FwIHBpdm90IGJhY2tcbiAgICB2YXIgYVB0ciA9IGVsZW1TaXplICogKGhpLTEpXG4gICAgdmFyIGJQdHIgPSBlbGVtU2l6ZSAqIHBpdm90XG4gICAgZm9yKHZhciBpPTA7IGk8ZWxlbVNpemU7ICsraSwgKythUHRyLCArK2JQdHIpIHtcbiAgICAgIHZhciB4ID0gYm94ZXNbYVB0cl1cbiAgICAgIGJveGVzW2FQdHJdID0gYm94ZXNbYlB0cl1cbiAgICAgIGJveGVzW2JQdHJdID0geFxuICAgIH1cbiAgICB2YXIgeSA9IGlkc1toaS0xXVxuICAgIGlkc1toaS0xXSA9IGlkc1twaXZvdF1cbiAgICBpZHNbcGl2b3RdID0geVxuXG4gICAgLy9Td2FwIHBpdm90IHRvIGxhc3QgcGl2b3RcbiAgICBpZihtaWQgPCBwaXZvdCkge1xuICAgICAgaGkgPSBwaXZvdC0xXG4gICAgICB3aGlsZShsbyA8IGhpICYmIFxuICAgICAgICBib3hlc1tlbGVtU2l6ZSooaGktMSkrYXhpc10gPT09IHZhbHVlKSB7XG4gICAgICAgIGhpIC09IDFcbiAgICAgIH1cbiAgICAgIGhpICs9IDFcbiAgICB9IGVsc2UgaWYocGl2b3QgPCBtaWQpIHtcbiAgICAgIGxvID0gcGl2b3QgKyAxXG4gICAgICB3aGlsZShsbyA8IGhpICYmXG4gICAgICAgIGJveGVzW2VsZW1TaXplKmxvK2F4aXNdID09PSB2YWx1ZSkge1xuICAgICAgICBsbyArPSAxXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy9NYWtlIHN1cmUgcGl2b3QgaXMgYXQgc3RhcnRcbiAgcmV0dXJuIHBhcnRpdGlvblN0YXJ0TGVzc1RoYW4oXG4gICAgZCwgYXhpcywgXG4gICAgc3RhcnQsIG1pZCwgYm94ZXMsIGlkcyxcbiAgICBib3hlc1tlbGVtU2l6ZSptaWQrYXhpc10pXG59IiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuUGFydGl0aW9uXG5cbnZhciBjb2RlID0gJ2Zvcih2YXIgaj0yKmEsaz1qKmMsbD1rLG09YyxuPWIsbz1hK2IscD1jO2Q+cDsrK3Asays9ail7dmFyIF87aWYoJClpZihtPT09cCltKz0xLGwrPWo7ZWxzZXtmb3IodmFyIHM9MDtqPnM7KytzKXt2YXIgdD1lW2src107ZVtrK3NdPWVbbF0sZVtsKytdPXR9dmFyIHU9ZltwXTtmW3BdPWZbbV0sZlttKytdPXV9fXJldHVybiBtJ1xuXG5mdW5jdGlvbiBnZW5QYXJ0aXRpb24ocHJlZGljYXRlLCBhcmdzKSB7XG4gIHZhciBmYXJncyA9J2FiY2RlZicuc3BsaXQoJycpLmNvbmNhdChhcmdzKVxuICB2YXIgcmVhZHMgPSBbXVxuICBpZihwcmVkaWNhdGUuaW5kZXhPZignbG8nKSA+PSAwKSB7XG4gICAgcmVhZHMucHVzaCgnbG89ZVtrK25dJylcbiAgfVxuICBpZihwcmVkaWNhdGUuaW5kZXhPZignaGknKSA+PSAwKSB7XG4gICAgcmVhZHMucHVzaCgnaGk9ZVtrK29dJylcbiAgfVxuICBmYXJncy5wdXNoKFxuICAgIGNvZGUucmVwbGFjZSgnXycsIHJlYWRzLmpvaW4oKSlcbiAgICAgICAgLnJlcGxhY2UoJyQnLCBwcmVkaWNhdGUpKVxuICByZXR1cm4gRnVuY3Rpb24uYXBwbHkodm9pZCAwLCBmYXJncylcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8vVGhpcyBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG5kYXJyYXktc29ydFxuLy9JdCBpcyBpbmxpbmVkIGhlcmUgYXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZFxuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBwZXI7XG5cbnZhciBJTlNFUlRfU09SVF9DVVRPRkYgPSAzMlxuXG5mdW5jdGlvbiB3cmFwcGVyKGRhdGEsIG4wKSB7XG4gIGlmIChuMCA8PSA0KklOU0VSVF9TT1JUX0NVVE9GRikge1xuICAgIGluc2VydGlvblNvcnQoMCwgbjAgLSAxLCBkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBxdWlja1NvcnQoMCwgbjAgLSAxLCBkYXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRpb25Tb3J0KGxlZnQsIHJpZ2h0LCBkYXRhKSB7XG4gIHZhciBwdHIgPSAyKihsZWZ0KzEpXG4gIGZvcih2YXIgaT1sZWZ0KzE7IGk8PXJpZ2h0OyArK2kpIHtcbiAgICB2YXIgYSA9IGRhdGFbcHRyKytdXG4gICAgdmFyIGIgPSBkYXRhW3B0cisrXVxuICAgIHZhciBqID0gaVxuICAgIHZhciBqcHRyID0gcHRyLTJcbiAgICB3aGlsZShqLS0gPiBsZWZ0KSB7XG4gICAgICB2YXIgeCA9IGRhdGFbanB0ci0yXVxuICAgICAgdmFyIHkgPSBkYXRhW2pwdHItMV1cbiAgICAgIGlmKHggPCBhKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYoeCA9PT0gYSAmJiB5IDwgYikge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGF0YVtqcHRyXSAgID0geFxuICAgICAgZGF0YVtqcHRyKzFdID0geVxuICAgICAganB0ciAtPSAyXG4gICAgfVxuICAgIGRhdGFbanB0cl0gICA9IGFcbiAgICBkYXRhW2pwdHIrMV0gPSBiXG4gIH1cbn1cblxuZnVuY3Rpb24gc3dhcChpLCBqLCBkYXRhKSB7XG4gIGkgKj0gMlxuICBqICo9IDJcbiAgdmFyIHggPSBkYXRhW2ldXG4gIHZhciB5ID0gZGF0YVtpKzFdXG4gIGRhdGFbaV0gPSBkYXRhW2pdXG4gIGRhdGFbaSsxXSA9IGRhdGFbaisxXVxuICBkYXRhW2pdID0geFxuICBkYXRhW2orMV0gPSB5XG59XG5cbmZ1bmN0aW9uIG1vdmUoaSwgaiwgZGF0YSkge1xuICBpICo9IDJcbiAgaiAqPSAyXG4gIGRhdGFbaV0gPSBkYXRhW2pdXG4gIGRhdGFbaSsxXSA9IGRhdGFbaisxXVxufVxuXG5mdW5jdGlvbiByb3RhdGUoaSwgaiwgaywgZGF0YSkge1xuICBpICo9IDJcbiAgaiAqPSAyXG4gIGsgKj0gMlxuICB2YXIgeCA9IGRhdGFbaV1cbiAgdmFyIHkgPSBkYXRhW2krMV1cbiAgZGF0YVtpXSA9IGRhdGFbal1cbiAgZGF0YVtpKzFdID0gZGF0YVtqKzFdXG4gIGRhdGFbal0gPSBkYXRhW2tdXG4gIGRhdGFbaisxXSA9IGRhdGFbaysxXVxuICBkYXRhW2tdID0geFxuICBkYXRhW2srMV0gPSB5XG59XG5cbmZ1bmN0aW9uIHNodWZmbGVQaXZvdChpLCBqLCBweCwgcHksIGRhdGEpIHtcbiAgaSAqPSAyXG4gIGogKj0gMlxuICBkYXRhW2ldID0gZGF0YVtqXVxuICBkYXRhW2pdID0gcHhcbiAgZGF0YVtpKzFdID0gZGF0YVtqKzFdXG4gIGRhdGFbaisxXSA9IHB5XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoaSwgaiwgZGF0YSkge1xuICBpICo9IDJcbiAgaiAqPSAyXG4gIHZhciB4ID0gZGF0YVtpXSxcbiAgICAgIHkgPSBkYXRhW2pdXG4gIGlmKHggPCB5KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gZWxzZSBpZih4ID09PSB5KSB7XG4gICAgcmV0dXJuIGRhdGFbaSsxXSA+IGRhdGFbaisxXVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVQaXZvdChpLCB5LCBiLCBkYXRhKSB7XG4gIGkgKj0gMlxuICB2YXIgeCA9IGRhdGFbaV1cbiAgaWYoeCA8IHkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2UgaWYoeCA9PT0geSkge1xuICAgIHJldHVybiBkYXRhW2krMV0gPCBiXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHF1aWNrU29ydChsZWZ0LCByaWdodCwgZGF0YSkge1xuICB2YXIgc2l4dGggPSAocmlnaHQgLSBsZWZ0ICsgMSkgLyA2IHwgMCwgXG4gICAgICBpbmRleDEgPSBsZWZ0ICsgc2l4dGgsIFxuICAgICAgaW5kZXg1ID0gcmlnaHQgLSBzaXh0aCwgXG4gICAgICBpbmRleDMgPSBsZWZ0ICsgcmlnaHQgPj4gMSwgXG4gICAgICBpbmRleDIgPSBpbmRleDMgLSBzaXh0aCwgXG4gICAgICBpbmRleDQgPSBpbmRleDMgKyBzaXh0aCwgXG4gICAgICBlbDEgPSBpbmRleDEsIFxuICAgICAgZWwyID0gaW5kZXgyLCBcbiAgICAgIGVsMyA9IGluZGV4MywgXG4gICAgICBlbDQgPSBpbmRleDQsIFxuICAgICAgZWw1ID0gaW5kZXg1LCBcbiAgICAgIGxlc3MgPSBsZWZ0ICsgMSwgXG4gICAgICBncmVhdCA9IHJpZ2h0IC0gMSwgXG4gICAgICB0bXAgPSAwXG4gIGlmKGNvbXBhcmUoZWwxLCBlbDIsIGRhdGEpKSB7XG4gICAgdG1wID0gZWwxXG4gICAgZWwxID0gZWwyXG4gICAgZWwyID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDQsIGVsNSwgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDRcbiAgICBlbDQgPSBlbDVcbiAgICBlbDUgPSB0bXBcbiAgfVxuICBpZihjb21wYXJlKGVsMSwgZWwzLCBkYXRhKSkge1xuICAgIHRtcCA9IGVsMVxuICAgIGVsMSA9IGVsM1xuICAgIGVsMyA9IHRtcFxuICB9XG4gIGlmKGNvbXBhcmUoZWwyLCBlbDMsIGRhdGEpKSB7XG4gICAgdG1wID0gZWwyXG4gICAgZWwyID0gZWwzXG4gICAgZWwzID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDEsIGVsNCwgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDFcbiAgICBlbDEgPSBlbDRcbiAgICBlbDQgPSB0bXBcbiAgfVxuICBpZihjb21wYXJlKGVsMywgZWw0LCBkYXRhKSkge1xuICAgIHRtcCA9IGVsM1xuICAgIGVsMyA9IGVsNFxuICAgIGVsNCA9IHRtcFxuICB9XG4gIGlmKGNvbXBhcmUoZWwyLCBlbDUsIGRhdGEpKSB7XG4gICAgdG1wID0gZWwyXG4gICAgZWwyID0gZWw1XG4gICAgZWw1ID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDIsIGVsMywgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDJcbiAgICBlbDIgPSBlbDNcbiAgICBlbDMgPSB0bXBcbiAgfVxuICBpZihjb21wYXJlKGVsNCwgZWw1LCBkYXRhKSkge1xuICAgIHRtcCA9IGVsNFxuICAgIGVsNCA9IGVsNVxuICAgIGVsNSA9IHRtcFxuICB9XG5cbiAgdmFyIHBpdm90MVggPSBkYXRhWzIqZWwyXVxuICB2YXIgcGl2b3QxWSA9IGRhdGFbMiplbDIrMV1cbiAgdmFyIHBpdm90MlggPSBkYXRhWzIqZWw0XVxuICB2YXIgcGl2b3QyWSA9IGRhdGFbMiplbDQrMV1cblxuICB2YXIgcHRyMCA9IDIgKiBlbDE7XG4gIHZhciBwdHIyID0gMiAqIGVsMztcbiAgdmFyIHB0cjQgPSAyICogZWw1O1xuICB2YXIgcHRyNSA9IDIgKiBpbmRleDE7XG4gIHZhciBwdHI2ID0gMiAqIGluZGV4MztcbiAgdmFyIHB0cjcgPSAyICogaW5kZXg1O1xuICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgMjsgKytpMSkge1xuICAgIHZhciB4ID0gZGF0YVtwdHIwK2kxXTtcbiAgICB2YXIgeSA9IGRhdGFbcHRyMitpMV07XG4gICAgdmFyIHogPSBkYXRhW3B0cjQraTFdO1xuICAgIGRhdGFbcHRyNStpMV0gPSB4O1xuICAgIGRhdGFbcHRyNitpMV0gPSB5O1xuICAgIGRhdGFbcHRyNytpMV0gPSB6O1xuICB9XG5cbiAgbW92ZShpbmRleDIsIGxlZnQsIGRhdGEpXG4gIG1vdmUoaW5kZXg0LCByaWdodCwgZGF0YSlcbiAgZm9yICh2YXIgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7ICsraykge1xuICAgIGlmIChjb21wYXJlUGl2b3QoaywgcGl2b3QxWCwgcGl2b3QxWSwgZGF0YSkpIHtcbiAgICAgIGlmIChrICE9PSBsZXNzKSB7XG4gICAgICAgIHN3YXAoaywgbGVzcywgZGF0YSlcbiAgICAgIH1cbiAgICAgICsrbGVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjb21wYXJlUGl2b3QoaywgcGl2b3QyWCwgcGl2b3QyWSwgZGF0YSkpIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVQaXZvdChncmVhdCwgcGl2b3QyWCwgcGl2b3QyWSwgZGF0YSkpIHtcbiAgICAgICAgICAgIGlmICgtLWdyZWF0IDwgaykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29tcGFyZVBpdm90KGdyZWF0LCBwaXZvdDFYLCBwaXZvdDFZLCBkYXRhKSkge1xuICAgICAgICAgICAgICByb3RhdGUoaywgbGVzcywgZ3JlYXQsIGRhdGEpXG4gICAgICAgICAgICAgICsrbGVzcztcbiAgICAgICAgICAgICAgLS1ncmVhdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN3YXAoaywgZ3JlYXQsIGRhdGEpXG4gICAgICAgICAgICAgIC0tZ3JlYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2h1ZmZsZVBpdm90KGxlZnQsIGxlc3MtMSwgcGl2b3QxWCwgcGl2b3QxWSwgZGF0YSlcbiAgc2h1ZmZsZVBpdm90KHJpZ2h0LCBncmVhdCsxLCBwaXZvdDJYLCBwaXZvdDJZLCBkYXRhKVxuICBpZiAobGVzcyAtIDIgLSBsZWZ0IDw9IElOU0VSVF9TT1JUX0NVVE9GRikge1xuICAgIGluc2VydGlvblNvcnQobGVmdCwgbGVzcyAtIDIsIGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHF1aWNrU29ydChsZWZ0LCBsZXNzIC0gMiwgZGF0YSk7XG4gIH1cbiAgaWYgKHJpZ2h0IC0gKGdyZWF0ICsgMikgPD0gSU5TRVJUX1NPUlRfQ1VUT0ZGKSB7XG4gICAgaW5zZXJ0aW9uU29ydChncmVhdCArIDIsIHJpZ2h0LCBkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBxdWlja1NvcnQoZ3JlYXQgKyAyLCByaWdodCwgZGF0YSk7XG4gIH1cbiAgaWYgKGdyZWF0IC0gbGVzcyA8PSBJTlNFUlRfU09SVF9DVVRPRkYpIHtcbiAgICBpbnNlcnRpb25Tb3J0KGxlc3MsIGdyZWF0LCBkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBxdWlja1NvcnQobGVzcywgZ3JlYXQsIGRhdGEpO1xuICB9XG59IiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbml0OiAgICAgICAgICAgc3FJbml0LFxuICBzd2VlcEJpcGFydGl0ZTogc3dlZXBCaXBhcnRpdGUsXG4gIHN3ZWVwQ29tcGxldGU6ICBzd2VlcENvbXBsZXRlLFxuICBzY2FuQmlwYXJ0aXRlOiAgc2NhbkJpcGFydGl0ZSxcbiAgc2NhbkNvbXBsZXRlOiAgIHNjYW5Db21wbGV0ZVxufVxuXG52YXIgcG9vbCAgPSByZXF1aXJlKCd0eXBlZGFycmF5LXBvb2wnKVxudmFyIGJpdHMgID0gcmVxdWlyZSgnYml0LXR3aWRkbGUnKVxudmFyIGlzb3J0ID0gcmVxdWlyZSgnLi9zb3J0JylcblxuLy9GbGFnIGZvciBibHVlXG52YXIgQkxVRV9GTEFHID0gKDE8PDI4KVxuXG4vLzFEIHN3ZWVwIGV2ZW50IHF1ZXVlIHN0dWZmICh1c2UgcG9vbCB0byBzYXZlIHNwYWNlKVxudmFyIElOSVRfQ0FQQUNJVFkgICAgICA9IDEwMjRcbnZhciBSRURfU1dFRVBfUVVFVUUgICAgPSBwb29sLm1hbGxvY0ludDMyKElOSVRfQ0FQQUNJVFkpXG52YXIgUkVEX1NXRUVQX0lOREVYICAgID0gcG9vbC5tYWxsb2NJbnQzMihJTklUX0NBUEFDSVRZKVxudmFyIEJMVUVfU1dFRVBfUVVFVUUgICA9IHBvb2wubWFsbG9jSW50MzIoSU5JVF9DQVBBQ0lUWSlcbnZhciBCTFVFX1NXRUVQX0lOREVYICAgPSBwb29sLm1hbGxvY0ludDMyKElOSVRfQ0FQQUNJVFkpXG52YXIgQ09NTU9OX1NXRUVQX1FVRVVFID0gcG9vbC5tYWxsb2NJbnQzMihJTklUX0NBUEFDSVRZKVxudmFyIENPTU1PTl9TV0VFUF9JTkRFWCA9IHBvb2wubWFsbG9jSW50MzIoSU5JVF9DQVBBQ0lUWSlcbnZhciBTV0VFUF9FVkVOVFMgICAgICAgPSBwb29sLm1hbGxvY0RvdWJsZShJTklUX0NBUEFDSVRZICogOClcblxuLy9SZXNlcnZlcyBtZW1vcnkgZm9yIHRoZSAxRCBzd2VlcCBkYXRhIHN0cnVjdHVyZXNcbmZ1bmN0aW9uIHNxSW5pdChjb3VudCkge1xuICB2YXIgcmNvdW50ID0gYml0cy5uZXh0UG93Mihjb3VudClcbiAgaWYoUkVEX1NXRUVQX1FVRVVFLmxlbmd0aCA8IHJjb3VudCkge1xuICAgIHBvb2wuZnJlZShSRURfU1dFRVBfUVVFVUUpXG4gICAgUkVEX1NXRUVQX1FVRVVFID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgaWYoUkVEX1NXRUVQX0lOREVYLmxlbmd0aCA8IHJjb3VudCkge1xuICAgIHBvb2wuZnJlZShSRURfU1dFRVBfSU5ERVgpXG4gICAgUkVEX1NXRUVQX0lOREVYID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgaWYoQkxVRV9TV0VFUF9RVUVVRS5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoQkxVRV9TV0VFUF9RVUVVRSlcbiAgICBCTFVFX1NXRUVQX1FVRVVFID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgaWYoQkxVRV9TV0VFUF9JTkRFWC5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoQkxVRV9TV0VFUF9JTkRFWClcbiAgICBCTFVFX1NXRUVQX0lOREVYID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgaWYoQ09NTU9OX1NXRUVQX1FVRVVFLmxlbmd0aCA8IHJjb3VudCkge1xuICAgIHBvb2wuZnJlZShDT01NT05fU1dFRVBfUVVFVUUpXG4gICAgQ09NTU9OX1NXRUVQX1FVRVVFID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgaWYoQ09NTU9OX1NXRUVQX0lOREVYLmxlbmd0aCA8IHJjb3VudCkge1xuICAgIHBvb2wuZnJlZShDT01NT05fU1dFRVBfSU5ERVgpXG4gICAgQ09NTU9OX1NXRUVQX0lOREVYID0gcG9vbC5tYWxsb2NJbnQzMihyY291bnQpXG4gIH1cbiAgdmFyIGV2ZW50TGVuZ3RoID0gOCAqIHJjb3VudFxuICBpZihTV0VFUF9FVkVOVFMubGVuZ3RoIDwgZXZlbnRMZW5ndGgpIHtcbiAgICBwb29sLmZyZWUoU1dFRVBfRVZFTlRTKVxuICAgIFNXRUVQX0VWRU5UUyA9IHBvb2wubWFsbG9jRG91YmxlKGV2ZW50TGVuZ3RoKVxuICB9XG59XG5cbi8vUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgYWN0aXZlIHF1ZXVlIGluIE8oMSlcbmZ1bmN0aW9uIHNxUG9wKHF1ZXVlLCBpbmRleCwgY291bnQsIGl0ZW0pIHtcbiAgdmFyIGlkeCA9IGluZGV4W2l0ZW1dXG4gIHZhciB0b3AgPSBxdWV1ZVtjb3VudC0xXVxuICBxdWV1ZVtpZHhdID0gdG9wXG4gIGluZGV4W3RvcF0gPSBpZHhcbn1cblxuLy9JbnNlcnQgYW4gaXRlbSBpbnRvIHRoZSBhY3RpdmUgcXVldWUgaW4gTygxKVxuZnVuY3Rpb24gc3FQdXNoKHF1ZXVlLCBpbmRleCwgY291bnQsIGl0ZW0pIHtcbiAgcXVldWVbY291bnRdID0gaXRlbVxuICBpbmRleFtpdGVtXSAgPSBjb3VudFxufVxuXG4vL1JlY3Vyc2lvbiBiYXNlIGNhc2U6IHVzZSAxRCBzd2VlcCBhbGdvcml0aG1cbmZ1bmN0aW9uIHN3ZWVwQmlwYXJ0aXRlKFxuICAgIGQsIHZpc2l0LFxuICAgIHJlZFN0YXJ0LCAgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KSB7XG5cbiAgLy9zdG9yZSBldmVudHMgYXMgcGFpcnMgW2Nvb3JkaW5hdGUsIGlkeF1cbiAgLy9cbiAgLy8gIHJlZCBjcmVhdGU6ICAtKGlkeCsxKVxuICAvLyAgcmVkIGRlc3Ryb3k6IGlkeFxuICAvLyAgYmx1ZSBjcmVhdGU6IC0oaWR4K0JMVUVfRkxBRylcbiAgLy8gIGJsdWUgZGVzdHJveTogaWR4K0JMVUVfRkxBR1xuICAvL1xuICB2YXIgcHRyICAgICAgPSAwXG4gIHZhciBlbGVtU2l6ZSA9IDIqZFxuICB2YXIgaXN0YXJ0ICAgPSBkLTFcbiAgdmFyIGllbmQgICAgID0gZWxlbVNpemUtMVxuXG4gIGZvcih2YXIgaT1yZWRTdGFydDsgaTxyZWRFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSByZWRJbmRleFtpXVxuICAgIHZhciByZWRPZmZzZXQgPSBlbGVtU2l6ZSppXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IHJlZFtyZWRPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAtKGlkeCsxKVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2llbmRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGlkeFxuICB9XG5cbiAgZm9yKHZhciBpPWJsdWVTdGFydDsgaTxibHVlRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gYmx1ZUluZGV4W2ldK0JMVUVfRkxBR1xuICAgIHZhciBibHVlT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBibHVlW2JsdWVPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAtaWR4XG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGJsdWVbYmx1ZU9mZnNldCtpZW5kXVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBpZHhcbiAgfVxuXG4gIC8vcHJvY2VzcyBldmVudHMgZnJvbSBsZWZ0LT5yaWdodFxuICB2YXIgbiA9IHB0ciA+Pj4gMVxuICBpc29ydChTV0VFUF9FVkVOVFMsIG4pXG4gIFxuICB2YXIgcmVkQWN0aXZlICA9IDBcbiAgdmFyIGJsdWVBY3RpdmUgPSAwXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHZhciBlID0gU1dFRVBfRVZFTlRTWzIqaSsxXXwwXG4gICAgaWYoZSA+PSBCTFVFX0ZMQUcpIHtcbiAgICAgIC8vYmx1ZSBkZXN0cm95IGV2ZW50XG4gICAgICBlID0gKGUtQkxVRV9GTEFHKXwwXG4gICAgICBzcVBvcChCTFVFX1NXRUVQX1FVRVVFLCBCTFVFX1NXRUVQX0lOREVYLCBibHVlQWN0aXZlLS0sIGUpXG4gICAgfSBlbHNlIGlmKGUgPj0gMCkge1xuICAgICAgLy9yZWQgZGVzdHJveSBldmVudFxuICAgICAgc3FQb3AoUkVEX1NXRUVQX1FVRVVFLCBSRURfU1dFRVBfSU5ERVgsIHJlZEFjdGl2ZS0tLCBlKVxuICAgIH0gZWxzZSBpZihlIDw9IC1CTFVFX0ZMQUcpIHtcbiAgICAgIC8vYmx1ZSBjcmVhdGUgZXZlbnRcbiAgICAgIGUgPSAoLWUtQkxVRV9GTEFHKXwwXG4gICAgICBmb3IodmFyIGo9MDsgajxyZWRBY3RpdmU7ICsraikge1xuICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQoUkVEX1NXRUVQX1FVRVVFW2pdLCBlKVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3FQdXNoKEJMVUVfU1dFRVBfUVVFVUUsIEJMVUVfU1dFRVBfSU5ERVgsIGJsdWVBY3RpdmUrKywgZSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy9yZWQgY3JlYXRlIGV2ZW50XG4gICAgICBlID0gKC1lLTEpfDBcbiAgICAgIGZvcih2YXIgaj0wOyBqPGJsdWVBY3RpdmU7ICsraikge1xuICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQoZSwgQkxVRV9TV0VFUF9RVUVVRVtqXSlcbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNxUHVzaChSRURfU1dFRVBfUVVFVUUsIFJFRF9TV0VFUF9JTkRFWCwgcmVkQWN0aXZlKyssIGUpXG4gICAgfVxuICB9XG59XG5cbi8vQ29tcGxldGUgc3dlZXBcbmZ1bmN0aW9uIHN3ZWVwQ29tcGxldGUoZCwgdmlzaXQsIFxuICByZWRTdGFydCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleCkge1xuXG4gIHZhciBwdHIgICAgICA9IDBcbiAgdmFyIGVsZW1TaXplID0gMipkXG4gIHZhciBpc3RhcnQgICA9IGQtMVxuICB2YXIgaWVuZCAgICAgPSBlbGVtU2l6ZS0xXG5cbiAgZm9yKHZhciBpPXJlZFN0YXJ0OyBpPHJlZEVuZDsgKytpKSB7XG4gICAgdmFyIGlkeCA9IChyZWRJbmRleFtpXSsxKTw8MVxuICAgIHZhciByZWRPZmZzZXQgPSBlbGVtU2l6ZSppXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IHJlZFtyZWRPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAtaWR4XG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IHJlZFtyZWRPZmZzZXQraWVuZF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gaWR4XG4gIH1cblxuICBmb3IodmFyIGk9Ymx1ZVN0YXJ0OyBpPGJsdWVFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSAoYmx1ZUluZGV4W2ldKzEpPDwxXG4gICAgdmFyIGJsdWVPZmZzZXQgPSBlbGVtU2l6ZSppXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGJsdWVbYmx1ZU9mZnNldCtpc3RhcnRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9ICgtaWR4KXwxXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGJsdWVbYmx1ZU9mZnNldCtpZW5kXVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBpZHh8MVxuICB9XG5cbiAgLy9wcm9jZXNzIGV2ZW50cyBmcm9tIGxlZnQtPnJpZ2h0XG4gIHZhciBuID0gcHRyID4+PiAxXG4gIGlzb3J0KFNXRUVQX0VWRU5UUywgbilcbiAgXG4gIHZhciByZWRBY3RpdmUgICAgPSAwXG4gIHZhciBibHVlQWN0aXZlICAgPSAwXG4gIHZhciBjb21tb25BY3RpdmUgPSAwXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHZhciBlICAgICA9IFNXRUVQX0VWRU5UU1syKmkrMV18MFxuICAgIHZhciBjb2xvciA9IGUmMVxuICAgIGlmKGkgPCBuLTEgJiYgKGU+PjEpID09PSAoU1dFRVBfRVZFTlRTWzIqaSszXT4+MSkpIHtcbiAgICAgIGNvbG9yID0gMlxuICAgICAgaSArPSAxXG4gICAgfVxuICAgIFxuICAgIGlmKGUgPCAwKSB7XG4gICAgICAvL0NyZWF0ZSBldmVudFxuICAgICAgdmFyIGlkID0gLShlPj4xKSAtIDFcblxuICAgICAgLy9JbnRlcnNlY3Qgd2l0aCBjb21tb25cbiAgICAgIGZvcih2YXIgaj0wOyBqPGNvbW1vbkFjdGl2ZTsgKytqKSB7XG4gICAgICAgIHZhciByZXR2YWwgPSB2aXNpdChDT01NT05fU1dFRVBfUVVFVUVbal0sIGlkKVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihjb2xvciAhPT0gMCkge1xuICAgICAgICAvL0ludGVyc2VjdCB3aXRoIHJlZFxuICAgICAgICBmb3IodmFyIGo9MDsgajxyZWRBY3RpdmU7ICsraikge1xuICAgICAgICAgIHZhciByZXR2YWwgPSB2aXNpdChSRURfU1dFRVBfUVVFVUVbal0sIGlkKVxuICAgICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNvbG9yICE9PSAxKSB7XG4gICAgICAgIC8vSW50ZXJzZWN0IHdpdGggYmx1ZVxuICAgICAgICBmb3IodmFyIGo9MDsgajxibHVlQWN0aXZlOyArK2opIHtcbiAgICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQoQkxVRV9TV0VFUF9RVUVVRVtqXSwgaWQpXG4gICAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoY29sb3IgPT09IDApIHtcbiAgICAgICAgLy9SZWRcbiAgICAgICAgc3FQdXNoKFJFRF9TV0VFUF9RVUVVRSwgUkVEX1NXRUVQX0lOREVYLCByZWRBY3RpdmUrKywgaWQpXG4gICAgICB9IGVsc2UgaWYoY29sb3IgPT09IDEpIHtcbiAgICAgICAgLy9CbHVlXG4gICAgICAgIHNxUHVzaChCTFVFX1NXRUVQX1FVRVVFLCBCTFVFX1NXRUVQX0lOREVYLCBibHVlQWN0aXZlKyssIGlkKVxuICAgICAgfSBlbHNlIGlmKGNvbG9yID09PSAyKSB7XG4gICAgICAgIC8vQm90aFxuICAgICAgICBzcVB1c2goQ09NTU9OX1NXRUVQX1FVRVVFLCBDT01NT05fU1dFRVBfSU5ERVgsIGNvbW1vbkFjdGl2ZSsrLCBpZClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy9EZXN0cm95IGV2ZW50XG4gICAgICB2YXIgaWQgPSAoZT4+MSkgLSAxXG4gICAgICBpZihjb2xvciA9PT0gMCkge1xuICAgICAgICAvL1JlZFxuICAgICAgICBzcVBvcChSRURfU1dFRVBfUVVFVUUsIFJFRF9TV0VFUF9JTkRFWCwgcmVkQWN0aXZlLS0sIGlkKVxuICAgICAgfSBlbHNlIGlmKGNvbG9yID09PSAxKSB7XG4gICAgICAgIC8vQmx1ZVxuICAgICAgICBzcVBvcChCTFVFX1NXRUVQX1FVRVVFLCBCTFVFX1NXRUVQX0lOREVYLCBibHVlQWN0aXZlLS0sIGlkKVxuICAgICAgfSBlbHNlIGlmKGNvbG9yID09PSAyKSB7XG4gICAgICAgIC8vQm90aFxuICAgICAgICBzcVBvcChDT01NT05fU1dFRVBfUVVFVUUsIENPTU1PTl9TV0VFUF9JTkRFWCwgY29tbW9uQWN0aXZlLS0sIGlkKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vL1N3ZWVwIGFuZCBwcnVuZS9zY2FubGluZSBhbGdvcml0aG06XG4vLyAgU2NhbiBhbG9uZyBheGlzLCBkZXRlY3QgaW50ZXJzZWN0aW9uc1xuLy8gIEJydXRlIGZvcmNlIGFsbCBib3hlcyBhbG9uZyBheGlzXG5mdW5jdGlvbiBzY2FuQmlwYXJ0aXRlKFxuICBkLCBheGlzLCB2aXNpdCwgZmxpcCxcbiAgcmVkU3RhcnQsICByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KSB7XG4gIFxuICB2YXIgcHRyICAgICAgPSAwXG4gIHZhciBlbGVtU2l6ZSA9IDIqZFxuICB2YXIgaXN0YXJ0ICAgPSBheGlzXG4gIHZhciBpZW5kICAgICA9IGF4aXMrZFxuXG4gIHZhciByZWRTaGlmdCAgPSAxXG4gIHZhciBibHVlU2hpZnQgPSAxXG4gIGlmKGZsaXApIHtcbiAgICBibHVlU2hpZnQgPSBCTFVFX0ZMQUdcbiAgfSBlbHNlIHtcbiAgICByZWRTaGlmdCAgPSBCTFVFX0ZMQUdcbiAgfVxuXG4gIGZvcih2YXIgaT1yZWRTdGFydDsgaTxyZWRFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSBpICsgcmVkU2hpZnRcbiAgICB2YXIgcmVkT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLWlkeFxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2llbmRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGlkeFxuICB9XG4gIGZvcih2YXIgaT1ibHVlU3RhcnQ7IGk8Ymx1ZUVuZDsgKytpKSB7XG4gICAgdmFyIGlkeCA9IGkgKyBibHVlU2hpZnRcbiAgICB2YXIgYmx1ZU9mZnNldCA9IGVsZW1TaXplKmlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gYmx1ZVtibHVlT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLWlkeFxuICB9XG5cbiAgLy9wcm9jZXNzIGV2ZW50cyBmcm9tIGxlZnQtPnJpZ2h0XG4gIHZhciBuID0gcHRyID4+PiAxXG4gIGlzb3J0KFNXRUVQX0VWRU5UUywgbilcbiAgXG4gIHZhciByZWRBY3RpdmUgICAgPSAwXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHZhciBlID0gU1dFRVBfRVZFTlRTWzIqaSsxXXwwXG4gICAgaWYoZSA8IDApIHtcbiAgICAgIHZhciBpZHggICA9IC1lXG4gICAgICB2YXIgaXNSZWQgPSBmYWxzZVxuICAgICAgaWYoaWR4ID49IEJMVUVfRkxBRykge1xuICAgICAgICBpc1JlZCA9ICFmbGlwXG4gICAgICAgIGlkeCAtPSBCTFVFX0ZMQUcgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc1JlZCA9ICEhZmxpcFxuICAgICAgICBpZHggLT0gMVxuICAgICAgfVxuICAgICAgaWYoaXNSZWQpIHtcbiAgICAgICAgc3FQdXNoKFJFRF9TV0VFUF9RVUVVRSwgUkVEX1NXRUVQX0lOREVYLCByZWRBY3RpdmUrKywgaWR4KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGJsdWVJZCAgPSBibHVlSW5kZXhbaWR4XVxuICAgICAgICB2YXIgYmx1ZVB0ciA9IGVsZW1TaXplICogaWR4XG4gICAgICAgIFxuICAgICAgICB2YXIgYjAgPSBibHVlW2JsdWVQdHIrYXhpcysxXVxuICAgICAgICB2YXIgYjEgPSBibHVlW2JsdWVQdHIrYXhpcysxK2RdXG5cbnJlZF9sb29wOlxuICAgICAgICBmb3IodmFyIGo9MDsgajxyZWRBY3RpdmU7ICsraikge1xuICAgICAgICAgIHZhciBvaWR4ICAgPSBSRURfU1dFRVBfUVVFVUVbal1cbiAgICAgICAgICB2YXIgcmVkUHRyID0gZWxlbVNpemUgKiBvaWR4XG5cbiAgICAgICAgICBpZihiMSA8IHJlZFtyZWRQdHIrYXhpcysxXSB8fCBcbiAgICAgICAgICAgICByZWRbcmVkUHRyK2F4aXMrMStkXSA8IGIwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvcih2YXIgaz1heGlzKzI7IGs8ZDsgKytrKSB7XG4gICAgICAgICAgICBpZihibHVlW2JsdWVQdHIgKyBrICsgZF0gPCByZWRbcmVkUHRyICsga10gfHwgXG4gICAgICAgICAgICAgICByZWRbcmVkUHRyICsgayArIGRdIDwgYmx1ZVtibHVlUHRyICsga10pIHtcbiAgICAgICAgICAgICAgY29udGludWUgcmVkX2xvb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVkSWQgID0gcmVkSW5kZXhbb2lkeF1cbiAgICAgICAgICB2YXIgcmV0dmFsXG4gICAgICAgICAgaWYoZmxpcCkge1xuICAgICAgICAgICAgcmV0dmFsID0gdmlzaXQoYmx1ZUlkLCByZWRJZClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dmFsID0gdmlzaXQocmVkSWQsIGJsdWVJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXR2YWwgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNxUG9wKFJFRF9TV0VFUF9RVUVVRSwgUkVEX1NXRUVQX0lOREVYLCByZWRBY3RpdmUtLSwgZSAtIHJlZFNoaWZ0KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FuQ29tcGxldGUoXG4gIGQsIGF4aXMsIHZpc2l0LFxuICByZWRTdGFydCwgIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpIHtcblxuICB2YXIgcHRyICAgICAgPSAwXG4gIHZhciBlbGVtU2l6ZSA9IDIqZFxuICB2YXIgaXN0YXJ0ICAgPSBheGlzXG4gIHZhciBpZW5kICAgICA9IGF4aXMrZFxuXG4gIGZvcih2YXIgaT1yZWRTdGFydDsgaTxyZWRFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSBpICsgQkxVRV9GTEFHXG4gICAgdmFyIHJlZE9mZnNldCA9IGVsZW1TaXplKmlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gcmVkW3JlZE9mZnNldCtpc3RhcnRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IC1pZHhcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gcmVkW3JlZE9mZnNldCtpZW5kXVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBpZHhcbiAgfVxuICBmb3IodmFyIGk9Ymx1ZVN0YXJ0OyBpPGJsdWVFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSBpICsgMVxuICAgIHZhciBibHVlT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBibHVlW2JsdWVPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAtaWR4XG4gIH1cblxuICAvL3Byb2Nlc3MgZXZlbnRzIGZyb20gbGVmdC0+cmlnaHRcbiAgdmFyIG4gPSBwdHIgPj4+IDFcbiAgaXNvcnQoU1dFRVBfRVZFTlRTLCBuKVxuICBcbiAgdmFyIHJlZEFjdGl2ZSAgICA9IDBcbiAgZm9yKHZhciBpPTA7IGk8bjsgKytpKSB7XG4gICAgdmFyIGUgPSBTV0VFUF9FVkVOVFNbMippKzFdfDBcbiAgICBpZihlIDwgMCkge1xuICAgICAgdmFyIGlkeCAgID0gLWVcbiAgICAgIGlmKGlkeCA+PSBCTFVFX0ZMQUcpIHtcbiAgICAgICAgUkVEX1NXRUVQX1FVRVVFW3JlZEFjdGl2ZSsrXSA9IGlkeCAtIEJMVUVfRkxBR1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWR4IC09IDFcbiAgICAgICAgdmFyIGJsdWVJZCAgPSBibHVlSW5kZXhbaWR4XVxuICAgICAgICB2YXIgYmx1ZVB0ciA9IGVsZW1TaXplICogaWR4XG5cbiAgICAgICAgdmFyIGIwID0gYmx1ZVtibHVlUHRyK2F4aXMrMV1cbiAgICAgICAgdmFyIGIxID0gYmx1ZVtibHVlUHRyK2F4aXMrMStkXVxuXG5yZWRfbG9vcDpcbiAgICAgICAgZm9yKHZhciBqPTA7IGo8cmVkQWN0aXZlOyArK2opIHtcbiAgICAgICAgICB2YXIgb2lkeCAgID0gUkVEX1NXRUVQX1FVRVVFW2pdXG4gICAgICAgICAgdmFyIHJlZElkICA9IHJlZEluZGV4W29pZHhdXG5cbiAgICAgICAgICBpZihyZWRJZCA9PT0gYmx1ZUlkKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZWRQdHIgPSBlbGVtU2l6ZSAqIG9pZHhcbiAgICAgICAgICBpZihiMSA8IHJlZFtyZWRQdHIrYXhpcysxXSB8fCBcbiAgICAgICAgICAgIHJlZFtyZWRQdHIrYXhpcysxK2RdIDwgYjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvcih2YXIgaz1heGlzKzI7IGs8ZDsgKytrKSB7XG4gICAgICAgICAgICBpZihibHVlW2JsdWVQdHIgKyBrICsgZF0gPCByZWRbcmVkUHRyICsga10gfHwgXG4gICAgICAgICAgICAgICByZWRbcmVkUHRyICsgayArIGRdICAgPCBibHVlW2JsdWVQdHIgKyBrXSkge1xuICAgICAgICAgICAgICBjb250aW51ZSByZWRfbG9vcFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZXR2YWwgPSB2aXNpdChyZWRJZCwgYmx1ZUlkKVxuICAgICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dmFsIFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaWR4ID0gZSAtIEJMVUVfRkxBR1xuICAgICAgZm9yKHZhciBqPXJlZEFjdGl2ZS0xOyBqPj0wOyAtLWopIHtcbiAgICAgICAgaWYoUkVEX1NXRUVQX1FVRVVFW2pdID09PSBpZHgpIHtcbiAgICAgICAgICBmb3IodmFyIGs9aisxOyBrPHJlZEFjdGl2ZTsgKytrKSB7XG4gICAgICAgICAgICBSRURfU1dFRVBfUVVFVUVbay0xXSA9IFJFRF9TV0VFUF9RVUVVRVtrXVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAtLXJlZEFjdGl2ZVxuICAgIH1cbiAgfVxufSIsIiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmZyb207IiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZScpOyIsInZhciBjb3JlICA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKVxuICAsICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7c3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeX0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59OyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5NYXA7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5NYXRoLmxvZzI7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKXtcbiAgcmV0dXJuICRPYmplY3QuY3JlYXRlKFAsIEQpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmZyZWV6ZTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmdldFByb3RvdHlwZU9mOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5czsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LnNldFByb3RvdHlwZU9mOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5TZXQ7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5TeW1ib2w7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fd2tzLWV4dCcpLmYoJ2l0ZXJhdG9yJyk7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwidmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlciwgSVRFUkFUT1Ipe1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsIi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gMSAtPiBBcnJheSNtYXBcbi8vIDIgLT4gQXJyYXkjZmlsdGVyXG4vLyAzIC0+IEFycmF5I3NvbWVcbi8vIDQgLT4gQXJyYXkjZXZlcnlcbi8vIDUgLT4gQXJyYXkjZmluZFxuLy8gNiAtPiBBcnJheSNmaW5kSW5kZXhcbnZhciBjdHggICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGFzYyAgICAgID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVFlQRSwgJGNyZWF0ZSl7XG4gIHZhciBJU19NQVAgICAgICAgID0gVFlQRSA9PSAxXG4gICAgLCBJU19GSUxURVIgICAgID0gVFlQRSA9PSAyXG4gICAgLCBJU19TT01FICAgICAgID0gVFlQRSA9PSAzXG4gICAgLCBJU19FVkVSWSAgICAgID0gVFlQRSA9PSA0XG4gICAgLCBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2XG4gICAgLCBOT19IT0xFUyAgICAgID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVhcbiAgICAsIGNyZWF0ZSAgICAgICAgPSAkY3JlYXRlIHx8IGFzYztcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KXtcbiAgICB2YXIgTyAgICAgID0gdG9PYmplY3QoJHRoaXMpXG4gICAgICAsIHNlbGYgICA9IElPYmplY3QoTylcbiAgICAgICwgZiAgICAgID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSAwXG4gICAgICAsIHJlc3VsdCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWRcbiAgICAgICwgdmFsLCByZXM7XG4gICAgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKXtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmKFRZUEUpe1xuICAgICAgICBpZihJU19NQVApcmVzdWx0W2luZGV4XSA9IHJlczsgICAgICAgICAgICAvLyBtYXBcbiAgICAgICAgZWxzZSBpZihyZXMpc3dpdGNoKFRZUEUpe1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsOyAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgICAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2UgaWYoSVNfRVZFUlkpcmV0dXJuIGZhbHNlOyAgICAgICAgICAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGlzQXJyYXkgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxuICAsIFNQRUNJRVMgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCl7XG4gIHZhciBDO1xuICBpZihpc0FycmF5KG9yaWdpbmFsKSl7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKUMgPSB1bmRlZmluZWQ7XG4gICAgaWYoaXNPYmplY3QoQykpe1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZihDID09PSBudWxsKUMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59OyIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3JpZ2luYWwsIGxlbmd0aCl7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgY3JlYXRlICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGFuSW5zdGFuY2UgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGRlZmluZWQgICAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgZm9yT2YgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKVxuICAsIHN0ZXAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBzZXRTcGVjaWVzICA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBmYXN0S2V5ICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5XG4gICwgU0laRSAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uKHRoYXQsIGtleSl7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSksIGVudHJ5O1xuICBpZihpbmRleCAhPT0gJ0YnKXJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvcihlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgIGlmKGVudHJ5LmsgPT0ga2V5KXJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKXtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgaXRlcmFibGUpe1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpe1xuICAgICAgICBmb3IodmFyIHRoYXQgPSB0aGlzLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihlbnRyeS5wKWVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgICAsIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYoZW50cnkpe1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkublxuICAgICAgICAgICAgLCBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihwcmV2KXByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYobmV4dCluZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmKHRoYXQuX2YgPT0gZW50cnkpdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYodGhhdC5fbCA9PSBlbnRyeSl0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgJ2ZvckVhY2gnKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpXG4gICAgICAgICAgLCBlbnRyeTtcbiAgICAgICAgd2hpbGUoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKXtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKERFU0NSSVBUT1JTKWRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIGRlZmluZWQodGhpc1tTSVpFXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KVxuICAgICAgLCBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZihlbnRyeSl7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZighdGhhdC5fZil0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZihwcmV2KXByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZihpbmRleCAhPT0gJ0YnKXRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uKEMsIE5BTUUsIElTX01BUCl7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgICAgIHRoaXMuX3QgPSBpdGVyYXRlZDsgIC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbigpe1xuICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAsIGtpbmQgID0gdGhhdC5fa1xuICAgICAgICAsIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUoZW50cnkgJiYgZW50cnkucillbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSl7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gc3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnICwgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBmcm9tICAgID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBtZXRhICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKVxuICAsIGZhaWxzICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmVBbGwgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIGZvck9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBhbkluc3RhbmNlICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZFAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgZWFjaCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMClcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspe1xuICB2YXIgQmFzZSAgPSBnbG9iYWxbTkFNRV1cbiAgICAsIEMgICAgID0gQmFzZVxuICAgICwgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnXG4gICAgLCBwcm90byA9IEMgJiYgQy5wcm90b3R5cGVcbiAgICAsIE8gICAgID0ge307XG4gIGlmKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKXtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGFyZ2V0LCBpdGVyYWJsZSl7XG4gICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSwgJ19jJyk7XG4gICAgICB0YXJnZXQuX2MgPSBuZXcgQmFzZTtcbiAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSxmdW5jdGlvbihLRVkpe1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmKEtFWSBpbiBwcm90byAmJiAhKElTX1dFQUsgJiYgS0VZID09ICdjbGVhcicpKWhpZGUoQy5wcm90b3R5cGUsIEtFWSwgZnVuY3Rpb24oYSwgYil7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgS0VZKTtcbiAgICAgICAgaWYoIUlTX0FEREVSICYmIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpKXJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoJ3NpemUnIGluIHByb3RvKWRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYoIUlTX1dFQUspY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyAgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgaW5kZXgsIHZhbHVlKXtcbiAgaWYoaW5kZXggaW4gb2JqZWN0KSRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59OyIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9IHBJRS5mXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBrZXksIG93biwgb3V0O1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgICBpZih0aGlzIGluc3RhbmNlb2YgQyl7XG4gICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmKElTX1BST1RPKXtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJylcbiAgLCBCUkVBSyAgICAgICA9IHt9XG4gICwgUkVUVVJOICAgICAgPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKXtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKVxuICAgICwgZiAgICAgID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICl7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyAgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07IiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTsiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTsiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsICRpdGVyQ3JlYXRlICAgID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG4gICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuICAgICwgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkYW55TmF0aXZlKXtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSkpO1xuICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyByZXR1cm4ge2RvbmU6IHNhZmUgPSB0cnVlfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwidmFyIGdldEtleXMgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGtleXMgICA9IGdldEtleXMoTylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTsiLCJ2YXIgTUVUQSAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGhhcyAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBzZXREZXNjICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBpZCAgICAgICA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG4gIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH19KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuICBpZihGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6ICAgICAgTUVUQSxcbiAgTkVFRDogICAgIGZhbHNlLFxuICBmYXN0S2V5OiAgZmFzdEtleSxcbiAgZ2V0V2VhazogIGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgT2JzZXJ2ZXIgID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXJcbiAgLCBwcm9jZXNzICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIFByb21pc2UgICA9IGdsb2JhbC5Qcm9taXNlXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlKGhlYWQpe1xuICAgICAgZm4gICA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIGlmKGhlYWQpbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYocGFyZW50KXBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoaXNOb2RlKXtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZihPYnNlcnZlcil7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWVcbiAgICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHZhciB0YXNrID0ge2ZuOiBmbiwgbmV4dDogdW5kZWZpbmVkfTtcbiAgICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYoIWhlYWQpe1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgcElFICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCAkYXNzaWduICA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBBID0ge31cbiAgICAsIEIgPSB7fVxuICAgICwgUyA9IFN5bWJvbCgpXG4gICAgLCBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oayl7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgICAgID0gdG9PYmplY3QodGFyZ2V0KVxuICAgICwgYUxlbiAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBpbmRleCA9IDFcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmZcbiAgICAsIGlzRW51bSAgICAgPSBwSUUuZjtcbiAgd2hpbGUoYUxlbiA+IGluZGV4KXtcbiAgICB2YXIgUyAgICAgID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pXG4gICAgICAsIGtleXMgICA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaiAgICAgID0gMFxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gailpZihpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKVRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduOyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwidmFyIGRQICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGkgPSAwXG4gICAgLCBQO1xuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTsiLCJ2YXIgcElFICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApe1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoaGFzKE8sIFApKXJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGdPUE4gICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07IiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTsiLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsiLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb3JlICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpe1xuICAgIGlmKHNhZmUgJiYgdGFyZ2V0W2tleV0pdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90byl7XG4gIGFuT2JqZWN0KE8pO1xuICBpZighaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKXRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uKHRlc3QsIGJ1Z2d5LCBzZXQpe1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyIGlkID0gMFxuICAsIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07IiwidmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgd2tzRXh0ICAgICAgICAgPSByZXF1aXJlKCcuL193a3MtZXh0JylcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZihuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKWRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHt2YWx1ZTogd2tzRXh0LmYobmFtZSl9KTtcbn07IiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXQgICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGl0ZXJGbiA9IGdldChpdCk7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgfHwgSXRlcmF0b3JzLmhhc093blByb3BlcnR5KGNsYXNzb2YoTykpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5JylcbiAgLCBnZXRJdGVyRm4gICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpbmRleCAgID0gMFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihtYXBwaW5nKW1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvcihyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7IiwiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTsiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7YXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyl9KTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2NyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpfSk7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0Jywge2RlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mfSk7IiwiLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBtZXRhICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbigkZnJlZXplKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCl7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbigpe1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCl7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7IiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0fSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjbGFzc29mICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uICAgICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGZvck9mICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgdGFzayAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIG1pY3JvdGFzayAgICAgICAgICA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKClcbiAgLCBQUk9NSVNFICAgICAgICAgICAgPSAnUHJvbWlzZSdcbiAgLCBUeXBlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCAkUHJvbWlzZSAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgICAgICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgZW1wdHkgICAgICAgICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIEludGVybmFsLCBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlICAgICA9ICRQcm9taXNlLnJlc29sdmUoMSlcbiAgICAgICwgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uKGV4ZWMpeyBleGVjKGVtcHR5LCBlbXB0eSk7IH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gd2l0aCBsaWJyYXJ5IHdyYXBwZXIgc3BlY2lhbCBjYXNlXG4gIHJldHVybiBhID09PSBiIHx8IGEgPT09ICRQcm9taXNlICYmIGIgPT09IFdyYXBwZXI7XG59O1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgPyBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICA6IG5ldyBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uKCQkcmVzb2x2ZSwgJCRyZWplY3Qpe1xuICAgIGlmKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ICA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHByb21pc2UsIGlzUmVqZWN0KXtcbiAgaWYocHJvbWlzZS5fbilyZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIG9rICAgID0gcHJvbWlzZS5fcyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIGRvbWFpbiAgPSByZWFjdGlvbi5kb21haW5cbiAgICAgICAgLCByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihoYW5kbGVyKXtcbiAgICAgICAgICBpZighb2spe1xuICAgICAgICAgICAgaWYocHJvbWlzZS5faCA9PSAyKW9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGhhbmRsZXIgPT09IHRydWUpcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdCAmJiAhcHJvbWlzZS5faClvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBhYnJ1cHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmKGFicnVwdCl0aHJvdyBhYnJ1cHQuZXJyb3I7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICBpZihwcm9taXNlLl9oID09IDEpcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2NcbiAgICAsIGkgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpe1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZihyZWFjdGlvbi5mYWlsIHx8ICFpc1VuaGFuZGxlZChyZWFjdGlvbi5wcm9taXNlKSlyZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYoaXNOb2RlKXtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCl7XG4gICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3Z9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmKCFwcm9taXNlLl9hKXByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihwcm9taXNlID09PSB2YWx1ZSl0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge193OiBwcm9taXNlLCBfZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaChlcnIpe1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCl7XG4gICAgICB2YXIgcmVhY3Rpb24gICAgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rICAgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCAgID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fYSl0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fcylub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpe1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcHJvbWlzZSAgPSBuZXcgSW50ZXJuYWw7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ICA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6ICRQcm9taXNlfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZWplY3QgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiAkUHJvbWlzZSAmJiBzYW1lQ29uc3RydWN0b3IoeC5jb25zdHJ1Y3RvciwgdGhpcykpcmV0dXJuIHg7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdmFsdWVzICAgID0gW11cbiAgICAgICAgLCBpbmRleCAgICAgPSAwXG4gICAgICAgICwgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIHZhciAkaW5kZXggICAgICAgID0gaW5kZXgrK1xuICAgICAgICAgICwgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdTZXQnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBNRVRBICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVlcbiAgLCAkZmFpbHMgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBzaGFyZWQgICAgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIHdrcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgLCB3a3NFeHQgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcy1leHQnKVxuICAsIHdrc0RlZmluZSAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpXG4gICwga2V5T2YgICAgICAgICAgPSByZXF1aXJlKCcuL19rZXlvZicpXG4gICwgZW51bUtleXMgICAgICAgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKVxuICAsIGlzQXJyYXkgICAgICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIF9jcmVhdGUgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZ09QTkV4dCAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKVxuICAsICRHT1BEICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsICREUCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCAka2V5cyAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcbiAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG4gICwgZ09QTiAgICAgICAgICAgPSBnT1BORXh0LmZcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIFRPX1BSSU1JVElWRSAgID0gd2tzKCd0b1ByaW1pdGl2ZScpXG4gICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuICAsIEFsbFN5bWJvbHMgICAgID0gc2hhcmVkKCdzeW1ib2xzJylcbiAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuICAsIFVTRV9OQVRJVkUgICAgID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJ1xuICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZihwcm90b0Rlc2MpZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGlmKGl0ID09PSBPYmplY3RQcm90bykkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG4gICAgaWYoIUQuZW51bWVyYWJsZSl7XG4gICAgICBpZighaGFzKGl0LCBISURERU4pKWRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0paXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG4gICAgLCBpICAgID0gMFxuICAgICwgbCA9IGtleXMubGVuZ3RoXG4gICAgLCBrZXk7XG4gIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSlELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpe1xuICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG4gICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmKCFVU0VfTkFUSVZFKXtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmKERFU0NSSVBUT1JTICYmIHNldHRlcilzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHtjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiAgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSl7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uKG5hbWUpe1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH1cbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApd2tzRGVmaW5lKHN5bWJvbHNbaSsrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG4gICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG4gICAgdGhyb3cgVHlwZUVycm9yKGtleSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24oKXsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuICAgIGlmKGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKXJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIHZhciBhcmdzID0gW2l0XVxuICAgICAgLCBpICAgID0gMVxuICAgICAgLCByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmKHR5cGVvZiByZXBsYWNlciA9PSAnZnVuY3Rpb24nKSRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYoIWlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ01hcCcsIHt0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKX0pOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1NldCcsIHt0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKX0pOyIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnYXN5bmNJdGVyYXRvcicpOyIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpOyIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIFRPX1NUUklOR19UQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCJcInVzZSBzdHJpY3RcIlxuXG5mdW5jdGlvbiBkdXBlX2FycmF5KGNvdW50LCB2YWx1ZSwgaSkge1xuICB2YXIgYyA9IGNvdW50W2ldfDBcbiAgaWYoYyA8PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShjKSwgalxuICBpZihpID09PSBjb3VudC5sZW5ndGgtMSkge1xuICAgIGZvcihqPTA7IGo8YzsgKytqKSB7XG4gICAgICByZXN1bHRbal0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3Ioaj0wOyBqPGM7ICsraikge1xuICAgICAgcmVzdWx0W2pdID0gZHVwZV9hcnJheShjb3VudCwgdmFsdWUsIGkrMSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBkdXBlX251bWJlcihjb3VudCwgdmFsdWUpIHtcbiAgdmFyIHJlc3VsdCwgaVxuICByZXN1bHQgPSBuZXcgQXJyYXkoY291bnQpXG4gIGZvcihpPTA7IGk8Y291bnQ7ICsraSkge1xuICAgIHJlc3VsdFtpXSA9IHZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBkdXBlKGNvdW50LCB2YWx1ZSkge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YWx1ZSA9IDBcbiAgfVxuICBzd2l0Y2godHlwZW9mIGNvdW50KSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgaWYoY291bnQgPiAwKSB7XG4gICAgICAgIHJldHVybiBkdXBlX251bWJlcihjb3VudHwwLCB2YWx1ZSlcbiAgICAgIH1cbiAgICBicmVha1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIGlmKHR5cGVvZiAoY291bnQubGVuZ3RoKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gZHVwZV9hcnJheShjb3VudCwgdmFsdWUsIDApXG4gICAgICB9XG4gICAgYnJlYWtcbiAgfVxuICByZXR1cm4gW11cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkdXBlIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCIoZnVuY3Rpb24oKXt2YXIgaz0hIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7ZnVuY3Rpb24gbChhLGIpe2s/YS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsYiwhMSk6YS5hdHRhY2hFdmVudChcInNjcm9sbFwiLGIpfWZ1bmN0aW9uIHYoYSl7ZG9jdW1lbnQuYm9keT9hKCk6az9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGEpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25yZWFkeXN0YXRlY2hhbmdlXCIsZnVuY3Rpb24oKXtcImludGVyYWN0aXZlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGUmJlwiY29tcGxldGVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZXx8YSgpfSl9O2Z1bmN0aW9uIHcoYSl7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dGhpcy5hLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpO3RoaXMuYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7dGhpcy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZz0tMTt0aGlzLmIuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuYy5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7XG50aGlzLmYuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuaC5zdHlsZS5jc3NUZXh0PVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAwJTtoZWlnaHQ6MjAwJTtmb250LXNpemU6MTZweDttYXgtd2lkdGg6bm9uZTtcIjt0aGlzLmIuYXBwZW5kQ2hpbGQodGhpcy5oKTt0aGlzLmMuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5iKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5jKX1cbmZ1bmN0aW9uIHkoYSxiKXthLmEuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO21pbi13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bzttYXJnaW46MDtwYWRkaW5nOjA7dG9wOi05OTlweDtsZWZ0Oi05OTlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udDpcIitiK1wiO1wifWZ1bmN0aW9uIHooYSl7dmFyIGI9YS5hLm9mZnNldFdpZHRoLGM9YisxMDA7YS5mLnN0eWxlLndpZHRoPWMrXCJweFwiO2EuYy5zY3JvbGxMZWZ0PWM7YS5iLnNjcm9sbExlZnQ9YS5iLnNjcm9sbFdpZHRoKzEwMDtyZXR1cm4gYS5nIT09Yj8oYS5nPWIsITApOiExfWZ1bmN0aW9uIEEoYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9bTt6KGEpJiZudWxsIT09YS5hLnBhcmVudE5vZGUmJmIoYS5nKX12YXIgbT1hO2woYS5iLGMpO2woYS5jLGMpO3ooYSl9O2Z1bmN0aW9uIEIoYSxiKXt2YXIgYz1ifHx7fTt0aGlzLmZhbWlseT1hO3RoaXMuc3R5bGU9Yy5zdHlsZXx8XCJub3JtYWxcIjt0aGlzLndlaWdodD1jLndlaWdodHx8XCJub3JtYWxcIjt0aGlzLnN0cmV0Y2g9Yy5zdHJldGNofHxcIm5vcm1hbFwifXZhciBDPW51bGwsRD1udWxsLEg9ISF3aW5kb3cuRm9udEZhY2U7ZnVuY3Rpb24gSSgpe2lmKG51bGw9PT1EKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXthLnN0eWxlLmZvbnQ9XCJjb25kZW5zZWQgMTAwcHggc2Fucy1zZXJpZlwifWNhdGNoKGIpe31EPVwiXCIhPT1hLnN0eWxlLmZvbnR9cmV0dXJuIER9ZnVuY3Rpb24gSihhLGIpe3JldHVyblthLnN0eWxlLGEud2VpZ2h0LEkoKT9hLnN0cmV0Y2g6XCJcIixcIjEwMHB4XCIsYl0uam9pbihcIiBcIil9XG5CLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxtPWF8fFwiQkVTYnN3eVwiLHg9Ynx8M0UzLEU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7aWYoSCl7dmFyIEs9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKCl7KG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eD9iKCk6ZG9jdW1lbnQuZm9udHMubG9hZChKKGMsYy5mYW1pbHkpLG0pLnRoZW4oZnVuY3Rpb24oYyl7MTw9Yy5sZW5ndGg/YSgpOnNldFRpbWVvdXQoZSwyNSl9LGZ1bmN0aW9uKCl7YigpfSl9ZSgpfSksTD1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3NldFRpbWVvdXQoYyx4KX0pO1Byb21pc2UucmFjZShbTCxLXSkudGhlbihmdW5jdGlvbigpe2EoYyl9LGZ1bmN0aW9uKCl7YihjKX0pfWVsc2UgdihmdW5jdGlvbigpe2Z1bmN0aW9uIHEoKXt2YXIgYjtpZihiPS0xIT1mJiYtMSE9Z3x8LTEhPWYmJi0xIT1ofHwtMSE9ZyYmLTEhPVxuaCkoYj1mIT1nJiZmIT1oJiZnIT1oKXx8KG51bGw9PT1DJiYoYj0vQXBwbGVXZWJLaXRcXC8oWzAtOV0rKSg/OlxcLihbMC05XSspKS8uZXhlYyh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksQz0hIWImJig1MzY+cGFyc2VJbnQoYlsxXSwxMCl8fDUzNj09PXBhcnNlSW50KGJbMV0sMTApJiYxMT49cGFyc2VJbnQoYlsyXSwxMCkpKSxiPUMmJihmPT1yJiZnPT1yJiZoPT1yfHxmPT10JiZnPT10JiZoPT10fHxmPT11JiZnPT11JiZoPT11KSksYj0hYjtiJiYobnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGNsZWFyVGltZW91dChHKSxhKGMpKX1mdW5jdGlvbiBGKCl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eCludWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksYihjKTtlbHNle3ZhciBhPWRvY3VtZW50LmhpZGRlbjtpZighMD09PWF8fHZvaWQgMD09PWEpZj1lLmEub2Zmc2V0V2lkdGgsZz1uLmEub2Zmc2V0V2lkdGgsXG5oPXAuYS5vZmZzZXRXaWR0aCxxKCk7Rz1zZXRUaW1lb3V0KEYsNTApfX12YXIgZT1uZXcgdyhtKSxuPW5ldyB3KG0pLHA9bmV3IHcobSksZj0tMSxnPS0xLGg9LTEscj0tMSx0PS0xLHU9LTEsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEc9MDtkLmRpcj1cImx0clwiO3koZSxKKGMsXCJzYW5zLXNlcmlmXCIpKTt5KG4sSihjLFwic2VyaWZcIikpO3kocCxKKGMsXCJtb25vc3BhY2VcIikpO2QuYXBwZW5kQ2hpbGQoZS5hKTtkLmFwcGVuZENoaWxkKG4uYSk7ZC5hcHBlbmRDaGlsZChwLmEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7cj1lLmEub2Zmc2V0V2lkdGg7dD1uLmEub2Zmc2V0V2lkdGg7dT1wLmEub2Zmc2V0V2lkdGg7RigpO0EoZSxmdW5jdGlvbihhKXtmPWE7cSgpfSk7eShlLEooYywnXCInK2MuZmFtaWx5KydcIixzYW5zLXNlcmlmJykpO0EobixmdW5jdGlvbihhKXtnPWE7cSgpfSk7eShuLEooYywnXCInK2MuZmFtaWx5KydcIixzZXJpZicpKTtBKHAsZnVuY3Rpb24oYSl7aD1cbmE7cSgpfSk7eShwLEooYywnXCInK2MuZmFtaWx5KydcIixtb25vc3BhY2UnKSl9KX0pfTt3aW5kb3cuRm9udEZhY2VPYnNlcnZlcj1CO3dpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5jaGVjaz13aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUubG9hZD1CLnByb3RvdHlwZS5sb2FkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIpO30oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgc29saWRDaGlsZHJlbjogZmFsc2UsICAgLy8gd2hldGhlciB0byB0aWxlIHNvbGlkIHNxdWFyZSB0aWxlcyBmdXJ0aGVyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHRoZSB0aWxlIGlzIHNvbGlkIGNsaXBwZWQgc3F1YXJlXG4gICAgICAgIGlmICghb3B0aW9ucy5zb2xpZENoaWxkcmVuICYmIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgaWYgKHRsKSBzdGFjay5wdXNoKHRsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIGlmIChibCkgc3RhY2sucHVzaChibCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgaWYgKHRyKSBzdGFjay5wdXNoKHRyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIGlmIChicikgc3RhY2sucHVzaChiciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKHBhcmVudC5zb3VyY2UpIHtcbiAgICAgICAgaWYgKGlzQ2xpcHBlZFNxdWFyZShwYXJlbnQsIGV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gdHJhbnNmb3JtVGlsZShwYXJlbnQsIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGlsZXNbaWRdKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSB0aWxlLnoyLFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSBnZW9tW2pdID0gdHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGdlb21bal07XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHJpbmdba10gPSB0cmFuc2Zvcm1Qb2ludChyaW5nW2tdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQocCwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgdmFyIHggPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzBdICogejIgLSB0eCkpLFxuICAgICAgICB5ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFsxXSAqIHoyIC0gdHkpKTtcbiAgICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgoYSwgYiwgeCkge1xuICAgIHJldHVybiBbeCwgKHggLSBhWzBdKSAqIChiWzFdIC0gYVsxXSkgLyAoYlswXSAtIGFbMF0pICsgYVsxXSwgMV07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RZKGEsIGIsIHkpIHtcbiAgICByZXR1cm4gWyh5IC0gYVsxXSkgKiAoYlswXSAtIGFbMF0pIC8gKGJbMV0gLSBhWzFdKSArIGFbMF0sIHksIDFdO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgZXh0ZW50LCBidWZmZXIpIHtcblxuICAgIHZhciBmZWF0dXJlcyA9IHRpbGUuc291cmNlO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbMF07XG4gICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMyB8fCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW4gPSBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSA1KSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gdHJhbnNmb3JtUG9pbnQoZmVhdHVyZS5nZW9tZXRyeVswXVtpXSwgZXh0ZW50LCB0aWxlLnoyLCB0aWxlLngsIHRpbGUueSk7XG4gICAgICAgIGlmICgocFswXSAhPT0gLWJ1ZmZlciAmJiBwWzBdICE9PSBleHRlbnQgKyBidWZmZXIpIHx8XG4gICAgICAgICAgICAocFsxXSAhPT0gLWJ1ZmZlciAmJiBwWzFdICE9PSBleHRlbnQgKyBidWZmZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2ltcGxpZnk7XG5cbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmZ1bmN0aW9uIHNpbXBsaWZ5KHBvaW50cywgdG9sZXJhbmNlKSB7XG5cbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgIGZpcnN0ID0gMCxcbiAgICAgICAgbGFzdCA9IGxlbiAtIDEsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGksIG1heFNxRGlzdCwgc3FEaXN0LCBpbmRleDtcblxuICAgIC8vIGFsd2F5cyByZXRhaW4gdGhlIGVuZHBvaW50cyAoMSBpcyB0aGUgbWF4IHZhbHVlKVxuICAgIHBvaW50c1tmaXJzdF1bMl0gPSAxO1xuICAgIHBvaW50c1tsYXN0XVsyXSA9IDE7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBzdGFja1xuICAgIHdoaWxlIChsYXN0KSB7XG5cbiAgICAgICAgbWF4U3FEaXN0ID0gMDtcblxuICAgICAgICBmb3IgKGkgPSBmaXJzdCArIDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIHNxRGlzdCA9IGdldFNxU2VnRGlzdChwb2ludHNbaV0sIHBvaW50c1tmaXJzdF0sIHBvaW50c1tsYXN0XSk7XG5cbiAgICAgICAgICAgIGlmIChzcURpc3QgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWF4U3FEaXN0ID0gc3FEaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBwb2ludHNbaW5kZXhdWzJdID0gbWF4U3FEaXN0OyAvLyBzYXZlIHRoZSBwb2ludCBpbXBvcnRhbmNlIGluIHNxdWFyZWQgcGl4ZWxzIGFzIGEgeiBjb29yZGluYXRlXG4gICAgICAgICAgICBzdGFjay5wdXNoKGZpcnN0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBpbmRleDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZmlyc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChwLCBhLCBiKSB7XG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSxcbiAgICAgICAgcHggPSBwWzBdLCBweSA9IHBbMV0sXG4gICAgICAgIGR4ID0gYnggLSB4LFxuICAgICAgICBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6MjogejIsXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluOiBbMiwgMV0sXG4gICAgICAgIG1heDogWy0xLCAwXVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pbiA9IGZlYXR1cmVzW2ldLm1pbixcbiAgICAgICAgICAgIG1heCA9IGZlYXR1cmVzW2ldLm1heDtcblxuICAgICAgICBpZiAobWluWzBdIDwgdGlsZS5taW5bMF0pIHRpbGUubWluWzBdID0gbWluWzBdO1xuICAgICAgICBpZiAobWluWzFdIDwgdGlsZS5taW5bMV0pIHRpbGUubWluWzFdID0gbWluWzFdO1xuICAgICAgICBpZiAobWF4WzBdID4gdGlsZS5tYXhbMF0pIHRpbGUubWF4WzBdID0gbWF4WzBdO1xuICAgICAgICBpZiAobWF4WzFdID4gdGlsZS5tYXhbMV0pIHRpbGUubWF4WzFdID0gbWF4WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdLFxuICAgICAgICBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgaSwgaiwgcmluZywgcDtcblxuICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGlmaWVkUmluZyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHAgPSByaW5nW2pdO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgcG9pbnRzIHdpdGggaW1wb3J0YW5jZSA+IHRvbGVyYW5jZVxuICAgICAgICAgICAgICAgIGlmIChub1NpbXBsaWZ5IHx8IHBbMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkUmluZy5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbmZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIGJ1ZmZlciwgaW50ZXJzZWN0WCkge1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcyxcbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgaW50ZXJzZWN0WCwgLTEsIDIpLCAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXdHZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MsXG4gICAgICAgICAgICBtaW46IFtmZWF0dXJlLm1pblswXSArIG9mZnNldCwgZmVhdHVyZS5taW5bMV1dLFxuICAgICAgICAgICAgbWF4OiBbZmVhdHVyZS5tYXhbMF0gKyBvZmZzZXQsIGZlYXR1cmUubWF4WzFdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5hcmVhID0gcG9pbnRzLmFyZWE7XG4gICAgbmV3UG9pbnRzLmRpc3QgPSBwb2ludHMuZGlzdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKFtwb2ludHNbaV1bMF0gKyBvZmZzZXQsIHBvaW50c1tpXVsxXSwgcG9pbnRzW2ldWzJdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGludmVydFxuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQGFsaWFzIG1hdDMuaW52ZXJ0XG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl1cbiAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV1cbiAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF1cblxuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxXG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwXG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjBcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjFcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gYjAxICogZGV0XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldFxuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldFxuICBvdXRbM10gPSBiMTEgKiBkZXRcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXRcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0XG4gIG91dFs2XSA9IGIyMSAqIGRldFxuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXRcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbEZyb21NYXQ0XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBhbGlhcyBtYXQzLm5vcm1hbEZyb21NYXQ0XG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbmZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXVxuICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XVxuICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdXG4gIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XVxuXG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTBcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMFxuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwXG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTFcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMVxuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyXG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzBcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMFxuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwXG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzFcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMVxuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYjAwICogYjExXG4gICAgICAgICAgLSBiMDEgKiBiMTBcbiAgICAgICAgICArIGIwMiAqIGIwOVxuICAgICAgICAgICsgYjAzICogYjA4XG4gICAgICAgICAgLSBiMDQgKiBiMDdcbiAgICAgICAgICArIGIwNSAqIGIwNlxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldFxuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldFxuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldFxuXG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXRcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXRcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG5cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9va0F0O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCAwLjAwMDAwMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwZXJzcGVjdGl2ZTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHNjYWxlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zbGF0ZTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGFyc2VFcnJvcnNcblxuZnVuY3Rpb24gcGFyc2VFcnJvcnMobG9nKSB7XG4gIGxvZyA9IFN0cmluZyhsb2cpXG5cbiAgdmFyIGxvZ3MgPSBbXVxuICB2YXIgcmVzdWx0XG5cbiAgd2hpbGUgKHJlc3VsdCA9IGxvZy5tYXRjaCgvRVJST1JcXDooW15cXG5dKykvKSkge1xuICAgIGxvZyA9IGxvZy5zbGljZShyZXN1bHQuaW5kZXggKyAxKVxuXG4gICAgdmFyIGxpbmUgPSByZXN1bHRbMV0udHJpbSgpXG4gICAgdmFyIHNlcHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIgZW1zZyA9IHNlcHMuc2xpY2UoMikuam9pbignOicpLnRyaW0oKVxuICAgIHZhciBmaWxlID0gcGFyc2VJbnQoc2Vwc1swXSwgMTApXG4gICAgdmFyIGxpbmUgPSBwYXJzZUludChzZXBzWzFdLCAxMClcblxuICAgIGxvZ3MucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGVtc2dcbiAgICAgICwgZmlsZTogZmlsZVxuICAgICAgLCBsaW5lOiBsaW5lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG4vLyB2YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG4vLyBtb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG4vLyBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDMwLyogMCAqLykgPyAnXFx4MDAnIDpcbiAgICAgICAgKGMgPT09IDB4NjEvKiBhICovKSA/ICdcXHgwNycgOlxuICAgICAgICAoYyA9PT0gMHg2Mi8qIGIgKi8pID8gJ1xceDA4JyA6XG4gICAgICAgIChjID09PSAweDc0LyogdCAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4MDkvKiBUYWIgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDZFLyogbiAqLykgPyAnXFx4MEEnIDpcbiAgICAgICAgKGMgPT09IDB4NzYvKiB2ICovKSA/ICdcXHgwQicgOlxuICAgICAgICAoYyA9PT0gMHg2Ni8qIGYgKi8pID8gJ1xceDBDJyA6XG4gICAgICAgIChjID09PSAweDcyLyogciAqLykgPyAnXFx4MEQnIDpcbiAgICAgICAgKGMgPT09IDB4NjUvKiBlICovKSA/ICdcXHgxQicgOlxuICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSA/ICcgJyA6XG4gICAgICAgIChjID09PSAweDIyLyogXCIgKi8pID8gJ1xceDIyJyA6XG4gICAgICAgIChjID09PSAweDJGLyogLyAqLykgPyAnLycgOlxuICAgICAgICAoYyA9PT0gMHg1Qy8qIFxcICovKSA/ICdcXHg1QycgOlxuICAgICAgICAoYyA9PT0gMHg0RS8qIE4gKi8pID8gJ1xceDg1JyA6XG4gICAgICAgIChjID09PSAweDVGLyogXyAqLykgPyAnXFx4QTAnIDpcbiAgICAgICAgKGMgPT09IDB4NEMvKiBMICovKSA/ICdcXHUyMDI4JyA6XG4gICAgICAgIChjID09PSAweDUwLyogUCAqLykgPyAnXFx1MjAyOScgOiAnJztcbn1cblxuZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQoYykge1xuICBpZiAoYyA8PSAweEZGRkYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgfVxuICAvLyBFbmNvZGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNDb2RlX3BvaW50c19VLjJCMDEwMDAwX3RvX1UuMkIxMEZGRkZcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKChjIC0gMHgwMTAwMDApID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMCk7XG59XG5cbnZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOyAvLyBpbnRlZ2VyLCBmb3IgZmFzdCBhY2Nlc3NcbnZhciBzaW1wbGVFc2NhcGVNYXAgPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgc2ltcGxlRXNjYXBlQ2hlY2tbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKSA/IDEgOiAwO1xuICBzaW1wbGVFc2NhcGVNYXBbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKTtcbn1cblxuXG5mdW5jdGlvbiBTdGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgdGhpcy5maWxlbmFtZSAgPSBvcHRpb25zWydmaWxlbmFtZSddICB8fCBudWxsO1xuICB0aGlzLnNjaGVtYSAgICA9IG9wdGlvbnNbJ3NjaGVtYSddICAgIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7XG4gIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1snb25XYXJuaW5nJ10gfHwgbnVsbDtcbiAgdGhpcy5sZWdhY3kgICAgPSBvcHRpb25zWydsZWdhY3knXSAgICB8fCBmYWxzZTtcbiAgdGhpcy5qc29uICAgICAgPSBvcHRpb25zWydqc29uJ10gICAgICB8fCBmYWxzZTtcbiAgdGhpcy5saXN0ZW5lciAgPSBvcHRpb25zWydsaXN0ZW5lciddICB8fCBudWxsO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMudHlwZU1hcCAgICAgICA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcDtcblxuICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gIHRoaXMucG9zaXRpb24gICA9IDA7XG4gIHRoaXMubGluZSAgICAgICA9IDA7XG4gIHRoaXMubGluZVN0YXJ0ICA9IDA7XG4gIHRoaXMubGluZUluZGVudCA9IDA7XG5cbiAgdGhpcy5kb2N1bWVudHMgPSBbXTtcblxuICAvKlxuICB0aGlzLnZlcnNpb247XG4gIHRoaXMuY2hlY2tMaW5lQnJlYWtzO1xuICB0aGlzLnRhZ01hcDtcbiAgdGhpcy5hbmNob3JNYXA7XG4gIHRoaXMudGFnO1xuICB0aGlzLmFuY2hvcjtcbiAgdGhpcy5raW5kO1xuICB0aGlzLnJlc3VsdDsqL1xuXG59XG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFlBTUxFeGNlcHRpb24oXG4gICAgbWVzc2FnZSxcbiAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCAoc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQpKSk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZSkge1xuICBpZiAoc3RhdGUub25XYXJuaW5nKSB7XG4gICAgc3RhdGUub25XYXJuaW5nLmNhbGwobnVsbCwgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkpO1xuICB9XG59XG5cblxudmFyIGRpcmVjdGl2ZUhhbmRsZXJzID0ge1xuXG4gIFlBTUw6IGZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBtYXRjaCwgbWFqb3IsIG1pbm9yO1xuXG4gICAgaWYgKHN0YXRlLnZlcnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgbWF0Y2ggPSAvXihbMC05XSspXFwuKFswLTldKykkLy5leGVjKGFyZ3NbMF0pO1xuXG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuXG4gICAgaWYgKG1ham9yICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS52ZXJzaW9uID0gYXJnc1swXTtcbiAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSAobWlub3IgPCAyKTtcblxuICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cbiAgfSxcblxuICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIGhhbmRsZSwgcHJlZml4O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGhhbmRsZSA9IGFyZ3NbMF07XG4gICAgcHJlZml4ID0gYXJnc1sxXTtcblxuICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QoaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yIFwiJyArIGhhbmRsZSArICdcIiB0YWcgaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXgpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgcHJlZml4IChzZWNvbmQgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFnTWFwW2hhbmRsZV0gPSBwcmVmaXg7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQoc3RhdGUsIHN0YXJ0LCBlbmQsIGNoZWNrSnNvbikge1xuICB2YXIgX3Bvc2l0aW9uLCBfbGVuZ3RoLCBfY2hhcmFjdGVyLCBfcmVzdWx0O1xuXG4gIGlmIChzdGFydCA8IGVuZCkge1xuICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChjaGVja0pzb24pIHtcbiAgICAgIGZvciAoX3Bvc2l0aW9uID0gMCwgX2xlbmd0aCA9IF9yZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gPCBfbGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gKz0gMSkge1xuICAgICAgICBfY2hhcmFjdGVyID0gX3Jlc3VsdC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG4gICAgICAgIGlmICghKF9jaGFyYWN0ZXIgPT09IDB4MDkgfHxcbiAgICAgICAgICAgICAgKDB4MjAgPD0gX2NoYXJhY3RlciAmJiBfY2hhcmFjdGVyIDw9IDB4MTBGRkZGKSkpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHN0YXRlLnJlc3VsdCArPSBfcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWFwcGluZ3Moc3RhdGUsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykge1xuICB2YXIgc291cmNlS2V5cywga2V5LCBpbmRleCwgcXVhbnRpdHk7XG5cbiAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZScpO1xuICB9XG5cbiAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcblxuICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoZGVzdGluYXRpb24sIGtleSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIG92ZXJyaWRhYmxlS2V5c1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkge1xuICB2YXIgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGtleU5vZGUgPSBTdHJpbmcoa2V5Tm9kZSk7XG5cbiAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHtcbiAgICBfcmVzdWx0ID0ge307XG4gIH1cblxuICBpZiAoa2V5VGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVOb2RlKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gdmFsdWVOb2RlLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXhdLCBvdmVycmlkYWJsZUtleXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghc3RhdGUuanNvbiAmJlxuICAgICAgICAhX2hhc093blByb3BlcnR5LmNhbGwob3ZlcnJpZGFibGVLZXlzLCBrZXlOb2RlKSAmJlxuICAgICAgICBfaGFzT3duUHJvcGVydHkuY2FsbChfcmVzdWx0LCBrZXlOb2RlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsXG4gICAgICB0ZXh0SW5kZW50ICAgICA9IG5vZGVJbmRlbnQsXG4gICAgICBlbXB0eUxpbmVzICAgICA9IDAsXG4gICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4N0MvKiB8ICovKSB7XG4gICAgZm9sZGluZyA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDNFLyogPiAqLykge1xuICAgIGZvbGRpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJCLyogKyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGlmIChDSE9NUElOR19DTElQID09PSBjaG9tcGluZykge1xuICAgICAgICBjaG9tcGluZyA9IChjaCA9PT0gMHgyQi8qICsgKi8pID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhIGNob21waW5nIG1vZGUgaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgaWYgKHRtcCA9PT0gMCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZScpO1xuICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxO1xuICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKTtcblxuICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG4gICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmXG4gICAgICAgICAgIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSkge1xuICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUubGluZUluZGVudCA+IHRleHRJbmRlbnQpIHtcbiAgICAgIHRleHRJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBlbXB0eUxpbmVzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBFbmQgb2YgdGhlIHNjYWxhci5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgY2hvbXBpbmcuXG4gICAgICBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0tFRVApIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgIC8vIElmIGN1cnJlbnQgbGluZSBpc24ndCB0aGUgZmlyc3Qgb25lIC0gY291bnQgbGluZSBicmVhayBmcm9tIHRoZSBsYXN0IGNvbnRlbnQgbGluZS5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSAtIGNvdW50IG9ubHkgZW1wdHkgbGluZXMuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICAgICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgICAgID0ge30sXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleVRhZyAgICAgICAgPSBudWxsLFxuICAgICAga2V5Tm9kZSAgICAgICA9IG51bGwsXG4gICAgICB2YWx1ZU5vZGUgICAgID0gbnVsbCxcbiAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZSxcbiAgICAgIGRldGVjdGVkICAgICAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7IC8vIFNhdmUgdGhlIGN1cnJlbnQgbGluZS5cblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBFcGlsb2d1ZS5cbiAgLy9cblxuICAvLyBTcGVjaWFsIGNhc2U6IGxhc3QgbWFwcGluZydzIG5vZGUgY29udGFpbnMgb25seSB0aGUga2V5IGluIGV4cGxpY2l0IG5vdGF0aW9uLlxuICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ21hcHBpbmcnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgaXNWZXJiYXRpbSA9IGZhbHNlLFxuICAgICAgaXNOYW1lZCAgICA9IGZhbHNlLFxuICAgICAgdGFnSGFuZGxlLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIxLyogISAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4M0MvKiA8ICovKSB7XG4gICAgaXNWZXJiYXRpbSA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNOYW1lZCA9IHRydWU7XG4gICAgdGFnSGFuZGxlID0gJyEhJztcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIHtcbiAgICB0YWdIYW5kbGUgPSAnISc7XG4gIH1cblxuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGNoICE9PSAwICYmIGNoICE9PSAweDNFLyogPiAqLyk7XG5cbiAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgdmVyYmF0aW0gdGFnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgICAgIGlmICghaXNOYW1lZCkge1xuICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiAtIDEsIHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lZCB0YWcgaGFuZGxlIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVycycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YWdOYW1lICYmICFQQVRURVJOX1RBR19VUkkudGVzdCh0YWdOYW1lKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICcgKyB0YWdOYW1lKTtcbiAgfVxuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgc3RhdGUudGFnID0gdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgdGFnSGFuZGxlKSkge1xuICAgIHN0YXRlLnRhZyA9IHN0YXRlLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEnKSB7XG4gICAgc3RhdGUudGFnID0gJyEnICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEhJykge1xuICAgIHN0YXRlLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjonICsgdGFnTmFtZTtcblxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgXCInICsgdGFnSGFuZGxlICsgJ1wiJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYW5jaG9yIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIHN0YXRlLmFuY2hvciA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sIGFsaWFzLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MkEvKiAqICovKSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYWxpYXMgbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoIXN0YXRlLmFuY2hvck1hcC5oYXNPd25Qcm9wZXJ0eShhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5O1xuICAgICAgICAgICB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIC8vIEltcGxpY2l0IHJlc29sdmluZyBpcyBub3QgYWxsb3dlZCBmb3Igbm9uLXNjYWxhciB0eXBlcywgYW5kICc/J1xuICAgICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXNzaWduZWQgdG8gcGxhaW4gc2NhbGFycy4gU28sIGl0IGlzbid0XG4gICAgICAgIC8vIG5lZWRlZCB0byBjaGVjayBmb3IgJ2tpbmQnIGNvbmZvcm1pdHkuXG5cbiAgICAgICAgaWYgKHR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgICAgc3RhdGUudGFnID0gdHlwZS50YWc7XG4gICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpLCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gIGxvYWRBbGwoaW5wdXQsIG91dHB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuKi9cblxudmFyIGNvbW1vbiAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIFR5cGUgICAgICAgICAgPSByZXF1aXJlKCcuL3R5cGUnKTtcblxuXG5mdW5jdGlvbiBjb21waWxlTGlzdChzY2hlbWEsIG5hbWUsIHJlc3VsdCkge1xuICB2YXIgZXhjbHVkZSA9IFtdO1xuXG4gIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24gKGluY2x1ZGVkU2NoZW1hKSB7XG4gICAgcmVzdWx0ID0gY29tcGlsZUxpc3QoaW5jbHVkZWRTY2hlbWEsIG5hbWUsIHJlc3VsdCk7XG4gIH0pO1xuXG4gIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50VHlwZSkge1xuICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2aW91c1R5cGUsIHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChwcmV2aW91c1R5cGUudGFnID09PSBjdXJyZW50VHlwZS50YWcpIHtcbiAgICAgICAgZXhjbHVkZS5wdXNoKHByZXZpb3VzSW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnB1c2goY3VycmVudFR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZXhjbHVkZS5pbmRleE9mKGluZGV4KSA9PT0gLTE7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVNYXAoLyogbGlzdHMuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9LCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGUpIHtcbiAgICByZXN1bHRbdHlwZS50YWddID0gdHlwZTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGFyZ3VtZW50c1tpbmRleF0uZm9yRWFjaChjb2xsZWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYGxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIEpTLVlBTUwncyBkZWZhdWx0IHNhZmUgc2NoZW1hIGFuZCBpbmNsdWRlc1xuLy8gSmF2YVNjcmlwdC1zcGVjaWZpYyB0eXBlczogISFqcy91bmRlZmluZWQsICEhanMvcmVnZXhwIGFuZCAhIWpzL2Z1bmN0aW9uLlxuLy9cbi8vIEFsc28gdGhpcyBzY2hlbWEgaXMgdXNlZCBhcyBkZWZhdWx0IGJhc2Ugc2NoZW1hIGF0IGBTY2hlbWEuY3JlYXRlYCBmdW5jdGlvbi5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hLkRFRkFVTFQgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZGVmYXVsdF9zYWZlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3VuZGVmaW5lZCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvcmVnZXhwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9mdW5jdGlvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxuLy8gQSB0cmljayBmb3IgYnJvd3NlcmlmaWVkIHZlcnNpb24uXG4vLyBTaW5jZSB3ZSBtYWtlIGJyb3dzZXJpZmllciB0byBpZ25vcmUgYGJ1ZmZlcmAgbW9kdWxlLCBOb2RlQnVmZmVyIHdpbGwgYmUgdW5kZWZpbmVkXG52YXIgTm9kZUJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSByZXR1cm4gbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQm9vbGVhbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSA0ICYmIChkYXRhID09PSAndHJ1ZScgfHwgZGF0YSA9PT0gJ1RydWUnIHx8IGRhdGEgPT09ICdUUlVFJykpIHx8XG4gICAgICAgICAobWF4ID09PSA1ICYmIChkYXRhID09PSAnZmFsc2UnIHx8IGRhdGEgPT09ICdGYWxzZScgfHwgZGF0YSA9PT0gJ0ZBTFNFJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAndHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUcnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RSVUUnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCb29sZWFuLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCb29sZWFuLFxuICBwcmVkaWNhdGU6IGlzQm9vbGVhbixcbiAgcmVwcmVzZW50OiB7XG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAndHJ1ZScgOiAnZmFsc2UnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RSVUUnIDogJ0ZBTFNFJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUcnVlJyA6ICdGYWxzZSc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAnXig/OlstK10/KD86WzAtOV1bMC05X10qKVxcXFwuWzAtOV9dKig/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcXFwuWzAtOV9dKicgK1xuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG5cbiAgICBpZiAoY2ggPT09ICd4Jykge1xuICAgICAgLy8gYmFzZSAxNlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHM7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgIGlmIChjaCA9PT0gJzonKSBicmVhaztcbiAgICBpZiAoIWlzRGVjQ29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFoYXNEaWdpdHMpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwYicgKyBvYmplY3QudG9TdHJpbmcoMik7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwJyAgKyBvYmplY3QudG9TdHJpbmcoOCk7IH0sXG4gICAgZGVjaW1hbDogICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICAgICAgICBvYmplY3QudG9TdHJpbmcoMTApOyB9LFxuICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMHgnICsgb2JqZWN0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJpbWE7XG5cbi8vIEJyb3dzZXJpZmllZCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgZXNwcmltYVxuLy9cbi8vIDEuIEZvciBub2RlLmpzIGp1c3QgcmVxdWlyZSBtb2R1bGUgYXMgZGVwc1xuLy8gMi4gRm9yIGJyb3dzZXIgdHJ5IHRvIHJlcXVpcmUgbXVkdWxlIHZpYSBleHRlcm5hbCBBTUQgc3lzdGVtLlxuLy8gICAgSWYgbm90IGZvdW5kIC0gdHJ5IHRvIGZhbGxiYWNrIHRvIHdpbmRvdy5lc3ByaW1hLiBJZiBub3Rcbi8vICAgIGZvdW5kIHRvbyAtIHRoZW4gZmFpbCB0byBwYXJzZS5cbi8vXG50cnkge1xuICAvLyB3b3JrYXJvdW5kIHRvIGV4Y2x1ZGUgcGFja2FnZSBmcm9tIGJyb3dzZXJpZnkgbGlzdC5cbiAgdmFyIF9yZXF1aXJlID0gcmVxdWlyZTtcbiAgZXNwcmltYSA9IF9yZXF1aXJlKCdlc3ByaW1hJyk7XG59IGNhdGNoIChfKSB7XG4gIC8qZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHlbMF0gKyAxLCBib2R5WzFdIC0gMSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gaWYgcmVnZXhwIHN0YXJ0cyB3aXRoICcvJyBpdCBjYW4gaGF2ZSBtb2RpZmllcnMgYW5kIG11c3QgYmUgcHJvcGVybHkgY2xvc2VkXG4gIC8vIGAvZm9vL2dpbWAgLSBtb2RpZmllcnMgdGFpbCBjYW4gYmUgbWF4aW11bSAzIGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuXG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAvLCBpcyBzaG91bGQgYmUgcHJvcGVybHkgdGVybWluYXRlZFxuICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGAvZm9vL2dpbWAgLSB0YWlsIGNhbiBiZSBtYXhpbXVtIDQgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG4gICAgcmVnZXhwID0gcmVnZXhwLnNsaWNlKDEsIHJlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnLycgKyBvYmplY3Quc291cmNlICsgJy8nO1xuXG4gIGlmIChvYmplY3QuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAob2JqZWN0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKG9iamVjdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLFxuICBwcmVkaWNhdGU6IGlzUmVnRXhwLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gMSAmJiBkYXRhID09PSAnficpIHx8XG4gICAgICAgICAobWF4ID09PSA0ICYmIChkYXRhID09PSAnbnVsbCcgfHwgZGF0YSA9PT0gJ051bGwnIHx8IGRhdGEgPT09ICdOVUxMJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCxcbiAgcHJlZGljYXRlOiBpc051bGwsXG4gIHJlcHJlc2VudDoge1xuICAgIGNhbm9uaWNhbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ34nOyAgICB9LFxuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ251bGwnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ05VTEwnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ051bGwnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4LCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuICAgIHBhaXJIYXNLZXkgPSBmYWxzZTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7XG4gICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHtcbiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sT21hcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sT21hcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/Oig/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/KT8kJyk7ICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG4vLyBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4vLyAgICAgdmFyIG91dHB1dCA9IFtdO1xuLy8gICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuLy8gICAgIHZhciBpID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoLCByZW1haW5pbmdCeXRlcyA9IGxlbjtcblxuLy8gICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcbi8vICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuLy8gICAgICAgICByZW1haW5pbmdCeXRlcyA9IGxlbiAtIGk7XG5cbi8vICAgICAgICAgaWYgKCFpc0FycmF5KSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4vLyAgICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuLy8gICAgICAgICBlbmMzID0gcmVtYWluaW5nQnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0O1xuLy8gICAgICAgICBlbmM0ID0gcmVtYWluaW5nQnl0ZXMgPiAyID8gKGNocjMgJiA2MykgOiA2NDtcblxuLy8gICAgICAgICBvdXRwdXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7XG5cbi8vICAgICB9XG5cbi8vICAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XG4vLyB9O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMCwgcmVzdWx0SW5kZXggPSAwO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICB2YXIgdG90YWxMZW5ndGggPSBpbnB1dC5sZW5ndGggKiAzIC8gNDtcbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0O1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBjb21wcmVzc2VkIG9iamVjdCwgd2l0aCBldmVyeXRoaW5nIG5lZWRlZCB0byBkZWNvbXByZXNzIGl0LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFmdGVyIGRlY29tcHJlc3Npb24uXG4gKiBAcGFyYW0ge251bWJlcn0gY3JjMzIgdGhlIGNyYzMyIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgY29tcHJlc3NlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLmNyYzMyID0gY3JjMzI7XG4gICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBkYXRhO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSB1bmNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbnRlbnRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKVxuICAgICAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiZGF0YV9sZW5ndGhcIikpO1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgd29ya2VyLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2VkU2l6ZVwiLCB0aGlzLmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY3JjMzJcIiwgdGhpcy5jcmMzMilcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgdGhpcy5jb21wcmVzc2lvbilcbiAgICAgICAgO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2hhaW4gdGhlIGdpdmVuIHdvcmtlciB3aXRoIG90aGVyIHdvcmtlcnMgdG8gY29tcHJlc3MgdGhlIGNvbnRlbnQgd2l0aCB0aGVcbiAqIGdpdmVuIGNvbXByZXNpb24uXG4gKiBAcGFyYW0ge0dlbmVyaWNXb3JrZXJ9IHVuY29tcHJlc3NlZFdvcmtlciB0aGUgd29ya2VyIHRvIHBpcGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgbmV3IHdvcmtlciBjb21wcmVzc2luZyB0aGUgY29udGVudC5cbiAqL1xuQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tID0gZnVuY3Rpb24gKHVuY29tcHJlc3NlZFdvcmtlciwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiB1bmNvbXByZXNzZWRXb3JrZXJcbiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJ1bmNvbXByZXNzZWRTaXplXCIpKVxuICAgIC5waXBlKGNvbXByZXNzaW9uLmNvbXByZXNzV29ya2VyKGNvbXByZXNzaW9uT3B0aW9ucykpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImNvbXByZXNzZWRTaXplXCIpKVxuICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIGNvbXByZXNzaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcHJlc3NlZE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgLy8gY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGNvbXByZXNzaW9uXCIpO1xuICAgIC8vIH0sXG4gICAgdW5jb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgZGVjb21wcmVzc2lvblwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5ERUZMQVRFID0gcmVxdWlyZSgnLi9mbGF0ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvemxpYi9jcmMzMi5qc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgICB2YXIgYywgdGFibGUgPSBbXTtcblxuICAgIGZvcih2YXIgbiA9MDsgbiA8IDI1NjsgbisrKXtcbiAgICAgICAgYyA9IG47XG4gICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICAgICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZVtuXSA9IGM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBjcmMzMiBvZiBhIHN0cmluZy5cbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbiBjcmMzMiwgYnV0IGZvciBzdHJpbmdzLiBVc2luZyB0aGVcbiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxlIHBlcmZvcm1hbmNlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjcmMuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGNyYzMyIGNvbXB1dGF0aW9uLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgY29tcHV0ZWQgY3JjMzIuXG4gKi9cbmZ1bmN0aW9uIGNyYzMyc3RyKGNyYywgc3RyLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JjMzJ3cmFwcGVyKGlucHV0LCBjcmMpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gY3JjMzIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfVxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5iYXNlNjQgPSBmYWxzZTtcbmV4cG9ydHMuYmluYXJ5ID0gZmFsc2U7XG5leHBvcnRzLmRpciA9IGZhbHNlO1xuZXhwb3J0cy5jcmVhdGVGb2xkZXJzID0gdHJ1ZTtcbmV4cG9ydHMuZGF0ZSA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb25PcHRpb25zID0gbnVsbDtcbmV4cG9ydHMuY29tbWVudCA9IG51bGw7XG5leHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG5leHBvcnRzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIEVTNlByb21pc2UgPSByZXF1aXJlKFwiZXM2LXByb21pc2VcIikuUHJvbWlzZTtcblxuLyoqXG4gKiBMZXQgdGhlIHVzZXIgdXNlL2NoYW5nZSBzb21lIGltcGxlbWVudGF0aW9ucy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvbWlzZTogd2luZG93LlByb21pc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVVNFX1RZUEVEQVJSQVkgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgcGFrbyA9IHJlcXVpcmUoXCJwYWtvXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG52YXIgQVJSQVlfVFlQRSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5cbmV4cG9ydHMubWFnaWMgPSBcIlxceDA4XFx4MDBcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB3b3JrZXIgdGhhdCB1c2VzIHBha28gdG8gaW5mbGF0ZS9kZWZsYXRlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIHRoZSBuYW1lIG9mIHRoZSBwYWtvIGZ1bmN0aW9uIHRvIGNhbGwgOiBlaXRoZXIgXCJEZWZsYXRlXCIgb3IgXCJJbmZsYXRlXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIEZsYXRlV29ya2VyKGFjdGlvbiwgb3B0aW9ucykge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkZsYXRlV29ya2VyL1wiICsgYWN0aW9uKTtcblxuICAgIHRoaXMuX3Bha28gPSBuZXcgcGFrb1thY3Rpb25dKHtcbiAgICAgICAgcmF3OnRydWUsXG4gICAgICAgIGxldmVsIDogb3B0aW9ucy5sZXZlbCB8fCAtMSAvLyBkZWZhdWx0IGNvbXByZXNzaW9uXG4gICAgfSk7XG4gICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZFxuICAgIC8vIHRoaXMgYWxsb3cgdGhpcyB3b3JrZXIgdG8gcGFzcyBhcm91bmQgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG51dGlscy5pbmhlcml0cyhGbGF0ZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5tZXRhID0gY2h1bmsubWV0YTtcbiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7XG59O1xuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrbyA9IG51bGw7XG59O1xuXG5leHBvcnRzLmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJEZWZsYXRlXCIsIGNvbXByZXNzaW9uT3B0aW9ucyk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJJbmZsYXRlXCIsIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gYSBvZiB6aXAgZmlsZSBpbiBqc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEpTWmlwKCkge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH1cblxuICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6XG4gICAgLy8ge1xuICAgIC8vICAgXCJmb2xkZXIvXCIgOiB7Li4ufSxcbiAgICAvLyAgIFwiZm9sZGVyL2RhdGEudHh0XCIgOiB7Li4ufVxuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0ge307XG5cbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG4gICAgLy8gV2hlcmUgd2UgYXJlIGluIHRoZSBoaWVyYXJjaHlcbiAgICB0aGlzLnJvb3QgPSBcIlwiO1xuICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1tpXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gdGhpc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH07XG59XG5KU1ppcC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL29iamVjdCcpO1xuSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpO1xuSlNaaXAuc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuSlNaaXAuZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbkpTWmlwLmxvYWRBc3luYyA9IGZ1bmN0aW9uIChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5tb2R1bGUuZXhwb3J0cyA9IEpTWmlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIFppcEVudHJpZXMgPSByZXF1aXJlKCcuL3ppcEVudHJpZXMnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG5cbi8qKlxuICogQ2hlY2sgdGhlIENSQzMyIG9mIGFuIGVudHJ5LlxuICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IENyYzMyUHJvYmUoKSk7XG4gICAgICAgIHdvcmtlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0cmVhbUluZm8uY3JjMzIgIT09IHppcEVudHJ5LmRlY29tcHJlc3NlZC5jcmMzMikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIHppcCA9IHRoaXM7XG4gICAgb3B0aW9ucyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAgIGNoZWNrQ1JDMzI6IGZhbHNlLFxuICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IGZhbHNlLFxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcbiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRlY29kZVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSlNaaXAgY2FuJ3QgYWNjZXB0IGEgc3RyZWFtIHdoZW4gbG9hZGluZyBhIHppcCBmaWxlLlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KFwidGhlIGxvYWRlZCB6aXAgZmlsZVwiLCBkYXRhLCB0cnVlLCBvcHRpb25zLm9wdGltaXplZEJpbmFyeVN0cmluZywgb3B0aW9ucy5iYXNlNjQpXG4gICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IG5ldyBaaXBFbnRyaWVzKG9wdGlvbnMpO1xuICAgICAgICB6aXBFbnRyaWVzLmxvYWQoZGF0YSk7XG4gICAgICAgIHJldHVybiB6aXBFbnRyaWVzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gY2hlY2tDUkMzMih6aXBFbnRyaWVzKSB7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwRW50cmllcyldO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmlsZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gYWRkRmlsZXMocmVzdWx0cykge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IHJlc3VsdHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gZmlsZXNbaV07XG4gICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7XG4gICAgICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLFxuICAgICAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgOiBpbnB1dC5maWxlQ29tbWVudFN0ci5sZW5ndGggPyBpbnB1dC5maWxlQ29tbWVudFN0ciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGRvc1Blcm1pc3Npb25zIDogaW5wdXQuZG9zUGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogb3B0aW9ucy5jcmVhdGVGb2xkZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoemlwRW50cmllcy56aXBDb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRyaWVzLnppcENvbW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gemlwO1xuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbnRyeSBmb3IgdGhpcyBzdHJlYW0uXG4gKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihmaWxlbmFtZSwgc3RyZWFtKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIiArIGZpbGVuYW1lKTtcbiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYmluZFN0cmVhbShzdHJlYW0pO1xufVxuXG51dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHN0cmVhbSBhbmQgYmluZCB0aGUgY2FsbGJhY2tzIG9uIGl0LlxuICogRG8gdGhpcyBBU0FQIG9uIG5vZGUgMC4xMCAhIEEgbGF6eSBiaW5kaW5nIGRvZXNuJ3QgYWx3YXlzIHdvcmsuXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS5cbiAqL1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5fYmluZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIHN0cmVhbVxuICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zdHJlYW0ucGF1c2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudXRpbC5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBSZWFkYWJsZSk7XG5cbi8qKlxuKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLlxuKiBAc2VlIHRoZSBTb3VyY2VXcmFwcGVyIGluIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbFxuKiBAY29uc3RydWN0b3JcbiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXJcbiogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG5vZGVqcyBzdHJlYW0gb3B0aW9uc1xuKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIoaGVscGVyLCBvcHRpb25zLCB1cGRhdGVDYikge1xuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGhlbHBlci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgIHNlbGYuX2hlbHBlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHVwZGF0ZUNiKSB7XG4gICAgICAgICAgICB1cGRhdGVDYihtZXRhKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSk7XG59XG5cblxuTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlci5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVzdW1lKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBydW5uaW5nIGluIE5vZGVqcywgd2lsbCBiZSB1bmRlZmluZWQgaW4gYSBicm93c2VyLlxuICAgICAqIEluIGEgYnJvd3NlciwgYnJvd3NlcmlmeSB3b24ndCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgdGhlIHdob2xlIG1vZHVsZVxuICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQgYW4gZW1wdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIGlzTm9kZSA6IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuXG4gICAgICogQHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuXG4gICAgICovXG4gICAgbmV3QnVmZmVyIDogZnVuY3Rpb24oZGF0YSwgZW5jb2Rpbmcpe1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihkYXRhLCBlbmNvZGluZyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIG91dCBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7XG4gICAgICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYik7XG4gICAgfSxcblxuICAgIGlzU3RyZWFtIDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuLy8gdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpO1xuLy8gdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIi4vZ2VuZXJhdGVcIik7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcbnZhciBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIgPSByZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyXCIpO1xuXG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuXG4gICAgLypcbiAgICAgKiBDb3JyZWN0IG9wdGlvbnMuXG4gICAgICovXG5cbiAgICBvID0gdXRpbHMuZXh0ZW5kKG8gfHwge30sIGRlZmF1bHRzKTtcbiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBpZiAoby5jb21wcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gby5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygby51bml4UGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgby51bml4UGVybWlzc2lvbnMgPSBwYXJzZUludChvLnVuaXhQZXJtaXNzaW9ucywgOCk7XG4gICAgfVxuXG4gICAgLy8gVU5YX0lGRElSICAwMDQwMDAwIHNlZSB6aXBpbmZvLmNcbiAgICBpZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeVxuICAgIGlmIChvLmRvc1Blcm1pc3Npb25zICYmIChvLmRvc1Blcm1pc3Npb25zICYgMHgwMDEwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG8uZGlyKSB7XG4gICAgICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG4gICAgfVxuICAgIGlmIChvLmNyZWF0ZUZvbGRlcnMgJiYgKHBhcmVudCA9IHBhcmVudEZvbGRlcihuYW1lKSkpIHtcbiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgJiYgby5iaW5hcnkgPT09IGZhbHNlICYmIG8uYmFzZTY0ID09PSBmYWxzZTtcbiAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7XG5cblxuICAgIHZhciBpc0NvbXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwO1xuXG4gICAgaWYgKGlzQ29tcHJlc3NlZEVtcHR5IHx8IG8uZGlyIHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBcIlNUT1JFXCI7XG4gICAgICAgIGRhdGFUeXBlID0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIENvbnZlcnQgY29udGVudCB0byBmaXQuXG4gICAgICovXG5cbiAgICB2YXIgemlwT2JqZWN0Q29udGVudCA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKG5hbWUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSB1dGlscy5wcmVwYXJlQ29udGVudChuYW1lLCBkYXRhLCBvLmJpbmFyeSwgby5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG8uYmFzZTY0KTtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCB6aXBPYmplY3RDb250ZW50LCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIC8qXG4gICAgVE9ETzogd2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBhc3luYyBwcm9taXNlc1xuICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUpIGJ1dCByZXR1cm5pbmcgYVxuICAgIHByb21pc2UgaXMgdXNlbGVzcyBiZWNhdXNlIGZpbGUobmFtZSwgZGF0YSkgcmV0dXJucyB0aGUgSlNaaXBcbiAgICBvYmplY3QgZm9yIGNoYWluaW5nLiBTaG91bGQgd2UgYnJlYWsgdGhhdCB0byBhbGxvdyB0aGUgdXNlclxuICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/XG5cbiAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcE9iamVjdENvbnRlbnQpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuICAgICovXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgIHJldHVybiAobGFzdFNsYXNoID4gMCkgPyBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpIDogXCJcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCB3aXRoIGEgc2xhc2ggYXQgdGhlIGVuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICovXG52YXIgZm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAocGF0aC5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgICAgIHBhdGggKz0gXCIvXCI7IC8vIElFIGRvZXNuJ3QgbGlrZSBzdWJzdHIoLTEpXG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzO1xuXG4gICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcblxuICAgIC8vIERvZXMgdGhpcyBmb2xkZXIgYWxyZWFkeSBleGlzdD9cbiAgICBpZiAoIXRoaXMuZmlsZXNbbmFtZV0pIHtcbiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIG51bGwsIHtcbiAgICAgICAgICAgIGRpcjogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IGNyZWF0ZUZvbGRlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVzW25hbWVdO1xufTtcblxuLyoqXG4qIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb25cbiogQHBhcmFtICB7T2JqZWN0fSAgb2JqZWN0IEFueXRoaW5nXG4qIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sXG4qIGZhbHNlIG90aGVyd2lzZVxuKi9cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuLy8gcmV0dXJuIHRoZSBhY3R1YWwgcHJvdG90eXBlIG9mIEpTWmlwXG52YXIgb3V0ID0ge1xuICAgIC8qKlxuICAgICAqIEBzZWUgbG9hZEFzeW5jXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoOiBmdW5jdGlvbihjYikge1xuICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTtcbiAgICAgICAgZm9yIChmaWxlbmFtZSBpbiB0aGlzLmZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aCAmJiBmaWxlbmFtZS5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoKSA9PT0gdGhpcy5yb290KSB7IC8vIHRoZSBmaWxlIGlzIGluIHRoZSBjdXJyZW50IHJvb3RcbiAgICAgICAgICAgICAgICBjYihyZWxhdGl2ZVBhdGgsIGZpbGUpOyAvLyBUT0RPIHJldmVyc2UgdGhlIHBhcmFtZXRlcnMgPyBuZWVkIHRvIGJlIGNsZWFuIEFORCBjb25zaXN0ZW50IHdpdGggdGhlIGZpbHRlciBzZWFyY2ggZm4uLi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgbmVzdGVkIGZpbGVzL2ZvbGRlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuXG4gICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihzZWFyY2gpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2gocmVsYXRpdmVQYXRoLCBlbnRyeSkpIHsgLy8gdGhlIGZpbGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2ggYSBmaWxlLlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSxcbiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIChpZiBubyBkYXRhKSBvciBhIHJlZ2V4IHRvIG1hdGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgIFRoZSBmaWxlIGRhdGEsIGVpdGhlciByYXcgb3IgYmFzZTY0IGVuY29kZWRcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuICB7SlNaaXB8T2JqZWN0fEFycmF5fSB0aGlzIEpTWmlwIG9iamVjdCAod2hlbiBhZGRpbmcgYSBmaWxlKSxcbiAgICAgKiBhIGZpbGUgKHdoZW4gc2VhcmNoaW5nIGJ5IHN0cmluZykgb3IgYW4gYXJyYXkgb2YgZmlsZXMgKHdoZW4gc2VhcmNoaW5nIGJ5IHJlZ2V4KS5cbiAgICAgKi9cbiAgICBmaWxlOiBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnZXhwID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhwLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHRoaXMuZmlsZXNbdGhpcy5yb290ICsgbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmRpcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUgZGF0YSAhXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAgICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBkYXRhLCBvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuXG4gICAgICogQHJldHVybiAge0pTWmlwfSBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBhcyB0aGUgcm9vdCwgb3IgYW4gYXJyYXkgY29udGFpbmluZyBtYXRjaGluZyBmb2xkZXJzLlxuICAgICAqL1xuICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlZ0V4cChhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZGlyICYmIGFyZy50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UsIG5hbWUgaXMgYSBuZXcgZm9sZGVyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5yb290ICsgYXJnO1xuICAgICAgICB2YXIgbmV3Rm9sZGVyID0gZm9sZGVyQWRkLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290XG4gICAgICAgIHZhciByZXQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldC5yb290ID0gbmV3Rm9sZGVyLm5hbWU7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfS8vLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge0pTWmlwfSB0aGlzIEpTWmlwIG9iamVjdFxuICAgICAqL1xuICAgIC8vIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIC8vICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAvLyAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICBpZiAoIWZpbGUpIHtcbiAgICAvLyAgICAgICAgIC8vIExvb2sgZm9yIGFueSBmb2xkZXJzXG4gICAgLy8gICAgICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgLy8gICAgICAgICAgICAgbmFtZSArPSBcIi9cIjtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGZpbGUgJiYgIWZpbGUuZGlyKSB7XG4gICAgLy8gICAgICAgICAvLyBmaWxlXG4gICAgLy8gICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIC8vIG1heWJlIGEgZm9sZGVyLCBkZWxldGUgcmVjdXJzaXZlbHlcbiAgICAvLyAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIGZpbGUubmFtZS5zbGljZSgwLCBuYW1lLmxlbmd0aCkgPT09IG5hbWU7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2tpZHNbaV0ubmFtZV07XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gdGhpcztcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhcyBhbiBpbnRlcm5hbCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBzdHJlYW1lZCB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICB2YXIgd29ya2VyLCBvcHRzID0ge307XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgIC8vICAgICAgICAgICBzdHJlYW1GaWxlczogZmFsc2UsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uOiBcIlNUT1JFXCIsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG51bGwsXG4gICAgLy8gICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgLy8gICAgICAgICAgIHBsYXRmb3JtOiBcIkRPU1wiLFxuICAgIC8vICAgICAgICAgICBjb21tZW50OiBudWxsLFxuICAgIC8vICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgLy8gICAgICAgICAgIGVuY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhlbmNvZGVcbiAgICAvLyAgICAgICB9KTtcblxuICAgIC8vICAgICAgIG9wdHMudHlwZSA9IG9wdHMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyAgICAgICAvLyBcImJpbmFyeXN0cmluZ1wiIGlzIHByZWZlcmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSBcInN0cmluZ1wiLlxuICAgIC8vICAgICAgIGlmKG9wdHMudHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIikge1xuICAgIC8vICAgICAgICAgb3B0cy50eXBlID0gXCJzdHJpbmdcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICBpZiAoIW9wdHMudHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLlwiKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB1dGlscy5jaGVja1N1cHBvcnQob3B0cy50eXBlKTtcblxuICAgIC8vICAgICAgIC8vIGFjY2VwdCBub2RlanMgYHByb2Nlc3MucGxhdGZvcm1gXG4gICAgLy8gICAgICAgaWYoXG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdmcmVlYnNkJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnbGludXgnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdzdW5vcydcbiAgICAvLyAgICAgICApIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiVU5JWFwiO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJET1NcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAvLyAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21tZW50KTtcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgICAgd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAvLyAgICAgd29ya2VyLmVycm9yKGUpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIod29ya2VyLCBvcHRzLnR5cGUgfHwgXCJzdHJpbmdcIiwgb3B0cy5taW1lVHlwZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZU5vZGVTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vICAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIC8vICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJub2RlYnVmZmVyXCI7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgLy8gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7XG5cdH1cbn1cbnV0aWxzLmluaGVyaXRzKEFycmF5UmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvICsgaV07XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSA0OyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09PSBzaWcwICYmIHRoaXMuZGF0YVtpICsgMV0gPT09IHNpZzEgJiYgdGhpcy5kYXRhW2kgKyAyXSA9PT0gc2lnMiAmJiB0aGlzLmRhdGFbaSArIDNdID09PSBzaWczKSB7XG4gICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpLFxuICAgICAgICBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIgPT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIERhdGFSZWFkZXIoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuemVybyA9IDA7XG59XG5EYXRhUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmZWQgaW5kZXggd2lsbCBub3QgYmUgdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnplcm8gKyBuZXdJbmRleCB8fCBuZXdJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gXCIgKyB0aGlzLmxlbmd0aCArIFwiLCBhc2tlZCBpbmRleCA9IFwiICsgKG5ld0luZGV4KSArIFwiKS4gQ29ycnVwdGVkIHppcCA/XCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleCBUaGUgbmV3IGluZGV4LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBzZXRJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2tpcDogZnVuY3Rpb24obikge1xuICAgICAgICB0aGlzLnNldEluZGV4KHRoaXMuaW5kZXggKyBuKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBhIGJ5dGUuXG4gICAgICovXG4gICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBudW1iZXIgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuXG4gICAgICovXG4gICAgcmVhZEludDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlzLmluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyB0aGlzLmJ5dGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgc3RyaW5nIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMucmVhZERhdGEoc2l6ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSByYXcgZGF0YSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuXG4gICAgICovXG4gICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB6aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBzaWduYXR1cmUgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cmVuY2UsIC0xIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIHNpZ25hdHVyZSAoNCBieXRlcykgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNvbXBhcmUgaXQgd2l0aCBzaWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZWFkQW5kQ2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKSk7IC8vIHNlY29uZFxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihkYXRhKSB7XG4gICAgVWludDhBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7XG5cbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBOb2RlQnVmZmVyUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvICsgaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKSAtIHRoaXMuemVybztcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcgPT09IGRhdGE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIC8vIHRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdGhlIFwiJiAweGZmXCIgbWFzay5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1JlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFVpbnQ4QXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgLy8gaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTtcbnZhciBOb2RlQnVmZmVyUmVhZGVyID0gcmVxdWlyZSgnLi9Ob2RlQnVmZmVyUmVhZGVyJyk7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWRlciBhZGFwdGVkIHRvIHRoZSBkYXRhLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC5cbiAqIEByZXR1cm4ge0RhdGFSZWFkZXJ9IHRoZSBkYXRhIHJlYWRlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgIHV0aWxzLmNoZWNrU3VwcG9ydCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAhc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlcIiwgZGF0YSkpO1xufTtcblxuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLkxPQ0FMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAzXFx4MDRcIjtcbmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwMVxceDAyXCI7XG5leHBvcnRzLkNFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNVxceDA2XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSBcIlBLXFx4MDZcXHgwN1wiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDZcXHgwNlwiO1xuZXhwb3J0cy5EQVRBX0RFU0NSSVBUT1IgPSBcIlBLXFx4MDdcXHgwOFwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjb252ZXJ0IGNodW5rcyB0byBhIHNwZWNpZmllZCB0eXBlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIENvbnZlcnRXb3JrZXIoZGVzdFR5cGUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDb252ZXJ0V29ya2VyIHRvIFwiICsgZGVzdFR5cGUpO1xuICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTtcbn1cbnV0aWxzLmluaGVyaXRzKENvbnZlcnRXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ29udmVydFdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ29udmVydFdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgY3JjMzIgb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENyYzMyUHJvYmUoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ3JjMzJQcm9iZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ3JjMzJQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5zdHJlYW1JbmZvLmNyYzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApO1xuICAgIHRoaXMucHVzaChjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgbmFtZSB1c2VkIHRvIGV4cG9zZSB0aGUgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9iZShwcm9wTmFtZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIgKyBwcm9wTmFtZSk7XG4gICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgIHRoaXMud2l0aFN0cmVhbUluZm8ocHJvcE5hbWUsIDApO1xufVxudXRpbHMuaW5oZXJpdHMoRGF0YUxlbmd0aFByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYoY2h1bmspIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSB8fCAwO1xuICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcywgY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YUxlbmd0aFByb2JlO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vLyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNodW5rc1xuLy8gVE9ETyBleHBvc2UgdGhpcyBhcyBhIHB1YmxpYyB2YXJpYWJsZVxudmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Byb21pc2V9IGRhdGFQIHRoZSBwcm9taXNlIG9mIHRoZSBkYXRhIHRvIHNwbGl0XG4gKi9cbmZ1bmN0aW9uIERhdGFXb3JrZXIoZGF0YVApIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhV29ya2VyXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFJc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy5tYXggPSAwO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcblxuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIGRhdGFQLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi5kYXRhSXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7XG4gICAgICAgIHNlbGYubWF4ID0gZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwO1xuICAgICAgICBzZWxmLnR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl90aWNrQW5kUmVwZWF0KCk7XG4gICAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgIH0pO1xufVxuXG51dGlscy5pbmhlcml0cyhEYXRhV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGlja1NjaGVkdWxlZCAmJiB0aGlzLmRhdGFJc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgdGljayBhIHNjaGVkdWxlIGFuIG90aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aWNrKCk7XG4gICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVhZCBhbmQgcHVzaCBhIGNodW5rLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFO1xuICAgIHZhciBkYXRhID0gbnVsbCwgbmV4dEluZGV4ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLm1heCkge1xuICAgICAgICAvLyBFT0ZcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlXG4gKiBhIG5vZGVqcyBzdHJlYW0gYnV0IHdpdGggc29tZSBkaWZmZXJlbmNlcy4gT24gdGhlIGdvb2Qgc2lkZSA6XG4gKiAtIGl0IHdvcmtzIG9uIElFIDYtOSB3aXRob3V0IGFueSBpc3N1ZSAvIHBvbHlmaWxsXG4gKiAtIGl0IHdlaWdodHMgbGVzcyB0aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeVxuICogLSBpdCBmb3J3YXJkcyBlcnJvcnMgKG5vIG5lZWQgdG8gZGVjbGFyZSBhbiBlcnJvciBoYW5kbGVyIEVWRVJZV0hFUkUpXG4gKlxuICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhblxuICogb2JqZWN0IGNvbnRhaW5pbmcgYW55dGhpbmcgKGBwZXJjZW50YCBmb3IgZXhhbXBsZSksIHNlZSBlYWNoIHdvcmtlciBmb3IgbW9yZVxuICogZGV0YWlscy4gVGhlIGxhdHRlciBpcyB0aGUgcmVhbCBkYXRhIChTdHJpbmcsIFVpbnQ4QXJyYXksIGV0YykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyZWFtIChtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5mdW5jdGlvbiBHZW5lcmljV29ya2VyKG5hbWUpIHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgd29ya2VycyBjaGFpblxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIGFuIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlIHdvcmtlciB3YXMgcGF1c2VkXG4gICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IG51bGw7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgdG8gYmUgbWVyZ2VkIGJ5IHRoaXMgd29ya2VyIGludG8gdGhlIGdlbmVyYWwgbWV0YWRhdGFcbiAgICB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBsb2NrZWQgdG8gcHJldmVudCBmdXJ0aGVyIHN0cnVjdHVyZSB1cGRhdGVzIChwaXBlKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XG4gICAgICAgICdkYXRhJzpbXSxcbiAgICAgICAgJ2VuZCc6W10sXG4gICAgICAgICdlcnJvcic6W11cbiAgICB9O1xuICAgIC8vIHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueVxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xufVxuXG5HZW5lcmljV29ya2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhlIG5leHQgd29ya2Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKi9cbiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImRhdGFcIiwgY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVuZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtIHdpdGggYW4gZXJyb3IuXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIgd2l0aCBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcblxuICAgICAgICAgICAgLy8gaW4gdGhlIHdvcmtlcnMgY2hhaW4gZXhwbG9kZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2hhaW4sXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeVxuICAgICAgICAgICAgLy8gd29ya2VycyB1cHdhcmQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci5cbiAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIG9uIGFuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgY3VycmVudCBvYmplY3QgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbGVhbiBhbnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBjbGVhblVwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9yID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQuIFRoaXMgd2lsbCBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgcHJvdmlkZWQgYXJnLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLlxuICAgICAqL1xuICAgIGVtaXQgOiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV1baV0uY2FsbCh0aGlzLCBhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFpbiBhIHdvcmtlciB3aXRoIGFuIG90aGVyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBuZXh0IHRoZSB3b3JrZXIgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcGlwZSA6IGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqIFVzaW5nIGFuIEFQSSB3aXRoIGBwaXBlKG5leHQpYCBpcyB2ZXJ5IGVhc3kuXG4gICAgICogSW1wbGVtZW50aW5nIHRoZSBBUEkgd2l0aCB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbmV4dCBvbmUgcmVnaXN0ZXJpbmdcbiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gcHJldmlvdXMgdGhlIHByZXZpb3VzIHdvcmtlciwgc2VuZGluZyBldmVudHMgdG8gdGhpcyBvbmVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJQcmV2aW91cyA6IGZ1bmN0aW9uIChwcmV2aW91cykge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFyaW5nIHRoZSBzdHJlYW1JbmZvLi4uXG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHByZXZpb3VzLnN0cmVhbUluZm87XG4gICAgICAgIC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0c1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gIHByZXZpb3VzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByZXZpb3VzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NDaHVuayhjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtIHNvIGl0IGRvZXNuJ3Qgc2VuZCBldmVudHMgYW55bW9yZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBwYXVzZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSBhIHBhdXNlZCBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcmVzdW1lZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlIHdvcmtlciB0cmllZCB0byByZXN1bWUgYnV0IGZhaWxlZFxuICAgICAgICB2YXIgd2l0aEVycm9yID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcik7XG4gICAgICAgICAgICB3aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXdpdGhFcnJvcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZsdXNoIGFueSByZW1haW5pbmcgYnl0ZXMgYXMgdGhlIHN0cmVhbSBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgZmx1c2ggOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRkZW4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXkvdmFsdWUgdG8gYmUgYWRkZWQgaW4gdGhlIHdvcmtlcnMgY2hhaW4gc3RyZWFtSW5mbyBvbmNlIGFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gdXNlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVhbUluZm8uXG4gICAgICovXG4gICAgbWVyZ2VTdHJlYW1JbmZvIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dHJhU3RyZWFtSW5mby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUluZm9ba2V5XSA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGFsbCBjYWxscyB0byBwaXBlIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubG9jaygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUHJldHR5IHByaW50IHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqL1xuICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWUgPSBcIldvcmtlciBcIiArIHRoaXMubmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzICsgXCIgLT4gXCIgKyBtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2VuZXJpY1dvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xudmFyIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIgPSByZXF1aXJlKCcuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcicpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4uL2V4dGVybmFsXCIpO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZGF0YS4gSWYgdGhlIHVzZXIgd2FudHMgYSBCbG9iIGZvclxuICogZXhhbXBsZSwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlXG4gKiBBcnJheUJ1ZmZlci9CbG9iIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmFtZSBvZiB0aGUgZmluYWwgdHlwZVxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgY29udGVudCBpbiB0aGUgcmlnaHQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1aaXBPdXRwdXQodHlwZSwgY29udGVudCwgbWltZVR5cGUpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgY29udGVudCksIG1pbWVUeXBlKTtcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiIDpcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGNvbnRlbnQpO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1Ubyh0eXBlLCBjb250ZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYW4gYXJyYXkgb2YgZGF0YSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRlZCBkYXRhXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhc2tlZCB0eXBlIGlzIHVuc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdCAodHlwZSwgZGF0YUFycmF5KSB7XG4gICAgdmFyIGksIGluZGV4ID0gMCwgcmVzID0gbnVsbCwgdG90YWxMZW5ndGggPSAwO1xuICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZGF0YUFycmF5LmpvaW4oXCJcIik7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF0YUFycmF5KTtcbiAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgIHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5zZXQoZGF0YUFycmF5W2ldLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChkYXRhQXJyYXkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnXCIgICsgdHlwZSArIFwiJ1wiKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAqIGNvbXBsZXRlIGJsb2NrLlxuICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNhbGxiYWNrIGEgY2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLiBDYWxsZWRcbiAqIHdpdGggb25lIGFyZyA6XG4gKiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC5cbiAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICB2YXIgZGF0YUFycmF5ID0gW107XG4gICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSxcbiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBoZWxwZXIuX291dHB1dFR5cGUsXG4gICAgICAgICAgICBtaW1lVHlwZSA9IGhlbHBlci5fbWltZVR5cGU7XG4gICAgICAgIGhlbHBlclxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZih1cGRhdGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtWmlwT3V0cHV0KHJlc3VsdFR5cGUsIGNvbmNhdChjaHVua1R5cGUsIGRhdGFBcnJheSksIG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgdG8gZWFzaWx5IHVzZSB3b3JrZXJzIG91dHNpZGUgb2YgSlNaaXAuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIgdGhlIHdvcmtlciB0byB3cmFwXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGJ5IHRoZSB1c2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBTdHJlYW1IZWxwZXIod29ya2VyLCBvdXRwdXRUeXBlLCBtaW1lVHlwZSkge1xuICAgIHZhciBpbnRlcm5hbFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJ1aW50OGFycmF5XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxUeXBlID0gaW50ZXJuYWxUeXBlO1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIHRvIG91dHB1dCByZXN1bHRzXG4gICAgICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICAvLyB0aGUgbWltZSB0eXBlXG4gICAgICAgIHRoaXMuX21pbWVUeXBlID0gbWltZVR5cGU7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChpbnRlcm5hbFR5cGUpO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB3b3JrZXIucGlwZShuZXcgQ29udmVydFdvcmtlcihpbnRlcm5hbFR5cGUpKTtcbiAgICAgICAgLy8gdGhlIGxhc3Qgd29ya2VycyBjYW4gYmUgcmV3aXJlZCB3aXRob3V0IGlzc3VlcyBidXQgd2UgbmVlZCB0b1xuICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuXG4gICAgICAgIHdvcmtlci5sb2NrKCk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTtcbiAgICB9XG59XG5cblN0cmVhbUhlbHBlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAgICAgKiBjb21wbGV0ZSBibG9jay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAgICAgKi9cbiAgICBhY2N1bXVsYXRlIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxpc3RlbmVyIG9uIGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZ0IHRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKGV2dCwgZm4pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKGV2dCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwgY2h1bmsubWV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dGlscy5kZWxheShmbiwgYXJndW1lbnRzLCBzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsIFtdLCB0aGlzLl93b3JrZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLnBhdXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbm9kZWpzIHN0cmVhbSBmb3IgdGhpcyBoZWxwZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyfSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAgICAgKi9cbiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpO1xuICAgICAgICBpZiAodGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCBzdHJlYW0gY29udGFpbmluZyBibG9iL2FycmF5YnVmZmVyL3VpbnQ4YXJyYXkvc3RyaW5nXG4gICAgICAgICAgICAvLyBpcyBzdHJhbmdlIGFuZCBJIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUgdXNlZnVsLlxuICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGFcbiAgICAgICAgICAgIC8vIGJ1ZyByZXBvcnQgIVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKHRoaXMsIHtcbiAgICAgICAgICAgIG9iamVjdE1vZGUgOiB0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIlxuICAgICAgICB9LCB1cGRhdGVDYik7XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUhlbHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iYXNlNjQgPSB0cnVlO1xuZXhwb3J0cy5hcnJheSA9IHRydWU7XG5leHBvcnRzLnN0cmluZyA9IHRydWU7XG5leHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuZXhwb3J0cy5ub2RlYnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbi8vIGNvbnRhaW5zIHRydWUgaWYgSlNaaXAgY2FuIHJlYWQvZ2VuZXJhdGUgVWludDhBcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5cbmlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbn1cbmVsc2Uge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbGljYXRpb24vemlwXCJcbiAgICAgICAgfSkuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gYnVpbGRlci5nZXRCbG9iKCdhcHBsaWNhdGlvbi96aXAnKS5zaXplID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0cy5ub2Rlc3RyZWFtID0gISFyZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlclwiKS5wcm90b3R5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihzdHIsIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTtcbn07XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBieXRlcyBhcnJheSAob3IgYSByZXByZXNlbnRhdGlvbikgcmVwcmVzZW50aW5nIGFuIFVURi04IGVuY29kZWRcbiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSBidWYgdGhlIGRhdGEgZGUgZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZGVjb2RlID0gZnVuY3Rpb24gdXRmOGRlY29kZShidWYpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgYnVmKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGJ1ZiA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBidWYpO1xuXG4gICAgcmV0dXJuIGJ1ZjJzdHJpbmcoYnVmKTtcbn07XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZGVjb2RlIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzIGludG8gc3RyaW5nIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RGVjb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGRlY29kZVwiKTtcbiAgICAvLyB0aGUgbGFzdCBieXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC5cbiAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG5cbiAgICB2YXIgZGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBjaHVuay5kYXRhKTtcblxuICAgIC8vIDFzdCBzdGVwLCByZS11c2Ugd2hhdCdzIGxlZnQgb2YgdGhlIHByZXZpb3VzIGNodW5rXG4gICAgaWYgKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShwcmV2aW91c0RhdGEubGVuZ3RoICsgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7XG4gICAgICAgICAgICBkYXRhLnNldChwcmV2aW91c0RhdGEsIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEJvdW5kYXJ5ID0gdXRmOGJvcmRlcihkYXRhKTtcbiAgICB2YXIgdXNhYmxlRGF0YSA9IGRhdGE7XG4gICAgaWYgKG5leHRCb3VuZGFyeSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnN1YmFycmF5KG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnNsaWNlKG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksXG4gICAgICAgICAgICBtZXRhIDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cbn07XG5leHBvcnRzLlV0ZjhEZWNvZGVXb3JrZXIgPSBVdGY4RGVjb2RlV29ya2VyO1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGVuZGNvZGUgc3RyaW5nIGNodW5rcyBpbnRvIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhFbmNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZW5jb2RlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOEVuY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RW5jb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZW5jb2RlKGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRoYXQgcGFzcyBhcyBhIFwiYmluYXJ5IHN0cmluZ1wiOiBpdCBzaG91bGQgcmVwcmVzZW50IGEgYnl0ZVxuICogYXJyYXkgYnV0IG1heSBoYXZlID4gMjU1IGNoYXIgY29kZXMuIEJlIHN1cmUgdG8gdGFrZSBvbmx5IHRoZSBmaXJzdCBieXRlXG4gKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fSB0aGUgc3RyaW5nIGluIGEgYmluYXJ5IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCByZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9iLiBETyBOT1QgdXNlXG4gKiBhbiBVaW50OEFycmF5IGJlY2F1c2UgdGhlIHN0b2NrIGJyb3dzZXIgb2YgYW5kcm9pZCA0IHdvbid0IGFjY2VwdCBpdCAoaXRcbiAqIHdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGEgc3RyaW5nLCBcIltvYmplY3QgVWludDhBcnJheV1cIikuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBibG9iLlxuICogQHJldHVybiB7QmxvYn0gdGhlIGNyZWF0ZWQgYmxvYi5cbiAqL1xuZXhwb3J0cy5uZXdCbG9iID0gZnVuY3Rpb24ocGFydCwgdHlwZSkge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtwYXJ0XSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJvd3NlciBvbmx5LCBvbGQgd2F5XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydCk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIC8vIHdlbGwsIGZ1Y2sgPyFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxufTtcbi8qKlxuICogVGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIHNhbWUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYW4gYXJyYXkgd2l0aCBhIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gZmlsbCBpbiAod2lsbCBiZSBtdXRhdGVkKS5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCBhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gKiBUaGlzIGNvbnRhaW5zIHN0YXRpYyBpbmZvcm1hdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0XG4gKiBjYW4gYmUgb3B0aW1pemVkIGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci5cbiAqL1xudmFyIGFycmF5VG9TdHJpbmdIZWxwZXIgPSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGludCBpbnRvIGEgc3RyaW5nLCBjaHVuayBieSBjaHVuay5cbiAgICAgKiBTZWUgdGhlIHBlcmZvcm1hbmNlcyBub3RlcyBvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGNodW5rIHRoZSBjaHVuayBzaXplLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gICAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY2h1bmsgaXMgdG9vIGJpZyBmb3IgdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIC8vIHNob3J0Y3V0XG4gICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGlzIGlzIHRoZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZ2VuZXJhdGUgQSBMT1Qgb2YgaW50ZXJtZWRpYXRlIHN0cmluZy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWwuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7XG4gICAgICAgIHZhciByZXN1bHRTdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH0sXG4gICAgYXBwbHlDYW5CZVVzZWQgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gVWludDhBcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgdWludDhhcnJheSA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgbm9kZWJ1ZmZlciA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0Lm5vZGVidWZmZXIgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBub2RlanNVdGlscy5uZXdCdWZmZXIoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICB9XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7XG4gICAgLy8gUGVyZm9ybWFuY2VzIG5vdGVzIDpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWVcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vY29udmVydGluZy1hLXVpbnQ4YXJyYXktdG8tYS1zdHJpbmcvMlxuICAgIC8vIGJ1dCB0aGUgc3RhY2sgaXMgbGltaXRlZCAoYW5kIHdlIGNhbiBnZXQgaHVnZSBhcnJheXMgISkuXG4gICAgLy9cbiAgICAvLyByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7IGdlbmVyYXRlIHRvbyBtYW55IHN0cmluZ3MgIVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yXG4gICAgLy8gVE9ETyA6IHdlIG5vdyBoYXZlIHdvcmtlcnMgdGhhdCBzcGxpdCB0aGUgd29yay4gRG8gd2Ugc3RpbGwgbmVlZCB0aGF0ID9cbiAgICB2YXIgY2h1bmsgPSA2NTUzNixcbiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgIGlmICh0eXBlID09PSBcInVpbnQ4YXJyYXlcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQudWludDhhcnJheTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyO1xuICAgIH1cblxuICAgIGlmIChjYW5Vc2VBcHBseSkge1xuICAgICAgICB3aGlsZSAoY2h1bmsgPiAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGFwcGx5IG9yIGNodW5rIGVycm9yIDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAvLyBkZWZhdWx0IGJyb3dzZXIgb24gYW5kcm9pZCA0LipcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNoYXIoYXJyYXkpO1xufVxuXG5leHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7XG5cblxuLyoqXG4gKiBDb3B5IHRoZSBkYXRhIGZyb20gYW4gYXJyYXktbGlrZSB0byBhbiBvdGhlciBhcnJheS1saWtlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlGcm9tIHRoZSBvcmlnaW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5VG9baV0gPSBhcnJheUZyb21baV07XG4gICAgfVxuICAgIHJldHVybiBhcnJheVRvO1xufVxuXG4vLyBhIG1hdHJpeCBjb250YWluaW5nIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gZXZlcnl0aGluZyBpbnRvIGV2ZXJ5dGhpbmcuXG52YXIgdHJhbnNmb3JtID0ge307XG5cbi8vIHN0cmluZyB0byA/XG50cmFuc2Zvcm1bXCJzdHJpbmdcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcInN0cmluZ1wiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gYXJyYXlidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShuZXcgVWludDhBcnJheShpbnB1dCksIG5ldyBBcnJheShpbnB1dC5ieXRlTGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGlkZW50aXR5LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9XG59O1xuXG4vLyB1aW50OGFycmF5IHRvID9cbnRyYW5zZm9ybVtcInVpbnQ4YXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFwibm9kZWJ1ZmZlclwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5ICYmIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJ1aW50OGFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LmFycmF5YnVmZmVyICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlidWZmZXJcIjtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZS5cbiAqL1xuZXhwb3J0cy5jaGVja1N1cHBvcnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdmFyIHN1cHBvcnRlZCA9IHN1cHBvcnRbdHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IC0xOyAvLyB3ZWxsLCBcIlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcIiBpcyBwYXJzZWQgYXMgLTFcblxuLyoqXG4gKiBQcmV0dGlmeSBhIHN0cmluZyByZWFkIGFzIGJpbmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBwcmV0dGlmeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gYSBwcmV0dHkgc3RyaW5nLlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZXMgPSAnJyxcbiAgICAgICAgY29kZSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgKHN0ciB8fCBcIlwiKS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJlcyArPSAnXFxcXHgnICsgKGNvZGUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBEZWZlciB0aGUgY2FsbCBvZiBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gZ2l2ZSB0byB0aGUgY2FsbGJhY2suXG4gKi9cbmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikge1xuICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGEgcHJvdG90eXBlIHdpdGggYW4gb3RoZXIsIHdpdGhvdXQgY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhcbiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdG9yIHRoZSBjb25zdHJ1Y3RvciB0byBhdWdtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckN0b3IgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB0byB1c2VcbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICB2YXIgT2JqID0gZnVuY3Rpb24oKSB7fTtcbiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBPYmooKTtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaSwgYXR0cjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzXG4gICAgICAgIGZvciAoYXR0ciBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikgJiYgdHlwZW9mIHJlc3VsdFthdHRyXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFthdHRyXSA9IGFyZ3VtZW50c1tpXVthdHRyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYXJiaXRyYXJ5IGNvbnRlbnQgaW50byBhIFByb21pc2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBhIG5hbWUgZm9yIHRoZSBjb250ZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBub3QgYW4gdW5pY29kZSBzdHJpbmdcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgb25seSBoYXMgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBpbiBhIGZvcm1hdCB1c2FibGUgYnkgSlNaaXAuXG4gKi9cbmV4cG9ydHMucHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHtcblxuICAgIHZhciBwcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC5ibG9iICYmIGlucHV0RGF0YSBpbnN0YW5jZW9mIEJsb2IgJiYgdHlwZW9mIEZpbGVSZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBkYXRhIGlzIGFscmVhZHkgYSBwcm9taXNlLCB0aGlzIGZsYXR0ZW4gaXQuXG4gICAgICAgIHByb21pc2UgPSBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoaW5wdXREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoZGF0YSk7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcIlRoZSBkYXRhIG9mICdcIiArIG5hbWUgKyBcIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICFcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFycmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IGV4cG9ydHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNCYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQmluYXJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkQmluYXJ5U3RyaW5nID09PSB0cnVlIG1lYW5zIHRoYXQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBmaWx0ZXJlZCB3aXRoIGEgMHhGRiBtYXNrXG4gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcsIG5vdCBpbiBhIGJhc2U2NCBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGlzIGlzIGEgY29ycmVjdCBcImJpbmFyeSBzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHNpZyA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJpZXMucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlZmljaWVkIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgaXQgaXMgYW4gb3RoZXIgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGNoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShleHBlY3RlZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmluZGV4IC09IDQ7XG4gICAgICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnIDogdW5leHBlY3RlZCBzaWduYXR1cmUgXCIgKyBcIihcIiArIHV0aWxzLnByZXR0eShzaWduYXR1cmUpICsgXCIsIGV4cGVjdGVkIFwiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFza2VkSW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIGV4cGVjdC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzU2lnbmF0dXJlOiBmdW5jdGlvbihhc2tlZEluZGV4LCBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGFza2VkSW5kZXgpO1xuICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHZhciB6aXBDb21tZW50ID0gdGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICAvLyBUbyBnZXQgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHRoZSBnZW5lcmF0aW9uIHBhcnQsIHdlIHdpbGwgYXNzdW1lIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyB1dGY4IGVuY29kZWQgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTtcbiAgICAgICAgdGhpcy56aXBDb21tZW50ID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShkZWNvZGVDb250ZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnJlYWRlci5za2lwKDQpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci5cbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmRpc2tzQ291bnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICBpZiAodGhpcy5kaXNrc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIGZpbGVzLCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHJlYWQgaW4gdGhlIGNlbnRyYWwgcGFydC5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLCBmaWxlO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChmaWxlLmxvY2FsSGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICBmaWxlLmhhbmRsZVVURjgoKTtcbiAgICAgICAgICAgIGZpbGUucHJvY2Vzc0F0dHJpYnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlsZTtcblxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkIFwiICsgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyArIFwiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCBcIiArIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBidXQgd2UgZ290IHNvbWV0aGluZyBmb3IgdGhlIHVzZXI6IG5vIGVycm9yIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiZXhwZWN0ZWRcIiwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcywgXCJyZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3RcIiwgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50IGlzIGEgdHJ1bmNhdGVkIHppcCBvciBjb21wbGV0ZSBnYXJiYWdlLlxuICAgICAgICAgICAgLy8gQSBcIkxPQ0FMX0ZJTEVfSEVBREVSXCIgaXMgbm90IHJlcXVpcmVkIGF0IHRoZSBiZWdpbm5pbmcgKGF1dG9cbiAgICAgICAgICAgIC8vIGV4dHJhY3RpYmxlIHppcCBmb3IgZXhhbXBsZSkgYnV0IGl0IGNhbiBnaXZlIGEgZ29vZCBoaW50LlxuICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc29cbiAgICAgICAgICAgIC8vIGdldCB1bnJlYWRhYmxlIGRhdGEuXG4gICAgICAgICAgICB2YXIgaXNHYXJiYWdlID0gIXRoaXMuaXNTaWduYXR1cmUoMCwgc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcblxuICAgICAgICAgICAgaWYgKGlzR2FyYmFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIGl0IGlzLCBzZWUgaHR0cDovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgdmFyIGVuZE9mQ2VudHJhbERpck9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKTtcblxuXG4gICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOlxuICAgICAgICAgICAgNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkXG4gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgICAgICAgICAgNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdFxuICAgICAgICAgICAgICAgIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nXG4gICAgICAgICAgICAgICAgYW4gYXJjaGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXIgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnppcDY0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIFdhcm5pbmcgOiB0aGUgemlwNjQgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgYnV0IE9OTFkgaWYgdGhlIDY0Yml0cyBpbnRlZ2VyIHJlYWQgZnJvbVxuICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRlZ2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhc2NyaXB0IHJlcHJlc2VudHNcbiAgICAgICAgICAgIGFsbCBudW1iZXJzIGFzIDY0LWJpdCBkb3VibGUgcHJlY2lzaW9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICAgICAgICBTbywgd2UgaGF2ZSA1M2JpdHMgZm9yIGludGVnZXJzIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgdHJlYXQgZXZlcnl0aGluZyBhcyAzMmJpdHMuXG4gICAgICAgICAgICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnNcbiAgICAgICAgICAgIGFuZCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmIHNlY3Rpb24gOC41XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBzaG91bGQgbG9vayBmb3IgYSB6aXA2NCBFT0NEIGxvY2F0b3JcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKTtcblxuICAgICAgICAgICAgLy8gbm93IHRoZSB6aXA2NCBFT0NEIHJlY29yZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciwgc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgbm90IHdoZXJlIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5jZW50cmFsRGlyT2Zmc2V0ICsgdGhpcy5jZW50cmFsRGlyU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuemlwNjQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvclxuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMTIgLyogc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIDEyIGJ5dGVzICovICsgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXh0cmFCeXRlcyA9IGVuZE9mQ2VudHJhbERpck9mZnNldCAtIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0O1xuXG4gICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGV4dHJhQnl0ZXMsIFwiZXh0cmEgYnl0ZXMgYXQgYmVnaW5uaW5nIG9yIHdpdGhpbiB6aXBmaWxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmUoZW5kT2ZDZW50cmFsRGlyT2Zmc2V0LCBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0cyBzZWVtIHdyb25nLCBidXQgd2UgaGF2ZSBzb21ldGhpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICAgICAgICAgICAgLy8gU2/igKYgd2Uga2VlcCBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBpcyB3cm9uZywgdXBkYXRlIHRoZSBcInplcm9cIiBvZiB0aGUgcmVhZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGRhdGEgaGFzIGJlZW4gcHJlcGVuZGVkIChjcnggZmlsZXMgZm9yIGV4YW1wbGUpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIuemVybyA9IGV4dHJhQnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgXCIgKyBNYXRoLmFicyhleHRyYUJ5dGVzKSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlckZvcihkYXRhKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB6aXAgZmlsZSBhbmQgY3JlYXRlIFppcEVudHJpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgemlwIGZpbGUuXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZWFkZXIoZGF0YSk7XG4gICAgICAgIHRoaXMucmVhZEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB0aGlzLnJlYWRDZW50cmFsRGlyKCk7XG4gICAgICAgIHRoaXMucmVhZExvY2FsRmlsZXMoKTtcbiAgICB9XG59O1xuLy8gfX19IGVuZCBvZiBaaXBFbnRyaWVzXG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIGNyYzMyZm4gPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IHJlcXVpcmUoJy4vY29tcHJlc3Npb25zJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuXG52YXIgTUFERV9CWV9ET1MgPSAweDAwO1xudmFyIE1BREVfQllfVU5JWCA9IDB4MDM7XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xudmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgZm9yICh2YXIgbWV0aG9kIGluIGNvbXByZXNzaW9ucykge1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9ucy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHJlc3Npb25zW21ldGhvZF0ubWFnaWMgPT09IGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Npb25zW21ldGhvZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgLy8gdGhlIGZpbGVOYW1lIGlzIHN0b3JlZCBhcyBiaW5hcnkgZGF0YSwgdGhlIGhhbmRsZVVURjggbWV0aG9kIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBlbmNvZGluZy5cbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgcmVhZGVyLnNraXAobG9jYWxFeHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpO1xuICAgICAgICBpZiAoY29tcHJlc3Npb24gPT09IG51bGwpIHsgLy8gbm8gY29tcHJlc3Npb24gZm91bmRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIiArIHV0aWxzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSArIFwiIHVua25vd24gKGlubmVyIGZpbGUgOiBcIiArIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZmlsZU5hbWUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhpcy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgcmVhZGVyLnNraXAoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmJpdEZsYWcgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLmRhdGUgPSByZWFkZXIucmVhZERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmMzMiA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aWxsIGJlIHJlYWQgaW4gdGhlIGxvY2FsIHBhcnQsIHNlZSB0aGUgY29tbWVudHMgdGhlcmVcbiAgICAgICAgcmVhZGVyLnNraXAoZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpO1xuICAgICAgICB0aGlzLnBhcnNlWklQNjRFeHRyYUZpZWxkKHJlYWRlcik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnQgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuXG4gICAgICovXG4gICAgcHJvY2Vzc0F0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdmFyIG1hZGVCeSA9IHRoaXMudmVyc2lvbk1hZGVCeSA+PiA4O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIERPUyBkaXJlY3RvcnkgZmxhZyBzZXQuXG4gICAgICAgIC8vIFdlIGxvb2sgZm9yIGl0IGluIHRoZSBET1MgYW5kIFVOSVggcGVybWlzc2lvbnNcbiAgICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IDYgYml0cyAoMCB0byA1KVxuICAgICAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4M0Y7XG4gICAgICAgIH1cblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfVU5JWCkge1xuICAgICAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjtcbiAgICAgICAgICAgIC8vIHRoZSBvY3RhbCBwZXJtaXNzaW9ucyBhcmUgaW4gKHRoaXMudW5peFBlcm1pc3Npb25zICYgMHgwMUZGKS50b1N0cmluZyg4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhaWwgc2FmZSA6IGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC8gaXQgcHJvYmFibHkgbWVhbnMgYSBmb2xkZXJcbiAgICAgICAgaWYgKCF0aGlzLmRpciAmJiB0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIFpJUDY0IGV4dHJhIGZpZWxkIGFuZCBtZXJnZSB0aGUgaW5mbyBpbiB0aGUgY3VycmVudCBaaXBFbnRyeS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICBwYXJzZVpJUDY0RXh0cmFGaWVsZDogZnVuY3Rpb24ocmVhZGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3VsZCBiZSBzb21ldGhpbmcsIHByZXBhcmluZyB0aGUgZXh0cmEgcmVhZGVyXG4gICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0udmFsdWUpO1xuXG4gICAgICAgIC8vIEkgcmVhbGx5IGhvcGUgdGhhdCB0aGVzZSA2NGJpdHMgaW50ZWdlciBjYW4gZml0IGluIDMyIGJpdHMgaW50ZWdlciwgYmVjYXVzZSBqc1xuICAgICAgICAvLyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLlxuICAgICAgICBpZiAodGhpcy51bmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbEhlYWRlck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZEV4dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRlci5pbmRleCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlYWRlci5pbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICBpZiAodGhpcy51c2VVVEY4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoKCk7XG4gICAgICAgICAgICBpZiAodXBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXBhdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lQnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh1Y29tbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1Y29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudEJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIHBhdGgsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdXBhdGhGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg3MDc1XTtcbiAgICAgICAgaWYgKHVwYXRoRmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIGNvbW1lbnQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdWNvbW1lbnRGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg2Mzc1XTtcbiAgICAgICAgaWYgKHVjb21tZW50RmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gb3B0aW9ucy51bml4UGVybWlzc2lvbnM7XG4gICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7XG4gICAgLy8ga2VlcCBvbmx5IHRoZSBjb21wcmVzc2lvblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLFxuICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBvcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc1xuICAgIH07XG59O1xuXG5aaXBPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlcm5hbCBzdHJlYW0gZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhc2tVbmljb2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIjtcbiAgICAgICAgaWYgKG91dHB1dFR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG5cbiAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5O1xuXG4gICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcgJiYgIWFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuaWNvZGVTdHJpbmcgJiYgYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOERlY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHJlc3VsdCwgb3V0cHV0VHlwZSwgXCJcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGFza2VkIHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIG9mIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBhcyBhIG5vZGVqcyBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBTdHJlYW0gdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBub2RlU3RyZWFtOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSB8fCBcIm5vZGVidWZmZXJcIikudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB0byB1c2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIC8vIF9jb21wcmVzc1dvcmtlcjogZnVuY3Rpb24gKGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgaWYgKFxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEuY29tcHJlc3Npb24ubWFnaWMgPT09IGNvbXByZXNzaW9uLm1hZ2ljXG4gICAgLy8gICAgICkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcbiAgICAvLyAgICAgICAgIGlmKCF0aGlzLl9kYXRhQmluYXJ5KSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIHJldHVybiBDb21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20ocmVzdWx0LCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIF9kZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlZE1ldGhvZHMgPSBbXCJhc1RleHRcIiwgXCJhc0JpbmFyeVwiLCBcImFzTm9kZUJ1ZmZlclwiLCBcImFzVWludDhBcnJheVwiLCBcImFzQXJyYXlCdWZmZXJcIl07XG52YXIgcmVtb3ZlZEZuID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xufTtcblxuZm9yKHZhciBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgWmlwT2JqZWN0LnByb3RvdHlwZVtyZW1vdmVkTWV0aG9kc1tpXV0gPSByZW1vdmVkRm47XG59XG5tb2R1bGUuZXhwb3J0cyA9IFppcE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gbm90TnVsbCh4KSAgeyByZXR1cm4geCAhPSBudWxsOyB9XG5mdW5jdGlvbiB3cmFwKHgpICAgICB7IHJldHVybiAnKCcgKyB4ICsgJyknO31cblxuZnVuY3Rpb24gbWF5YmVRdW90ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxvb2tVcChrZXkpIHtcbiAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250ZXh0LicgKyBrZXkuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gJ2NvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzLicgKyBrZXk7XG59XG5cbmZ1bmN0aW9uIG51bGxWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuICcgdHJ1ZSAnO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChtYXliZVF1b3RlKHZhbHVlKSArICcgPT09ICcgKyBsb29rVXAoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5T3Ioa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gd3JhcCh2YWx1ZXMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiBwcm9wZXJ0eUVxdWFsKGtleSwgeCk7IH0pLmpvaW4oJyB8fCAnKSk7XG59XG5cbmZ1bmN0aW9uIHByaW50TmVzdGVkKHZhbHVlcywgam9pbmVyKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLmZpbHRlcihub3ROdWxsKS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoeC5qb2luKCcgJiYgJykpO1xuICAgIH0pLmpvaW4oJyAnICsgam9pbmVyICsgJyAnKSk7XG59XG5cbmZ1bmN0aW9uIGFueShfLCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgPyBwcmludE5lc3RlZCh2YWx1ZXMubWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHBhcnNlRmlsdGVyKHYsIG9wdGlvbnMpIH0pLCAnfHwnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gYWxsKF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucykgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBtYXRjaChmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoZmlsdGVyID09IG51bGwpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07IH1cbiAgICAvLyBqc2hpbnQgZXZpbDogdHJ1ZVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAncmV0dXJuICcgKyBmaWx0ZXJUb1N0cmluZyhwYXJzZUZpbHRlcihmaWx0ZXIsIG9wdGlvbnMpKSArICc7Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBmaWx0ZXJUb1N0cmluZzogZmlsdGVyVG9TdHJpbmcsXG4gICAgcGFyc2VGaWx0ZXI6IHBhcnNlRmlsdGVyXG59O1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuICB2YXIgZGljdDtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgICBpZiAodHlwZW9mIGRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdCA9IGRpY3Rpb25hcnk7XG4gICAgICB9XG5cbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3VwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2c7IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyeVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7ICAgICB9LFxuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyAgICAgfSxcbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7ICAgIH0sXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7ICAgICB9LFxuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyAgfSxcbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcC54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IHAueTtcbiAgICB9LFxuXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLy8gRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLy8gY29uc3RydWN0cyBQb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG5leHRUaWNrO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLm5leHRUaWNrO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIi8vIFRoaXMgbWV0aG9kIG9mIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBuZWVkcyB0byBiZVxuLy8ga2VwdCBpZGVudGljYWwgdG8gdGhlIHdheSBpdCBpcyBvYnRhaW5lZCBpbiBydW50aW1lLmpzXG52YXIgZyA9XG4gIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDpcbiAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdGhpcztcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvbWFzdGVyL0xJQ0VOU0UgZmlsZS4gQW5cbiAqIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpblxuICogdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKChvdXRlckZuIHx8IEdlbmVyYXRvcikucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGB2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnRgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLiBTb21lIG1heSBjb25zaWRlciB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB0b29cbiAgLy8gY3V0ZXN5LCBidXQgdGhleSBhcmUgY3VybXVkZ2VvbnMuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gbmV3IEF3YWl0QXJndW1lbnQoYXJnKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBd2FpdEFyZ3VtZW50KGFyZykge1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBd2FpdEFyZ3VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5hcmcpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy5kb21haW4pIHtcbiAgICAgIGludm9rZSA9IHByb2Nlc3MuZG9tYWluLmJpbmQoaW52b2tlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIiB8fFxuICAgICAgICAgICAgICAobWV0aG9kID09PSBcInRocm93XCIgJiYgZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgLy8gQSByZXR1cm4gb3IgdGhyb3cgKHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyB0aHJvd1xuICAgICAgICAgICAgLy8gbWV0aG9kKSBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgICAgdmFyIHJldHVybk1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKHJldHVybk1ldGhvZCkge1xuICAgICAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gocmV0dXJuTWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgYXJnKTtcbiAgICAgICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmV0dXJuIG1ldGhvZCB0aHJldyBhbiBleGNlcHRpb24sIGxldCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHByZXZhaWwgb3ZlciB0aGUgb3JpZ2luYWwgcmV0dXJuIG9yIHRocm93LlxuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCB0aGUgb3V0ZXIgcmV0dXJuLCBub3cgdGhhdCB0aGUgZGVsZWdhdGVcbiAgICAgICAgICAgICAgLy8gaXRlcmF0b3IgaGFzIGJlZW4gdGVybWluYXRlZC5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKFxuICAgICAgICAgICAgZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kXSxcbiAgICAgICAgICAgIGRlbGVnYXRlLml0ZXJhdG9yLFxuICAgICAgICAgICAgYXJnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gTGlrZSByZXR1cm5pbmcgZ2VuZXJhdG9yLnRocm93KHVuY2F1Z2h0KSwgYnV0IHdpdGhvdXQgdGhlXG4gICAgICAgICAgICAvLyBvdmVyaGVhZCBvZiBhbiBleHRyYSBmdW5jdGlvbiBjYWxsLlxuICAgICAgICAgICAgbWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERlbGVnYXRlIGdlbmVyYXRvciByYW4gYW5kIGhhbmRsZWQgaXRzIG93biBleGNlcHRpb25zIHNvXG4gICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBtZXRob2Qgd2FzLCB3ZSBjb250aW51ZSBhcyBpZiBpdCBpc1xuICAgICAgICAgIC8vIFwibmV4dFwiIHdpdGggYW4gdW5kZWZpbmVkIGFyZy5cbiAgICAgICAgICBtZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBhcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG4gICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG4gICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgICBtZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBhcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIHZhciBpbmZvID0ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGVnYXRlICYmIG1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICAgICAgICBhcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG4gICAgICAgIHJldHVybiAhIWNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9XG5cblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgfVxufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuLy9cbi8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4vLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4vLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG52YXIgU3RyaW5nRGVjb2RlciA9IGV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCAnJyk7XG4gIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKTtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICAvLyBDRVNVLTggcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDMtYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIC8vIFVURi0xNiByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMi1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMjtcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIC8vIEJhc2UtNjQgc3RvcmVzIDMgYnl0ZXMgaW4gNCBjaGFycywgYW5kIHBhZHMgdGhlIHJlbWFpbmRlci5cbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHBhc3NUaHJvdWdoV3JpdGU7XG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIGJ5dGVzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gVVRGLTggbmVlZHMgNFxuICAvLyBieXRlcywgYnV0IENFU1UtOCBtYXkgcmVxdWlyZSB1cCB0byA2ICgzIGJ5dGVzIHBlciBzdXJyb2dhdGUpLlxuICB0aGlzLmNoYXJCdWZmZXIgPSBuZXcgQnVmZmVyKDYpO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhclJlY2VpdmVkID0gMDtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG4vLyB3cml0ZSBkZWNvZGVzIHRoZSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXQgYXMgSlMgc3RyaW5nIHRoYXQgaXNcbi8vIGd1YXJhbnRlZWQgdG8gbm90IGNvbnRhaW4gYW55IHBhcnRpYWwgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBBbnkgcGFydGlhbFxuLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBidWZmZXJlZCB1cCwgYW5kIHdpbGwgYmVcbi8vIHJldHVybmVkIHdoZW4gY2FsbGluZyB3cml0ZSBhZ2FpbiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMuXG4vL1xuLy8gTm90ZTogQ29udmVydGluZyBhIEJ1ZmZlciBjb250YWluaW5nIGFuIG9ycGhhbiBzdXJyb2dhdGUgdG8gYSBTdHJpbmdcbi8vIGN1cnJlbnRseSB3b3JrcywgYnV0IGNvbnZlcnRpbmcgYSBTdHJpbmcgdG8gYSBCdWZmZXIgKHZpYSBgbmV3IEJ1ZmZlcmAsIG9yXG4vLyBCdWZmZXIjd3JpdGUpIHdpbGwgcmVwbGFjZSBpbmNvbXBsZXRlIHN1cnJvZ2F0ZXMgd2l0aCB0aGUgdW5pY29kZVxuLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBTZWUgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8xMjExNzMwMDkvIC5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciBjaGFyU3RyID0gJyc7XG4gIC8vIGlmIG91ciBsYXN0IHdyaXRlIGVuZGVkIHdpdGggYW4gaW5jb21wbGV0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyXG4gIHdoaWxlICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcmVtYWluaW5nIGJ5dGVzIHRoaXMgYnVmZmVyIGhhcyB0byBvZmZlciBmb3IgdGhpcyBjaGFyXG4gICAgdmFyIGF2YWlsYWJsZSA9IChidWZmZXIubGVuZ3RoID49IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkKSA/XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDpcbiAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIDAsIGF2YWlsYWJsZSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gYXZhaWxhYmxlO1xuXG4gICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkIDwgdGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBzdGlsbCBub3QgZW5vdWdoIGNoYXJzIGluIHRoaXMgYnVmZmVyPyB3YWl0IGZvciBtb3JlIC4uLlxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBieXRlcyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShhdmFpbGFibGUsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGNoYXJTdHIubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCArPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICBjaGFyU3RyID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYnl0ZXMgaW4gdGhpcyBidWZmZXIsIGp1c3QgZW1pdCBvdXIgY2hhclxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hhclN0cjtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgYW5kIHNldCBjaGFyTGVuZ3RoIC8gY2hhclJlY2VpdmVkXG4gIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7XG4gICAgZW5kIC09IHRoaXMuY2hhclJlY2VpdmVkO1xuICB9XG5cbiAgY2hhclN0ciArPSBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgZW5kKTtcblxuICB2YXIgZW5kID0gY2hhclN0ci5sZW5ndGggLSAxO1xuICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIDAsIHNpemUpO1xuICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpO1xuICB9XG5cbiAgLy8gb3IganVzdCBlbWl0IHRoZSBjaGFyU3RyXG4gIHJldHVybiBjaGFyU3RyO1xufTtcblxuLy8gZGV0ZWN0SW5jb21wbGV0ZUNoYXIgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIFVURi04IGNoYXJhY3RlciBhdFxuLy8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiBJZiBzbywgaXQgc2V0cyB0aGlzLmNoYXJMZW5ndGggdG8gdGhlIGJ5dGVcbi8vIGxlbmd0aCB0aGF0IGNoYXJhY3RlciwgYW5kIHNldHMgdGhpcy5jaGFyUmVjZWl2ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlc1xuLy8gdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoYXJhY3Rlci5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIGNoZWNrIGF0IHRoZSBlbmQgb2YgdGhpcyBidWZmZXJcbiAgdmFyIGkgPSAoYnVmZmVyLmxlbmd0aCA+PSAzKSA/IDMgOiBidWZmZXIubGVuZ3RoO1xuXG4gIC8vIEZpZ3VyZSBvdXQgaWYgb25lIG9mIHRoZSBsYXN0IGkgYnl0ZXMgb2Ygb3VyIGJ1ZmZlciBhbm5vdW5jZXMgYW5cbiAgLy8gaW5jb21wbGV0ZSBjaGFyLlxuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBpXTtcblxuICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi04I0Rlc2NyaXB0aW9uXG5cbiAgICAvLyAxMTBYWFhYWFxuICAgIGlmIChpID09IDEgJiYgYyA+PiA1ID09IDB4MDYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTEwWFhYWFxuICAgIGlmIChpIDw9IDIgJiYgYyA+PiA0ID09IDB4MEUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTExMFhYWFxuICAgIGlmIChpIDw9IDMgJiYgYyA+PiAzID09IDB4MUUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBpO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciByZXMgPSAnJztcbiAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoKVxuICAgIHJlcyA9IHRoaXMud3JpdGUoYnVmZmVyKTtcblxuICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQpIHtcbiAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICB2YXIgYnVmID0gdGhpcy5jaGFyQnVmZmVyO1xuICAgIHZhciBlbmMgPSB0aGlzLmVuY29kaW5nO1xuICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMjtcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAyIDogMDtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMyA6IDA7XG59XG4iLCIvKiFcbiAqIHN0cmlwLWNvbW1lbnRzIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9zdHJpcC1jb21tZW50cz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljJztcblxudmFyIHJlQmxvY2sgPSAnXFxcXC9cXFxcKic7XG52YXIgcmVCbG9ja0lnbm9yZSA9ICdcXFxcL1xcXFwqKD8hXFxcXCo/XFxcXCEpJztcbnZhciByZUJsb2NrRW5kID0gJygufFtcXFxcclxcXFxuXXxcXFxcbikqP1xcXFwqXFxcXC9cXFxcbj9cXFxcbj8nO1xudmFyIHJlTGluZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvKShbXFxzXFxTXSs/KSQvZ207XG52YXIgcmVMaW5lSWdub3JlID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC9bXiFdKShbXFxzXFxTXSs/KSQvZ207XG5cblxuLyoqXG4gKiBTdHJpcCBhbGwgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcInN0cmlwXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudHMgb3Igc3RyaW5nIHRvIHN0cmlwLlxuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYC5ibG9ja2AsIGFuZCBgLmxpbmVgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHN0cmlwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgcmV0dXJuIHN0ciA/IHN0cmlwLmJsb2NrKHN0cmlwLmxpbmUoc3RyLCBvcHRzKSwgb3B0cykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGJsb2NrIGNvbW1lbnRzLCBvcHRpb25hbGx5IGxlYXZpbmcgcHJvdGVjdGVkIGNvbW1lbnRzXG4gKiAoZS5nLiBgLyohYCkgaW50YWN0LlxuICpcbiAqIHslPSBkb2NzKFwiYmxvY2tcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgb25seSBjb21tZW50cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGAvKiFgIG9yIGAvKiohYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgYmxvY2sgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmJsb2NrID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2sgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2tJZ25vcmUgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgbGluZSBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwibGluZVwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBhbGwgdGhhdCBub3Qgc3RhcnRzIHdpdGggYC8vIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGxpbmUgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmxpbmUgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IHJlTGluZTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSByZUxpbmVJZ25vcmU7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG4iLCIhZnVuY3Rpb24oKSB7XG4gIHZhciB0b3BvanNvbiA9IHtcbiAgICB2ZXJzaW9uOiBcIjEuNi4xOVwiLFxuICAgIG1lc2g6IGZ1bmN0aW9uKHRvcG9sb2d5KSB7IHJldHVybiBvYmplY3QodG9wb2xvZ3ksIG1lc2hBcmNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOyB9LFxuICAgIG1lc2hBcmNzOiBtZXNoQXJjcyxcbiAgICBtZXJnZTogZnVuY3Rpb24odG9wb2xvZ3kpIHsgcmV0dXJuIG9iamVjdCh0b3BvbG9neSwgbWVyZ2VBcmNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOyB9LFxuICAgIG1lcmdlQXJjczogbWVyZ2VBcmNzLFxuICAgIGZlYXR1cmU6IGZlYXR1cmVPckNvbGxlY3Rpb24sXG4gICAgbmVpZ2hib3JzOiBuZWlnaGJvcnMsXG4gICAgcHJlc2ltcGxpZnk6IHByZXNpbXBsaWZ5XG4gIH07XG5cbiAgZnVuY3Rpb24gc3RpdGNoQXJjcyh0b3BvbG9neSwgYXJjcykge1xuICAgIHZhciBzdGl0Y2hlZEFyY3MgPSB7fSxcbiAgICAgICAgZnJhZ21lbnRCeVN0YXJ0ID0ge30sXG4gICAgICAgIGZyYWdtZW50QnlFbmQgPSB7fSxcbiAgICAgICAgZnJhZ21lbnRzID0gW10sXG4gICAgICAgIGVtcHR5SW5kZXggPSAtMTtcblxuICAgIC8vIFN0aXRjaCBlbXB0eSBhcmNzIGZpcnN0LCBzaW5jZSB0aGV5IG1heSBiZSBzdWJzdW1lZCBieSBvdGhlciBhcmNzLlxuICAgIGFyY3MuZm9yRWFjaChmdW5jdGlvbihpLCBqKSB7XG4gICAgICB2YXIgYXJjID0gdG9wb2xvZ3kuYXJjc1tpIDwgMCA/IH5pIDogaV0sIHQ7XG4gICAgICBpZiAoYXJjLmxlbmd0aCA8IDMgJiYgIWFyY1sxXVswXSAmJiAhYXJjWzFdWzFdKSB7XG4gICAgICAgIHQgPSBhcmNzWysrZW1wdHlJbmRleF0sIGFyY3NbZW1wdHlJbmRleF0gPSBpLCBhcmNzW2pdID0gdDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGFyY3MuZm9yRWFjaChmdW5jdGlvbihpKSB7XG4gICAgICB2YXIgZSA9IGVuZHMoaSksXG4gICAgICAgICAgc3RhcnQgPSBlWzBdLFxuICAgICAgICAgIGVuZCA9IGVbMV0sXG4gICAgICAgICAgZiwgZztcblxuICAgICAgaWYgKGYgPSBmcmFnbWVudEJ5RW5kW3N0YXJ0XSkge1xuICAgICAgICBkZWxldGUgZnJhZ21lbnRCeUVuZFtmLmVuZF07XG4gICAgICAgIGYucHVzaChpKTtcbiAgICAgICAgZi5lbmQgPSBlbmQ7XG4gICAgICAgIGlmIChnID0gZnJhZ21lbnRCeVN0YXJ0W2VuZF0pIHtcbiAgICAgICAgICBkZWxldGUgZnJhZ21lbnRCeVN0YXJ0W2cuc3RhcnRdO1xuICAgICAgICAgIHZhciBmZyA9IGcgPT09IGYgPyBmIDogZi5jb25jYXQoZyk7XG4gICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2ZnLnN0YXJ0ID0gZi5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2ZnLmVuZCA9IGcuZW5kXSA9IGZnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XSA9IGZyYWdtZW50QnlFbmRbZi5lbmRdID0gZjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmID0gZnJhZ21lbnRCeVN0YXJ0W2VuZF0pIHtcbiAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTtcbiAgICAgICAgZi51bnNoaWZ0KGkpO1xuICAgICAgICBmLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIGlmIChnID0gZnJhZ21lbnRCeUVuZFtzdGFydF0pIHtcbiAgICAgICAgICBkZWxldGUgZnJhZ21lbnRCeUVuZFtnLmVuZF07XG4gICAgICAgICAgdmFyIGdmID0gZyA9PT0gZiA/IGYgOiBnLmNvbmNhdChmKTtcbiAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZ2Yuc3RhcnQgPSBnLnN0YXJ0XSA9IGZyYWdtZW50QnlFbmRbZ2YuZW5kID0gZi5lbmRdID0gZ2Y7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2Yuc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtmLmVuZF0gPSBmO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmID0gW2ldO1xuICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydCA9IHN0YXJ0XSA9IGZyYWdtZW50QnlFbmRbZi5lbmQgPSBlbmRdID0gZjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGVuZHMoaSkge1xuICAgICAgdmFyIGFyYyA9IHRvcG9sb2d5LmFyY3NbaSA8IDAgPyB+aSA6IGldLCBwMCA9IGFyY1swXSwgcDE7XG4gICAgICBpZiAodG9wb2xvZ3kudHJhbnNmb3JtKSBwMSA9IFswLCAwXSwgYXJjLmZvckVhY2goZnVuY3Rpb24oZHApIHsgcDFbMF0gKz0gZHBbMF0sIHAxWzFdICs9IGRwWzFdOyB9KTtcbiAgICAgIGVsc2UgcDEgPSBhcmNbYXJjLmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIGkgPCAwID8gW3AxLCBwMF0gOiBbcDAsIHAxXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbHVzaChmcmFnbWVudEJ5RW5kLCBmcmFnbWVudEJ5U3RhcnQpIHtcbiAgICAgIGZvciAodmFyIGsgaW4gZnJhZ21lbnRCeUVuZCkge1xuICAgICAgICB2YXIgZiA9IGZyYWdtZW50QnlFbmRba107XG4gICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydF07XG4gICAgICAgIGRlbGV0ZSBmLnN0YXJ0O1xuICAgICAgICBkZWxldGUgZi5lbmQ7XG4gICAgICAgIGYuZm9yRWFjaChmdW5jdGlvbihpKSB7IHN0aXRjaGVkQXJjc1tpIDwgMCA/IH5pIDogaV0gPSAxOyB9KTtcbiAgICAgICAgZnJhZ21lbnRzLnB1c2goZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmx1c2goZnJhZ21lbnRCeUVuZCwgZnJhZ21lbnRCeVN0YXJ0KTtcbiAgICBmbHVzaChmcmFnbWVudEJ5U3RhcnQsIGZyYWdtZW50QnlFbmQpO1xuICAgIGFyY3MuZm9yRWFjaChmdW5jdGlvbihpKSB7IGlmICghc3RpdGNoZWRBcmNzW2kgPCAwID8gfmkgOiBpXSkgZnJhZ21lbnRzLnB1c2goW2ldKTsgfSk7XG5cbiAgICByZXR1cm4gZnJhZ21lbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVzaEFyY3ModG9wb2xvZ3ksIG8sIGZpbHRlcikge1xuICAgIHZhciBhcmNzID0gW107XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBnZW9tc0J5QXJjID0gW10sXG4gICAgICAgICAgZ2VvbTtcblxuICAgICAgZnVuY3Rpb24gYXJjKGkpIHtcbiAgICAgICAgdmFyIGogPSBpIDwgMCA/IH5pIDogaTtcbiAgICAgICAgKGdlb21zQnlBcmNbal0gfHwgKGdlb21zQnlBcmNbal0gPSBbXSkpLnB1c2goe2k6IGksIGc6IGdlb219KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbGluZShhcmNzKSB7XG4gICAgICAgIGFyY3MuZm9yRWFjaChhcmMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwb2x5Z29uKGFyY3MpIHtcbiAgICAgICAgYXJjcy5mb3JFYWNoKGxpbmUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZW9tZXRyeShvKSB7XG4gICAgICAgIGlmIChvLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIpIG8uZ2VvbWV0cmllcy5mb3JFYWNoKGdlb21ldHJ5KTtcbiAgICAgICAgZWxzZSBpZiAoby50eXBlIGluIGdlb21ldHJ5VHlwZSkgZ2VvbSA9IG8sIGdlb21ldHJ5VHlwZVtvLnR5cGVdKG8uYXJjcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBnZW9tZXRyeVR5cGUgPSB7XG4gICAgICAgIExpbmVTdHJpbmc6IGxpbmUsXG4gICAgICAgIE11bHRpTGluZVN0cmluZzogcG9seWdvbixcbiAgICAgICAgUG9seWdvbjogcG9seWdvbixcbiAgICAgICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihhcmNzKSB7IGFyY3MuZm9yRWFjaChwb2x5Z29uKTsgfVxuICAgICAgfTtcblxuICAgICAgZ2VvbWV0cnkobyk7XG5cbiAgICAgIGdlb21zQnlBcmMuZm9yRWFjaChhcmd1bWVudHMubGVuZ3RoIDwgM1xuICAgICAgICAgID8gZnVuY3Rpb24oZ2VvbXMpIHsgYXJjcy5wdXNoKGdlb21zWzBdLmkpOyB9XG4gICAgICAgICAgOiBmdW5jdGlvbihnZW9tcykgeyBpZiAoZmlsdGVyKGdlb21zWzBdLmcsIGdlb21zW2dlb21zLmxlbmd0aCAtIDFdLmcpKSBhcmNzLnB1c2goZ2VvbXNbMF0uaSk7IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvcG9sb2d5LmFyY3MubGVuZ3RoOyBpIDwgbjsgKytpKSBhcmNzLnB1c2goaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt0eXBlOiBcIk11bHRpTGluZVN0cmluZ1wiLCBhcmNzOiBzdGl0Y2hBcmNzKHRvcG9sb2d5LCBhcmNzKX07XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZUFyY3ModG9wb2xvZ3ksIG9iamVjdHMpIHtcbiAgICB2YXIgcG9seWdvbnNCeUFyYyA9IHt9LFxuICAgICAgICBwb2x5Z29ucyA9IFtdLFxuICAgICAgICBjb21wb25lbnRzID0gW107XG5cbiAgICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24obykge1xuICAgICAgaWYgKG8udHlwZSA9PT0gXCJQb2x5Z29uXCIpIHJlZ2lzdGVyKG8uYXJjcyk7XG4gICAgICBlbHNlIGlmIChvLnR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpIG8uYXJjcy5mb3JFYWNoKHJlZ2lzdGVyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKHBvbHlnb24pIHtcbiAgICAgIHBvbHlnb24uZm9yRWFjaChmdW5jdGlvbihyaW5nKSB7XG4gICAgICAgIHJpbmcuZm9yRWFjaChmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgICAocG9seWdvbnNCeUFyY1thcmMgPSBhcmMgPCAwID8gfmFyYyA6IGFyY10gfHwgKHBvbHlnb25zQnlBcmNbYXJjXSA9IFtdKSkucHVzaChwb2x5Z29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZXJpb3IocmluZykge1xuICAgICAgcmV0dXJuIGNhcnRlc2lhblJpbmdBcmVhKG9iamVjdCh0b3BvbG9neSwge3R5cGU6IFwiUG9seWdvblwiLCBhcmNzOiBbcmluZ119KS5jb29yZGluYXRlc1swXSkgPiAwOyAvLyBUT0RPIGFsbG93IHNwaGVyaWNhbD9cbiAgICB9XG5cbiAgICBwb2x5Z29ucy5mb3JFYWNoKGZ1bmN0aW9uKHBvbHlnb24pIHtcbiAgICAgIGlmICghcG9seWdvbi5fKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBbXSxcbiAgICAgICAgICAgIG5laWdoYm9ycyA9IFtwb2x5Z29uXTtcbiAgICAgICAgcG9seWdvbi5fID0gMTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHdoaWxlIChwb2x5Z29uID0gbmVpZ2hib3JzLnBvcCgpKSB7XG4gICAgICAgICAgY29tcG9uZW50LnB1c2gocG9seWdvbik7XG4gICAgICAgICAgcG9seWdvbi5mb3JFYWNoKGZ1bmN0aW9uKHJpbmcpIHtcbiAgICAgICAgICAgIHJpbmcuZm9yRWFjaChmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgICAgICAgcG9seWdvbnNCeUFyY1thcmMgPCAwID8gfmFyYyA6IGFyY10uZm9yRWFjaChmdW5jdGlvbihwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2x5Z29uLl8pIHtcbiAgICAgICAgICAgICAgICAgIHBvbHlnb24uXyA9IDE7XG4gICAgICAgICAgICAgICAgICBuZWlnaGJvcnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBvbHlnb25zLmZvckVhY2goZnVuY3Rpb24ocG9seWdvbikge1xuICAgICAgZGVsZXRlIHBvbHlnb24uXztcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIk11bHRpUG9seWdvblwiLFxuICAgICAgYXJjczogY29tcG9uZW50cy5tYXAoZnVuY3Rpb24ocG9seWdvbnMpIHtcbiAgICAgICAgdmFyIGFyY3MgPSBbXTtcblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBleHRlcmlvciAodW5pcXVlKSBhcmNzLlxuICAgICAgICBwb2x5Z29ucy5mb3JFYWNoKGZ1bmN0aW9uKHBvbHlnb24pIHtcbiAgICAgICAgICBwb2x5Z29uLmZvckVhY2goZnVuY3Rpb24ocmluZykge1xuICAgICAgICAgICAgcmluZy5mb3JFYWNoKGZ1bmN0aW9uKGFyYykge1xuICAgICAgICAgICAgICBpZiAocG9seWdvbnNCeUFyY1thcmMgPCAwID8gfmFyYyA6IGFyY10ubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIGFyY3MucHVzaChhcmMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RpdGNoIHRoZSBhcmNzIGludG8gb25lIG9yIG1vcmUgcmluZ3MuXG4gICAgICAgIGFyY3MgPSBzdGl0Y2hBcmNzKHRvcG9sb2d5LCBhcmNzKTtcblxuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHJpbmcgaXMgcmV0dXJuZWQsXG4gICAgICAgIC8vIGF0IG1vc3Qgb25lIG9mIHRoZXNlIHJpbmdzIGNhbiBiZSB0aGUgZXh0ZXJpb3I7XG4gICAgICAgIC8vIHRoaXMgZXh0ZXJpb3IgcmluZyBoYXMgdGhlIHNhbWUgd2luZGluZyBvcmRlclxuICAgICAgICAvLyBhcyBhbnkgZXh0ZXJpb3IgcmluZyBpbiB0aGUgb3JpZ2luYWwgcG9seWdvbnMuXG4gICAgICAgIGlmICgobiA9IGFyY3MubGVuZ3RoKSA+IDEpIHtcbiAgICAgICAgICB2YXIgc2duID0gZXh0ZXJpb3IocG9seWdvbnNbMF1bMF0pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoc2duID09PSBleHRlcmlvcihhcmNzW2ldKSkge1xuICAgICAgICAgICAgICB0ID0gYXJjc1swXSwgYXJjc1swXSA9IGFyY3NbaV0sIGFyY3NbaV0gPSB0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjcztcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZlYXR1cmVPckNvbGxlY3Rpb24odG9wb2xvZ3ksIG8pIHtcbiAgICByZXR1cm4gby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiID8ge1xuICAgICAgdHlwZTogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICAgICAgZmVhdHVyZXM6IG8uZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24obykgeyByZXR1cm4gZmVhdHVyZSh0b3BvbG9neSwgbyk7IH0pXG4gICAgfSA6IGZlYXR1cmUodG9wb2xvZ3ksIG8pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZSh0b3BvbG9neSwgbykge1xuICAgIHZhciBmID0ge1xuICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICBpZDogby5pZCxcbiAgICAgIHByb3BlcnRpZXM6IG8ucHJvcGVydGllcyB8fCB7fSxcbiAgICAgIGdlb21ldHJ5OiBvYmplY3QodG9wb2xvZ3ksIG8pXG4gICAgfTtcbiAgICBpZiAoby5pZCA9PSBudWxsKSBkZWxldGUgZi5pZDtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9iamVjdCh0b3BvbG9neSwgbykge1xuICAgIHZhciBhYnNvbHV0ZSA9IHRyYW5zZm9ybUFic29sdXRlKHRvcG9sb2d5LnRyYW5zZm9ybSksXG4gICAgICAgIGFyY3MgPSB0b3BvbG9neS5hcmNzO1xuXG4gICAgZnVuY3Rpb24gYXJjKGksIHBvaW50cykge1xuICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHBvaW50cy5wb3AoKTtcbiAgICAgIGZvciAodmFyIGEgPSBhcmNzW2kgPCAwID8gfmkgOiBpXSwgayA9IDAsIG4gPSBhLmxlbmd0aCwgcDsgayA8IG47ICsraykge1xuICAgICAgICBwb2ludHMucHVzaChwID0gYVtrXS5zbGljZSgpKTtcbiAgICAgICAgYWJzb2x1dGUocCwgayk7XG4gICAgICB9XG4gICAgICBpZiAoaSA8IDApIHJldmVyc2UocG9pbnRzLCBuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludChwKSB7XG4gICAgICBwID0gcC5zbGljZSgpO1xuICAgICAgYWJzb2x1dGUocCwgMCk7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lKGFyY3MpIHtcbiAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJjcy5sZW5ndGg7IGkgPCBuOyArK2kpIGFyYyhhcmNzW2ldLCBwb2ludHMpO1xuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmcoYXJjcykge1xuICAgICAgdmFyIHBvaW50cyA9IGxpbmUoYXJjcyk7XG4gICAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IDQpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbihhcmNzKSB7XG4gICAgICByZXR1cm4gYXJjcy5tYXAocmluZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VvbWV0cnkobykge1xuICAgICAgdmFyIHQgPSBvLnR5cGU7XG4gICAgICByZXR1cm4gdCA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiA/IHt0eXBlOiB0LCBnZW9tZXRyaWVzOiBvLmdlb21ldHJpZXMubWFwKGdlb21ldHJ5KX1cbiAgICAgICAgICA6IHQgaW4gZ2VvbWV0cnlUeXBlID8ge3R5cGU6IHQsIGNvb3JkaW5hdGVzOiBnZW9tZXRyeVR5cGVbdF0obyl9XG4gICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciBnZW9tZXRyeVR5cGUgPSB7XG4gICAgICBQb2ludDogZnVuY3Rpb24obykgeyByZXR1cm4gcG9pbnQoby5jb29yZGluYXRlcyk7IH0sXG4gICAgICBNdWx0aVBvaW50OiBmdW5jdGlvbihvKSB7IHJldHVybiBvLmNvb3JkaW5hdGVzLm1hcChwb2ludCk7IH0sXG4gICAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7IHJldHVybiBsaW5lKG8uYXJjcyk7IH0sXG4gICAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYXJjcy5tYXAobGluZSk7IH0sXG4gICAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7IHJldHVybiBwb2x5Z29uKG8uYXJjcyk7IH0sXG4gICAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYXJjcy5tYXAocG9seWdvbik7IH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5KG8pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSwgbikge1xuICAgIHZhciB0LCBqID0gYXJyYXkubGVuZ3RoLCBpID0gaiAtIG47IHdoaWxlIChpIDwgLS1qKSB0ID0gYXJyYXlbaV0sIGFycmF5W2krK10gPSBhcnJheVtqXSwgYXJyYXlbal0gPSB0O1xuICB9XG5cbiAgZnVuY3Rpb24gYmlzZWN0KGEsIHgpIHtcbiAgICB2YXIgbG8gPSAwLCBoaSA9IGEubGVuZ3RoO1xuICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgIGlmIChhW21pZF0gPCB4KSBsbyA9IG1pZCArIDE7XG4gICAgICBlbHNlIGhpID0gbWlkO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBuZWlnaGJvcnMob2JqZWN0cykge1xuICAgIHZhciBpbmRleGVzQnlBcmMgPSB7fSwgLy8gYXJjIGluZGV4IC0+IGFycmF5IG9mIG9iamVjdCBpbmRleGVzXG4gICAgICAgIG5laWdoYm9ycyA9IG9iamVjdHMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuXG4gICAgZnVuY3Rpb24gbGluZShhcmNzLCBpKSB7XG4gICAgICBhcmNzLmZvckVhY2goZnVuY3Rpb24oYSkge1xuICAgICAgICBpZiAoYSA8IDApIGEgPSB+YTtcbiAgICAgICAgdmFyIG8gPSBpbmRleGVzQnlBcmNbYV07XG4gICAgICAgIGlmIChvKSBvLnB1c2goaSk7XG4gICAgICAgIGVsc2UgaW5kZXhlc0J5QXJjW2FdID0gW2ldO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbihhcmNzLCBpKSB7XG4gICAgICBhcmNzLmZvckVhY2goZnVuY3Rpb24oYXJjKSB7IGxpbmUoYXJjLCBpKTsgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VvbWV0cnkobywgaSkge1xuICAgICAgaWYgKG8udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIikgby5nZW9tZXRyaWVzLmZvckVhY2goZnVuY3Rpb24obykgeyBnZW9tZXRyeShvLCBpKTsgfSk7XG4gICAgICBlbHNlIGlmIChvLnR5cGUgaW4gZ2VvbWV0cnlUeXBlKSBnZW9tZXRyeVR5cGVbby50eXBlXShvLmFyY3MsIGkpO1xuICAgIH1cblxuICAgIHZhciBnZW9tZXRyeVR5cGUgPSB7XG4gICAgICBMaW5lU3RyaW5nOiBsaW5lLFxuICAgICAgTXVsdGlMaW5lU3RyaW5nOiBwb2x5Z29uLFxuICAgICAgUG9seWdvbjogcG9seWdvbixcbiAgICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24oYXJjcywgaSkgeyBhcmNzLmZvckVhY2goZnVuY3Rpb24oYXJjKSB7IHBvbHlnb24oYXJjLCBpKTsgfSk7IH1cbiAgICB9O1xuXG4gICAgb2JqZWN0cy5mb3JFYWNoKGdlb21ldHJ5KTtcblxuICAgIGZvciAodmFyIGkgaW4gaW5kZXhlc0J5QXJjKSB7XG4gICAgICBmb3IgKHZhciBpbmRleGVzID0gaW5kZXhlc0J5QXJjW2ldLCBtID0gaW5kZXhlcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIGZvciAodmFyIGsgPSBqICsgMTsgayA8IG07ICsraykge1xuICAgICAgICAgIHZhciBpaiA9IGluZGV4ZXNbal0sIGlrID0gaW5kZXhlc1trXSwgbjtcbiAgICAgICAgICBpZiAoKG4gPSBuZWlnaGJvcnNbaWpdKVtpID0gYmlzZWN0KG4sIGlrKV0gIT09IGlrKSBuLnNwbGljZShpLCAwLCBpayk7XG4gICAgICAgICAgaWYgKChuID0gbmVpZ2hib3JzW2lrXSlbaSA9IGJpc2VjdChuLCBpaildICE9PSBpaikgbi5zcGxpY2UoaSwgMCwgaWopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5laWdoYm9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNpbXBsaWZ5KHRvcG9sb2d5LCB0cmlhbmdsZUFyZWEpIHtcbiAgICB2YXIgYWJzb2x1dGUgPSB0cmFuc2Zvcm1BYnNvbHV0ZSh0b3BvbG9neS50cmFuc2Zvcm0pLFxuICAgICAgICByZWxhdGl2ZSA9IHRyYW5zZm9ybVJlbGF0aXZlKHRvcG9sb2d5LnRyYW5zZm9ybSksXG4gICAgICAgIGhlYXAgPSBtaW5BcmVhSGVhcCgpO1xuXG4gICAgaWYgKCF0cmlhbmdsZUFyZWEpIHRyaWFuZ2xlQXJlYSA9IGNhcnRlc2lhblRyaWFuZ2xlQXJlYTtcblxuICAgIHRvcG9sb2d5LmFyY3MuZm9yRWFjaChmdW5jdGlvbihhcmMpIHtcbiAgICAgIHZhciB0cmlhbmdsZXMgPSBbXSxcbiAgICAgICAgICBtYXhBcmVhID0gMCxcbiAgICAgICAgICB0cmlhbmdsZTtcblxuICAgICAgLy8gVG8gc3RvcmUgZWFjaCBwb2ludOKAmXMgZWZmZWN0aXZlIGFyZWEsIHdlIGNyZWF0ZSBhIG5ldyBhcnJheSByYXRoZXIgdGhhblxuICAgICAgLy8gZXh0ZW5kaW5nIHRoZSBwYXNzZWQtaW4gcG9pbnQgdG8gd29ya2Fyb3VuZCBhIENocm9tZS9WOCBidWcgKGdldHRpbmdcbiAgICAgIC8vIHN0dWNrIGluIHNtaSBtb2RlKS4gRm9yIG1pZHBvaW50cywgdGhlIGluaXRpYWwgZWZmZWN0aXZlIGFyZWEgb2ZcbiAgICAgIC8vIEluZmluaXR5IHdpbGwgYmUgY29tcHV0ZWQgaW4gdGhlIG5leHQgc3RlcC5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJjLmxlbmd0aCwgcDsgaSA8IG47ICsraSkge1xuICAgICAgICBwID0gYXJjW2ldO1xuICAgICAgICBhYnNvbHV0ZShhcmNbaV0gPSBbcFswXSwgcFsxXSwgSW5maW5pdHldLCBpKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDEsIG4gPSBhcmMubGVuZ3RoIC0gMTsgaSA8IG47ICsraSkge1xuICAgICAgICB0cmlhbmdsZSA9IGFyYy5zbGljZShpIC0gMSwgaSArIDIpO1xuICAgICAgICB0cmlhbmdsZVsxXVsyXSA9IHRyaWFuZ2xlQXJlYSh0cmlhbmdsZSk7XG4gICAgICAgIHRyaWFuZ2xlcy5wdXNoKHRyaWFuZ2xlKTtcbiAgICAgICAgaGVhcC5wdXNoKHRyaWFuZ2xlKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0cmlhbmdsZXMubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHRyaWFuZ2xlID0gdHJpYW5nbGVzW2ldO1xuICAgICAgICB0cmlhbmdsZS5wcmV2aW91cyA9IHRyaWFuZ2xlc1tpIC0gMV07XG4gICAgICAgIHRyaWFuZ2xlLm5leHQgPSB0cmlhbmdsZXNbaSArIDFdO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodHJpYW5nbGUgPSBoZWFwLnBvcCgpKSB7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IHRyaWFuZ2xlLnByZXZpb3VzLFxuICAgICAgICAgICAgbmV4dCA9IHRyaWFuZ2xlLm5leHQ7XG5cbiAgICAgICAgLy8gSWYgdGhlIGFyZWEgb2YgdGhlIGN1cnJlbnQgcG9pbnQgaXMgbGVzcyB0aGFuIHRoYXQgb2YgdGhlIHByZXZpb3VzIHBvaW50XG4gICAgICAgIC8vIHRvIGJlIGVsaW1pbmF0ZWQsIHVzZSB0aGUgbGF0dGVyJ3MgYXJlYSBpbnN0ZWFkLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGVcbiAgICAgICAgLy8gY3VycmVudCBwb2ludCBjYW5ub3QgYmUgZWxpbWluYXRlZCB3aXRob3V0IGVsaW1pbmF0aW5nIHByZXZpb3VzbHktXG4gICAgICAgIC8vIGVsaW1pbmF0ZWQgcG9pbnRzLlxuICAgICAgICBpZiAodHJpYW5nbGVbMV1bMl0gPCBtYXhBcmVhKSB0cmlhbmdsZVsxXVsyXSA9IG1heEFyZWE7XG4gICAgICAgIGVsc2UgbWF4QXJlYSA9IHRyaWFuZ2xlWzFdWzJdO1xuXG4gICAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgIHByZXZpb3VzWzJdID0gdHJpYW5nbGVbMl07XG4gICAgICAgICAgdXBkYXRlKHByZXZpb3VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgIG5leHRbMF0gPSB0cmlhbmdsZVswXTtcbiAgICAgICAgICB1cGRhdGUobmV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXJjLmZvckVhY2gocmVsYXRpdmUpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlKHRyaWFuZ2xlKSB7XG4gICAgICBoZWFwLnJlbW92ZSh0cmlhbmdsZSk7XG4gICAgICB0cmlhbmdsZVsxXVsyXSA9IHRyaWFuZ2xlQXJlYSh0cmlhbmdsZSk7XG4gICAgICBoZWFwLnB1c2godHJpYW5nbGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0b3BvbG9neTtcbiAgfTtcblxuICBmdW5jdGlvbiBjYXJ0ZXNpYW5SaW5nQXJlYShyaW5nKSB7XG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IHJpbmcubGVuZ3RoLFxuICAgICAgICBhLFxuICAgICAgICBiID0gcmluZ1tuIC0gMV0sXG4gICAgICAgIGFyZWEgPSAwO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGEgPSBiO1xuICAgICAgYiA9IHJpbmdbaV07XG4gICAgICBhcmVhICs9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWEgKiAuNTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhcnRlc2lhblRyaWFuZ2xlQXJlYSh0cmlhbmdsZSkge1xuICAgIHZhciBhID0gdHJpYW5nbGVbMF0sIGIgPSB0cmlhbmdsZVsxXSwgYyA9IHRyaWFuZ2xlWzJdO1xuICAgIHJldHVybiBNYXRoLmFicygoYVswXSAtIGNbMF0pICogKGJbMV0gLSBhWzFdKSAtIChhWzBdIC0gYlswXSkgKiAoY1sxXSAtIGFbMV0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVBcmVhKGEsIGIpIHtcbiAgICByZXR1cm4gYVsxXVsyXSAtIGJbMV1bMl07XG4gIH1cblxuICBmdW5jdGlvbiBtaW5BcmVhSGVhcCgpIHtcbiAgICB2YXIgaGVhcCA9IHt9LFxuICAgICAgICBhcnJheSA9IFtdLFxuICAgICAgICBzaXplID0gMDtcblxuICAgIGhlYXAucHVzaCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdXAoYXJyYXlbb2JqZWN0Ll8gPSBzaXplXSA9IG9iamVjdCwgc2l6ZSsrKTtcbiAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG5cbiAgICBoZWFwLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNpemUgPD0gMCkgcmV0dXJuO1xuICAgICAgdmFyIHJlbW92ZWQgPSBhcnJheVswXSwgb2JqZWN0O1xuICAgICAgaWYgKC0tc2l6ZSA+IDApIG9iamVjdCA9IGFycmF5W3NpemVdLCBkb3duKGFycmF5W29iamVjdC5fID0gMF0gPSBvYmplY3QsIDApO1xuICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfTtcblxuICAgIGhlYXAucmVtb3ZlID0gZnVuY3Rpb24ocmVtb3ZlZCkge1xuICAgICAgdmFyIGkgPSByZW1vdmVkLl8sIG9iamVjdDtcbiAgICAgIGlmIChhcnJheVtpXSAhPT0gcmVtb3ZlZCkgcmV0dXJuOyAvLyBpbnZhbGlkIHJlcXVlc3RcbiAgICAgIGlmIChpICE9PSAtLXNpemUpIG9iamVjdCA9IGFycmF5W3NpemVdLCAoY29tcGFyZUFyZWEob2JqZWN0LCByZW1vdmVkKSA8IDAgPyB1cCA6IGRvd24pKGFycmF5W29iamVjdC5fID0gaV0gPSBvYmplY3QsIGkpO1xuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHVwKG9iamVjdCwgaSkge1xuICAgICAgd2hpbGUgKGkgPiAwKSB7XG4gICAgICAgIHZhciBqID0gKChpICsgMSkgPj4gMSkgLSAxLFxuICAgICAgICAgICAgcGFyZW50ID0gYXJyYXlbal07XG4gICAgICAgIGlmIChjb21wYXJlQXJlYShvYmplY3QsIHBhcmVudCkgPj0gMCkgYnJlYWs7XG4gICAgICAgIGFycmF5W3BhcmVudC5fID0gaV0gPSBwYXJlbnQ7XG4gICAgICAgIGFycmF5W29iamVjdC5fID0gaSA9IGpdID0gb2JqZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvd24ob2JqZWN0LCBpKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgciA9IChpICsgMSkgPDwgMSxcbiAgICAgICAgICAgIGwgPSByIC0gMSxcbiAgICAgICAgICAgIGogPSBpLFxuICAgICAgICAgICAgY2hpbGQgPSBhcnJheVtqXTtcbiAgICAgICAgaWYgKGwgPCBzaXplICYmIGNvbXBhcmVBcmVhKGFycmF5W2xdLCBjaGlsZCkgPCAwKSBjaGlsZCA9IGFycmF5W2ogPSBsXTtcbiAgICAgICAgaWYgKHIgPCBzaXplICYmIGNvbXBhcmVBcmVhKGFycmF5W3JdLCBjaGlsZCkgPCAwKSBjaGlsZCA9IGFycmF5W2ogPSByXTtcbiAgICAgICAgaWYgKGogPT09IGkpIGJyZWFrO1xuICAgICAgICBhcnJheVtjaGlsZC5fID0gaV0gPSBjaGlsZDtcbiAgICAgICAgYXJyYXlbb2JqZWN0Ll8gPSBpID0gal0gPSBvYmplY3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYXA7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1BYnNvbHV0ZSh0cmFuc2Zvcm0pIHtcbiAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIG5vb3A7XG4gICAgdmFyIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICAgIGt5ID0gdHJhbnNmb3JtLnNjYWxlWzFdLFxuICAgICAgICBkeCA9IHRyYW5zZm9ybS50cmFuc2xhdGVbMF0sXG4gICAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocG9pbnQsIGkpIHtcbiAgICAgIGlmICghaSkgeDAgPSB5MCA9IDA7XG4gICAgICBwb2ludFswXSA9ICh4MCArPSBwb2ludFswXSkgKiBreCArIGR4O1xuICAgICAgcG9pbnRbMV0gPSAoeTAgKz0gcG9pbnRbMV0pICoga3kgKyBkeTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtUmVsYXRpdmUodHJhbnNmb3JtKSB7XG4gICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiBub29wO1xuICAgIHZhciB4MCxcbiAgICAgICAgeTAsXG4gICAgICAgIGt4ID0gdHJhbnNmb3JtLnNjYWxlWzBdLFxuICAgICAgICBreSA9IHRyYW5zZm9ybS5zY2FsZVsxXSxcbiAgICAgICAgZHggPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzBdLFxuICAgICAgICBkeSA9IHRyYW5zZm9ybS50cmFuc2xhdGVbMV07XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50LCBpKSB7XG4gICAgICBpZiAoIWkpIHgwID0geTAgPSAwO1xuICAgICAgdmFyIHgxID0gKHBvaW50WzBdIC0gZHgpIC8ga3ggfCAwLFxuICAgICAgICAgIHkxID0gKHBvaW50WzFdIC0gZHkpIC8ga3kgfCAwO1xuICAgICAgcG9pbnRbMF0gPSB4MSAtIHgwO1xuICAgICAgcG9pbnRbMV0gPSB5MSAtIHkwO1xuICAgICAgeDAgPSB4MTtcbiAgICAgIHkwID0geTE7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKHRvcG9qc29uKTtcbiAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSB0b3BvanNvbjtcbiAgZWxzZSB0aGlzLnRvcG9qc29uID0gdG9wb2pzb247XG59KCk7XG4iLCIndXNlIHN0cmljdCdcblxudmFyIGJpdHMgPSByZXF1aXJlKCdiaXQtdHdpZGRsZScpXG52YXIgZHVwID0gcmVxdWlyZSgnZHVwJylcblxuLy9MZWdhY3kgcG9vbCBzdXBwb3J0XG5pZighZ2xvYmFsLl9fVFlQRURBUlJBWV9QT09MKSB7XG4gIGdsb2JhbC5fX1RZUEVEQVJSQVlfUE9PTCA9IHtcbiAgICAgIFVJTlQ4ICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIFVJTlQxNiAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIFVJTlQzMiAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIElOVDggICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIElOVDE2ICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIElOVDMyICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIEZMT0FUICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIERPVUJMRSAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIERBVEEgICAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIFVJTlQ4QyAgOiBkdXAoWzMyLCAwXSlcbiAgICAsIEJVRkZFUiAgOiBkdXAoWzMyLCAwXSlcbiAgfVxufVxuXG52YXIgaGFzVWludDhDID0gKHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSkgIT09ICd1bmRlZmluZWQnXG52YXIgUE9PTCA9IGdsb2JhbC5fX1RZUEVEQVJSQVlfUE9PTFxuXG4vL1VwZ3JhZGUgcG9vbFxuaWYoIVBPT0wuVUlOVDhDKSB7XG4gIFBPT0wuVUlOVDhDID0gZHVwKFszMiwgMF0pXG59XG5pZighUE9PTC5CVUZGRVIpIHtcbiAgUE9PTC5CVUZGRVIgPSBkdXAoWzMyLCAwXSlcbn1cblxuLy9OZXcgdGVjaG5pcXVlOiBPbmx5IGFsbG9jYXRlIGZyb20gQXJyYXlCdWZmZXJWaWV3IGFuZCBCdWZmZXJcbnZhciBEQVRBICAgID0gUE9PTC5EQVRBXG4gICwgQlVGRkVSICA9IFBPT0wuQlVGRkVSXG5cbmV4cG9ydHMuZnJlZSA9IGZ1bmN0aW9uIGZyZWUoYXJyYXkpIHtcbiAgaWYoQnVmZmVyLmlzQnVmZmVyKGFycmF5KSkge1xuICAgIEJVRkZFUltiaXRzLmxvZzIoYXJyYXkubGVuZ3RoKV0ucHVzaChhcnJheSlcbiAgfSBlbHNlIHtcbiAgICBpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyYXkpICE9PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBhcnJheSA9IGFycmF5LmJ1ZmZlclxuICAgIH1cbiAgICBpZighYXJyYXkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgbiA9IGFycmF5Lmxlbmd0aCB8fCBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdmFyIGxvZ19uID0gYml0cy5sb2cyKG4pfDBcbiAgICBEQVRBW2xvZ19uXS5wdXNoKGFycmF5KVxuICB9XG59XG5cbmZ1bmN0aW9uIGZyZWVBcnJheUJ1ZmZlcihidWZmZXIpIHtcbiAgaWYoIWJ1ZmZlcikge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBuID0gYnVmZmVyLmxlbmd0aCB8fCBidWZmZXIuYnl0ZUxlbmd0aFxuICB2YXIgbG9nX24gPSBiaXRzLmxvZzIobilcbiAgREFUQVtsb2dfbl0ucHVzaChidWZmZXIpXG59XG5cbmZ1bmN0aW9uIGZyZWVUeXBlZEFycmF5KGFycmF5KSB7XG4gIGZyZWVBcnJheUJ1ZmZlcihhcnJheS5idWZmZXIpXG59XG5cbmV4cG9ydHMuZnJlZVVpbnQ4ID1cbmV4cG9ydHMuZnJlZVVpbnQxNiA9XG5leHBvcnRzLmZyZWVVaW50MzIgPVxuZXhwb3J0cy5mcmVlSW50OCA9XG5leHBvcnRzLmZyZWVJbnQxNiA9XG5leHBvcnRzLmZyZWVJbnQzMiA9XG5leHBvcnRzLmZyZWVGbG9hdDMyID0gXG5leHBvcnRzLmZyZWVGbG9hdCA9XG5leHBvcnRzLmZyZWVGbG9hdDY0ID0gXG5leHBvcnRzLmZyZWVEb3VibGUgPSBcbmV4cG9ydHMuZnJlZVVpbnQ4Q2xhbXBlZCA9IFxuZXhwb3J0cy5mcmVlRGF0YVZpZXcgPSBmcmVlVHlwZWRBcnJheVxuXG5leHBvcnRzLmZyZWVBcnJheUJ1ZmZlciA9IGZyZWVBcnJheUJ1ZmZlclxuXG5leHBvcnRzLmZyZWVCdWZmZXIgPSBmdW5jdGlvbiBmcmVlQnVmZmVyKGFycmF5KSB7XG4gIEJVRkZFUltiaXRzLmxvZzIoYXJyYXkubGVuZ3RoKV0ucHVzaChhcnJheSlcbn1cblxuZXhwb3J0cy5tYWxsb2MgPSBmdW5jdGlvbiBtYWxsb2MobiwgZHR5cGUpIHtcbiAgaWYoZHR5cGUgPT09IHVuZGVmaW5lZCB8fCBkdHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgIHJldHVybiBtYWxsb2NBcnJheUJ1ZmZlcihuKVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaChkdHlwZSkge1xuICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICByZXR1cm4gbWFsbG9jVWludDgobilcbiAgICAgIGNhc2UgJ3VpbnQxNic6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50MTYobilcbiAgICAgIGNhc2UgJ3VpbnQzMic6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50MzIobilcbiAgICAgIGNhc2UgJ2ludDgnOlxuICAgICAgICByZXR1cm4gbWFsbG9jSW50OChuKVxuICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICByZXR1cm4gbWFsbG9jSW50MTYobilcbiAgICAgIGNhc2UgJ2ludDMyJzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY0ludDMyKG4pXG4gICAgICBjYXNlICdmbG9hdCc6XG4gICAgICBjYXNlICdmbG9hdDMyJzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY0Zsb2F0KG4pXG4gICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgY2FzZSAnZmxvYXQ2NCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NEb3VibGUobilcbiAgICAgIGNhc2UgJ3VpbnQ4X2NsYW1wZWQnOlxuICAgICAgICByZXR1cm4gbWFsbG9jVWludDhDbGFtcGVkKG4pXG4gICAgICBjYXNlICdidWZmZXInOlxuICAgICAgICByZXR1cm4gbWFsbG9jQnVmZmVyKG4pXG4gICAgICBjYXNlICdkYXRhJzpcbiAgICAgIGNhc2UgJ2RhdGF2aWV3JzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY0RhdGFWaWV3KG4pXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG1hbGxvY0FycmF5QnVmZmVyKG4pIHtcbiAgdmFyIG4gPSBiaXRzLm5leHRQb3cyKG4pXG4gIHZhciBsb2dfbiA9IGJpdHMubG9nMihuKVxuICB2YXIgZCA9IERBVEFbbG9nX25dXG4gIGlmKGQubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkLnBvcCgpXG4gIH1cbiAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcihuKVxufVxuZXhwb3J0cy5tYWxsb2NBcnJheUJ1ZmZlciA9IG1hbGxvY0FycmF5QnVmZmVyXG5cbmZ1bmN0aW9uIG1hbGxvY1VpbnQ4KG4pIHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NVaW50OCA9IG1hbGxvY1VpbnQ4XG5cbmZ1bmN0aW9uIG1hbGxvY1VpbnQxNihuKSB7XG4gIHJldHVybiBuZXcgVWludDE2QXJyYXkobWFsbG9jQXJyYXlCdWZmZXIoMipuKSwgMCwgbilcbn1cbmV4cG9ydHMubWFsbG9jVWludDE2ID0gbWFsbG9jVWludDE2XG5cbmZ1bmN0aW9uIG1hbGxvY1VpbnQzMihuKSB7XG4gIHJldHVybiBuZXcgVWludDMyQXJyYXkobWFsbG9jQXJyYXlCdWZmZXIoNCpuKSwgMCwgbilcbn1cbmV4cG9ydHMubWFsbG9jVWludDMyID0gbWFsbG9jVWludDMyXG5cbmZ1bmN0aW9uIG1hbGxvY0ludDgobikge1xuICByZXR1cm4gbmV3IEludDhBcnJheShtYWxsb2NBcnJheUJ1ZmZlcihuKSwgMCwgbilcbn1cbmV4cG9ydHMubWFsbG9jSW50OCA9IG1hbGxvY0ludDhcblxuZnVuY3Rpb24gbWFsbG9jSW50MTYobikge1xuICByZXR1cm4gbmV3IEludDE2QXJyYXkobWFsbG9jQXJyYXlCdWZmZXIoMipuKSwgMCwgbilcbn1cbmV4cG9ydHMubWFsbG9jSW50MTYgPSBtYWxsb2NJbnQxNlxuXG5mdW5jdGlvbiBtYWxsb2NJbnQzMihuKSB7XG4gIHJldHVybiBuZXcgSW50MzJBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig0Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NJbnQzMiA9IG1hbGxvY0ludDMyXG5cbmZ1bmN0aW9uIG1hbGxvY0Zsb2F0KG4pIHtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkobWFsbG9jQXJyYXlCdWZmZXIoNCpuKSwgMCwgbilcbn1cbmV4cG9ydHMubWFsbG9jRmxvYXQzMiA9IGV4cG9ydHMubWFsbG9jRmxvYXQgPSBtYWxsb2NGbG9hdFxuXG5mdW5jdGlvbiBtYWxsb2NEb3VibGUobikge1xuICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig4Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NGbG9hdDY0ID0gZXhwb3J0cy5tYWxsb2NEb3VibGUgPSBtYWxsb2NEb3VibGVcblxuZnVuY3Rpb24gbWFsbG9jVWludDhDbGFtcGVkKG4pIHtcbiAgaWYoaGFzVWludDhDKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShtYWxsb2NBcnJheUJ1ZmZlcihuKSwgMCwgbilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWFsbG9jVWludDgobilcbiAgfVxufVxuZXhwb3J0cy5tYWxsb2NVaW50OENsYW1wZWQgPSBtYWxsb2NVaW50OENsYW1wZWRcblxuZnVuY3Rpb24gbWFsbG9jRGF0YVZpZXcobikge1xuICByZXR1cm4gbmV3IERhdGFWaWV3KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NEYXRhVmlldyA9IG1hbGxvY0RhdGFWaWV3XG5cbmZ1bmN0aW9uIG1hbGxvY0J1ZmZlcihuKSB7XG4gIG4gPSBiaXRzLm5leHRQb3cyKG4pXG4gIHZhciBsb2dfbiA9IGJpdHMubG9nMihuKVxuICB2YXIgY2FjaGUgPSBCVUZGRVJbbG9nX25dXG4gIGlmKGNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gY2FjaGUucG9wKClcbiAgfVxuICByZXR1cm4gbmV3IEJ1ZmZlcihuKVxufVxuZXhwb3J0cy5tYWxsb2NCdWZmZXIgPSBtYWxsb2NCdWZmZXJcblxuZXhwb3J0cy5jbGVhckNhY2hlID0gZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgZm9yKHZhciBpPTA7IGk8MzI7ICsraSkge1xuICAgIFBPT0wuVUlOVDhbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuVUlOVDE2W2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLlVJTlQzMltpXS5sZW5ndGggPSAwXG4gICAgUE9PTC5JTlQ4W2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLklOVDE2W2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLklOVDMyW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLkZMT0FUW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLkRPVUJMRVtpXS5sZW5ndGggPSAwXG4gICAgUE9PTC5VSU5UOENbaV0ubGVuZ3RoID0gMFxuICAgIERBVEFbaV0ubGVuZ3RoID0gMFxuICAgIEJVRkZFUltpXS5sZW5ndGggPSAwXG4gIH1cbn0iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5faWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBjb29yZHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXVswXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgICAgICB0eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjb25zdCB0aWxlX2JvdW5kcyA9IFtcbiAgICB7IHg6IDAsIHk6IDB9LFxuICAgIHsgeDogR2VvLnRpbGVfc2NhbGUsIHk6IC1HZW8udGlsZV9zY2FsZSB9IC8vIFRPRE86IGNvcnJlY3QgZm9yIGZsaXBwZWQgeS1heGlzP1xuXTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfdXZzID0gWzAsIDAsIDEsIDFdO1xuXG4vLyBUZXN0cyBpZiBhIGxpbmUgc2VnbWVudCAoZnJvbSBwb2ludCBBIHRvIEIpIGlzIG91dHNpZGUgdGhlIHRpbGUgYm91bmRzXG4vLyAod2l0aGluIGEgY2VydGFpbiB0b2xlcmFuY2UgdG8gYWNjb3VudCBmb3IgZ2VvbWV0cnkgbmVhcmx5IG9uIHRpbGUgZWRnZXMpXG5leHBvcnQgZnVuY3Rpb24gb3V0c2lkZVRpbGUgKF9hLCBfYiwgdG9sZXJhbmNlKSB7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICAvLyBUT0RPOiBmaXggZmxpcHBlZCBZIGNvb3JkcyBoZXJlLCBjb25mdXNpbmcgd2l0aCAnbWF4JyByZWZlcmVuY2VcbiAgICBpZiAoKF9hWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgJiYgX2JbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgJiYgX2JbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgJiYgX2JbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UgJiYgX2JbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb29yZE91dHNpZGVUaWxlIChjb29yZCwgdG9sZXJhbmNlKSB7XG4gICAgdG9sZXJhbmNlID0gdG9sZXJhbmNlIHx8IDA7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICByZXR1cm4gY29vcmRbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZTtcbn1cbiIsIi8vIFBvaW50IGJ1aWxkZXJzXG5pbXBvcnQgeyBkZWZhdWx0X3V2cyB9IGZyb20gJy4vY29tbW9uJztcblxuLy8gQnVpbGQgYSBiaWxsYm9hcmQgc3ByaXRlIHF1YWQgY2VudGVyZWQgb24gYSBwb2ludC4gU3ByaXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgZHJhd24gaW4gc2NyZWVuc3BhY2UsIGFuZCBoYXZlXG4vLyBwcm9wZXJ0aWVzIGZvciB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgYW5kIGEgc2NhbGUgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgdGhlIHNjcmVlbnNwYWNlIHNpemVcbi8vIG9mIGEgc3ByaXRlIGJldHdlZW4gdHdvIHpvb20gbGV2ZWxzLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUXVhZHNGb3JQb2ludHMgKHBvaW50cywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCBwb3NpdGlvbl9pbmRleCwgc2hhcGVfaW5kZXgsIG9mZnNldF9pbmRleCB9LFxuICAgIHsgcXVhZCwgcXVhZF9ub3JtYWxpemUsIG9mZnNldCwgYW5nbGUsIHNoYXBlX3csIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuICAgIHF1YWRfbm9ybWFsaXplID0gcXVhZF9ub3JtYWxpemUgfHwgMTtcbiAgICBsZXQgdzIgPSBxdWFkWzBdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBoMiA9IHF1YWRbMV0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IHNjYWxpbmcgPSBbXG4gICAgICAgIFstdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgLWgyXSxcbiAgICAgICAgW3cyLCBoMl0sXG4gICAgICAgIFstdzIsIGgyXVxuICAgIF07XG5cbiAgICBsZXQgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIGxldCBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGxldCB0ZXhjb29yZHM7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuXG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgbGV0IG51bV9wb2ludHMgPSBwb2ludHMubGVuZ3RoO1xuICAgIGZvciAobGV0IHA9MDsgcCA8IG51bV9wb2ludHM7IHArKykge1xuICAgICAgICBsZXQgcG9pbnQgPSBwb2ludHNbcF07XG5cbiAgICAgICAgZm9yIChsZXQgcG9zPTA7IHBvcyA8IDQ7IHBvcysrKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGV4Y29vcmRzXG4gICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1twb3NdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3Bvc11bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDBdID0gcG9pbnRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAxXSA9IHBvaW50WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAwXSA9IHNjYWxpbmdbcG9zXVswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDFdID0gc2NhbGluZ1twb3NdWzFdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMl0gPSBhbmdsZTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDNdID0gc2hhcGVfdztcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDBdID0gb2Zmc2V0WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDFdID0gb2Zmc2V0WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICB9XG59XG4iLCIvLyBQb2x5Z29uIGJ1aWxkZXJzXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgeyBkZWZhdWx0X3V2cywgb3V0c2lkZVRpbGUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcblxuY29uc3QgdXBfdmVjMyA9IFswLCAwLCAxXTtcblxuLy8gVGVzc2VsYXRlIGEgZmxhdCAyRCBwb2x5Z29uXG4vLyB4ICYgeSBjb29yZGluYXRlcyB3aWxsIGJlIHNldCBhcyBmaXJzdCB0d28gZWxlbWVudHMgb2YgcHJvdmlkZWQgdmVydGV4X3RlbXBsYXRlXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICAvLyBGaW5kIHBvbHlnb24gZXh0ZW50cyB0byBjYWxjdWxhdGUgVVZzLCBmaXQgdGhlbSB0byB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxuICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldID0gR2VvLmZpbmRCb3VuZGluZ0JveChwb2x5Z29uKTtcbiAgICAgICAgICAgIHZhciBzcGFuX3ggPSBtYXhfeCAtIG1pbl94O1xuICAgICAgICAgICAgdmFyIHNwYW5feSA9IG1heF95IC0gbWluX3k7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdSA9IChtYXhfdSAtIG1pbl91KSAvIHNwYW5feDtcbiAgICAgICAgICAgIHZhciBzY2FsZV92ID0gKG1heF92IC0gbWluX3YpIC8gc3Bhbl95O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcmluZ19pbmRleCA9IDA7IHJpbmdfaW5kZXggPCBwb2x5Z29uLmxlbmd0aDsgcmluZ19pbmRleCsrKXtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggZGF0YVxuICAgICAgICAgICAgdmFyIHBvbHlnb25fcmluZyA9IHBvbHlnb25bcmluZ19pbmRleF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25fcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBwb2x5Z29uX3JpbmdbaV07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBVVnNcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSAoKHZlcnRleFswXSAtIG1pbl94KSAqIHNjYWxlX3UgKyBtaW5fdSkgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gKCh2ZXJ0ZXhbMV0gLSBtaW5feSkgKiBzY2FsZV92ICsgbWluX3YpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRyaWFuZ3VsYXRlUG9seWdvbihlYXJjdXQuZmxhdHRlbihwb2x5Z29uKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIGluZGljZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUZXNzZWxhdGUgYW5kIGV4dHJ1ZGUgYSBmbGF0IDJEIHBvbHlnb24gaW50byBhIHNpbXBsZSAzRCBtb2RlbCB3aXRoIGZpeGVkIGhlaWdodCBhbmQgYWRkIHRvIEdMIHZlcnRleCBidWZmZXJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4dHJ1ZGVkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHosIGhlaWdodCwgbWluX2hlaWdodCxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIG5vcm1hbF9pbmRleCxcbiAgICBub3JtYWxfbm9ybWFsaXplLFxuICAgIHtcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICB3aW5kaW5nXG4gICAgfSkge1xuXG4gICAgLy8gVG9wXG4gICAgdmFyIG1pbl96ID0geiArIChtaW5faGVpZ2h0IHx8IDApO1xuICAgIHZhciBtYXhfeiA9IHogKyBoZWlnaHQ7XG4gICAgdmVydGV4X3RlbXBsYXRlWzJdID0gbWF4X3o7XG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSwgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KTtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgLy8gV2FsbHNcbiAgICAvLyBGaXQgVVZzIHRvIHdhbGwgcXVhZFxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIGZvciAodmFyIHE9MDsgcSA8IHBvbHlnb24ubGVuZ3RoOyBxKyspIHtcbiAgICAgICAgICAgIHZhciBjb250b3VyID0gcG9seWdvbltxXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgdz0wOyB3IDwgY29udG91ci5sZW5ndGggLSAxOyB3KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29udG91clt3XSwgY29udG91clt3KzFdLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgZXh0cnVkZSB0aWxlIGVkZ2VzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV2FsbCBvcmRlciBpcyBkZXBlbmRlbnQgb24gd2luZGluZyBvcmRlciwgc28gdGhhdCBub3JtYWxzIGZhY2Ugb3V0d2FyZFxuICAgICAgICAgICAgICAgIGxldCB3MCwgdzE7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRpbmcgPT09ICdDQ1cnKSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdztcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3KzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHcrMTtcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFR3byB0cmlhbmdsZXMgZm9yIHRoZSBxdWFkIGZvcm1lZCBieSBlYWNoIHZlcnRleCBwYWlyLCBnb2luZyBmcm9tIGJvdHRvbSB0byB0b3AgaGVpZ2h0XG4gICAgICAgICAgICAgICAgdmFyIHdhbGxfdmVydGljZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1heF96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1heF96XVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjIHRoZSBub3JtYWwgb2YgdGhlIHdhbGwgZnJvbSB1cCB2ZWN0b3IgYW5kIG9uZSBzZWdtZW50IG9mIHRoZSB3YWxsIHRyaWFuZ2xlc1xuICAgICAgICAgICAgICAgIGxldCB3YWxsX3ZlYyA9IFZlY3Rvci5ub3JtYWxpemUoW2NvbnRvdXJbdzFdWzBdIC0gY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzFdWzFdIC0gY29udG91clt3MF1bMV0sIDBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsID0gVmVjdG9yLmNyb3NzKHVwX3ZlYzMsIHdhbGxfdmVjKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2ZXJ0ZXggdGVtcGxhdGUgd2l0aCBjdXJyZW50IHN1cmZhY2Ugbm9ybWFsXG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDBdID0gbm9ybWFsWzBdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMV0gPSBub3JtYWxbMV0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAyXSA9IG5vcm1hbFsyXSAqIG5vcm1hbF9ub3JtYWxpemU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3dj0wOyB3diA8IHdhbGxfdmVydGljZXMubGVuZ3RoOyB3disrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHdhbGxfdmVydGljZXNbd3ZdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzJdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMl07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1t3dl1bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1t3dl1bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRyaWFuZ3VsYXRpb24gdXNpbmcgZWFyY3V0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dFxuZXhwb3J0IGZ1bmN0aW9uIHRyaWFuZ3VsYXRlUG9seWdvbiAoZGF0YSkge1xuICAgIHJldHVybiBlYXJjdXQoZGF0YS52ZXJ0aWNlcywgZGF0YS5ob2xlcywgZGF0YS5kaW1lbnNpb25zKTtcbn1cbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuXG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQge291dHNpZGVUaWxlLCBpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4vY29tbW9uJztcblxuY29uc3QgemVyb192ZWMyID0gWzAsIDBdO1xuXG4vLyBCdWlsZCB0ZXNzZWxsYXRlZCB0cmlhbmdsZXMgZm9yIGEgcG9seWxpbmVcbmNvbnN0IENBUF9UWVBFID0ge1xuICAgIGJ1dHQ6IDAsXG4gICAgc3F1YXJlOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBKT0lOX1RZUEUgPSB7XG4gICAgbWl0ZXI6IDAsXG4gICAgYmV2ZWw6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IERFRkFVTFQgPSB7XG4gICAgTUlURVJfTElNSVQ6IDMsXG4gICAgVEVYQ09PUkRfTk9STUFMSVpFOiAxLFxuICAgIFRFWENPT1JEX1JBVElPOiAxLFxuICAgIE1JTl9GQU5fV0lEVEg6IDUgICAgICAgIC8vIFdpZHRoIG9mIGxpbmUgaW4gdGlsZSB1bml0cyB0byBwbGFjZSAxIHRyaWFuZ2xlIHBlciBmYW5cbn07XG5cbi8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuY29uc3Qgdl9zY2FsZV9hZGp1c3QgPSBHZW8udGlsZV9zY2FsZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWxpbmVzIChsaW5lcywgd2lkdGgsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX3JhdGlvLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICBqb2luLCBjYXAsXG4gICAgICAgIG1pdGVyX2xpbWl0XG4gICAgfSkge1xuXG4gICAgdmFyIGNhcF90eXBlID0gY2FwID8gQ0FQX1RZUEVbY2FwXSA6IENBUF9UWVBFLmJ1dHQ7XG4gICAgdmFyIGpvaW5fdHlwZSA9IGpvaW4gPyBKT0lOX1RZUEVbam9pbl0gOiBKT0lOX1RZUEUubWl0ZXI7XG5cbiAgICAvLyBDb25maWd1cmUgbWl0ZXIgbGltaXRcbiAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgbWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdCB8fCBERUZBVUxULk1JVEVSX0xJTUlUOyAvLyBkZWZhdWx0IG1pdGVyIGxpbWl0XG4gICAgICAgIHZhciBtaXRlcl9sZW5fc3EgPSBtaXRlcl9saW1pdCAqIG1pdGVyX2xpbWl0O1xuICAgIH1cblxuICAgIC8vIFRleHR1cmUgVmFyaWFibGVzXG4gICAgdmFyIHZfc2NhbGU7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCBERUZBVUxULlRFWENPT1JEX05PUk1BTElaRTtcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8gPSB0ZXhjb29yZF9yYXRpbyB8fCBERUZBVUxULlRFWENPT1JEX1JBVElPO1xuICAgICAgICB2X3NjYWxlID0gMSAvICh0ZXhjb29yZF93aWR0aCAqIHRleGNvb3JkX3JhdGlvICogdl9zY2FsZV9hZGp1c3QpOyAvLyBzY2FsZXMgbGluZSB0ZXh0dXJlIGFzIGEgcmF0aW8gb2YgdGhlIGxpbmUncyB3aWR0aFxuICAgIH1cblxuICAgIC8vIFZhbHVlcyB0aGF0IGFyZSBjb25zdGFudCBmb3IgZWFjaCBsaW5lIGFuZCBhcmUgcGFzc2VkIHRvIGhlbHBlciBmdW5jdGlvbnNcbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICBtaXRlcl9sZW5fc3EsXG4gICAgICAgIGpvaW5fdHlwZSxcbiAgICAgICAgY2FwX3R5cGUsXG4gICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgIGhhbGZfd2lkdGg6IHdpZHRoIC8gMixcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIHZfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplXG4gICAgfTtcblxuICAgIC8vIEJ1ZmZlciBmb3IgZXh0cmEgbGluZXMgdG8gcHJvY2Vzc1xuICAgIHZhciBleHRyYV9saW5lcyA9IFtdO1xuXG4gICAgLy8gUHJvY2VzcyBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShsaW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV4dHJhIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4dHJhX2xpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGV4dHJhX2xpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2x5bGluZShsaW5lLCBjb250ZXh0LCBleHRyYV9saW5lcyl7XG4gICAgLy8gU2tpcCBpZiBsaW5lIGlzIG5vdCB2YWxpZFxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjb29yZEN1cnIsIGNvb3JkTmV4dCwgbm9ybVByZXYsIG5vcm1OZXh0O1xuICAgIHZhciB7am9pbl90eXBlLCBjYXBfdHlwZSwgY2xvc2VkX3BvbHlnb24sIHJlbW92ZV90aWxlX2VkZ2VzLCB0aWxlX2VkZ2VfdG9sZXJhbmNlLCB2X3NjYWxlLCBtaXRlcl9sZW5fc3F9ID0gY29udGV4dDtcbiAgICB2YXIgdiA9IDA7IC8vIFRleHR1cmUgdi1jb29yZGluYXRlXG5cbiAgICAvLyBMb29wIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgdG8gYSB0aWxlIGJvdW5kYXJ5IGlmIGZvdW5kXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uICYmIGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIHZhciBib3VuZGFyeUluZGV4ID0gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSk7XG4gICAgICAgIGlmIChib3VuZGFyeUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGxpbmUgdGhhdCBpcyBhIGN5Y2xpYyBwZXJtdXRhdGlvbiBvZiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIHZhciBwZXJtdXRlZExpbmUgPSBwZXJtdXRlTGluZShsaW5lLCBib3VuZGFyeUluZGV4KTtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gocGVybXV0ZWRMaW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZJUlNUIFBPSU5UXG4gICAgY29vcmRDdXJyID0gbGluZVswXTtcbiAgICBjb29yZE5leHQgPSBsaW5lWzFdO1xuXG4gICAgLy8gSWYgZmlyc3QgcGFpciBvZiBwb2ludHMgaXMgcmVkdW5kYW50LCBzbGljZSBhbmQgcHVzaCB0byB0aGUgbGluZXMgYXJyYXlcbiAgICBpZiAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobGluZS5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgLy8gU2tpcCB0aWxlIGJvdW5kYXJ5IGxpbmVzIGFuZCBhcHBlbmQgYSBuZXcgbGluZSBpZiBuZWVkZWRcbiAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgIHZhciBub25Cb3VuZGFyeVNlZ21lbnQgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIDAsIHRpbGVfZWRnZV90b2xlcmFuY2UpO1xuICAgICAgICBpZiAobm9uQm91bmRhcnlTZWdtZW50KSB7XG4gICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKG5vbkJvdW5kYXJ5U2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjbG9zZWRfcG9seWdvbil7XG4gICAgICAgIC8vIEJlZ2luIHRoZSBwb2x5Z29uIHdpdGggYSBqb2luIChjb25uZWN0aW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cylcbiAgICAgICAgbm9ybVByZXYgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGxpbmVbbGluZS5sZW5ndGggLSAyXSwgY29vcmRDdXJyKSk7XG4gICAgICAgIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIGxpbmUgYmVnaW5zIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtTmV4dCwgY2FwX3R5cGUsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGNhcF90eXBlICE9PSBDQVBfVFlQRS5idXR0KSB7XG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiB2X3NjYWxlICogY29udGV4dC50ZXhjb29yZF93aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBmaXJzdCBwYWlyIG9mIHBvaW50cyBmb3IgdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIElOVEVSTUVESUFSWSBQT0lOVFNcbiAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJySW5kZXggPSBpO1xuICAgICAgICB2YXIgbmV4dEluZGV4ID0gaSArIDE7XG4gICAgICAgIGNvb3JkQ3VyciA9IGxpbmVbY3VyckluZGV4XTtcbiAgICAgICAgY29vcmROZXh0ID0gbGluZVtuZXh0SW5kZXhdO1xuXG4gICAgICAgIC8vIFNraXAgcmVkdW5kYW50IHZlcnRpY2VzXG4gICAgICAgIGlmIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGUgYm91bmRhcmllc1xuICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgdmFyIG5vbkJvdW5kYXJ5TGluZXMgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIGN1cnJJbmRleCArIDEsIHRpbGVfZWRnZV90b2xlcmFuY2UpO1xuICAgICAgICAgICAgaWYgKG5vbkJvdW5kYXJ5TGluZXMpIHtcbiAgICAgICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKG5vbkJvdW5kYXJ5TGluZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9ybVByZXYgPSBub3JtTmV4dDtcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgY29vcmROZXh0KSk7XG5cbiAgICAgICAgLy8gQWRkIGpvaW5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRNaXRlcih2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgbWl0ZXJfbGVuX3NxLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIH1cblxuICAgIC8vIExBU1QgUE9JTlRcbiAgICBjb29yZEN1cnIgPSBjb29yZE5leHQ7XG4gICAgbm9ybVByZXYgPSBub3JtTmV4dDtcblxuICAgIGlmIChjbG9zZWRfcG9seWdvbikge1xuICAgICAgICAvLyBDbG9zZSB0aGUgcG9seWdvbiB3aXRoIGEgbWl0ZXIgam9pbnQgb3IgYnV0dCBjYXAgaWYgb24gYSB0aWxlIGJvdW5kYXJ5XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGxpbmVbMV0pKTtcbiAgICAgICAgZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEZpbmlzaCB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gSWYgbGluZSBlbmRzIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtUHJldiwgY2FwX3R5cGUsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSl7XG4gICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShsaW5lWzBdKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBiYWNrSW5kZXggPSAwOyBiYWNrSW5kZXggPCBsaW5lLmxlbmd0aDsgYmFja0luZGV4KyspIHtcbiAgICAgICAgdmFyIGNvb3JkQ3VyciA9IGxpbmVbbGluZS5sZW5ndGggLSAxIC0gYmFja0luZGV4XTtcbiAgICAgICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGggLSAxIC0gYmFja0luZGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cbi8vIEl0ZXJhdGUgdGhyb3VnaCBsaW5lIGZyb20gc3RhcnRJbmRleCB0byBmaW5kIGEgc2VnbWVudCBub3Qgb24gYSB0aWxlIGJvdW5kYXJ5LCBpZiBhbnkuXG5mdW5jdGlvbiBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50IChsaW5lLCBzdGFydEluZGV4LCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuICAgIHdoaWxlIChsaW5lW2VuZEluZGV4ICsgMV0gJiYgb3V0c2lkZVRpbGUobGluZVtlbmRJbmRleF0sIGxpbmVbZW5kSW5kZXggKyAxXSwgdG9sZXJhbmNlKSkge1xuICAgICAgICBlbmRJbmRleCsrO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGEgbGluZSBzZWdtZW50IHJlbWFpbmluZyB0aGF0IGlzIHdpdGhpbiB0aGUgdGlsZSwgcHVzaCBpdCB0byB0aGUgbGluZXMgYXJyYXlcbiAgICByZXR1cm4gKGxpbmUubGVuZ3RoIC0gZW5kSW5kZXggPj0gMikgPyBsaW5lLnNsaWNlKGVuZEluZGV4KSA6IGZhbHNlO1xufVxuXG4vLyBCZWdpbiBhIHBvbHlnb24gd2l0aCBhIGpvaW4gY29ubmVjdGluZyB0byB0aGUgbGFzdCBzZWdtZW50IChpZiB2YWxpZCBqb2luLXR5cGUgc3BlY2lmaWVkKVxuZnVuY3Rpb24gc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpe1xuICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChqb2luX3R5cGUgPT09IHVuZGVmaW5lZCB8fCBpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIDBdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCAwXSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyB3aXRoaW4gYSB0aWxlLCBhZGQgYSBqb2luXG4gICAgICAgIHZhciB2ID0gMDtcbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRNaXRlcih2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgY29udGV4dC5taXRlcl9sZW5fc3EsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gRW5kIGEgcG9seWdvbiBhcHByb3ByaWF0ZWx5XG5mdW5jdGlvbiBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpIHtcbiAgICAvLyBJZiBwb2x5Z29uIGVuZHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gZW5kcyB3aXRoaW4gYSB0aWxlLCBhZGQgTWl0ZXIgb3Igbm8gam9pbnQgKGpvaW4gYWRkZWQgb24gc3RhcnRQb2x5Z29uKVxuICAgICAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlciAmJiBWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gY29udGV4dC5taXRlcl9sZW5fc3EpIHtcbiAgICAgICAgICAgIGpvaW5fdHlwZSA9IEpPSU5fVFlQRS5iZXZlbDsgLy8gc3dpdGNoIHRvIGJldmVsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLmFkZChub3JtUHJldiwgbm9ybU5leHQpKTtcbiAgICB2YXIgc2NhbGUgPSAyIC8gKDEgKyBNYXRoLmFicyhWZWN0b3IuZG90KG5vcm1QcmV2LCBtaXRlclZlYykpKTtcbiAgICByZXR1cm4gVmVjdG9yLm11bHQobWl0ZXJWZWMsIHNjYWxlICogc2NhbGUpO1xufVxuXG4vLyBBZGQgYSBtaXRlciB2ZWN0b3Igb3IgYSBqb2luIGlmIHRoZSBtaXRlciBpcyB0b28gc2hhcnBcbmZ1bmN0aW9uIGFkZE1pdGVyICh2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgbWl0ZXJfbGVuX3NxLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAvLyAgTWl0ZXIgbGltaXQ6IGlmIG1pdGVyIGpvaW4gaXMgdG9vIHNoYXJwLCBjb252ZXJ0IHRvIGJldmVsIGluc3RlYWRcbiAgICBpZiAoVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IG1pdGVyX2xlbl9zcSkge1xuICAgICAgICBhZGRKb2luKEpPSU5fVFlQRS5taXRlciwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQWRkIGEgYmV2ZWwgb3Igcm91bmQgam9pblxuZnVuY3Rpb24gYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG4gICAgdmFyIGlzQ2xvY2t3aXNlID0gKG5vcm1OZXh0WzBdICogbm9ybVByZXZbMV0gLSBub3JtTmV4dFsxXSAqIG5vcm1QcmV2WzBdID4gMCk7XG5cbiAgICBpZiAoaXNDbG9ja3dpc2Upe1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5uZWcobm9ybVByZXYpLCBtaXRlclZlYywgVmVjdG9yLm5lZyhub3JtTmV4dCksXG4gICAgICAgICAgICAgICAgWzAsIHZdLCBbMSwgdl0sIFswLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5uZWcobm9ybVByZXYpLCBtaXRlclZlYywgVmVjdG9yLm5lZyhub3JtTmV4dCksXG4gICAgICAgICAgICAgICAgWzAsIHZdLCBbMSwgdl0sIFswLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgbm9ybVByZXYsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBub3JtTmV4dCxcbiAgICAgICAgICAgICAgICBbMSwgdl0sIFswLCB2XSwgWzEsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgbm9ybVByZXYsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBub3JtTmV4dCxcbiAgICAgICAgICAgICAgICBbMSwgdl0sIFswLCB2XSwgWzEsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbn1cblxuLy8gQWRkIGluZGljZXMgdG8gdmVydGV4X2VsZW1lbnRzXG5mdW5jdGlvbiBpbmRleFBhaXJzKG51bV9wYWlycywgY29udGV4dCl7XG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBudW1fdmVydGljZXMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgb2Zmc2V0ID0gbnVtX3ZlcnRpY2VzIC0gMiAqIG51bV9wYWlycyAtIDI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9wYWlyczsgaSsrKXtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAzKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAxKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFZlcnRleChjb29yZGluYXRlLCBub3JtYWwsIHV2LCBjb250ZXh0KSB7XG4gICAgdmFyIHZlcnRleF90ZW1wbGF0ZSA9IGNvbnRleHQudmVydGV4X3RlbXBsYXRlO1xuICAgIHZhciB2ZXJ0ZXhfZGF0YSA9IGNvbnRleHQudmVydGV4X2RhdGE7XG5cbiAgICBidWlsZFZlcnRleFRlbXBsYXRlKHZlcnRleF90ZW1wbGF0ZSwgY29vcmRpbmF0ZSwgdXYsIG5vcm1hbCwgY29udGV4dCk7XG4gICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmVydGV4VGVtcGxhdGUgKHZlcnRleF90ZW1wbGF0ZSwgdmVydGV4LCB0ZXh0dXJlX2Nvb3JkLCBzY2FsZSwgY29udGV4dCkge1xuICAgIC8vIHNldCB2ZXJ0ZXggcG9zaXRpb25cbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB2ZXJ0ZXhbMF07XG4gICAgdmVydGV4X3RlbXBsYXRlWzFdID0gdmVydGV4WzFdO1xuXG4gICAgLy8gc2V0IFVWc1xuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICYmIHRleHR1cmVfY29vcmQpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQudGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleHR1cmVfY29vcmRbMF0gKiBjb250ZXh0LnRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQudGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleHR1cmVfY29vcmRbMV0gKiBjb250ZXh0LnRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICB9XG5cbiAgICAvLyBzZXQgU2NhbGluZyB2ZXJ0ZXggKFgsIFkgbm9ybWFsIGRpcmVjdGlvbiArIFogaGFsZl93aWR0aCBhcyBhdHRyaWJ1dGUpXG4gICAgaWYgKGNvbnRleHQuc2NhbGluZ19pbmRleCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMF0gPSBzY2FsZVswXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAxXSA9IHNjYWxlWzFdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDJdID0gY29udGV4dC5oYWxmX3dpZHRoO1xuICAgIH1cbn1cblxuLy8gIFRlc3NhbGF0ZSBhIEZBTiBnZW9tZXRyeSBiZXR3ZWVuIHBvaW50cyBBICAgICAgIEJcbi8vICB1c2luZyB0aGVpciBub3JtYWxzIGZyb20gYSBjZW50ZXIgICAgICAgIFxcIC4gLiAvXG4vLyAgYW5kIGludGVycG9sYXRpbmcgdGhlaXIgVVZzICAgICAgICAgICAgICAgXFwgcCAvXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcLi9cbmZ1bmN0aW9uIGFkZEZhbiAoY29vcmQsIG5BLCBuQywgbkIsIHV2QSwgdXZDLCB1dkIsIGlzQ2FwLCBjb250ZXh0KSB7XG4gICAgdmFyIGNyb3NzID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF07XG4gICAgdmFyIGRvdCA9IFZlY3Rvci5kb3QobkEsIG5CKTtcblxuICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoY3Jvc3MsIGRvdCk7XG4gICAgd2hpbGUgKGFuZ2xlID49IE1hdGguUEkpIHtcbiAgICAgICAgYW5nbGUgLT0gMipNYXRoLlBJO1xuICAgIH1cblxuICAgIHZhciBudW1UcmlhbmdsZXMgPSB0cmlhbmdsZXNQZXJBcmMoYW5nbGUsIGNvbnRleHQuaGFsZl93aWR0aCk7XG4gICAgaWYgKG51bVRyaWFuZ2xlcyA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQywgdXZDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1dkEsIGNvbnRleHQpO1xuXG4gICAgdmFyIGJsYWRlID0gbkE7XG5cbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciB1dkN1cnI7XG4gICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICB1dkN1cnIgPSBbXTtcbiAgICAgICAgICAgIHZhciBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnN1Yih1dkEsIHV2Qyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3Iuc2V0KHV2QSk7XG4gICAgICAgICAgICB2YXIgdXZfZGVsdGEgPSBWZWN0b3IuZGl2KFZlY3Rvci5zdWIodXZCLCB1dkEpLCBudW1UcmlhbmdsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFuZ2xlX3N0ZXAgPSBhbmdsZSAvIG51bVRyaWFuZ2xlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRyaWFuZ2xlczsgaSsrKSB7XG4gICAgICAgIGJsYWRlID0gVmVjdG9yLnJvdChibGFkZSwgYW5nbGVfc3RlcCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcInRocm91Z2hcIiB0aGUgY2FwXG4gICAgICAgICAgICAgICAgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5yb3QoYWZmaW5lX3V2Q3VyciwgYW5nbGVfc3RlcCk7XG4gICAgICAgICAgICAgICAgdXZDdXJyWzBdID0gYWZmaW5lX3V2Q3VyclswXSArIHV2Q1swXTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMV0gPSBhZmZpbmVfdXZDdXJyWzFdICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZSArIHV2Q1sxXTsgLy8gc2NhbGUgdGhlIHYtY29vcmRpbmF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJhcm91bmRcIiB0aGUgam9pblxuICAgICAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5hZGQodXZDdXJyLCB1dl9kZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIGJsYWRlLCB1dkN1cnIsIGNvbnRleHQpO1xuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyBpICsgKChjcm9zcyA+IDApID8gMiA6IDEpKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyBpICsgKChjcm9zcyA+IDApID8gMSA6IDIpKTtcbiAgICB9XG59XG5cbi8vICBhZGRCZXZlbCAgICBBIC0tLS0tIEJcbi8vICAgICAgICAgICAgIC8gXFwgICAgIC8gXFxcbi8vICAgICAgICAgICAvICAgL1xcICAgL1xcICBcXFxuLy8gICAgICAgICAgICAgIC8gIFxcIC8gIFxcICBcXFxuLy8gICAgICAgICAgICAgICAgLyBDIFxcXG5mdW5jdGlvbiBhZGRCZXZlbCAoY29vcmQsIG5BLCBuQywgbkIsIHVBLCB1QywgdUIsIGNvbnRleHQpIHtcbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQywgdUMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHVBLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5CLCB1QiwgY29udGV4dCk7XG5cbiAgICB2YXIgb3JpZW50YXRpb24gPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXSA+IDA7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAob3JpZW50YXRpb24pIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDIpO1xuICAgIH1cbn1cblxuLy8gIEZ1bmN0aW9uIHRvIGFkZCB0aGUgdmVydGV4IG5lZWQgZm9yIGxpbmUgY2Fwcyxcbi8vICBiZWNhdXNlIHJlLXVzZSB0aGUgYnVmZmVycyBuZWVkcyB0byBiZSBhdCB0aGUgZW5kXG5mdW5jdGlvbiBhZGRDYXAgKGNvb3JkLCB2LCBub3JtYWwsIHR5cGUsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG5lZ19ub3JtYWwgPSBWZWN0b3IubmVnKG5vcm1hbCk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpe1xuICAgICAgICBjYXNlIENBUF9UWVBFLnNxdWFyZTpcbiAgICAgICAgICAgIHZhciB0YW5nZW50O1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKXtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gW25vcm1hbFsxXSwgLW5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBub3JtYWwsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBuZWdfbm9ybWFsLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFstbm9ybWFsWzFdLCBub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBub3JtYWwsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBuZWdfbm9ybWFsLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLnJvdW5kOlxuICAgICAgICAgICAgdmFyIG5BLCBuQiwgdXZBLCB1dkIsIHV2QztcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgICAgIG5BID0gbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbmVnX25vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzAsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5lZ19ub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzAsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWRkRmFuKGNvb3JkLFxuICAgICAgICAgICAgICAgIG5BLCB6ZXJvX3ZlYzIsIG5CLFxuICAgICAgICAgICAgICAgIHV2QSwgdXZDLCB1dkIsXG4gICAgICAgICAgICAgICAgdHJ1ZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuYnV0dDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59XG5cbi8vIENhbGN1bGF0ZSBudW1iZXIgb2YgdHJpYW5nbGVzIGZvciBhIGZhbiBnaXZlbiBhbiBhbmdsZSBhbmQgbGluZSB3aWR0aFxuZnVuY3Rpb24gdHJpYW5nbGVzUGVyQXJjIChhbmdsZSwgd2lkdGgpIHtcbiAgICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgICAgIGFuZ2xlID0gLWFuZ2xlO1xuICAgIH1cblxuICAgIHZhciBudW1UcmlhbmdsZXMgPSAod2lkdGggPiAyICogREVGQVVMVC5NSU5fRkFOX1dJRFRIKSA/IE1hdGgubG9nMih3aWR0aCAvIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgOiAxO1xuICAgIHJldHVybiBNYXRoLmNlaWwoYW5nbGUgLyBNYXRoLlBJICogbnVtVHJpYW5nbGVzKTtcbn1cblxuLy8gQ3ljbGljYWxseSBwZXJtdXRlIGNsb3NlZCBsaW5lIHN0YXJ0aW5nIGF0IGFuIGluZGV4XG5mdW5jdGlvbiBwZXJtdXRlTGluZShsaW5lLCBzdGFydEluZGV4KXtcbiAgICB2YXIgbmV3TGluZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBpbmRleCA9IChpICsgc3RhcnRJbmRleCkgJSBsaW5lLmxlbmd0aDtcbiAgICAgICAgLy8gc2tpcCB0aGUgZmlyc3QgKHJlcGVhdGVkKSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIG5ld0xpbmUucHVzaChsaW5lW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3TGluZS5wdXNoKG5ld0xpbmVbMF0pO1xuICAgIHJldHVybiBuZXdMaW5lO1xufSIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IHttYXQ0LCBtYXQzLCB2ZWMzfSBmcm9tICcuL3V0aWxzL2dsLW1hdHJpeCc7XG5cbi8vIEFic3RyYWN0IGJhc2UgY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjYW1lcmEgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZShuYW1lLCB2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaXNvbWV0cmljJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElzb21ldHJpY0NhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAnZmxhdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGF0Q2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdwZXJzcGVjdGl2ZSc6XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgfVxuXG4gICAgLy8gU3luYyBjYW1lcmEgcG9zaXRpb24vem9vbSB0byBzY2VuZSB2aWV3XG4gICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIHx8IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IHsgbG5nOiB0aGlzLnBvc2l0aW9uWzBdLCBsYXQ6IHRoaXMucG9zaXRpb25bMV0sIHpvb206IHRoaXMucG9zaXRpb25bMl0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnpvb20pIHtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSB0aGlzLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBtb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICBzZXR1cE1hdHJpY2VzIChtYXRyaWNlcywgcHJvZ3JhbSkge1xuICAgICAgICAvLyBNb2RlbCB2aWV3IG1hdHJpeCAtIHRyYW5zZm9ybSB0aWxlIHNwYWNlIGludG8gdmlldyBzcGFjZSAobWV0ZXJzLCByZWxhdGl2ZSB0byBjYW1lcmEpXG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMubW9kZWxfdmlldzMyLCB0aGlzLnZpZXdfbWF0cml4LCBtYXRyaWNlcy5tb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWxWaWV3JywgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcblxuICAgICAgICAvLyBOb3JtYWwgbWF0cmljZXMgLSB0cmFuc2Zvcm1zIHN1cmZhY2Ugbm9ybWFscyBpbnRvIHZpZXcgc3BhY2VcbiAgICAgICAgbWF0My5ub3JtYWxGcm9tTWF0NChtYXRyaWNlcy5ub3JtYWwzMiwgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcbiAgICAgICAgbWF0My5pbnZlcnQobWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiwgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X25vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9pbnZlcnNlTm9ybWFsTWF0cml4JywgbWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMik7XG4gICAgfVxuXG59XG5cbi8qKlxuICAgIFBlcnNwZWN0aXZlIG1hdHJpeCBwcm9qZWN0aW9uXG5cbiAgICBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgcGVyc3BlY3RpdmUgY2FtZXJhIHRoYXQsIGdpdmVuIGEgZGVzaXJlZCBjYW1lcmEgZm9jYWwgbGVuZ3RoICh3aGljaCBjYW4gYWxzbyB2YXJ5IGJ5IHpvb20gbGV2ZWwpLFxuICAgIGNvbnN0cmFpbnMgdGhlIGNhbWVyYSBoZWlnaHQgYWJvdmUgdGhlIGdyb3VuZCBwbGFuZSBzdWNoIHRoYXQgdGhlIGRpc3BsYXllZCBncm91bmQgYXJlYSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBvZlxuICAgIGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcC4gVGhpcyBtZWFucyB5b3UgY2FuIHNldCB0aGUgY2FtZXJhIGxvY2F0aW9uIGJ5IFtsYXQsIGxuZywgem9vbV0gYXMgeW91IHdvdWxkIGEgdHlwaWNhbFxuICAgIHdlYiBtZXJjYXRvciBtYXAsIHRoZW4gYWRqdXN0IHRoZSBmb2NhbCBsZW5ndGggYXMgbmVlZGVkLlxuXG4gICAgVmFuaXNoaW5nIHBvaW50IGNhbiBhbHNvIGJlIGFkanVzdGVkIHRvIGFjaGlldmUgZGlmZmVyZW50IFwidmlld2luZyBhbmdsZXNcIiwgZS5nLiBpbnN0ZWFkIG9mIGxvb2tpbmcgc3RyYWlnaHQgZG93biBpbnRvXG4gICAgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQsIHRoZSBjYW1lcmEgYXBwZWFycyB0byBiZSB0aWx0ZWQgYXQgYW4gYW5nbGUuIEZvciBleGFtcGxlOlxuXG4gICAgWzAsIDBdID0gbG9va2luZyB0b3dhcmRzIGNlbnRlciBvZiB2aWV3cG9ydFxuICAgIFstMjUwLCAtMjUwXSA9IGxvb2tpbmcgMjUwIHBpeGVscyBmcm9tIHRoZSB2aWV3cG9ydCBjZW50ZXIgdG8gdGhlIGxvd2VyLWxlZnQgY29ybmVyXG4gICAgWzQwMCwgMF0gPSBsb29raW5nIDQwMCBwaXhlbHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSB2aWV3cG9ydCBjZW50ZXJcbiovXG5jbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwZXJzcGVjdGl2ZSc7XG5cbiAgICAgICAgLy8gYSBzaW5nbGUgc2NhbGFyLCBvciBwYWlycyBvZiBzdG9wcyBtYXBwaW5nIHpvb20gbGV2ZWxzLCBlLmcuIFt6b29tLCBmb2NhbCBsZW5ndGhdXG4gICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gb3B0aW9ucy5mb2NhbF9sZW5ndGg7XG4gICAgICAgIHRoaXMuZm92ID0gb3B0aW9ucy5mb3Y7XG4gICAgICAgIGlmICghdGhpcy5mb2NhbF9sZW5ndGggJiYgIXRoaXMuZm92KSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGZvY2FsIGxlbmd0aCByYW5nZXMgYnkgem9vbVxuICAgICAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBbWzE2LCAyXSwgWzE3LCAyLjVdLCBbMTgsIDNdLCBbMTksIDRdLCBbMjAsIDZdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gb3B0aW9ucy52YW5pc2hpbmdfcG9pbnQgfHwgWzAsIDBdOyAvLyBbeCwgeV1cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSB0aGlzLnZhbmlzaGluZ19wb2ludC5tYXAocGFyc2VGbG9hdCk7IC8vIHdlIGltcGxpY2l0bHkgb25seSBzdXBwb3J0IHB4IHVuaXRzIGhlcmVcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyA9IFtdO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW5zIHRoZSBjYW1lcmEgc28gdGhhdCB0aGUgdmlld2FibGUgYXJlYSBtYXRjaGVzIGdpdmVuIHRoZSB2aWV3cG9ydCBoZWlnaHRcbiAgICAvLyAoaW4gd29ybGQgc3BhY2UsIGUuZy4gbWV0ZXJzKSwgZ2l2ZW4gZWl0aGVyIGEgY2FtZXJhIGZvY2FsIGxlbmd0aCBvciBmaWVsZC1vZi12aWV3XG4gICAgLy8gKGZvY2FsIGxlbmd0aCBpcyB1c2VkIGlmIGJvdGggYXJlIHBhc3NlZCkuXG4gICAgY29uc3RyYWluQ2FtZXJhKHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfSkge1xuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGhlaWdodFxuICAgICAgICBpZiAoIWhlaWdodCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb2NhbCBsZW5ndGgsIGNhbGN1bGF0ZSBGT1ZcbiAgICAgICAgICAgIGlmIChmb2NhbF9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBGT1YsIGNhbGN1bGF0ZSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdikge1xuICAgICAgICAgICAgICAgIGZvdiA9IGZvdiAqIE1hdGguUEkgLyAxODA7IC8vIGNvbnZlcnQgRk9WIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDEgLyBNYXRoLnRhbihmb3YgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzdGFuY2UgdGhhdCBjYW1lcmEgc2hvdWxkIGJlIGZyb20gZ3JvdW5kIHN1Y2ggdGhhdCBpdCBmaXRzIHRoZSBmaWVsZCBvZiB2aWV3IGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBmb3IgYSBjb252ZW50aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsIGFuZCBjYW1lcmEgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBoZWlnaHQgPSB2aWV3X2hlaWdodCAvIDIgKiBmb2NhbF9sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBmb2NhbCBsZW5ndGggLyBmaWVsZC1vZi12aWV3XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMiAqIGhlaWdodCAvIHZpZXdfaGVpZ2h0O1xuICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH07XG4gICAgfVxuXG4gICAgdXBkYXRlTWF0cmljZXMoKSB7XG4gICAgICAgIC8vIFRPRE86IG9ubHkgcmUtY2FsY3VsYXRlIHRoZXNlIHZhcnMgd2hlbiBuZWNlc3NhcnlcblxuICAgICAgICAvLyBIZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdmFyIHZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyBDb21wdXRlIGNhbWVyYSBwcm9wZXJ0aWVzIHRvIGZpdCBkZXNpcmVkIHZpZXdcbiAgICAgICAgdmFyIHsgaGVpZ2h0LCBmb3YgfSA9IHRoaXMuY29uc3RyYWluQ2FtZXJhKHtcbiAgICAgICAgICAgIHZpZXdfaGVpZ2h0OiB2aWV3cG9ydF9oZWlnaHQsXG4gICAgICAgICAgICBmb2NhbF9sZW5ndGg6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvY2FsX2xlbmd0aCksXG4gICAgICAgICAgICBmb3Y6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvdilcbiAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZpZXcgbWF0cml4XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCBoZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoLi4ucG9zaXRpb24pLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgaGVpZ2h0IC0gMSksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuICAgICAgICAvLyBFeGNsdWRlIGNhbWVyYSBoZWlnaHQgZnJvbSB2aWV3IG1hdHJpeFxuICAgICAgICBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgMCksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAtMSksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgZm92LCB0aGlzLnZpZXcuYXNwZWN0LCAxLCBoZWlnaHQgKiAyKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHZhbmlzaGluZyBwb2ludCBmcm9tIHBpeGVscyB0byB2aWV3cG9ydCBzcGFjZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMF0gLyB0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGg7XG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFsxXSAvIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQWRqdXN0IHByb2plY3Rpb24gbWF0cml4IHRvIGluY2x1ZGUgdmFuaXNoaW5nIHBvaW50IHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMjsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyOyAvLyB6IGNvbHVtbiBvZiB5IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gVHJhbnNsYXRlIGdlb21ldHJ5IGludG8gdGhlIGRpc3RhbmNlIHNvIHRoYXQgY2FtZXJhIGlzIGFwcHJvcHJpYXRlIGhlaWdodCBhYm92ZSBncm91bmRcbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhZGp1c3QgeHkgdG8gY29tcGVuc2F0ZSBmb3IgYW55IHZhbmlzaGluZyBwb2ludCBza2V3LCBlLmcuIG1vdmUgZ2VvbWV0cnkgc28gdGhhdCB0aGUgZGlzcGxheWVkIGdcbiAgICAgICAgLy8gcGxhbmUgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgZXhwZWN0ZWQgYnkgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoaXMgW2xhdCwgbG5nLCB6b29tXS5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqIHRoaXMudmlldy5hc3BlY3QgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyKSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDIpLFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbmNsdWRlIGNhbWVyYSBoZWlnaHQgaW4gcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKDAsIDAsIC1oZWlnaHQpKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCBbMCwgMCwgdGhpcy5wb3NpdGlvbl9tZXRlcnNbMl1dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3KTtcbiAgICB9XG5cbn1cblxuLy8gSXNvbWV0cmljLXN0eWxlIHByb2plY3Rpb25cbi8vIE5vdGU6IHRoaXMgaXMgYWN0dWFsbHkgYW4gXCJheG9ub21ldHJpY1wiIHByb2plY3Rpb24sIGJ1dCBJJ20gdXNpbmcgdGhlIGNvbGxvcXVpYWwgdGVybSBpc29tZXRyaWMgYmVjYXVzZSBpdCBpcyBtb3JlIHJlY29nbml6YWJsZS5cbi8vIEFuIGlzb21ldHJpYyBwcm9qZWN0aW9uIGlzIGEgc3BlY2lmaWMgc3Vic2V0IG9mIGF4b25vbWV0cmljIHByb2plY3Rpb25zLlxuLy8gJ2F4aXMnIGRldGVybWluZXMgdGhlIHh5IHNrZXcgYXBwbGllZCB0byBhIHZlcnRleCBiYXNlZCBvbiBpdHMgeiBjb29yZGluYXRlLCBlLmcuIFswLCAxXSBheGlzIGNhdXNlcyBidWlsZGluZ3MgdG8gYmUgZHJhd25cbi8vIHN0cmFpZ2h0IHVwd2FyZHMgb24gc2NyZWVuIGF0IHRoZWlyIHRydWUgaGVpZ2h0LCBbMCwgLjVdIHdvdWxkIGRyYXcgdGhlbSB1cCBhdCBoYWxmLWhlaWdodCwgWzEsIDBdIHdvdWxkIGJlIHNpZGV3YXlzLCBldGMuXG5jbGFzcyBJc29tZXRyaWNDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnaXNvbWV0cmljJztcbiAgICAgICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzIHx8IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBpZiAodGhpcy5heGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhpcy5heGlzID0geyB4OiB0aGlzLmF4aXNbMF0sIHk6IHRoaXMuYXhpc1sxXSB9OyAvLyBhbGxvdyBheGlzIHRvIGFsc28gYmUgcGFzc2VkIGFzIDItZWxlbSBhcnJheVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLnh5ICs9IHBvc2l0aW9uLnogKiB1X2lzb21ldHJpY19heGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSB6IGZvciBkZXB0aCBidWZmZXIgc28gdXAgaXMgbmVnYXRpdmUsXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNjYWxlIGRvd24gdmFsdWVzIHNvIG9iamVjdHMgaGlnaGVyIHRoYW4gb25lIHNjcmVlbiBoZWlnaHQgd2lsbCBub3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICAgICAgICAvLyBwdWxsIGZvcndhcmQgc2xpZ2h0bHkgdG8gYXZvaWQgZ29pbmcgcGFzdCBmYXIgY2xpcHBpbmcgcGxhbmVcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi56ID0gLXBvc2l0aW9uLnogLyAxMDAuICsgMS4gLSAwLjAwMTtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBWaWV3XG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy52aWV3X21hdHJpeCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMudmlld19tYXRyaXgsIHRoaXMudmlld19tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygtcG9zaXRpb25bMF0sIC1wb3NpdGlvblsxXSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb25cbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICAvLyBhcHBseSBpc29tZXRyaWMgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gdGhpcy5heGlzLnggLyB0aGlzLnZpZXcuYXNwZWN0OyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSB0aGlzLmF4aXMueTsgICAgICAgICAgICAgICAgICAgIC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBjb252ZXJ0IG1ldGVycyB0byB2aWV3cG9ydFxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy54LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueSxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnZpZXdwb3J0X2hlaWdodF0pO1xuICAgICAgICAvLyBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueCwgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHQpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIFswLCAwXSk7XG4gICAgfVxuXG59XG5cbi8vIEZsYXQgcHJvamVjdGlvbiAoZS5nLiBqdXN0IHRvcC1kb3duLCBubyBwZXJzcGVjdGl2ZSkgLSBhIGRlZ2VuZXJhdGUgaXNvbWV0cmljIGNhbWVyYVxuY2xhc3MgRmxhdENhbWVyYSBleHRlbmRzIElzb21ldHJpY0NhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdmbGF0JztcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIEF4aXMgaXMgZml4ZWQgdG8gKDAsIDApIGZvciBmbGF0IGNhbWVyYVxuICAgICAgICB0aGlzLmF4aXMueCA9IDA7XG4gICAgICAgIHRoaXMuYXhpcy55ID0gMDtcblxuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICB9XG5cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgZ2VvIGZ1bmN0aW9uc1xuXG52YXIgR2VvO1xuZXhwb3J0IGRlZmF1bHQgR2VvID0ge307XG5cbi8vIFByb2plY3Rpb24gY29uc3RhbnRzXG5HZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb20gPSAxODtcbkdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20gPSAyMDtcbkdlby50aWxlX3NpemUgPSAyNTY7XG5HZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyA9IDIwMDM3NTA4LjM0Mjc4OTI0NDtcbkdlby5jaXJjdW1mZXJlbmNlX21ldGVycyA9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzICogMjtcbkdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsID0gR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gR2VvLnRpbGVfc2l6ZTsgLy8gbWluIHpvb20gZHJhd3Mgd29ybGQgYXMgMiB0aWxlcyB3aWRlXG5cbmxldCBtZXRlcnNfcGVyX3BpeGVsID0gW107XG5HZW8ubWV0ZXJzUGVyUGl4ZWwgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfcGl4ZWxbel0gPSBtZXRlcnNfcGVyX3BpeGVsW3pdIHx8IEdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfcGl4ZWxbel07XG59O1xuXG5sZXQgbWV0ZXJzX3Blcl90aWxlID0gW107XG5HZW8ubWV0ZXJzUGVyVGlsZSA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl90aWxlW3pdID0gbWV0ZXJzX3Blcl90aWxlW3pdIHx8IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3RpbGVbel07XG59O1xuXG4vLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBiYXNlZCBvbiBhbiBkZWZpbmVkIHRpbGUgc2NhbGVcbkdlby50aWxlX3NjYWxlID0gNDA5NjsgLy8gY29vcmRpbmF0ZXMgYXJlIGxvY2FsbHkgc2NhbGVkIHRvIHRoZSByYW5nZSBbMCwgdGlsZV9zY2FsZV1cbkdlby51bml0c19wZXJfcGl4ZWwgPSBHZW8udGlsZV9zY2FsZSAvIEdlby50aWxlX3NpemU7XG5HZW8uaGVpZ2h0X3NjYWxlID0gMTY7ICAvLyBwcm92aWRlcyBzdWItbWV0ZXIgcHJlY2lzaW9uIGZvciBoZWlnaHQgdmFsdWVzICgxNnRocyBvZiBhIG1ldGVycylcblxubGV0IHVuaXRzX3Blcl9tZXRlciA9IFtdO1xuR2VvLnVuaXRzUGVyTWV0ZXIgPSBmdW5jdGlvbiAoeikge1xuICAgIHVuaXRzX3Blcl9tZXRlclt6XSA9IHVuaXRzX3Blcl9tZXRlclt6XSB8fCBHZW8udGlsZV9zY2FsZSAvIChHZW8udGlsZV9zaXplICogR2VvLm1ldGVyc1BlclBpeGVsKHopKTtcbiAgICByZXR1cm4gdW5pdHNfcGVyX21ldGVyW3pdO1xufTtcblxuLy8gQ29udmVydCB0aWxlIGxvY2F0aW9uIHRvIG1lcmNhdG9yIG1ldGVycyAtIG11bHRpcGx5IGJ5IHBpeGVscyBwZXIgdGlsZSwgdGhlbiBieSBtZXRlcnMgcGVyIHBpeGVsLCBhZGp1c3QgZm9yIG1hcCBvcmlnaW5cbkdlby5tZXRlcnNGb3JUaWxlID0gZnVuY3Rpb24gKHRpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aWxlLnggKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMsXG4gICAgICAgIHk6IC0odGlsZS55ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKVxuICAgIH07XG59O1xuXG4vKipcbiAgIEdpdmVuIGEgcG9pbnQgaW4gbWVyY2F0b3IgbWV0ZXJzIGFuZCBhIHpvb20gbGV2ZWwsIHJldHVybiB0aGUgdGlsZSBYL1kvWiB0aGF0IHRoZSBwb2ludCBsaWVzIGluXG4qL1xuR2VvLnRpbGVGb3JNZXRlcnMgPSBmdW5jdGlvbiAoW3gsIHldLCB6b29tKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5mbG9vcigoeCArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB5OiBNYXRoLmZsb29yKCgteSArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB6OiB6b29tXG4gICAgfTtcbn07XG5cbi8vIFdyYXAgYSB0aWxlIHRvIHBvc2l0aXZlICNzIGZvciB6b29tXG4vLyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGF4ZXMgdG8gd3JhcFxuR2VvLndyYXBUaWxlID0gZnVuY3Rpb24oeyB4LCB5LCB6IH0sIG1hc2sgPSB7IHg6IHRydWUsIHk6IGZhbHNlIH0pIHtcbiAgICB2YXIgbSA9ICgxIDw8IHopIC0gMTtcbiAgICBpZiAobWFzay54KSB7XG4gICAgICAgIHggPSB4ICYgbTtcbiAgICB9XG4gICAgaWYgKG1hc2sueSkge1xuICAgICAgICB5ID0geSAmIG07XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHksIHogfTtcbn07XG5cbi8qKlxuICAgQ29udmVydCBtZXJjYXRvciBtZXRlcnMgdG8gbGF0LWxuZ1xuKi9cbkdlby5tZXRlcnNUb0xhdExuZyA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcblxuICAgIHggLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG4gICAgeSAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIHkgPSAoMiAqIE1hdGguYXRhbihNYXRoLmV4cCh5ICogTWF0aC5QSSkpIC0gKE1hdGguUEkgLyAyKSkgLyBNYXRoLlBJO1xuXG4gICAgeCAqPSAxODA7XG4gICAgeSAqPSAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuLyoqXG4gIENvbnZlcnQgbGF0LWxuZyB0byBtZXJjYXRvciBtZXRlcnNcbiovXG5HZW8ubGF0TG5nVG9NZXRlcnMgPSBmdW5jdGlvbihbeCwgeV0pIHtcblxuICAgIC8vIExhdGl0dWRlXG4gICAgeSA9IE1hdGgubG9nKE1hdGgudGFuKHkqTWF0aC5QSS8zNjAgKyBNYXRoLlBJLzQpKSAvIE1hdGguUEk7XG4gICAgeSAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIC8vIExvbmdpdHVkZVxuICAgIHggKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuR2VvLndyYXBMbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPiAxODAgfHwgeCA8IC0xODApIHtcbiAgICAgICAgeCA9ICgoeCArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbi8vIFJ1biBhbiBpbi1wbGFjZSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gZWFjaCBjb29vcmRpbmF0ZSBpbiBhIEdlb0pTT04gZ2VvbWV0cnlcbkdlby50cmFuc2Zvcm1HZW9tZXRyeSA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgdHJhbnNmb3JtKSB7XG4gICAgaWYgKGdlb21ldHJ5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBza2lwIGlmIG1pc3NpbmcgZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgdHJhbnNmb3JtKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2gocG9seWdvbiA9PiB7XG4gICAgICAgICAgICBwb2x5Z29uLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IHN1cHBvcnQgR2VvbWV0cnlDb2xsZWN0aW9uXG59O1xuXG5HZW8uYm94SW50ZXJzZWN0ID0gZnVuY3Rpb24gKGIxLCBiMikge1xuICAgIHJldHVybiAhKFxuICAgICAgICBiMi5zdy54ID4gYjEubmUueCB8fFxuICAgICAgICBiMi5uZS54IDwgYjEuc3cueCB8fFxuICAgICAgICBiMi5zdy55ID4gYjEubmUueSB8fFxuICAgICAgICBiMi5uZS55IDwgYjEuc3cueVxuICAgICk7XG59O1xuXG4vLyBGaW5kcyB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBmb3IgYSBwb2x5Z29uXG5HZW8uZmluZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICB2YXIgbWluX3ggPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3ggPSAtSW5maW5pdHksXG4gICAgICAgIG1pbl95ID0gSW5maW5pdHksXG4gICAgICAgIG1heF95ID0gLUluZmluaXR5O1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGV4YW1pbmUgb3V0ZXIgcmluZyAocG9seWdvblswXSlcbiAgICB2YXIgbnVtX2Nvb3JkcyA9IHBvbHlnb25bMF0ubGVuZ3RoO1xuICAgIGZvciAodmFyIGM9MDsgYyA8IG51bV9jb29yZHM7IGMrKykge1xuICAgICAgICB2YXIgY29vcmQgPSBwb2x5Z29uWzBdW2NdO1xuXG4gICAgICAgIGlmIChjb29yZFswXSA8IG1pbl94KSB7XG4gICAgICAgICAgICBtaW5feCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA8IG1pbl95KSB7XG4gICAgICAgICAgICBtaW5feSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFswXSA+IG1heF94KSB7XG4gICAgICAgICAgICBtYXhfeCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA+IG1heF95KSB7XG4gICAgICAgICAgICBtYXhfeSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV07XG59O1xuXG4vLyBDb252ZXJ0IGdlb21ldHJ5IHR5cGUgdG8gb25lIG9mOiAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJ1xuR2VvLmdlb21ldHJ5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJldHVybiAncG9seWdvbic7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2xpbmUnO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgcmV0dXJuICdwb2ludCc7XG4gICAgfVxufTtcblxuR2VvLmNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC9ibG9iL2MxMGY0MDVhMTEyMTQyYjE5Nzg1OTY3Y2UwZTE0MjEzMmE2MDk1YWQvc3JjL2xheWVyL3ZlY3Rvci9Qb2x5Z29uLmpzI0w1N1xuICAgIGxldCB4ID0gMCwgeSA9IDAsIGFyZWEgPSAwO1xuICAgIGxldCByaW5nID0gcG9seWdvblswXTsgLy8gb25seSB1c2UgZmlyc3QgcmluZyBmb3Igbm93XG4gICAgbGV0IGxlbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSwgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbal07XG4gICAgICAgIGxldCBmID0gcDBbMV0gKiBwMVswXSAtIHAxWzFdICogcDBbMF07XG5cbiAgICAgICAgeCArPSAocDBbMF0gKyBwMVswXSkgKiBmO1xuICAgICAgICB5ICs9IChwMFsxXSArIHAxWzFdKSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4IC8gYXJlYSwgeSAvIGFyZWFdO1xufTtcblxuR2VvLm11bHRpQ2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgbiA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBsZXQgY2VudHJvaWQgPSBbMCwgMF07XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBsZXQgYyA9IEdlby5jZW50cm9pZChwb2x5Z29uc1twXSk7XG4gICAgICAgIGNlbnRyb2lkWzBdICs9IGNbMF07XG4gICAgICAgIGNlbnRyb2lkWzFdICs9IGNbMV07XG4gICAgfVxuXG4gICAgY2VudHJvaWRbMF0gLz0gbjtcbiAgICBjZW50cm9pZFsxXSAvPSBuO1xuXG4gICAgcmV0dXJuIGNlbnRyb2lkO1xufTtcblxuR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tpKzFdO1xuXG4gICAgICAgIGFyZWEgKz0gcDBbMF0gKiBwMVsxXSAtIHAxWzBdICogcDBbMV07XG4gICAgfVxuXG4gICAgYXJlYSArPSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV0gLSByaW5nWzBdWzBdICogcmluZ1tuIC0gMV1bMV07XG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucG9seWdvblJpbmdBcmVhID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKSkgLyAyO1xufTtcblxuLy8gVE9ETzogc3VidHJhY3QgaW5uZXIgcmluZ3Ncbkdlby5wb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgcmV0dXJuIEdlby5wb2x5Z29uUmluZ0FyZWEocG9seWdvblswXSk7XG59O1xuXG5HZW8ubXVsdGlQb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBhcmVhID0gMDtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGFyZWEgKz0gR2VvLnBvbHlnb25BcmVhKHBvbHlnb25zW3BdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5yaW5nV2luZGluZyA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSBHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpO1xuICAgIGlmIChhcmVhID4gMCkge1xuICAgICAgICByZXR1cm4gJ0NXJztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJlYSA8IDApIHtcbiAgICAgICAgcmV0dXJuICdDQ1cnO1xuICAgIH1cbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkIG9uIHplcm8gYXJlYSBwb2x5Z29uXG59O1xuXG4vLyBFbmZvcmNlIHdpbmRpbmcgb3JkZXIgb24gb3V0ZXIvaW5uZXIgcmluZ3Ncbi8vIHdpbmRpbmc6ICdDVycgb3IgJ0NDVydcbkdlby5lbmZvcmNlV2luZGluZyA9IGZ1bmN0aW9uIChnZW9tLCB3aW5kaW5nKSB7XG4gICAgbGV0IHBvbHlzO1xuICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBwb2x5cyA9IFtnZW9tLmNvb3JkaW5hdGVzXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBwb2x5cyA9IGdlb20uY29vcmRpbmF0ZXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2VvbTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5cy5sZW5ndGg7IHArKykge1xuICAgICAgICBsZXQgcG9seSA9IHBvbHlzW3BdO1xuXG4gICAgICAgIC8vIElmIGZpcnN0IHJpbmcgd2luZGluZyBkb2Vzbid0IG1hdGNoLCByZXZlcnNlIGFsbCByaW5nc1xuICAgICAgICAvLyBOT1RFOiBhc3N1bWVzIHJpbmcgd2luZGluZyBvcmRlcnMgYWxyZWFkeSBhbHRlcm5hdGUgYXMgZXhwZWN0ZWRcbiAgICAgICAgaWYgKEdlby5yaW5nV2luZGluZyhwb2x5WzBdKSAhPT0gd2luZGluZykge1xuICAgICAgICAgICAgZm9yIChsZXQgcmluZyBvZiBwb2x5KSB7XG4gICAgICAgICAgICAgICAgcmluZy5yZXZlcnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb207XG59O1xuIiwiLy8gV2ViR0wgY29uc3RhbnRzIC0gbmVlZCB0byBpbXBvcnQgdGhlc2Ugc2VwYXJhdGVseSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHRoZSB3ZWIgd29ya2VyXG5cbnZhciBnbDtcbmV4cG9ydCBkZWZhdWx0IGdsID0ge307XG5cbi8qIERhdGFUeXBlICovXG5nbC5CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7XG5nbC5VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgPSAweDE0MDE7XG5nbC5TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7XG5nbC5VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgPSAweDE0MDM7XG5nbC5JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDQ7XG5nbC5VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgPSAweDE0MDU7XG5nbC5GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7XG4iLCIvLyBXZWJHTCBjb250ZXh0IHdyYXBwZXJcblxudmFyIENvbnRleHQ7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0ID0ge307XG5cbi8vIFNldHVwIGEgV2ViR0wgY29udGV4dFxuLy8gSWYgbm8gY2FudmFzIGVsZW1lbnQgaXMgcHJvdmlkZWQsIG9uZSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYm9keVxuQ29udGV4dC5nZXRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q29udGV4dCAoY2FudmFzLCBvcHRpb25zKVxue1xuICAgIHZhciBmdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgaWYgKGNhbnZhcyA9PSBudWxsKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBjYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gLTE7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgZnVsbHNjcmVlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0aW9ucykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIG9wdGlvbnMpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuXCIpO1xuICAgIH1cblxuICAgIGlmICghZnVsbHNjcmVlbikge1xuICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUud2lkdGgpLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS5oZWlnaHQpLCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdsO1xufTtcblxuQ29udGV4dC5yZXNpemUgPSBmdW5jdGlvbiAoZ2wsIHdpZHRoLCBoZWlnaHQsIGRldmljZV9waXhlbF9yYXRpbylcbntcbiAgICBkZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW8gfHwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICBnbC5jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgZ2wuY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgZ2wuY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuY2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG59O1xuIiwiLy8gV2ViR0wgZXh0ZW5zaW9uIHdyYXBwZXJcbi8vIFN0b3JlcyBleHRlbnNpb25zIGJ5IG5hbWUgYW5kIEdMIGNvbnRleHRcblxubGV0IGV4dGVuc2lvbnMgPSBuZXcgTWFwKCk7IC8vIG1hcCBvZiBleHRlbnNpb25zIGJ5IEdMIGNvbnRleHRcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uIChnbCwgbmFtZSkge1xuICAgIGxldCBleHRzID0gZXh0ZW5zaW9ucy5nZXQoZ2wpO1xuICAgIGlmICghZXh0cykge1xuICAgICAgICBleHRlbnNpb25zLnNldChnbCwgbmV3IE1hcCgpKTtcbiAgICAgICAgZXh0cyA9IGV4dGVuc2lvbnMuZ2V0KGdsKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4dHMuZ2V0KG5hbWUpKSB7XG4gICAgICAgIGV4dHMuc2V0KG5hbWUsIGdsLmdldEV4dGVuc2lvbihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBleHRzLmdldChuYW1lKTtcbn1cbiIsInZhciBHTFNMID0ge307XG5leHBvcnQgZGVmYXVsdCBHTFNMO1xuXG4vKipcbiAgICBQYXJzZSB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCBpbmZlcnMgdHlwZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZVxuICAgIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBzZXQgdW5pZm9ybSB2YWx1ZXMgb24gYSBHTCBwcm9ncmFtLiBFYWNoIG9iamVjdCBpbiB0aGUgcmV0dXJuZWRcbiAgICBhcnJheSBoYXMgdGhlIGZvcm06XG4gICAgeyB0eXBlLCBtZXRob2QsIG5hbWUsIHZhbHVlIH1cblxuICAgIHR5cGU6IHRoZSBHTCB1bmlmb3JtIHR5cGUsIHN1Y2ggYXMgJ3ZlYzMnLCAnZmxvYXQnLCBldGMuXG4gICAgbWV0aG9kOiB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgbWV0aG9kIHRvIHVzZSwgc3VjaCBhcyAnMWYnLCAnM2Z2JywgZXRjLlxuICAgIG5hbWU6IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgR0wgdW5pZm9ybSBsb2NhdGlvbiwgZS5nLiAnYXJyYXlbMF0uZmllbGQnLCBldGMuXG4gICAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIEdMIHVuaWZvcm0gc2V0dGVyIGZvciB0aGF0IHR5cGUsIGUuZy4gWzEsIDIsIDNdIGZvciBhIHZlYzNcblxuICAgIFRleHR1cmVzIGhhdmUgc3BlY2lhbCBiZWhhdmlvcjogdW5pZm9ybXMgd2l0aCBzdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRleHR1cmVzLCBhbmRcbiAgICB0aGUgc3RyaW5nIGlzIHVzZWQgYXMgYSB1bmlxdWUgdGV4dHVyZSAna2V5JyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyICh3aGljaCBpcyByZXNwb25zaWJsZVxuICAgIGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB1bmlmb3JtcykuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgYXMgYSBrZXkgaW50byBhIGRpY3Rpb25hcnkgb2ZcbiAgICBrbm93biB0ZXh0dXJlIG5hbWVzLCBvciBpdCBjb3VsZCBzaW1wbHkgYmUgdXNlZCBhcyBhIFVSTCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSB0ZXh0dXJlIGZyb20uXG4qL1xuR0xTTC5wYXJzZVVuaWZvcm1zID0gZnVuY3Rpb24gKHVuaWZvcm1zKSB7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW25hbWVdO1xuICAgICAgICB2YXIgdTtcblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheTogdmVjdG9yLCBhcnJheSBvZiBmbG9hdHMsIGFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybSkpIHtcbiAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXRbXScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbMF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzIC0gYnV0IG9ubHkgYXJyYXlzIG9mIHZlY3RvcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm1bMF0pICYmIHR5cGVvZiB1bmlmb3JtWzBdWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1bMF0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybVswXS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybVswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtW3VdLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGVsc2Ugd2FybmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdmFyaWFibGUgZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlLCBhcnJheTtcblxuICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBmbG9hdHMgLSB2ZWN0b3Igb3IgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAndmVjJyArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICBlbHNlIHsgLy9pZiAodmFsdWUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb29sZWFuXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdHlwZSA9ICdib29sJztcbiAgICB9XG4gICAgLy8gVGV4dHVyZVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB2YXJpYWJsZSBkZWZpbml0aW9uXG4gICAgdmFyIHZhcmlhYmxlID0gJyc7XG4gICAgdmFyaWFibGUgKz0gYCR7dHlwZX0gJHtuYW1lfWA7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHZhcmlhYmxlICs9IGBbJHthcnJheX1dYDtcbiAgICB9XG4gICAgdmFyaWFibGUgKz0gJztcXG4nO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHVuaWZvcm0gZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVVbmlmb3JtID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuICd1bmlmb3JtICcgKyBHTFNMLmRlZmluZVZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8qKlxuICAgIENoZWNrIGZvciBhIHVuaWZvcm0gZGVmaW5pdGlvbiBvZiAnbmFtZScgaW4gdGhlIHByb3ZpZGVkIEdMU0wgc291cmNlXG4gICAgU2ltcGxlIHJlZ2V4IGNoZWNrIGZvciAndW5pZm9ybScga2V5d29yZCBhbmQgdmFyIG5hbWUsIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UvZXh0cmFjdCBHTFNMXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzVW5pZm9ybURlZmluZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgLy8gTWF0Y2gsIGluIG9yZGVyOlxuICAgIC8vIC0gdGhlIGtleXdvcmQgJ3VuaWZvcm0nXG4gICAgLy8gLSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHRoYXQgaXMgYW55dGhpbmcgZXhjZXB0IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnl0aGluZyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMsIHsgLi4uIH0gKGFuIGlubGluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBjYW4gZ28gaGVyZSlcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueSAjIG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBub3QgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtXG5cbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCd1bmlmb3JtW147XSsoPzp7W1xcXFxzXFxcXFNdKn0pP1teO10qXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5tYXRjaChyZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIENoZWNrIHRoYXQgYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBpbiB0aGUgR0xTTCBzb3VyY2VcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNTeW1ib2xSZWZlcmVuY2VkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2Uuc2VhcmNoKHJlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMi1lbGVtZW50IGFycmF5IGludG8gYSAzLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKCB6IClcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjMyA9IGZ1bmN0aW9uICh2LCB6ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHggPSBbLi4udiwgel0ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAzLWVsZW1lbnQgYXJyYXkgaW50byBhIDQtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoZS5nLiB3IG9yIGEpXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzQgPSBmdW5jdGlvbiAodiwgdyA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICB4ID0gWy4uLnYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG5cbiIsIlxuZXhwb3J0IGNsYXNzIFJlbmRlclN0YXRlIHtcblx0Y29uc3RydWN0b3IgKHZhbHVlLCBzZXR1cCkge1xuICAgICAgICBzZXR1cCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwO1xuICAgIH1cblxuICAgIHNldCAodmFsdWUpIHtcbiAgICBcdC8vIGlmIHRoZSBzdGF0ZXMgYXJlIGRpZmZlcmVudCwgY2FsbCB0aGUgR0wgY29udGV4dCBmb3IgYSBzdGF0ZSBjaGFuZ2VcbiAgICBcdGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgXHRcdHRoaXMuc2V0dXAodmFsdWUpO1xuICAgIFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgXHR9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJTdGF0ZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKGdsKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICAvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlID0gZ2wuQkFDSztcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSA9IGdsLk9ORTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGEgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXG4gICAgICAgIC8vIERlcHRoIHRlc3Qvd3JpdGVcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCA9IHRydWU7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTsgLy8gZGVwdGggZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZVxuXG4gICAgXHQvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuY3VsbGluZyA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgY3VsbDogdGhpcy5kZWZhdWx0cy5jdWxsaW5nLCBmYWNlOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuY3VsbCkge1xuICAgIFx0XHRcdFx0Z2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBcdFx0Z2wuY3VsbEZhY2UodmFsdWUuZmFjZSk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIEJsZW5kaW5nIG1vZGVcbiAgICAgICAgdGhpcy5ibGVuZGluZyA9IG5ldyBSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmxlbmQ6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcsXG4gICAgICAgICAgICAgICAgc3JjOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyxcbiAgICAgICAgICAgICAgICBkc3Q6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0LFxuICAgICAgICAgICAgICAgIHNyY19hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEsXG4gICAgICAgICAgICAgICAgZHN0X2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5ibGVuZCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNyY19hbHBoYSAmJiB2YWx1ZS5kc3RfYWxwaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKHZhbHVlLnNyYywgdmFsdWUuZHN0LCB2YWx1ZS5zcmNfYWxwaGEsIHZhbHVlLmRzdF9hbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmModmFsdWUuc3JjLCB2YWx1ZS5kc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggd3JpdGVcbiAgICAgICAgdGhpcy5kZXB0aF93cml0ZSA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfd3JpdGU6IHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgICAgIFx0XHRnbC5kZXB0aE1hc2sodmFsdWUuZGVwdGhfd3JpdGUpO1xuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB0ZXN0XG4gICAgICAgIHRoaXMuZGVwdGhfdGVzdCA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfdGVzdDogdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0IH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuZGVwdGhfdGVzdCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgXHRcdGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgfVxuXG59XG4iLCIvLyBHTCBwcm9ncmFtIHdyYXBwZXIgdG8gY2FjaGUgdW5pZm9ybSBsb2NhdGlvbnMvdmFsdWVzLCBkbyBjb21waWxlLXRpbWUgcHJlLXByb2Nlc3Npbmdcbi8vIChpbmplY3RpbmcgI2RlZmluZXMgYW5kICNwcmFnbWEgYmxvY2tzIGludG8gc2hhZGVycyksIGV0Yy5cblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbHNsJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCBzdHJpcCBmcm9tICdzdHJpcC1jb21tZW50cyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlU2hhZGVyRXJyb3JzIH0gZnJvbSAnZ2wtc2hhZGVyLWVycm9ycyc7XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5jb25zdCByZV9wcmFnbWEgPSAvXlxccyojcHJhZ21hLiokL2dtOyAgIC8vIGZvciByZW1vdmluZyB1bnVzZWQgcHJhZ21hcyBhZnRlciBzaGFkZXIgYmxvY2sgaW5qZWN0aW9uXG5jb25zdCByZV9jb250aW51ZV9saW5lID0gL1xcXFxcXHMqXFxuL21nOyAgIC8vIGZvciByZW1vdmluZyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclByb2dyYW0ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9zb3VyY2UsIGZyYWdtZW50X3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBpbnNlcnRlZCBhcyAjZGVmaW5lcyBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZGVmaW5lc3x8e30pO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgZm9yIGJsb2NrcyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuYmxvY2tzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja3N8fHt9KTtcbiAgICAgICAgdGhpcy5ibG9ja19zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2NrX3Njb3Blc3x8e30pO1xuXG4gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhY3RpdmF0ZVxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwgW107XG5cbiAgICAgICAgLy8gSlMtb2JqZWN0IHVuaWZvcm1zIHRoYXQgYXJlIGV4cGVjdGVkIGJ5IHRoaXMgcHJvZ3JhbVxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNoYWRlciBzb3VyY2UsIHRoZWlyIHR5cGVzIHdpbGwgYmUgaW5mZXJyZWQgYW5kIGRlZmluaXRpb25zXG4gICAgICAgIC8vIGZvciBlYWNoIHdpbGwgYmUgaW5qZWN0ZWQuXG4gICAgICAgIHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcblxuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHVuaWZvcm1zLCBsYXppbHkgYWRkZWQgYXMgZWFjaCB1bmlmb3JtIGlzIHNldFxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdmVydGV4IGF0dHJpYnV0ZXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZFxuXG4gICAgICAgIHRoaXMudmVydGV4X3NvdXJjZSA9IHZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc291cmNlID0gZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTaGFkZXJQcm9ncmFtLmlkKys7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNbdGhpcy5pZF0gPSB0aGlzO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7IC8vIGNhbiBwcm92aWRlIGEgcHJvZ3JhbSBuYW1lICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgICAgICBkZWxldGUgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc1t0aGlzLmlkXTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9ncmFtIHdyYXBwZXIgd2l0aCBzaW1wbGUgc3RhdGUgY2FjaGVcbiAgICB1c2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFNoYWRlclByb2dyYW0uY3VycmVudCAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gdGhpcztcbiAgICB9XG5cbiAgICBjb21waWxlKCkge1xuICAgICAgICBpZiAodGhpcy5jb21waWxpbmcpIHtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGJlY2F1c2UgYWxyZWFkeSBjb21waWxpbmdgKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIENvcHkgc291cmNlcyBmcm9tIHByZS1tb2RpZmllZCB0ZW1wbGF0ZVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLnZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBhdmFpbGFiaWxpdHlcbiAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSB0aGlzLmNoZWNrRXh0ZW5zaW9ucygpO1xuXG4gICAgICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIHRvIGJlIGluamVjdGVkIGxhdGVyXG4gICAgICAgIHZhciBkZWZpbmVzID0gdGhpcy5idWlsZERlZmluZUxpc3QoKTtcblxuICAgICAgICAvLyBJbmplY3QgdXNlci1kZWZpbmVkIGJsb2NrcyAoYXJiaXRyYXJ5IGNvZGUgcG9pbnRzIG1hdGNoaW5nIG5hbWVkICNwcmFnbWFzKVxuICAgICAgICAvLyBSZXBsYWNlIGFjY29yZGluZyB0byB0aGlzIHBhdHRlcm46XG4gICAgICAgIC8vICNwcmFnbWEgdGFuZ3JhbTogW2tleV1cbiAgICAgICAgLy8gZS5nLiAjcHJhZ21hIHRhbmdyYW06IGdsb2JhbFxuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgYmxvY2sgY29kZSBzbmlwcGV0c1xuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5idWlsZFNoYWRlckJsb2NrTGlzdCgpO1xuICAgICAgICB2YXIgcmVnZXhwO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBibG9ja3MpIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1trZXldO1xuICAgICAgICAgICAgaWYgKCFibG9jayB8fCAoQXJyYXkuaXNBcnJheShibG9jaykgJiYgYmxvY2subGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaXJzdCBmaW5kIGNvZGUgcmVwbGFjZSBwb2ludHMgaW4gc2hhZGVyc1xuICAgICAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cCgnXlxcXFxzKiNwcmFnbWFcXFxccyt0YW5ncmFtOlxcXFxzKycgKyBrZXkgKyAnXFxcXHMqJCcsICdtJyk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X3ZlcnRleCA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5tYXRjaChyZWdleHApO1xuICAgICAgICAgICAgdmFyIGluamVjdF9mcmFnbWVudCA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG5cbiAgICAgICAgICAgIC8vIEF2b2lkIG5ldHdvcmsgcmVxdWVzdCBpZiBub3RoaW5nIHRvIHJlcGxhY2VcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ID09IG51bGwgJiYgaW5qZWN0X2ZyYWdtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgYmxvY2tzIGludG8gb25lIHN0cmluZ1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9ICcnO1xuICAgICAgICAgICAgYmxvY2suZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgc3RhcnQgYW5kIGVuZCBvZiBlYWNoIGJsb2NrIHdpdGggbWV0YWRhdGEgKHdoaWNoIGNhbiBiZSBleHRyYWN0ZWQgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGZpbmFsIHNvdXJjZSBmb3IgZXJyb3IgaGFuZGxpbmcsIGRlYnVnZ2luZywgZXRjLilcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IGAke3ZhbC5zY29wZX0sICR7dmFsLmtleX0sICR7dmFsLm51bX1gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1zdGFydDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IHZhbC5zb3VyY2U7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLWVuZDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSW5qZWN0XG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluamVjdF9mcmFnbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGEgI2RlZmluZSBmb3IgdGhpcyBpbmplY3Rpb24gcG9pbnRcbiAgICAgICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fQkxPQ0tfJyArIGtleS5yZXBsYWNlKC9bXFxzLV0rL2csICdfJykudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4tdXAgYW55ICNwcmFnbWFzIHRoYXQgd2VyZW4ndCByZXBsYWNlZCAodG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcblxuICAgICAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICAgICAgdGhpcy5lbnN1cmVVbmlmb3Jtcyh0aGlzLmRlcGVuZGVudF91bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gQnVpbGQgJiBpbmplY3QgZXh0ZW5zaW9ucyAmIGRlZmluZXNcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lICphZnRlciogY29kZSBpbmplY3Rpb24gc28gdGhhdCB3ZSBjYW4gYWRkIGRlZmluZXMgZm9yIHdoaWNoIGNvZGUgcG9pbnRzIHdlcmUgaW5qZWN0ZWRcbiAgICAgICAgbGV0IGluZm8gPSAodGhpcy5uYW1lID8gKHRoaXMubmFtZSArICcgLyBpZCAnICsgdGhpcy5pZCkgOiAoJ2lkICcgKyB0aGlzLmlkKSk7XG4gICAgICAgIGxldCBoZWFkZXIgPSBgLy8gUHJvZ3JhbTogJHtpbmZvfVxcbmA7XG4gICAgICAgIGxldCBwcmVjaXNpb24gPSAnJztcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCh0aGlzLmdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5nbC5ISUdIX0ZMT0FUKTtcbiAgICAgICAgaWYgKGhpZ2ggJiYgaGlnaC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPVxuICAgICAgICAgICAgaGVhZGVyICtcbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcblxuICAgICAgICAvLyBQcmVjaXNpb24gcXVhbGlmaWVyIG9ubHkgdmFsaWQgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIC8vIE5COiAnI2V4dGVuc2lvbicgc3RhdGVtZW50cyBhZGRlZCB0byBmcmFnbWVudCBzaGFkZXIgb25seSwgYXMgSUUxMSB0aHJvd3MgZXJyb3Igd2hlbiB0aGV5IGFwcGVhciBpblxuICAgICAgICAvLyB2ZXJ0ZXggc2hhZGVyIChldmVuIHdoZW4gZ3VhcmRlZCBieSAjaWZkZWYpLCBhbmQgbm8gV2ViR0wgZXh0ZW5zaW9ucyByZXF1aXJlICcjZXh0ZW5zaW9uJyBpbiB2ZXJ0ZXggc2hhZGVyc1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPVxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyhleHRlbnNpb25zKSArXG4gICAgICAgICAgICBoZWFkZXIgK1xuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBtdWx0aS1saW5lIGJhY2tzbGFzaGVzXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcblxuICAgICAgICAvLyBDb21waWxlICYgc2V0IHVuaWZvcm1zIHRvIGNhY2hlZCB2YWx1ZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IFNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSh0aGlzLmdsLCB0aGlzLnByb2dyYW0sIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSwgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgICAgLy8gc2hhZGVyIGVycm9yIGluZm9cbiAgICAgICAgICAgIGlmIChlcnJvci50eXBlID09PSAndmVydGV4JyB8fCBlcnJvci50eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzID0gZXJyb3IuZXJyb3JzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGUgb2YgdGhpcy5zaGFkZXJfZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGUudHlwZSA9IGVycm9yLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGUuYmxvY2sgPSB0aGlzLmJsb2NrKGVycm9yLnR5cGUsIGUubGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBwcm9ncmFtICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgZXJyb3I6YCwgZXJyb3IpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaEF0dHJpYnV0ZXMoKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGREZWZpbmVMaXN0KCkge1xuICAgICAgICB2YXIgZCwgZGVmaW5lcyA9IHt9O1xuICAgICAgICBmb3IgKGQgaW4gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSB0aGlzLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIHNoYWRlciBibG9ja3MgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkU2hhZGVyQmxvY2tMaXN0KCkge1xuICAgICAgICBsZXQga2V5LCBibG9ja3MgPSB7fTtcblxuICAgICAgICAvLyBHbG9iYWwgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIFNoYWRlclByb2dyYW0uYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLlNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ubWFwKChzb3VyY2UsIG51bSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCBzb3VyY2UsIG51bSwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XSA9IFt7IGtleSwgc291cmNlOiBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9ncmFtLXNwZWNpZmljIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiB0aGlzLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBibG9ja3Nba2V5XSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVzID0gKHRoaXMuYmxvY2tfc2NvcGVzICYmIHRoaXMuYmxvY2tfc2NvcGVzW2tleV0pIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjdXJfc2NvcGUgPSBudWxsLCBudW0gPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYj0wOyBiIDwgdGhpcy5ibG9ja3Nba2V5XS5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVsYXRpdmUgdG8gY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVzW2JdICE9PSBjdXJfc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zY29wZSA9IHNjb3Blc1tiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XVtiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlOiBjdXJfc2NvcGUgfHwgdGhpcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZHJlc3MgZGlzY3JlcGFuY3kgaW4gYXJyYXkgdnMuIHNpbmdsZS12YWx1ZSBibG9ja3NcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXMgYXNzdW1lIGFycmF5IHdoZW4gdHJhY2tpbmcgYmxvY2sgc2NvcGVzXG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7IGtleSwgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiB0aGlzLm5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICBlbnN1cmVVbmlmb3Jtcyh1bmlmb3Jtcykge1xuICAgICAgICBpZiAoIXVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UpO1xuICAgICAgICB2YXIgZnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgIHZhciBpbmplY3QsIHZzX2luamVjdGlvbnMgPSBbXSwgZnNfaW5qZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIHVuaWZvcm0gZGVmaW5pdGlvbnNcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgaW5qZWN0ID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdmVydGV4IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgdnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiB2ZXJ0ZXggc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgdnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgZnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiBmcmFnbWVudCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICBmc19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluamVjdCBtaXNzaW5nIHVuaWZvcm1zXG4gICAgICAgIC8vIE5PVEU6IHRoZXNlIGFyZSBpbmplY3RlZCBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHNoYWRlcnMsIGV2ZW4gYmVmb3JlIGFueSAjZGVmaW5lcyBvciAjcHJhZ21hcyBhcmUgYWRkZWRcbiAgICAgICAgLy8gdGhpcyBjb3VsZCBjYXVzZSBzb21lIGlzc3VlcyB3aXRoIGNlcnRhaW4gI3ByYWdtYXMsIG9yIG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGV4cGVjdCAjZGVmaW5lc1xuICAgICAgICBpZiAodnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB2c19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSBmc19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgd2l0aCBpbmZlcnJlZCB0eXBlc1xuICAgIHNldFVuaWZvcm1zKHVuaWZvcm1zLCByZXNldF90ZXh0dXJlX3VuaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG5cbiAgICAgICAgLy8gVGV4dHVyZSB1bml0cyBtdXN0IGJlIHRyYWNrZWQgYW5kIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHRleHR1cmUgc2FtcGxlciB1bmlmb3JtIGlzIHNldC5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIHRleHR1cmUgdW5pdCBpcyByZXNldCB0byAwIGVhY2ggdGltZSBzZXRVbmlmb3JtcyBpcyBjYWxsZWQsIGJ1dCB0aGV5IGNhblxuICAgICAgICAvLyBhbHNvIGJlIHByZXNlcnZlZCwgZm9yIGV4YW1wbGUgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUgY2FsbHMgdG8gc2V0VW5pZm9ybXMgYXJlIGV4cGVjdGVkXG4gICAgICAgIC8vIChlLmcuIHByb2dyYW0tc3BlY2lmaWMgdW5pZm9ybXMgZm9sbG93ZWQgYnkgbWVzaC1zcGVjaWZpYyBvbmVzKS5cbiAgICAgICAgaWYgKHJlc2V0X3RleHR1cmVfdW5pdCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgdW5pZm9ybSB0eXBlcyBhbmQgdmFsdWVzIGZyb20gdGhlIEpTIG9iamVjdFxuICAgICAgICBjb25zdCBwYXJzZWQgPSBHTFNMLnBhcnNlVW5pZm9ybXModW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIFNldCBlYWNoIHVuaWZvcm1cbiAgICAgICAgZm9yIChsZXQgdT0wOyB1IDwgcGFyc2VkLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gcGFyc2VkW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0udHlwZSA9PT0gJ3NhbXBsZXIyRCcpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGV4dHVyZXMsIHdlIG5lZWQgdG8gdHJhY2sgdGV4dHVyZSB1bml0cywgc28gd2UgaGF2ZSBhIHNwZWNpYWwgc2V0dGVyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmb3JtKHVuaWZvcm0ubWV0aG9kLCB1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgc29tZSBvciBhbGwgdW5pZm9ybSB2YWx1ZXMgc28gdGhleSBjYW4gYmUgcmVzdG9yZWRcbiAgICBzYXZlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0uc2F2ZWRfdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0ID0gdGhpcy50ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHNvbWUgb3IgYWxsIHVuaWZvcm1zIHRvIHNhdmVkIHZhbHVlc1xuICAgIHJlc3RvcmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtICYmIHVuaWZvcm0uc2F2ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gdW5pZm9ybS5zYXZlZF92YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHRleHR1cmUgdW5pZm9ybSwgZmluZHMgdGV4dHVyZSBieSBuYW1lIG9yIGNyZWF0ZXMgYSBuZXcgb25lXG4gICAgc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybV9uYW1lLCB0ZXh0dXJlX25hbWUpIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RleHR1cmVfbmFtZV07XG4gICAgICAgIGlmICh0ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBDYW5ub3QgZmluZCB0ZXh0dXJlICcke3RleHR1cmVfbmFtZX0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0dXJlLmJpbmQodGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnVuaWZvcm0oJzFpJywgdW5pZm9ybV9uYW1lLCB0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0Kys7IC8vIFRPRE86IHRyYWNrIG1heCB0ZXh0dXJlIHVuaXRzIGFuZCBsb2cvdGhyb3cgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gZXg6IHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3Bvc2l0aW9uJywgW3gsIHksIHpdKTtcbiAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcbiAgICB1bmlmb3JtKG1ldGhvZCwgbmFtZSwgdmFsdWUpIHsgLy8gJ3ZhbHVlJyBpcyBhIG1ldGhvZC1hcHByb3ByaWF0ZSBhcmd1bWVudHMgbGlzdFxuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5pZm9ybXNbbmFtZV0gPSB0aGlzLnVuaWZvcm1zW25hbWVdIHx8IHt9O1xuICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbbmFtZV07XG4gICAgICAgIHVuaWZvcm0ubmFtZSA9IG5hbWU7XG4gICAgICAgIGlmICh1bmlmb3JtLmxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHVuaWZvcm0ubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB1bmlmb3JtLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSBzaW5nbGUgdW5pZm9ybVxuICAgIHVwZGF0ZVVuaWZvcm0odW5pZm9ybSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdW5pZm9ybSB8fCB1bmlmb3JtLmxvY2F0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMuY29tbWl0VW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXRzIHRoZSB1bmlmb3JtIHRvIHRoZSBHUFVcbiAgICBjb21taXRVbmlmb3JtKHVuaWZvcm0pe1xuICAgICAgICBsZXQgbG9jYXRpb24gPSB1bmlmb3JtLmxvY2F0aW9uO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pZm9ybS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJzFpJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaShsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2YobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2l2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXgzZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCB1bmlmb3JtIGxvY2F0aW9ucyBhbmQgc2V0IHRvIGxhc3QgY2FjaGVkIHZhbHVlc1xuICAgIHJlZnJlc2hVbmlmb3JtcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciB1IGluIHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmcmVzaEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIC8vIHZhciBsZW4gPSB0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCB0aGlzLmdsLkFDVElWRV9BVFRSSUJVVEVTKTtcbiAgICAgICAgLy8gZm9yICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gICAgIHZhciBhID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBpKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIGEgdmVydGV4IGF0dHJpYnV0ZVxuICAgIGF0dHJpYnV0ZShuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dHJpYiA9ICh0aGlzLmF0dHJpYnNbbmFtZV0gPSB0aGlzLmF0dHJpYnNbbmFtZV0gfHwge30pO1xuICAgICAgICBpZiAoYXR0cmliLmxvY2F0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWIubmFtZSA9IG5hbWU7XG4gICAgICAgIGF0dHJpYi5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcblxuICAgICAgICAvLyB2YXIgaW5mbyA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgYXR0cmliLmxvY2F0aW9uKTtcbiAgICAgICAgLy8gYXR0cmliLnR5cGUgPSBpbmZvLnR5cGU7XG4gICAgICAgIC8vIGF0dHJpYi5zaXplID0gaW5mby5zaXplO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgc3RyaW5nXG4gICAgc291cmNlKHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIGFycmF5IG9mIGxpbmUgc3RyaW5nc1xuICAgIGxpbmVzKHR5cGUpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc291cmNlKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgbGluZSBmcm9tIHNoYWRlciBzb3VyY2VcbiAgICBsaW5lKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZVtudW1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGluZm8gb24gd2hpY2ggc2hhZGVyIGJsb2NrIChpZiBhbnkpIGEgcGFydGljdWxhciBsaW5lIG51bWJlciBpbiBhIHNoYWRlciBpcyBpblxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBpbmZvIGlmIGEgYmxvY2sgaXMgZm91bmQ6IHsgbmFtZSwgbGluZSwgc291cmNlIH1cbiAgICAvLyAgc2NvcGU6IHdoZXJlIHRoZSBzaGFkZXIgYmxvY2sgb3JpZ2luYXRlZCwgZWl0aGVyIGEgc3R5bGUgbmFtZSwgb3IgZ2xvYmFsIHN1Y2ggYXMgU2hhZGVyUHJvZ3JhbVxuICAgIC8vICBuYW1lOiBzaGFkZXIgYmxvY2sgbmFtZSAoZS5nLiAnY29sb3InLCAncG9zaXRpb24nLCAnZ2xvYmFsJylcbiAgICAvLyAgbnVtOiB0aGUgYmxvY2sgbnVtYmVyICp3aXRoaW4qIGxvY2FsIHNjb3BlIChlLmcuIGlmIGEgc3R5bGUgaGFzIG11bHRpcGxlICdjb2xvcicgYmxvY2tzKVxuICAgIC8vICBsaW5lOiBsaW5lIG51bWJlciAqd2l0aGluKiB0aGUgc2hhZGVyIGJsb2NrIChub3QgdGhlIHdob2xlIHNoYWRlciBwcm9ncmFtKSwgdXNlZnVsIGZvciBlcnJvciBoaWdobGlnaHRpbmdcbiAgICAvLyAgc291cmNlOiB0aGUgY29kZSBmb3IgdGhlIGxpbmVcbiAgICAvLyBOT1RFOiB0aGlzIGRvZXMgYSBicnV0ZWZvcmNlIGxvb3Agb3ZlciB0aGUgc2hhZGVyIHNvdXJjZSBhbmQgbG9va3MgZm9yIHNoYWRlciBibG9jayBzdGFydC9lbmQgbWFya2Vyc1xuICAgIC8vIFdlIGNvdWxkIHRyYWNrIGxpbmUgcmFuZ2VzIGZvciBzaGFkZXIgYmxvY2tzIGFzIHRoZXkgYXJlIGluc2VydGVkLCBidXQgYXMgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBlcnJvciBoYW5kbGluZyBvbiBjb21waWxhdGlvbiBmYWlsdXJlLCBpdCB3YXMgc2ltcGxlciB0byBrZWVwIGl0IHNlcGFyYXRlIHRoYW4gdG8gYnVyZGVuIHRoZSBjb3JlXG4gICAgLy8gY29tcGlsYXRpb24gcGF0aC5cbiAgICBibG9jayh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IGxpbmVzID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgbGV0IGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW0gJiYgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stc3RhcnQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICBibG9jayA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgbnVtOiBtYXRjaFszXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLWVuZDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBudWxsOyAvLyBjbGVhciBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSAjIGFuZCBjb250ZW50XG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyBpbml0IHRvIC0xIHNvIHRoYXQgbGluZSAwIGlzIGZpcnN0IGFjdHVhbCBsaW5lIG9mIGJsb2NrIGNvZGUsIGFmdGVyIGNvbW1lbnQgbWFya2VyXG4gICAgICAgICAgICAgICAgYmxvY2subGluZSA9IChibG9jay5saW5lID09IG51bGwpID8gLTEgOiBibG9jay5saW5lICsgMTtcbiAgICAgICAgICAgICAgICBibG9jay5zb3VyY2UgPSBsaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGxpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMgZnJvbSB0aG9zZSByZXF1ZXN0ZWRcbiAgICAvLyBTZXRzIGludGVybmFsICNkZWZpbmVzIGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IG9mIGVhY2ggcmVxdWVzdGVkIGV4dGVuc2lvblxuICAgIGNoZWNrRXh0ZW5zaW9ucygpIHtcbiAgICAgICAgbGV0IGV4dHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiB0aGlzLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24odGhpcy5nbCwgbmFtZSk7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fRVhURU5TSU9OXyR7bmFtZX1gO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmluZXNbZGVmXSA9IChleHQgIT0gbnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHRzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYENvdWxkIG5vdCBlbmFibGUgZXh0ZW5zaW9uICcke25hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5TaGFkZXJQcm9ncmFtLmlkID0gMDsgICAgICAgICAgIC8vIGFzc2lnbiBlYWNoIHByb2dyYW0gYSB1bmlxdWUgaWRcblNoYWRlclByb2dyYW0ucHJvZ3JhbXMgPSB7fTsgICAgLy8gcHJvZ3JhbXMsIGJ5IGlkXG5TaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSBudWxsOyAgIC8vIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtXG5cbi8vIEdsb2JhbCBjb25maWcgYXBwbGllZCB0byBhbGwgcHJvZ3JhbXMgKGR1cGxpY2F0ZSBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHByb2dyYW0gd2lsbCB0YWtlIHByZWNlZGVuY2UpXG5TaGFkZXJQcm9ncmFtLmRlZmluZXMgPSB7fTtcblNoYWRlclByb2dyYW0uYmxvY2tzID0ge307XG5cbi8vIFR1cm4gYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2RlZmluZSBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nID0gZnVuY3Rpb24gKGRlZmluZXMpIHtcbiAgICB2YXIgZGVmaW5lX3N0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgZCBpbiBkZWZpbmVzKSB7XG4gICAgICAgIGlmIChkZWZpbmVzW2RdID09IG51bGwgfHwgZGVmaW5lc1tkXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnYm9vbGVhbicgJiYgZGVmaW5lc1tkXSA9PT0gdHJ1ZSkgeyAvLyBib29sZWFucyBhcmUgc2ltcGxlIGRlZmluZXMgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihkZWZpbmVzW2RdKSA9PT0gZGVmaW5lc1tkXSkgeyAvLyBpbnQgdG8gZmxvYXQgY29udmVyc2lvbiB0byBzYXRpc2Z5IEdMU0wgZmxvYXRzXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0udG9GaXhlZCgxKSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGFueSBvdGhlciBmbG9hdCBvciBzdHJpbmcgdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmluZV9zdHI7XG59O1xuXG4vLyBUdXJuIGEgbGlzdCBvZiBleHRlbnNpb24gbmFtZXMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNleHRlbnNpb24gc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyA9IGZ1bmN0aW9uIChleHRlbnNpb25zKSB7XG4gICAgZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwgW107XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChsZXQgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgc3RyICs9IGAjaWZkZWYgR0xfJHtleHR9XFxuI2V4dGVuc2lvbiBHTF8ke2V4dH0gOiBlbmFibGVcXG4jZW5kaWZcXG5gO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldIHx8IFtdO1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ucHVzaCguLi5ibG9ja3MpO1xufTtcblxuLy8gUmVtb3ZlIGFsbCBnbG9iYWwgc2hhZGVyIGJsb2NrcyBmb3IgYSBnaXZlbiBrZXlcblNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2sgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFtdO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKGtleSk7XG4gICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhrZXksIC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBDb21waWxlICYgbGluayBhIFdlYkdMIHByb2dyYW0gZnJvbSBwcm92aWRlZCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzXG4vLyB1cGRhdGUgYSBwcm9ncmFtIGlmIG9uZSBpcyBwYXNzZWQgaW4uIENyZWF0ZSBvbmUgaWYgbm90LiBBbGVydCBhbmQgZG9uJ3QgdXBkYXRlIGFueXRoaW5nIGlmIHRoZSBzaGFkZXJzIGRvbid0IGNvbXBpbGUuXG5TaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0gPSBmdW5jdGlvbiAoZ2wsIHByb2dyYW0sIHZlcnRleF9zaGFkZXJfc291cmNlLCBmcmFnbWVudF9zaGFkZXJfc291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHZlcnRleF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgZnJhZ21lbnRfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICBpZiAocHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRfc2hhZGVycyA9IGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9sZF9zaGFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgb2xkX3NoYWRlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB9XG5cbiAgICBpZiAodmVydGV4X3NoYWRlciA9PSBudWxsIHx8IGZyYWdtZW50X3NoYWRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXZWJHTCBwcm9ncmFtIGVycm9yOlxuICAgICAgICAgICAgVkFMSURBVEVfU1RBVFVTOiAke2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKX1cbiAgICAgICAgICAgIEVSUk9SOiAke2dsLmdldEVycm9yKCl9XG4gICAgICAgICAgICAtLS0gVmVydGV4IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7dmVydGV4X3NoYWRlcl9zb3VyY2V9XG4gICAgICAgICAgICAtLS0gRnJhZ21lbnQgU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHtmcmFnbWVudF9zaGFkZXJfc291cmNlfWApO1xuXG4gICAgICAgIGxldCBlcnJvciA9IHsgdHlwZTogJ3Byb2dyYW0nLCBtZXNzYWdlIH07XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG4vLyBDb21waWxlIGEgdmVydGV4IG9yIGZyYWdtZW50IHNoYWRlciBmcm9tIHByb3ZpZGVkIHNvdXJjZVxuU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIgPSBmdW5jdGlvbiAoZ2wsIHNvdXJjZSwgc3R5cGUpIHtcbiAgICBsZXQgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHN0eXBlKTtcblxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IHR5cGUgPSAoc3R5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICAgICAgbGV0IGVycm9ycyA9IHBhcnNlU2hhZGVyRXJyb3JzKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyB7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycyB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFkZXI7XG59O1xuIiwiLy8gVGV4dHVyZSBtYW5hZ2VtZW50XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4uL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG4vLyBHTCB0ZXh0dXJlIHdyYXBwZXIgb2JqZWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIGEgZ2xvYmFsIHNldCBvZiB0ZXh0dXJlcywga2V5ZWQgYnkgYSB1bmlxdWUgdXNlci1kZWZpbmVkIG5hbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDsgICAgLy8gYSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGlzIHRleHR1cmVcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhcyBleHBlY3RlZFxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nO1xuICAgICAgICB0aGlzLnNwcml0ZXMgPSBvcHRpb25zLnNwcml0ZXM7XG4gICAgICAgIHRoaXMudGV4Y29vcmRzID0ge307ICAgIC8vIHNwcml0ZSBVVnMgKFswLCAxXSByYW5nZSlcbiAgICAgICAgdGhpcy5zaXplcyA9IHt9OyAgICAgICAgLy8gc3ByaXRlIHNpemVzIChwaXhlbCBzaXplKVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG5cbiAgICAgICAgLy8gRGVzdHJveSBwcmV2aW91cyB0ZXh0dXJlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgcHJldmlvdXMgcmV0YWluIGNvdW50XG4gICAgICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQ7XG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50ID0gMDsgLy8gYWxsb3cgdG8gYmUgZnJlZWRcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0ZXh0dXJlIGluc3RhbmNlIGFuZCBkZWZpbml0aW9uXG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZV9jb25maWdzW3RoaXMubmFtZV0gPSBPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucyk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgY3JlYXRpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KHsgZm9yY2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGRlc3Ryb3lpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXTtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGRlc3Ryb3lpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXRhaW4gKCkge1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCsrO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiByZWxlYXNpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbl9jb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKHVuaXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYWN0aXZlVW5pdCAhPT0gdW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgIFRleHR1cmUuYWN0aXZlVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7IC8vIHRleHR1cmUgbXVzdCBiZSByZS1ib3VuZCB3aGVuIHVuaXQgY2hhbmdlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYm91bmRUZXh0dXJlICE9PSB0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ3VybCc7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2VsZW1lbnQnO1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KG9wdGlvbnMuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZGF0YSc7XG4gICAgICAgICAgICB0aGlzLnNldERhdGEob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQsIG9wdGlvbnMuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPVxuICAgICAgICAgICAgKHRoaXMubG9hZGluZyAmJiB0aGlzLmxvYWRpbmcudGhlbigoKSA9PiB7IHRoaXMuY2FsY3VsYXRlU3ByaXRlcygpOyByZXR1cm4gdGhpczsgfSkpIHx8XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYmFzZV91cmwpIHtcbiAgICAgICAgICAgIHVybCA9IFV0aWxzLmFkZEJhc2VVUkwodXJsLCBUZXh0dXJlLmJhc2VfdXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXJsID0gdXJsOyAvLyBzYXZlIFVSTCByZWZlcmVuY2UgKHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiBlbGVtZW50IGlzIGxvYWRlZCBiZWxvdylcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnVybDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICd1cmwnO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChpbWFnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBmcm9tICR7dGhpcy5zb3VyY2V9YCwgZXJyb3I6IGUsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIHJlc29sdmUgb24gZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1ZyBsb2FkaW5nIGRhdGEtVVJMIGltYWdlcyB3aXRoIENPUlMgZW5hYmxlZCwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICAgICAgICAgIGlmICghKFV0aWxzLmlzU2FmYXJpKCkgJiYgdGhpcy5zb3VyY2Uuc2xpY2UoMCwgNSkgPT09ICdkYXRhOicpKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSB0byBhIHJhdyBpbWFnZSBidWZmZXJcbiAgICBzZXREYXRhKHdpZHRoLCBoZWlnaHQsIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdkYXRhJztcblxuICAgICAgICAvLyBDb252ZXJ0IHJlZ3VsYXIgYXJyYXkgdG8gdHlwZWQgYXJyYXlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSB0ZXh0dXJlIHRvIHRyYWNrIGEgZWxlbWVudCAoY2FudmFzL2ltYWdlKVxuICAgIHNldEVsZW1lbnQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vIGEgc3RyaW5nIGVsZW1lbnQgaXMgaW50ZXJwZXRlZCBhcyBhIENTUyBzZWxlY3RvclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdlbGVtZW50JztcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbXNnID0gYHRoZSAnZWxlbWVudCcgcGFyYW1ldGVyIChcXGBlbGVtZW50OiAke0pTT04uc3RyaW5naWZ5KGVsKX1cXGApIG11c3QgYmUgYSBDU1MgYDtcbiAgICAgICAgICAgIG1zZyArPSBgc2VsZWN0b3Igc3RyaW5nLCBvciBhIDxjYW52YXM+LCA8aW1hZ2U+IG9yIDx2aWRlbz4gb2JqZWN0YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiAke21zZ31gLCBvcHRpb25zKTtcbiAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgYmVjYXVzZSAke21zZ31gLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVXBsb2FkcyBjdXJyZW50IGltYWdlIG9yIGJ1ZmZlciB0byB0aGUgR1BVIChjYW4gYmUgdXNlZCB0byB1cGRhdGUgYW5pbWF0ZWQgdGV4dHVyZXMgb24gdGhlIGZseSlcbiAgICB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAob3B0aW9ucy5VTlBBQ0tfRkxJUF9ZX1dFQkdMID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSkpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBvcHRpb25zLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCB8fCBmYWxzZSk7XG5cbiAgICAgICAgLy8gSW1hZ2Ugb3IgQ2FudmFzIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8XG4gICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICYmIHRoaXMuc291cmNlLmNvbXBsZXRlKSkge1xuXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2Uud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuc291cmNlLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYXcgaW1hZ2UgYnVmZmVyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlX3R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRleHR1cmUudHJpZ2dlcigndXBkYXRlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBmaWx0ZXJpbmcgbW9kZVxuICAgIHNldEZpbHRlcmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nIHx8ICdsaW5lYXInO1xuXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIC8vIEZvciBwb3dlci1vZi0yIHRleHR1cmVzLCB0aGUgZm9sbG93aW5nIHByZXNldHMgYXJlIGF2YWlsYWJsZTpcbiAgICAgICAgLy8gbWlwbWFwOiBsaW5lYXIgYmxlbmQgZnJvbSBuZWFyZXN0IG1pcFxuICAgICAgICAvLyBsaW5lYXI6IGxpbmVhciBibGVuZCBmcm9tIG9yaWdpbmFsIGltYWdlIChubyBtaXBzKVxuICAgICAgICAvLyBuZWFyZXN0OiBuZWFyZXN0IHBpeGVsIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMsICdibG9ja3knIGxvb2spXG4gICAgICAgIGlmIChVdGlscy5pc1Bvd2VyT2YyKHRoaXMud2lkdGgpICYmIFV0aWxzLmlzUG93ZXJPZjIodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSB0cnVlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgb3B0aW9ucy5URVhUVVJFX1dSQVBfUyB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1QgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ21pcG1hcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdtaXBtYXAnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7IC8vIFRPRE86IHVzZSB0cmlsaW5lYXIgZmlsdGVyaW5nIGJ5IGRlZnVhbHQgaW5zdGVhZD9cbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIGhhcyBzdHJpY3QgcmVxdWlyZW1lbnRzIG9uIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzOlxuICAgICAgICAgICAgLy8gTm8gbWlwbWFwcyBhbmQgbXVzdCBjbGFtcCB0byBlZGdlXG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSBmYWxzZTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBkZWZhdWx0IHRvIGxpbmVhciBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdsaW5lYXInO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBQcmUtY2FsYyBzcHJpdGUgcmVnaW9ucyBmb3IgYSB0ZXh0dXJlIHNwcml0ZSBpbiBVViBbMCwgMV0gc3BhY2VcbiAgICBjYWxjdWxhdGVTcHJpdGVzKCkge1xuICAgICAgICBpZiAodGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRoaXMuc3ByaXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBzcHJpdGUgPSB0aGlzLnNwcml0ZXNbc107XG5cbiAgICAgICAgICAgICAgICAvLyBNYXAgWzAsIDBdIHRvIFsxLCAxXSBjb29yZHMgdG8gdGhlIGFwcHJvcHJpYXRlIHNwcml0ZSBzdWItYXJlYSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzW3NdID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMF0sIHNwcml0ZVsxXV0sXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMl0sIHNwcml0ZVszXV0sXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZSBvZiBzcHJpdGVcbiAgICAgICAgICAgICAgICB0aGlzLnNpemVzW3NdID0gW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYy9jbGFzcyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5UZXh0dXJlLmNyZWF0ZSA9IGZ1bmN0aW9uIChnbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVGV4dHVyZShnbCwgbmFtZSwgb3B0aW9ucyk7XG59O1xuXG5UZXh0dXJlLnJldGFpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZXRhaW4oKTtcbiAgICB9XG59O1xuXG5UZXh0dXJlLnJlbGVhc2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbbmFtZV0ucmVsZWFzZSgpO1xuICAgIH1cbn07XG5cbi8vIERlc3Ryb3kgYWxsIHRleHR1cmUgaW5zdGFuY2VzIGZvciBhIGdpdmVuIEdMIGNvbnRleHRcblRleHR1cmUuZGVzdHJveSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHZhciB0ZXh0dXJlcyA9IE9iamVjdC5rZXlzKFRleHR1cmUudGV4dHVyZXMpO1xuICAgIGZvciAodmFyIHQgb2YgdGV4dHVyZXMpIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICBpZiAodGV4dHVyZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgIHRleHR1cmUuZGVzdHJveSh7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gR2V0IHNwcml0ZSBwaXhlbCBzaXplIGFuZCBVVnNcblRleHR1cmUuZ2V0U3ByaXRlSW5mbyA9IGZ1bmN0aW9uICh0ZXhuYW1lLCBzcHJpdGUpIHtcbiAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4bmFtZV07XG4gICAgcmV0dXJuIHRleHR1cmUgJiYgeyBzaXplOiB0ZXh0dXJlLnNpemVzW3Nwcml0ZV0sIHRleGNvb3JkczogdGV4dHVyZS50ZXhjb29yZHNbc3ByaXRlXSB9O1xufTtcblxuLy8gUmUtc2NhbGUgVVZzIGZyb20gWzAsIDFdIHJhbmdlIHRvIGEgc21hbGxlciBhcmVhIHdpdGhpbiB0aGUgaW1hZ2VcblRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlID0gZnVuY3Rpb24gKGFyZWFfb3JpZ2luLCBhcmVhX3NpemUsIHRleF9zaXplKSB7XG4gICAgdmFyIGFyZWFfb3JpZ2luX3kgPSB0ZXhfc2l6ZVsxXSAtIGFyZWFfb3JpZ2luWzFdIC0gYXJlYV9zaXplWzFdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgYXJlYV9vcmlnaW5bMF0gLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgYXJlYV9vcmlnaW5feSAvIHRleF9zaXplWzFdLFxuICAgICAgICAoYXJlYV9zaXplWzBdICsgYXJlYV9vcmlnaW5bMF0pIC8gdGV4X3NpemVbMF0sXG4gICAgICAgIChhcmVhX3NpemVbMV0gKyBhcmVhX29yaWdpbl95KSAvIHRleF9zaXplWzFdXG4gICAgXTtcbn07XG5cbi8vIENyZWF0ZSBhIHNldCBvZiB0ZXh0dXJlcyBrZXllZCBpbiBhbiBvYmplY3Rcbi8vIE9wdGlvbmFsbHkgbG9hZCBlYWNoIGlmIGl0IGhhcyBhIFVSTCBzcGVjaWZpZWRcblRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCA9IGZ1bmN0aW9uIChnbCwgdGV4dHVyZXMpIHtcbiAgICBsZXQgbG9hZGluZyA9IFtdO1xuICAgIGlmICh0ZXh0dXJlcykge1xuICAgICAgICBmb3IgKGxldCB0ZXhuYW1lIGluIHRleHR1cmVzKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gdGV4dHVyZXNbdGV4bmFtZV07XG5cbiAgICAgICAgICAgIC8vIElmIHRleHR1cmUgYWxyZWFkeSBleGlzdHMgYW5kIGRlZmluaXRpb24gaGFzbid0IGNoYW5nZWQsIG5vIG5lZWQgdG8gcmUtY3JlYXRlXG4gICAgICAgICAgICAvLyBOb3RlOiB0byBhdm9pZCBmbGlja2VyIHdoZW4gb3RoZXIgdGV4dHVyZXMvc2NlbmUgaXRlbXMgY2hhbmdlXG4gICAgICAgICAgICBpZiAoIVRleHR1cmUuY2hhbmdlZCh0ZXhuYW1lLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoZ2wsIHRleG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICBsb2FkaW5nLnB1c2godGV4dHVyZS5sb2FkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZyk7XG59O1xuXG4vLyBDcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSAoMXgxIHBpeGVsKSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXJcbi8vIChmb3IgZXhhbXBsZSB0byBwcmV2ZW50IEdMIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgdW5ib3VuZCB0ZXh0dXJlcylcblRleHR1cmUuZGVmYXVsdCA9ICdfX2RlZmF1bHQnO1xuVGV4dHVyZS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlKGdsLCBUZXh0dXJlLmRlZmF1bHQpO1xufTtcblxuLy8gSW5kaWNhdGUgaWYgYSB0ZXh0dXJlIGRlZmluaXRpb24gd291bGQgYmUgYSBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBjYWNoZVxuVGV4dHVyZS5jaGFuZ2VkID0gZnVuY3Rpb24gKG5hbWUsIGNvbmZpZykge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4dHVyZSkgeyAvLyBjYWNoZWQgdGV4dHVyZVxuICAgICAgICAvLyBjYW52YXMvaW1hZ2UtYmFzZWQgdGV4dHVyZXMgYXJlIGNvbnNpZGVyZWQgZHluYW1pYyBhbmQgYWx3YXlzIHJlZnJlc2hcbiAgICAgICAgaWYgKHRleHR1cmUuY29uZmlnX3R5cGUgPT09ICdlbGVtZW50JyB8fCBjb25maWcuZWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbXBhcmUgZGVmaW5pdGlvbnNcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KFRleHR1cmUudGV4dHVyZV9jb25maWdzW25hbWVdKSA9PT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIGNvbmZpZykpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgbWV0YWRhdGEgZm9yIGEgdGV4dHVyZSBieSBuYW1lXG4vLyBSZXR1cm5zIHZpYSBwcm9taXNlLCBpbiBjYXNlIHRleHR1cmUgaXMgc3RpbGwgbG9hZGluZ1xuLy8gQ2FuIGJlIGNhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gc3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG5UZXh0dXJlLmdldEluZm8gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIC8vIEdldCBpbmZvIGZvciBhbGwgdGV4dHVyZXMgYnkgZGVmYXVsdFxuICAgIGlmICghbmFtZSkge1xuICAgICAgICBuYW1lID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IG11bHRpcGxlIHRleHR1cmVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5hbWUubWFwKG4gPT4gVGV4dHVyZS5nZXRJbmZvKG4pKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNpbmdsZSB0ZXh0dXJlXG4gICAgdmFyIHRleCA9IFRleHR1cmUudGV4dHVyZXNbbmFtZV07XG4gICAgaWYgKHRleCkge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHRleHR1cmUgdG8gZmluaXNoIGxvYWRpbmcsIG9yIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICB2YXIgbG9hZGluZyA9IHRleC5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0ZXgpO1xuICAgICAgICByZXR1cm4gbG9hZGluZy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJldHVybiBhIHN1YnNldCBvZiB0ZXh0dXJlIGluZm9cbiAgICAgICAgICAgIC8vIChjb21wYXRpYmxlIHcvc3RydWN0dXJlZCBjbG9uaW5nLCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBhIHdvcmtlcilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGV4Lm5hbWUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRleC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRleC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgc3ByaXRlczogdGV4LnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRzOiB0ZXgudGV4Y29vcmRzLFxuICAgICAgICAgICAgICAgIHNpemVzOiB0ZXguc2l6ZXMsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiB0ZXguZmlsdGVyaW5nLFxuICAgICAgICAgICAgICAgIHBvd2VyX29mXzI6IHRleC5wb3dlcl9vZl8yLFxuICAgICAgICAgICAgICAgIHZhbGlkOiB0ZXgudmFsaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTm8gdGV4dHVyZSBmb3VuZFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbn07XG5cbi8vIFN5bmMgdGV4dHVyZSBpbmZvIHRvIHdvcmtlclxuLy8gQ2FsbGVkIGZyb20gd29ya2VyLCBnZXRzIGluZm8gb24gb25lIG9yIG1vcmUgdGV4dHVyZXMgaW5mbyBmcm9tIG1haW4gdGhyZWFkIHZpYSByZW1vdGUgY2FsbCwgdGhlbiBzdG9yZXMgaXRcbi8vIGxvY2FsbHkgaW4gd29ya2VyLiAndGV4dHVyZXMnIGNhbiBiZSBhbiBhcnJheSBvZiB0ZXh0dXJlIG5hbWVzIHRvIHN5bmMsIG9yIGlmIG51bGwsIGFsbCB0ZXh0dXJlcyBhcmUgc3luY2VkLlxuVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlciA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ1RleHR1cmUuZ2V0SW5mbycsIG5hbWVzKS5cbiAgICAgICAgdGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICBmb3IgKHZhciB0ZXggb2YgdGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RleC5uYW1lXSA9IHRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzO1xuICAgICAgICB9KTtcbn07XG5cbi8vIFJlcG9ydCBtYXggdGV4dHVyZSBzaXplIGZvciBhIEdMIGNvbnRleHRcblRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xufTtcblxuLy8gR2xvYmFsIHNldCBvZiB0ZXh0dXJlcywgYnkgbmFtZVxuVGV4dHVyZS50ZXh0dXJlcyA9IHt9O1xuVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3MgPSB7fTtcblRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDtcblRleHR1cmUuYWN0aXZlVW5pdCA9IG51bGw7XG5cblRleHR1cmUuYmFzZV91cmwgPSBudWxsOyAvLyBvcHRpb25hbCBiYXNlIFVSTCB0byBhZGQgdG8gdGV4dHVyZXNcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVGV4dHVyZScsIFRleHR1cmUpO1xuc3Vic2NyaWJlTWl4aW4oVGV4dHVyZSk7XG4iLCIvLyBDcmVhdGVzIGEgVmVydGV4IEFycmF5IE9iamVjdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayBvbiBzdGFuZGFyZCBhdHRyaWJ1dGUgY2FsbHNcblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgVmVydGV4QXJyYXlPYmplY3Q7XG5leHBvcnQgZGVmYXVsdCBWZXJ0ZXhBcnJheU9iamVjdCA9IHt9O1xuXG5WZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IGZhbHNlOyAgICAgIC8vIHNldCB0byB0cnVlIHRvIGRpc2FibGUgVkFPcyBldmVuIGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcblZlcnRleEFycmF5T2JqZWN0LmV4dCA9IG5ldyBNYXAoKTsgICAgICAgLy8gVkFPIGV4dGVuc2lvbnMsIGJ5IEdMIGNvbnRleHRcblZlcnRleEFycmF5T2JqZWN0LmJvdW5kX3ZhbyA9IG5ldyBNYXAoKTsgLy8gY3VycmVudGx5IGJvdW5kIFZBTywgYnkgR0wgY29udGV4dFxuXG5WZXJ0ZXhBcnJheU9iamVjdC5pbml0ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgaWYgKFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmV4dC5zZXQoZ2wsIGdsLmdldEV4dGVuc2lvbihcIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0XCIpKTtcbiAgICB9XG5cbiAgICBpZiAoVmVydGV4QXJyYXlPYmplY3QuZXh0LmdldChnbCkgIT0gbnVsbCkge1xuICAgICAgICBsb2coJ2luZm8nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBOT1QgYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsb2coJ3dhcm4nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gZm9yY2UgZGlzYWJsZWQnKTtcbiAgICB9XG59O1xuXG5WZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAoZ2wsIHNldHVwLCB0ZWFyZG93bikge1xuICAgIGxldCB2YW8gPSB7fTtcbiAgICB2YW8uc2V0dXAgPSBzZXR1cDtcbiAgICB2YW8udGVhcmRvd24gPSB0ZWFyZG93bjtcblxuICAgIGxldCBleHQgPSBWZXJ0ZXhBcnJheU9iamVjdC5leHQuZ2V0KGdsKTtcbiAgICBpZiAoZXh0ICE9IG51bGwpIHtcbiAgICAgICAgdmFvLl92YW8gPSBleHQuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgfVxuXG4gICAgdmFvLnNldHVwKHRydWUpO1xuXG4gICAgcmV0dXJuIHZhbztcbn07XG5cblZlcnRleEFycmF5T2JqZWN0LmJpbmQgPSBmdW5jdGlvbiAoZ2wsIHZhbykge1xuICAgIGxldCBleHQgPSBWZXJ0ZXhBcnJheU9iamVjdC5leHQuZ2V0KGdsKTtcbiAgICBpZiAodmFvICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIHZhby5fdmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYm91bmRfdmFvLnNldChnbCwgdmFvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhby5zZXR1cChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBib3VuZF92YW8gPSBWZXJ0ZXhBcnJheU9iamVjdC5ib3VuZF92YW8uZ2V0KGdsKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJvdW5kX3ZhbyAhPSBudWxsICYmIHR5cGVvZiBib3VuZF92YW8udGVhcmRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGJvdW5kX3Zhby50ZWFyZG93bigpO1xuICAgICAgICB9XG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJvdW5kX3Zhby5zZXQoZ2wsIG51bGwpO1xuICAgIH1cbn07XG5cblZlcnRleEFycmF5T2JqZWN0LmRlc3Ryb3kgPSBmdW5jdGlvbiAoZ2wsIHZhbykge1xuICAgIGxldCBleHQgPSBWZXJ0ZXhBcnJheU9iamVjdC5leHQuZ2V0KGdsKTtcbiAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICBleHQuZGVsZXRlVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICB2YW8uX3ZhbyA9IG51bGw7XG4gICAgfVxuICAgIC8vIGRlc3Ryb3kgaXMgYSBuby1vcCBpZiBWQU8gZXh0ZW5zaW9uIGlzbid0IGF2YWlsYWJsZVxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgZm9yIHByaW1pdGl2ZXNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmFvJztcblxuLy8gQSBzaW5nbGUgbWVzaC9WQk8sIGRlc2NyaWJlZCBieSBhIHZlcnRleCBsYXlvdXQsIHRoYXQgY2FuIGJlIGRyYXduIHdpdGggb25lIG9yIG1vcmUgcHJvZ3JhbXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZCT01lc2ggIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfZGF0YSwgZWxlbWVudF9kYXRhLCB2ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZGF0YSA9IHZlcnRleF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLmVsZW1lbnRfZGF0YSA9IGVsZW1lbnRfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3X21vZGUgPSBvcHRpb25zLmRyYXdfbW9kZSB8fCB0aGlzLmdsLlRSSUFOR0xFUztcbiAgICAgICAgdGhpcy5kYXRhX3VzYWdlID0gb3B0aW9ucy5kYXRhX3VzYWdlIHx8IHRoaXMuZ2wuU1RBVElDX0RSQVc7XG4gICAgICAgIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5ID0gMzsgLy8gVE9ETzogc3VwcG9ydCBsaW5lcywgc3RyaXAsIGZhbiwgZXRjLlxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5yZXRhaW4gPSBvcHRpb25zLnJldGFpbiB8fCBmYWxzZTsgLy8gd2hldGhlciB0byByZXRhaW4gbWVzaCBkYXRhIGluIENQVSBhZnRlciB1cGxvYWRpbmcgdG8gR1BVXG4gICAgICAgIHRoaXMuY3JlYXRlZF9hdCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IG9wdGlvbnMuZmFkZV9pbl90aW1lIHx8IDA7IC8vIG9wdGlvbmFsIHRpbWUgdG8gZmFkZSBpbiBtZXNoXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSB0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZhb3MgPSBuZXcgTWFwKCk7IC8vIG1hcCBvZiBWZXJ0ZXhBcnJheU9iamVjdHMsIGtleWVkIGJ5IHByb2dyYW1cblxuICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRfZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9jb3VudCA9IHRoaXMuZWxlbWVudF9kYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlfY291bnQgPSB0aGlzLmVsZW1lbnRfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF90eXBlID0gKHRoaXMuZWxlbWVudF9kYXRhLmNvbnN0cnVjdG9yID09PSBVaW50MTZBcnJheSkgPyB0aGlzLmdsLlVOU0lHTkVEX1NIT1JUOiB0aGlzLmdsLlVOU0lHTkVEX0lOVDtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMudmVydGV4X2NvdW50IC8gdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfZGF0YSwgdGhpcy5kYXRhX3VzYWdlKTtcblxuICAgICAgICBpZiAoIXRoaXMucmV0YWluKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRfZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIsIGJ5IGRlZmF1bHQgd2l0aCBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbSwgb3Igb3RoZXJ3aXNlIHdpdGggb3B0aW9uYWxseSBwcm92aWRlZCBvbmVcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbWVzaCByZXF1ZXN0cyBhIHJlbmRlciBvbiBuZXh0IGZyYW1lIChlLmcuIGZvciBmYWRlIGFuaW1hdGlvbnMpXG4gICAgcmVuZGVyKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtIHx8IFNoYWRlclByb2dyYW0uY3VycmVudDtcbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5zYXZlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1zKHRoaXMudW5pZm9ybXMsIGZhbHNlKTsgLy8gZG9uJ3QgcmVzZXQgdGV4dHVyZSB1bml0XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlzaWJsZV90aW1lID0gKCtuZXcgRGF0ZSgpIC0gdGhpcy5jcmVhdGVkX2F0KSAvIDEwMDA7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV92aXNpYmxlX3RpbWUnLCB2aXNpYmxlX3RpbWUpO1xuXG4gICAgICAgIHRoaXMuYmluZChwcm9ncmFtKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSl7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdFbGVtZW50cyh0aGlzLmRyYXdfbW9kZSwgdGhpcy5lbGVtZW50X2NvdW50LCB0aGlzLmVsZW1lbnRfdHlwZSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdBcnJheXModGhpcy5kcmF3X21vZGUsIDAsIHRoaXMudmVydGV4X2NvdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHByb2dyYW0ucmVzdG9yZVVuaWZvcm1zKHRoaXMudW5pZm9ybXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCBuZXh0IHJlbmRlciBpZiBtZXNoIGlzIGZhZGluZyBpblxuICAgICAgICByZXR1cm4gKHZpc2libGVfdGltZSA8IHRoaXMuZmFkZV9pbl90aW1lKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGJ1ZmZlcnMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzIHRvIHByZXBhcmUgZm9yIHJlbmRlcmluZ1xuICAgIGJpbmQocHJvZ3JhbSkge1xuICAgICAgICAvLyBCaW5kIFZBTyBmb3IgdGhpcyBwcm9nYW0sIG9yIGNyZWF0ZSBvbmVcbiAgICAgICAgbGV0IHZhbyA9IHRoaXMudmFvcy5nZXQocHJvZ3JhbSk7XG4gICAgICAgIGlmICh2YW8pIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgdmFvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFvcy5zZXQocHJvZ3JhbSwgVmVydGV4QXJyYXlPYmplY3QuY3JlYXRlKHRoaXMuZ2wsIChmb3JjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5lbmFibGUodGhpcy5nbCwgcHJvZ3JhbSwgZm9yY2UpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IHZhbyBvZiB0aGlzLnZhb3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRlc3Ryb3kodGhpcy5nbCwgdmFvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnVkJPTWVzaC5kZXN0cm95OiBkZWxldGUgYnVmZmVyJyArICh0aGlzLnZlcnRleF9kYXRhID8gYCBvZiBzaXplICR7dGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RofWAgOiAnJykpO1xuXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGdsIGZyb20gJy4vY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBWZXJ0ZXhFbGVtZW50cyBmcm9tICcuL3ZlcnRleF9lbGVtZW50cyc7XG5cbi8vIE1hcHMgR0wgdHlwZXMgdG8gSlMgYXJyYXkgdHlwZXNcbmxldCBhcnJheV90eXBlcyA9IHtcbiAgICBbZ2wuRkxPQVRdOiBGbG9hdDMyQXJyYXksXG4gICAgW2dsLkJZVEVdOiBJbnQ4QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxuICAgIFtnbC5JTlRdOiBJbnQzMkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcbiAgICBbZ2wuU0hPUlRdOiBJbnQxNkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9TSE9SVF06IFVpbnQxNkFycmF5XG59O1xuXG4vLyBBbiBpbnRlcm1lZGlhcnkgb2JqZWN0IHRoYXQgaG9sZHMgdmVydGV4IGRhdGEgaW4gdHlwZWQgYXJyYXlzLCBhY2NvcmRpbmcgdG8gYSBnaXZlbiB2ZXJ0ZXggbGF5b3V0XG4vLyBVc2VkIHRvIGNvbnN0cnVjdCBhIG1lc2gvVkJPIGZvciByZW5kZXJpbmdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleERhdGEge1xuXG4gICAgY29uc3RydWN0b3IgKHZlcnRleF9sYXlvdXQsIHsgcHJlYWxsb2MgPSA1MDAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2VsZW1lbnRzID0gbmV3IFZlcnRleEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKFZlcnRleERhdGEuYXJyYXlfcG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuYnl0ZV9sZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogcmV1c2VkIGJ1ZmZlciBvZiBieXRlcyAke3RoaXMuYnl0ZV9sZW5ndGh9LCAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHByZWFsbG9jOyAvLyAjIG9mIHZlcnRpY2VzIHRvIGFsbG9jYXRlXG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSAqIHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnl0ZV9sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAgLy8gYnl0ZSBvZmZzZXQgaW50byBjdXJyZW50bHkgYWxsb2NhdGVkIGJ1ZmZlclxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBjb21wb25lbnQgb2YgdGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFsuLi5jb21wb25lbnRdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVhbGxvY19jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICB9XG5cbiAgICAvLyAoUmUtKWFsbG9jYXRlIHR5cGVkIHZpZXdzIGludG8gdGhlIG1haW4gYnVmZmVyIC0gb25seSBjcmVhdGUgdGhlIHR5cGVzIHdlIG5lZWQgZm9yIHRoaXMgbGF5b3V0XG4gICAgc2V0QnVmZmVyVmlld3MgKCkge1xuICAgICAgICB0aGlzLnZpZXdzID0ge307XG4gICAgICAgIHRoaXMudmlld3NbZ2wuVU5TSUdORURfQllURV0gPSB0aGlzLnZlcnRleF9idWZmZXI7XG4gICAgICAgIGZvciAodmFyIGF0dHJpYiBvZiB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlicykge1xuICAgICAgICAgICAgLy8gTmVlZCB2aWV3IGZvciB0aGlzIHR5cGU/XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1thdHRyaWIudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnJheV90eXBlID0gYXJyYXlfdHlwZXNbYXR0cmliLnR5cGVdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3NbYXR0cmliLnR5cGVdID0gbmV3IGFycmF5X3R5cGUodGhpcy52ZXJ0ZXhfYnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGJ1ZmZlciBwb2ludGVyc1xuICAgICAgICBmb3IgKHZhciBjb21wb25lbnQgb2YgdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb21wb25lbnRbMV0gPSB0aGlzLnZpZXdzW2NvbXBvbmVudFswXV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbGxvY2F0ZWQgYnVmZmVyIHNpemUsIGV4cGFuZC9yZWFsbG9jIGJ1ZmZlciBpZiBuZWVkZWRcbiAgICBjaGVja0J1ZmZlclNpemUgKCkge1xuICAgICAgICBpZiAoKHRoaXMub2Zmc2V0ICsgdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSkgPiB0aGlzLmJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuc2l6ZSAqIDEuNSk7XG4gICAgICAgICAgICB0aGlzLnNpemUgLT0gdGhpcy5zaXplICUgNDtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdmFyIG5ld192aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBuZXdfdmlldy5zZXQodGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gY29weSBleGlzdGluZyBkYXRhIHRvIG5ldyBidWZmZXJcbiAgICAgICAgICAgIFZlcnRleERhdGEuYXJyYXlfcG9vbC5wdXNoKHRoaXMudmVydGV4X2J1ZmZlcik7IC8vIHNhdmUgcHJldmlvdXMgYnVmZmVyIGZvciB1c2UgYnkgbmV4dCB0aWxlXG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBuZXdfdmlldztcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvY19jb3VudCsrO1xuICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFZlcnRleERhdGE6IGV4cGFuZGVkIHZlcnRleCBibG9jayB0byAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhIHZlcnRleCwgY29waWVkIGZyb20gYSBwbGFpbiBKUyBhcnJheSBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgLy8gTm90ZTogdXNlcyBwcmUtY2FsY3VsYXRlZCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlLCBpbmNsdWRpbmcgcG9pbnRlciB0byBhcHByb3ByaWF0ZSB0eXBlZCBhcnJheVxuICAgIC8vIHZpZXcgYW5kIG9mZnNldCBpbnRvIGl0LiBUaGlzIHdhcyB0aGUgZmFzdGVzdCBtZXRob2QgcHJvZmlsZWQgc28gZmFyIGZvciBmaWxsaW5nIGEgbWl4ZWQtdHlwZVxuICAgIC8vIHZlcnRleCBsYXlvdXQgKHRob3VnaCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgcHJldmlvdXMgbWV0aG9kIHRoYXQgb25seSBzdXBwb3J0ZWQgRmxvYXQzMkFycmF5IGF0dHJpYnV0ZXMpLlxuICAgIGFkZFZlcnRleCAodmVydGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tCdWZmZXJTaXplKCk7XG4gICAgICAgIHZhciBpPTA7XG5cbiAgICAgICAgdmFyIGNsZW4gPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV1bKHRoaXMub2Zmc2V0ID4+IGNvbXBvbmVudFsyXSkgKyBjb21wb25lbnRbM11dID0gdmVydGV4W2krK107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldCArPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCsrO1xuICAgIH1cblxuICAgIC8vIEZpbmFsaXplIHZlcnRleCBidWZmZXIgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgYSBtZXNoXG4gICAgZW5kICgpIHtcbiAgICAgICAgLy8gQ2xpcCB0aGUgYnVmZmVyIHRvIHNpemUgdXNlZCBmb3IgdGhpcyBWQk9cbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMudmVydGV4X2VsZW1lbnRzLmVuZCgpO1xuXG4gICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogJHt0aGlzLnNpemV9IHZlcnRpY2VzIHRvdGFsLCByZWFsbG9jIGNvdW50ICR7dGhpcy5yZWFsbG9jX2NvdW50fWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxufVxuXG5WZXJ0ZXhEYXRhLmFycmF5X3Bvb2wgPSBbXTsgLy8gcG9vbCBvZiBjdXJyZW50bHkgYXZhaWxhYmxlIChwcmV2aW91c2x5IHVzZWQpIGJ1ZmZlcnMgKHVpbnQ4KVxuIiwiaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IE1BWF9WQUxVRSA9IE1hdGgucG93KDIsIDE2KSAtIDE7XG5sZXQgVWludDMyX2ZsYWcgPSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RWxlbWVudHMge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICB9XG4gICAgcHVzaCAodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdmFsdWVzIGhhdmUgb3ZlcmZsb3duIGFuZCBubyBVaW50MzIgb3B0aW9uIGlzIGF2YWlsYWJsZSwgZG8gbm90IHB1c2ggdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmhhc19vdmVyZmxvd24gJiYgIVVpbnQzMl9mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIG92ZXJmbG93IGlmIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBVaW50MTYgbWF4XG4gICAgICAgIGlmICh2YWx1ZSA+IE1BWF9WQUxVRSkge1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFycmF5LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbmQgKCkge1xuICAgICAgICBpZiAodGhpcy5hcnJheS5sZW5ndGgpe1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcih0aGlzLmFycmF5LCB0aGlzLmhhc19vdmVyZmxvd24pO1xuICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5WZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnID0gZnVuY3Rpb24oZmxhZykge1xuICAgIFVpbnQzMl9mbGFnID0gZmxhZztcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihhcnJheSwgb3ZlcmZsb3duKSB7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSAob3ZlcmZsb3duICYmIFVpbnQzMl9mbGFnKSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5KGFycmF5KTtcbn1cblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVmVydGV4RWxlbWVudHMnLCBWZXJ0ZXhFbGVtZW50cyk7XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi92ZXJ0ZXhfZGF0YSc7XG5cbi8vIERlc2NyaWJlcyBhIHZlcnRleCBsYXlvdXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG1hbnkgZGlmZmVyZW50IEdMIHByb2dyYW1zLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4TGF5b3V0IHtcbiAgICAvLyBBdHRyaWJzIGFyZSBhbiBhcnJheSwgaW4gbGF5b3V0IG9yZGVyLCBvZjogbmFtZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZFxuICAgIC8vIGV4OiB7IG5hbWU6ICdwb3NpdGlvbicsIHNpemU6IDMsIHR5cGU6IGdsLkZMT0FULCBub3JtYWxpemVkOiBmYWxzZSB9XG4gICAgY29uc3RydWN0b3IgKGF0dHJpYnMpIHtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0gYXR0cmliczsgLy8gZGljdGlvbmFyeSBvZiBhdHRyaWJ1dGVzLCBzcGVjaWZpZWQgYXMgc3RhbmRhcmQgR0wgYXR0cmliIG9wdGlvbnNcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107ICAgLy8gbGlzdCBvZiB0eXBlIGFuZCBvZmZzZXQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9OyAgICAgICAgLy8gbGluZWFyIGJ1ZmZlciBpbmRleCBvZiBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnQsIGUuZy4gdGhpcy5pbmRleC5wb3NpdGlvbi54XG5cbiAgICAgICAgLy8gQ2FsYyB2ZXJ0ZXggc3RyaWRlXG4gICAgICAgIHRoaXMuc3RyaWRlID0gMDtcblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBhdHRyaWIgb2YgdGhpcy5hdHRyaWJzKSB7XG4gICAgICAgICAgICBhdHRyaWIub2Zmc2V0ID0gdGhpcy5zdHJpZGU7XG4gICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplID0gYXR0cmliLnNpemU7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLklOVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSA0O1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuU0hPUlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSAyO1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSA0LWJ5dGUgYWxpZ25tZW50IG9uIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IGF0dHJpYi5ieXRlX3NpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpZGUgJiAzKSB7IC8vIHBhZCB0byBtdWx0aXBsZSBvZiA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gNCAtICh0aGlzLnN0cmlkZSAmIDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaW5mbyB0byBsaXN0IG9mIGF0dHJpYnV0ZSBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyBVc2VkIHRvIGJ1aWxkIHRoZSB2ZXJ0ZXggZGF0YSwgcHJvdmlkZXMgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byBlYWNoIHR5cGVkIGFycmF5IHZpZXdcbiAgICAgICAgICAgIC8vIEVhY2ggY29tcG9uZW50IGlzIGFuIGFycmF5IG9mOlxuICAgICAgICAgICAgLy8gW0dMIGF0dHJpYiB0eXBlLCBwb2ludGVyIHRvIHR5cGVkIGFycmF5IHZpZXcsIGJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZGV0ZXJtaW5lIGJ1ZmZlciBvZmZzZXQsIGFkZGl0aW9uYWwgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGNvbXBvbmVudF1cbiAgICAgICAgICAgIHZhciBvZmZzZXRfdHlwZWQgPSBhdHRyaWIub2Zmc2V0ID4+IHNoaWZ0O1xuICAgICAgICAgICAgaWYgKGF0dHJpYi5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGE9MDsgYSA8IGF0dHJpYi5zaXplOyBhKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvdmlkZSBhbiBpbmRleCBpbnRvIHRoZSB2ZXJ0ZXggZGF0YSBidWZmZXIgZm9yIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy5pbmRleFthdHRyaWIubmFtZV0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50ICs9IGF0dHJpYi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSB2ZXJ0ZXggbGF5b3V0IGZvciBhIHNwZWNpZmljIEdMIHByb2dyYW1cbiAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIGRlc2lyZWQgdmVydGV4IGJ1ZmZlciAoVkJPKSBpcyBhbHJlYWR5IGJvdW5kXG4gICAgLy8gSWYgYSBnaXZlbiBwcm9ncmFtIGRvZXNuJ3QgaW5jbHVkZSBhbGwgYXR0cmlidXRlcywgaXQgY2FuIHN0aWxsIHVzZSB0aGUgdmVydGV4IGxheW91dFxuICAgIC8vIHRvIHJlYWQgdGhvc2UgYXR0cmlicyB0aGF0IGl0IGRvZXMgcmVjb2duaXplLCB1c2luZyB0aGUgYXR0cmliIG9mZnNldHMgdG8gc2tpcCBvdGhlcnMuXG4gICAgZW5hYmxlIChnbCwgcHJvZ3JhbSwgZm9yY2UpXG4gICAge1xuICAgICAgICB2YXIgYXR0cmliLCBsb2NhdGlvbjtcblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAodmFyIGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZShhdHRyaWIubmFtZSkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgYXR0cmliLnNpemUsIGF0dHJpYi50eXBlLCBhdHRyaWIubm9ybWFsaXplZCwgdGhpcy5zdHJpZGUsIGF0dHJpYi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgYW55IHByZXZpb3VzbHkgYm91bmQgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yIChsb2NhdGlvbiBpbiBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGUoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgYW4gYXR0cmlidXRlIGlmIGl0IHdhcyBub3QgZW5hYmxlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9ncmFtXG4gICAgLy8gTk9URTogdGhpcyB3YXMgbW92ZWQgb3V0IG9mIHRoZSBpbm5lciBsb29wIGluIGVuYWJsZSgpIHRvIGFzc2lzdCB3L1ZNIG9wdGltaXphdGlvblxuICAgIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGUgKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSkge1xuICAgICAgICBpZiAoVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gIT09IHByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICBkZWxldGUgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhEYXRhKHRoaXMpO1xuICAgIH1cblxufVxuXG4vLyBUcmFjayBjdXJyZW50bHkgZW5hYmxlZCBhdHRyaWJzLCBieSB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBib3VuZCB0b1xuLy8gU3RhdGljIGNsYXNzIHByb3BlcnR5IHRvIHJlZmxlY3QgZ2xvYmFsIEdMIHN0YXRlXG5WZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzID0ge307XG4iLCJpbXBvcnQgUmVwZWF0R3JvdXAgZnJvbSAnLi9yZXBlYXRfZ3JvdXAnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgQ29sbGlzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb24gPSB7XG5cbiAgICB0aWxlczoge30sXG4gICAgbGlua19pZDogMCxcblxuICAgIG5leHRMaW5rSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtfaWQrKztcbiAgICB9LFxuXG4gICAgc3RhcnRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV0gPSB7XG4gICAgICAgICAgICBiYm94ZXM6IHsgICAgICAgICAgIC8vIGN1cnJlbnQgc2V0IG9mIHBsYWNlZCBib3VuZGluZyBib3hlc1xuICAgICAgICAgICAgICAgIGFhYmI6IFtdLFxuICAgICAgICAgICAgICAgIG9iYjogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RzOiB7fSwgICAgICAgIC8vIG9iamVjdHMgdG8gY29sbGlkZSwgZ3JvdXBlZCBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICAgICAga2VlcDoge30sICAgICAgICAgICAvLyBvYmplY3RzIHRoYXQgd2VyZSBrZXB0IGFmdGVyIGNvbGxpc2lvbiwgZ3JvdXBlZCBieSBzdHlsZVxuICAgICAgICAgICAgc3R5bGVzOiBuZXcgU2V0KCkgICAvLyBzdHlsZXMgY29udHJpYnV0aW5nIGNvbGxpc2lvbiBvYmplY3RzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZCB3aGVuIGFsbCByZWdpc3RlcmVkIHN0eWxlcyBoYXZlIGFkZGVkIG9iamVjdHNcbiAgICAgICAgc3RhdGUuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0VGlsZSAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIHBlbmRpbmcgc2V0LCBjb2xsaXNpb24gd2lsbCBibG9jayBvbiBhbGwgc3R5bGVzIHN1Ym1pdHRpbmcgdG8gY29sbGlzaW9uIHNldFxuICAgIGFkZFN0eWxlIChzdHlsZSwgdGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVzW3RpbGVdLnN0eWxlcy5hZGQoc3R5bGUpO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgY29sbGlzaW9uIG9iamVjdHMgZm9yIGEgc3R5bGVcbiAgICBjb2xsaWRlIChvYmplY3RzLCBzdHlsZSwgdGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0NvbGxpc2lvbi5jb2xsaWRlKCkgY2FsbGVkIHdpdGggbnVsbCB0aWxlJywgdGlsZSwgdGhpcy50aWxlcywgc3R5bGUsIG9iamVjdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHcm91cCBieSBwcmlvcml0eSBhbmQgc3R5bGVcbiAgICAgICAgbGV0IHRpbGVfb2JqZWN0cyA9IHN0YXRlLm9iamVjdHM7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gb2JqLmxhYmVsLmxheW91dC5wcmlvcml0eTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldIHx8IHt9O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSB8fCBbXTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHBlbmRpbmcgc3R5bGUgc2V0LCBpZiBubyBtb3JlIHN0eWxlcywgZG8gY29sbGlzaW9uICYgZmluaXNoIHRpbGVcbiAgICAgICAgc3RhdGUuc3R5bGVzLmRlbGV0ZShzdHlsZSk7XG4gICAgICAgIGlmIChzdGF0ZS5zdHlsZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3Igb2JqZWN0cyB0byBiZSBhZGRlZCBmcm9tIGFsbCBzdHlsZXNcbiAgICAgICAgcmV0dXJuIHN0YXRlLmNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmtlZXBbc3R5bGVdIHx8IFtdO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVGVzdCBsYWJlbHMgZm9yIGNvbGxpc2lvbnMsIGhpZ2hlciB0byBsb3dlciBwcmlvcml0eVxuICAgIC8vIFdoZW4gdHdvIGNvbGxpZGUsIGRpc2NhcmQgdGhlIGxvd2VyLXByaW9yaXR5IGxhYmVsXG4gICAgZW5kVGlsZSAodGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBsZXQga2VlcCA9IHN0YXRlLmtlZXA7XG5cbiAgICAgICAgUmVwZWF0R3JvdXAuY2xlYXIodGlsZSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBsYWJlbHMgYnkgcHJpb3JpdHksIHRoZW4gYnkgc3R5bGVcbiAgICAgICAgbGV0IHByaW9yaXRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5vYmplY3RzKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IHByaW9yaXR5IG9mIHByaW9yaXRpZXMpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0c1twcmlvcml0eV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlX29iamVjdHMpIHsgLy8gbm8gbGFiZWxzIGF0IHRoaXMgcHJpb3JpdHksIHNraXAgdG8gbmV4dFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3IgZWFjaCBzdHlsZVxuICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gc3R5bGVfb2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RzID0gc3R5bGVfb2JqZWN0c1tzdHlsZV07XG4gICAgICAgICAgICAgICAga2VlcFtzdHlsZV0gPSBrZWVwW3N0eWxlXSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0ID0gb2JqZWN0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuQmVQbGFjZWQob2JqZWN0LCB0aWxlLCBvYmplY3QubGlua2VkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBvYmplY3QgaWYgaXQgaXNuJ3QgZGVwZW5kZW50IG9uIGEgcGFyZW50IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmplY3QubGlua2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG9iamVjdCBpcyBkZXBlbmRlbnQgb24gYSBwYXJlbnQsIG9ubHkga2VlcCBpZiBib3RoIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2FuQmVQbGFjZWQob2JqZWN0LmxpbmtlZCwgdGlsZSwgb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QubGlua2VkLCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFJ1biBjb2xsaXNpb24gYW5kIHJlcGVhdCBjaGVjayB0byBzZWUgaWYgbGFiZWwgY2FuIGN1cnJlbnRseSBiZSBwbGFjZWRcbiAgICBjYW5CZVBsYWNlZCAob2JqZWN0LCB0aWxlLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBsZXQgbGFiZWwgPSBvYmplY3QubGFiZWw7XG4gICAgICAgIGxldCBsYXlvdXQgPSBvYmplY3QubGFiZWwubGF5b3V0O1xuXG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVzdCB0aGUgbGFiZWwgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBvdGhlciBsYWJlbHMgaW4gdGhlIHRpbGVcbiAgICAgICAgbGV0IGJib3hlcyA9IHRoaXMudGlsZXNbdGlsZV0uYmJveGVzO1xuICAgICAgICBpZiAoIWxheW91dC5jb2xsaWRlIHx8ICFsYWJlbC5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSAmJiBleGNsdWRlLmxhYmVsKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHJlcGVhdHNcbiAgICAgICAgICAgIGxldCByZXBlYXQgPSBSZXBlYXRHcm91cC5jaGVjayhsYWJlbCwgbGF5b3V0LCB0aWxlKTtcbiAgICAgICAgICAgIGlmIChyZXBlYXQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYGRpc2NhcmQgbGFiZWwgJyR7bGFiZWwudGV4dH0nLCAob25lX3Blcl9ncm91cDogJHtyZXBlYXQub25lX3Blcl9ncm91cH0pLCBkaXN0ICR7TWF0aC5zcXJ0KHJlcGVhdC5kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfSA8ICR7TWF0aC5zcXJ0KHJlcGVhdC5yZXBlYXRfZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH1gKTtcbiAgICAgICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxheW91dC5jb2xsaWRlKSB7XG4gICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYGRpc2NhcmQgbGFiZWwgJyR7bGFiZWwudGV4dH0nIGR1ZSB0byBjb2xsaXNpb25gKTtcbiAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgfSxcblxuICAgIC8vIFBsYWNlIGxhYmVsXG4gICAgcGxhY2UgKHsgbGFiZWwgfSwgdGlsZSkge1xuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgcGxhY2VkIGZvciBmdXR1cmUgY29sbGlzaW9uIGFuZCByZXBlYXQgY3VsbGluZ1xuICAgICAgICBSZXBlYXRHcm91cC5hZGQobGFiZWwsIGxhYmVsLmxheW91dCwgdGlsZSk7XG4gICAgICAgIGxhYmVsLmFkZCh0aGlzLnRpbGVzW3RpbGVdLmJib3hlcyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFBvaW50QW5jaG9yIGZyb20gJy4vcG9pbnRfYW5jaG9yJztcbmltcG9ydCBib3hJbnRlcnNlY3QgZnJvbSAnYm94LWludGVyc2VjdCc7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWtvbGFseXNlbmtvL2JveC1pbnRlcnNlY3RcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgT0JCIGZyb20gJy4uL3V0aWxzL29iYic7XG4vLyBpbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsIHtcblxuICAgIGNvbnN0cnVjdG9yIChzaXplLCBsYXlvdXQgPSB7fSkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpID8gdGhpcy5sYXlvdXQuYW5jaG9yWzBdIDogdGhpcy5sYXlvdXQuYW5jaG9yOyAvLyBpbml0aWFsIGFuY2hvclxuICAgICAgICB0aGlzLnBsYWNlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuYWFiYiA9IG51bGw7XG4gICAgICAgIHRoaXMub2JiID0gbnVsbDtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmFsaWduID0gdGhpcy5sYXlvdXQuYWxpZ24gfHwgUG9pbnRBbmNob3IuYWxpZ25Gb3JBbmNob3IodGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBvdmVybGFwcyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgIG9jY2x1ZGVkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFhYmJzID0gYmJveGVzLmFhYmI7XG4gICAgICAgIGxldCBvYmJzID0gYmJveGVzLm9iYjtcblxuICAgICAgICAvLyBCcm9hZCBwaGFzZVxuICAgICAgICBpZiAoYWFiYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYm94SW50ZXJzZWN0KFt0aGlzLmFhYmJdLCBhYWJicywgKGksIGopID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogYnJvYWQgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLmFhYmIsIGFhYmJzW2pdKTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29sbGlkaW5nIHdpdGggZXhjbHVkZWQgbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSAmJiBhYWJic1tqXSA9PT0gZXhjbHVkZS5hYWJiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwcGluZyBkdWUgdG8gZXhwbGljaXQgZXhjbHVzaW9uJywgdGhpcywgZXhjbHVkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hcnJvdyBwaGFzZSBjb2xsaXNpb24gaWYgbm8gcm90YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmIuYW5nbGUgPT09IDAgJiYgb2Jic1tqXS5hbmdsZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcCBuYXJyb3cgcGhhc2UgY29sbGlkZSBiZWNhdXNlIG5laXRoZXIgaXMgcm90YXRlZCcsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBwaGFzZVxuICAgICAgICAgICAgICAgIGlmIChPQkIuaW50ZXJzZWN0KHRoaXMub2JiLCBvYmJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogbmFycm93IHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGlzIGxhYmVsJ3MgYm91bmRpbmcgYm94IHRvIHRoZSBwcm92aWRlZCBzZXRcbiAgICBhZGQgKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGJib3hlcy5hYWJiLnB1c2godGhpcy5hYWJiKTtcbiAgICAgICAgYmJveGVzLm9iYi5wdXNoKHRoaXMub2JiKTtcbiAgICB9XG5cbiAgICAvLyBjaGVja3Mgd2hldGhlciB0aGUgbGFiZWwgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXNcbiAgICBpblRpbGVCb3VuZHMgKCkge1xuICAgICAgICBsZXQgbWluID0gWyB0aGlzLmFhYmJbMF0sIHRoaXMuYWFiYlsxXSBdO1xuICAgICAgICBsZXQgbWF4ID0gWyB0aGlzLmFhYmJbMl0sIHRoaXMuYWFiYlszXSBdO1xuXG4gICAgICAgIGlmICghVXRpbHMucG9pbnRJblRpbGUobWluKSB8fCAhVXRpbHMucG9pbnRJblRpbGUobWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIGRpc2NhcmRlZFxuICAgIC8vIERlcGVuZHMgb24gd2hldGhlciBsYWJlbCBtdXN0IGZpdCBpbiB0aGUgdGlsZSBib3VuZHMsIGFuZCBpZiBzbywgY2FuIGl0IGJlIG1vdmVkIHRvIGZpdCB0aGVyZVxuICAgIC8vIGBleGNsdWRlYCBpcyBhbiBvcHRpb25hbCBsYWJlbCB0byBleGNsdWRlIGZyb20gY29sbGlzaW9ucyB3aXRoIHRoaXMgbGFiZWxcbiAgICAvLyAoZS5nLiB1c2VmdWwgZm9yIGxpbmtlZCBvYmplY3RzIHRoYXQgc2hvdWxkbid0IGFmZmVjdCBlYWNoIG90aGVyJ3MgcGxhY2VtZW50KVxuICAgIGRpc2NhcmQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgLy8gU2hvdWxkIHRoZSBsYWJlbCBiZSBjdWxsZWQgaWYgaXQgY2FuJ3QgZml0IGluc2lkZSB0aGUgdGlsZSBib3VuZHM/XG4gICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSkge1xuICAgICAgICAgICAgbGV0IGluX3RpbGUgPSB0aGlzLmluVGlsZUJvdW5kcygpO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGZpdCwgc2hvdWxkIHdlIHRyeSB0byBtb3ZlIGl0IGludG8gdGhlIHRpbGUgYm91bmRzP1xuICAgICAgICAgICAgaWYgKCFpbl90aWxlICYmIHRoaXMubGF5b3V0Lm1vdmVfaW50b190aWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuIHdlIGZpdCB0aGUgbGFiZWwgaW50byB0aGUgdGlsZT9cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW92ZUludG9UaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbid0IGZpdCBpbiB0aWxlLCBkaXNjYXJkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghaW5fdGlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBvdXQgb2YgdGlsZSBib3VuZHMsIGRpc2NhcmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBsYWJlbCBoYXNuJ3QgYmVlbiBkaXNjYXJkZWQgeWV0LCBjaGVjayB0byBzZWUgaWYgaXQncyBvY2NsdWRlZCBieSBvdGhlciBsYWJlbHNcbiAgICAgICAgcmV0dXJuIHRoaXMub2NjbHVkZWQoYmJveGVzLCBleGNsdWRlKTtcbiAgICB9XG59XG5cbkxhYmVsLmVwc2lsb24gPSAwLjk5OTk7IC8vIHRvbGVyYW5jZSBhcm91bmQgY29sbGlzaW9uIGJveGVzLCBwcmV2ZW50IHBlcmZlY3RseSBhZGphY2VudCBvYmplY3RzIGZyb20gY29sbGlkaW5nXG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgT0JCIGZyb20gJy4uL3V0aWxzL29iYic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsTGluZSBleHRlbmRzIExhYmVsIHtcblxuICAgIGNvbnN0cnVjdG9yIChzaXplLCBsaW5lcywgbGF5b3V0KSB7XG4gICAgICAgIHN1cGVyKHNpemUsIGxheW91dCk7XG5cbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gb3B0aW9uYWxseSBsaW1pdCB0aGUgbGluZSBzZWdtZW50cyB0aGF0IHRoZSBsYWJlbCBtYXkgYmUgcGxhY2VkIGluLCBieSBzcGVjaWZ5aW5nIGEgc2VnbWVudCBpbmRleCByYW5nZVxuICAgICAgICAvLyB1c2VkIGFzIGEgY29hcnNlIHN1YmRpdmlkZSBmb3IgcGxhY2luZyBtdWx0aXBsZSBsYWJlbHMgcGVyIGxpbmUgZ2VvbWV0cnlcbiAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4ID0gbGF5b3V0LnNlZ21lbnRfc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5zZWdtZW50X21heCA9IGxheW91dC5zZWdtZW50X2VuZCB8fCB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIHRoaXMuYW5nbGUgPSB0aGlzLmNvbXB1dGVBbmdsZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gWyhzZWdtZW50WzBdWzBdICsgc2VnbWVudFsxXVswXSkgLyAyLCAoc2VnbWVudFswXVsxXSArIHNlZ21lbnRbMV1bMV0pIC8gMl07XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgbW92ZU5leHRTZWdtZW50ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudF9pbmRleCArIDEgPj0gdGhpcy5zZWdtZW50X21heCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCsrO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbXB1dGVBbmdsZSAoKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5jdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgcDBwMSA9IFZlY3Rvci5zdWIoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG5cbiAgICAgICAgcDBwMSA9IFZlY3Rvci5ub3JtYWxpemUocDBwMSk7XG5cbiAgICAgICAgbGV0IFBJXzIgPSBNYXRoLlBJIC8gMjtcbiAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hdGFuMihwMHAxWzBdLCBwMHAxWzFdKSArIFBJXzI7XG5cbiAgICAgICAgaWYgKHRoZXRhID4gUElfMiB8fCB0aGV0YSA8IC1QSV8yKSB7XG4gICAgICAgICAgICB0aGV0YSArPSBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIHRoZXRhICU9IE1hdGguUEkgKiAyO1xuXG4gICAgICAgIHJldHVybiB0aGV0YTtcbiAgICB9XG5cbiAgICBmaXRUb1NlZ21lbnQgKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuY3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICBsZXQgbGVuZ3RoID0gVmVjdG9yLmxlbmd0aChwMHAxKTtcblxuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoID0gdGhpcy5zaXplWzBdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgIGlmIChsYWJlbF9sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGFuIGV4Y2VlZCBoZXVyZXN0aWMgb2YgMTAwJSB3b3VsZCBsZXQgdGhlIGxhYmVsIGZpdCBpbiBhbnkgY2FzZXNcbiAgICAgICAgICAgIGxldCBleGNlZWQgPSAoMSAtIChsZW5ndGggLyBsYWJlbF9sZW5ndGgpKSAqIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBleGNlZWQgPCB0aGlzLmxheW91dC5saW5lX2V4Y2VlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbF9sZW5ndGggPD0gbGVuZ3RoO1xuICAgIH1cblxuICAgIGN1cnJlbnRTZWdtZW50ICgpIHtcbiAgICAgICAgbGV0IHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICBsZXQgcDIgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuXG4gICAgICAgIHJldHVybiBbIHAxLCBwMiBdO1xuICAgIH1cblxuICAgIHVwZGF0ZUJCb3hlcyAoKSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCB3aWR0aCA9ICh0aGlzLnNpemVbMF0gKyB0aGlzLmxheW91dC5idWZmZXJbMF0gKiAyKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG4gICAgICAgIGxldCBoZWlnaHQgPSAodGhpcy5zaXplWzFdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIGFwcGx5IG9mZnNldCwgeCBwb3NpdGl2ZSwgeSBwb2ludGluZyBkb3duXG4gICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KHRoaXMub2Zmc2V0LCB0aGlzLmFuZ2xlKTtcbiAgICAgICAgbGV0IHAgPSBbXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCksXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC0gKG9mZnNldFsxXSAqIHVwcClcbiAgICAgICAgXTtcblxuICAgICAgICAvLyB0aGUgYW5nbGUgb2YgdGhlIG9iYiBpcyBuZWdhdGl2ZSBzaW5jZSBpdCdzIHRoZSB0aWxlIHN5c3RlbSB5IGF4aXMgaXMgcG9pbnRpbmcgZG93blxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgLXRoaXMuYW5nbGUsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmFhYmIgPSB0aGlzLm9iYi5nZXRFeHRlbnQoKTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gbW92ZSB0aGUgbGFiZWwgaW50byB0aGUgdGlsZSBib3VuZHNcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbGFiZWwgd2FzIG1vdmVkIGludG8gdGlsZSwgZmFsc2UgaWYgaXQgY291bGRuJ3QgYmUgbW92ZWRcbiAgICBtb3ZlSW50b1RpbGUgKCkge1xuICAgICAgICBsZXQgaW5fdGlsZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZml0c190b19zZWdtZW50ID0gdGhpcy5maXRUb1NlZ21lbnQoKTtcblxuICAgICAgICAvLyBUcnkgbGluZSBzZWdtZW50cyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGZpdHMgdGhlIGxhYmVsIChhbmQgaXMgaW5zaWRlIHRoZSB0aWxlKVxuICAgICAgICB3aGlsZSAoIWluX3RpbGUgfHwgIWZpdHNfdG9fc2VnbWVudCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vdmVOZXh0U2VnbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIHdlIGNhbid0IG1vdmUgZnVydGhlciBpbiB0aGlzIGxpbmVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5fdGlsZSA9IHRoaXMuaW5UaWxlQm91bmRzKCk7XG4gICAgICAgICAgICBmaXRzX3RvX3NlZ21lbnQgPSB0aGlzLmZpdFRvU2VnbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluX3RpbGUgJiYgZml0c190b19zZWdtZW50O1xuICAgIH1cblxuICAgIGRpc2NhcmQgKGJib3hlcykge1xuICAgICAgICAvLyBGaXJzdCBmaW5kIGEgbGluZSBzZWdtZW50IHRoYXQgZml0cyB0aGUgbGFiZWxcbiAgICAgICAgaWYgKHRoaXMubGluZXMgJiYgIXRoaXMuZml0VG9TZWdtZW50KCkpIHtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5maXRUb1NlZ21lbnQoKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tb3ZlTmV4dFNlZ21lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBsYWJlbCBmaXRzIGluIGxpbmUsIHJ1biBzdGFuZGFyZCBkaXNjYXJkIHRlc3RzXG4gICAgICAgIHJldHVybiBzdXBlci5kaXNjYXJkKGJib3hlcyk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAvLyBubyB0ZXh0IG9mZnNldCwgdXNlIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBwYXJlbnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICBsZXQgcCA9IFtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKyAodGhpcy5vZmZzZXRbMF0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpLFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtICh0aGlzLm9mZnNldFsxXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYWFiYiA9IHRoaXMub2JiLmdldEV4dGVudCgpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBsYWJlbCBpbnRvIHRoZSB0aWxlIGJvdW5kc1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsYWJlbCB3YXMgbW92ZWQgaW50byB0aWxlLCBmYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZFxuICAgIG1vdmVJbnRvVGlsZSAoKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlswXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKz0gLXRoaXMuYWFiYlswXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsyXSA+PSBHZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSAtPSB0aGlzLmFhYmJbMl0gLSBHZW8udGlsZV9zY2FsZSArIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbM10gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlszXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsxXSA8PSAtR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzFdICsgR2VvLnRpbGVfc2NhbGUgLSAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluVGlsZUJvdW5kcygpO1xuICAgIH1cblxuICAgIGRpc2NhcmQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBhbmNob3Igc3BlY2lmaWVkLCB0cnkgdGhlbSBpbiBvcmRlclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG9uIHNlY29uZCBhbmNob3IgKGZpcnN0IGFuY2hvciB3YXMgc2V0IG9uIGNyZWF0aW9uKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MTsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgJiYgIXRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cbiIsIi8vIFNldHMgb2YgdmFsdWVzIHRvIG1hdGNoIGZvciBkaXJlY3Rpb25hbCBhbmQgY29ybmVyIGFuY2hvcnNcbmNvbnN0IGxlZnRzID0gWydsZWZ0JywgJ3RvcC1sZWZ0JywgJ2JvdHRvbS1sZWZ0J107XG5jb25zdCByaWdodHMgPSBbJ3JpZ2h0JywgJ3RvcC1yaWdodCcsICdib3R0b20tcmlnaHQnXTtcbmNvbnN0IHRvcHMgPSBbJ3RvcCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnXTtcbmNvbnN0IGJvdHRvbXMgPSBbJ2JvdHRvbScsICdib3R0b20tbGVmdCcsICdib3R0b20tcmlnaHQnXTtcblxubGV0IFBvaW50QW5jaG9yO1xuXG5leHBvcnQgZGVmYXVsdCBQb2ludEFuY2hvciA9IHtcblxuICAgIGNvbXB1dGVPZmZzZXQgKG9mZnNldCwgc2l6ZSwgYW5jaG9yLCBidWZmZXIgPSBudWxsKSB7XG4gICAgICAgIGlmICghYW5jaG9yIHx8IGFuY2hvciA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2Zmc2V0MiA9IFtvZmZzZXRbMF0sIG9mZnNldFsxXV07XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciB8fCB0aGlzLmRlZmF1bHRfYnVmZmVyO1xuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIGxlZnQvcmlnaHQgb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdIC09IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBidWZmZXJbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JpZ2h0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBidWZmZXJbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbiBvcHRpb25hbCB0b3AvYm90dG9tIG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc1RvcEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdIC09IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdIC09IGJ1ZmZlclsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzQm90dG9tQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gKz0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gKz0gYnVmZmVyWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDI7XG4gICAgfSxcblxuICAgIGFsaWduRm9yQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IgIT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JpZ2h0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICB9LFxuXG4gICAgaXNMZWZ0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChsZWZ0cy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzUmlnaHRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHJpZ2h0cy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzVG9wQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuICh0b3BzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNCb3R0b21BbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGJvdHRvbXMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICAvLyBCdWZmZXJzOiBbbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tXVxuICAgIGRlZmF1bHRfYnVmZmVyOiBbMi41LCAyLjUsIDEuNSwgMC43NV0sXG4gICAgemVyb19idWZmZXI6IFswLCAwLCAwLCAwXVxuXG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBlYXRHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoa2V5LCByZXBlYXRfZGlzdCwgbWF4X3JlcGVhdF9kaXN0KSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0ID0gcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3Rfc3EgPSB0aGlzLnJlcGVhdF9kaXN0ICogdGhpcy5yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EgPSBtYXhfcmVwZWF0X2Rpc3QgKiBtYXhfcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMub25lX3Blcl9ncm91cCA9ICh0aGlzLnJlcGVhdF9kaXN0X3NxID49IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgaW4gdGhpcyBncm91cFxuICAgIGNoZWNrIChvYmopIHtcbiAgICAgICAgLy8gSWYgb25seSBvbmUgb2JqZWN0IGFsbG93ZWQgcGVyIGdyb3VwLCBzaG9ydGN1dCBkaXN0YW5jZSBsb2dpY1xuICAgICAgICBpZiAodGhpcy5vbmVfcGVyX2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGRpc3RhbmNlIG1heGVzIG91dCBhdCB0aHJlc2hvbGQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgLy8gKG5vdCB0cnVlIGRpc3QgdmFsdWUgc2luY2Ugd2Ugc2tpcHBlZCBjYWxjdWxhdGluZyBpdClcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxOiB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIG9uZV9wZXJfZ3JvdXA6IHRoaXMub25lX3Blcl9ncm91cFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIG9iamVjdCBmb3IgdGhpcyBncm91cCB5ZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGRpc3RhbmNlIGZyb20gbmV3IG9iamVjdCB0byBvYmplY3RzIGFscmVhZHkgaW4gZ3JvdXBcbiAgICAgICAgbGV0IHAxID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAyID0gdGhpcy5wb3NpdGlvbnNbaV07XG4gICAgICAgICAgICBsZXQgZHggPSBwMVswXSAtIHAyWzBdO1xuICAgICAgICAgICAgbGV0IGR5ID0gcDFbMV0gLSBwMlsxXTtcbiAgICAgICAgICAgIGxldCBkaXN0X3NxID0gZHggKiBkeCArIGR5ICogZHk7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4aXN0aW5nIG9iamVjdCB3aXRoaW4gYWxsb3dlZCBkaXN0YW5jZVxuICAgICAgICAgICAgaWYgKGRpc3Rfc3EgPCB0aGlzLnJlcGVhdF9kaXN0X3NxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3FcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG9iamVjdCB0byB0aGlzIGdyb3VwXG4gICAgYWRkIChvYmopIHtcbiAgICAgICAgLy8gb25seSBzdG9yZSBvYmplY3QncyBwb3NpdGlvbiwgdG8gc2F2ZSBzcGFjZSAvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVmZXJlbmNlc1xuICAgICAgICBpZiAob2JqICYmIG9iai5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChvYmoucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIHVzZWQgdG8gbWFuYWdlIHJlcGVhdCBncm91cHMsIHdpdGhpbiBhbmQgYWNyb3NzIHRpbGVzXG5cbiAgICAvLyBSZXNldCBhbGwgZ3JvdXBzIGZvciB0aGlzIHRpbGVcbiAgICBzdGF0aWMgY2xlYXIgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5ncm91cHNbdGlsZV0gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgd2l0aGluIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGNoZWNrIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwICYmIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uY2hlY2sob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbiBvYmplY3QgdG8gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgYWRkIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID0gbmV3IFJlcGVhdEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBSZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uYWRkKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLy8gQ3VycmVudCBzZXQgb2YgcmVwZWF0IGdyb3VwcywgZ3JvdXBlZCBhbmQga2V5ZWQgYnkgdGlsZVxuUmVwZWF0R3JvdXAuZ3JvdXBzID0ge307XG5cbi8vIE1heCByZXBlYXQgZGlzdDogZm9yIGdyb3VwcyB3aXRoIGEgcmVwZWF0IGRpc3QgYmV5b25kIHRoaXMgdGhyZXNob2xkLCBvbmx5IG9uZSBsYWJlbFxuLy8gd2lsbCBiZSBhbGxvd2VkIHBlciBncm91cCwgZS5nLiBzZXQgdG8gdGlsZSBzaXplIGZvciBvbmUtbGFiZWwtcGVyLXRpbGVcblJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdCA9IEdlby50aWxlX3NjYWxlO1xuIiwiaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcblxuLy8gRXhwb3J0cyBtdXN0IGFwcGVhciBvdXRzaWRlIGEgZnVuY3Rpb24sIGJ1dCB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiBtYWluIHRocmVhZCAoYmVsb3cpXG5leHBvcnQgdmFyIExlYWZsZXRMYXllcjtcbmV4cG9ydCBmdW5jdGlvbiBsZWFmbGV0TGF5ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpIHtcblxuICAgIC8vIElmIExlYWZsZXRMYXllciBpcyBhbHJlYWR5IGRlZmluZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCBqdXN0IHJldHVybiB0aGF0IGltbWVkaWF0ZWx5XG4gICAgLy8gZS5nLiBpZiB5b3UgY2FsbCBsZWFmbGV0TGF5ZXIgbXVsdGlwbGUgdGltZXMgKHdoaWNoIGlzIHZhbGlkKVxuICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMZWFmbGV0IGxheWVyIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkZWZpbmVkIGluIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG5cbiAgICAgICAgbGV0IEwgPSBvcHRpb25zLmxlYWZsZXQgfHwgd2luZG93Lkw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBleHRlbmRpbmcgdGhlIGxlYWZsZXQgMC43LnggVGlsZUxheWVyIGNsYXNzLCBvciB0aGUgbmV3ZXJcbiAgICAgICAgLy8gbGVhZmxldCAxLnggR3JpZExheWVyIGNsYXNzLlxuICAgICAgICBsZXQgbGF5ZXJCYXNlQ2xhc3MgPSBMLkdyaWRMYXllciA/IEwuR3JpZExheWVyIDogTC5UaWxlTGF5ZXI7XG4gICAgICAgIGxldCBsZWFmbGV0VmVyc2lvbiA9IGxheWVyQmFzZUNsYXNzID09PSBMLkdyaWRMYXllciA/ICcxLngnIDogJzAuNy54JztcbiAgICAgICAgbGV0IGxheWVyQ2xhc3NDb25maWcgPSB7fTtcblxuICAgICAgICAvLyBJZiBleHRlbmRpbmcgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIsIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkXG4gICAgICAgIGlmIChsYXllckJhc2VDbGFzcyA9PT0gTC5UaWxlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX2FkZFRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUuX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gcmUtYWRkIHRoZSBjYW52YXMgc2luY2UgYmFzZSBjbGFzcyBgdmlld3Jlc2V0YCBldmVudCBjYW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5zY2VuZS5jb250YWluZXIgJiYgdGhpcy5zY2VuZS5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY2VuZS5jYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgY3VzdG9tIGxheWVyIG1ldGhvZHNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsYXllckNsYXNzQ29uZmlnLCB7XG5cbiAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dEZWJ1ZyA9ICghb3B0aW9ucy5zaG93RGVidWcgPyBmYWxzZSA6IHRydWUpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWUgPSBvcHRpb25zLndoZWVsRGVib3VuY2VUaW1lIHx8IDQwO1xuXG4gICAgICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlVmlld1Jlc2V0ID0gVXRpbHMuZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSgnem9vbWVuZCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSgnbW92ZWVuZCcpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy53aGVlbERlYm91bmNlVGltZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVTY2VuZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBTY2VuZS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2VuZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV29ya2VyczogdGhpcy5vcHRpb25zLm51bVdvcmtlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVVcGRhdGU6IHRoaXMub3B0aW9ucy5wcmVVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0VXBkYXRlOiB0aGlzLm9wdGlvbnMucG9zdFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNab29tOiAoTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID09PSAnMS54JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWdoRGVuc2l0eURpc3BsYXk6IHRoaXMub3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dMZXZlbDogdGhpcy5vcHRpb25zLmxvZ0xldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5vcHRpb25zLmludHJvc3BlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbGVkIHNjZW5lLnVwZGF0ZSgpIHBlciBmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlbmRlckxvb3A6IHRoaXMub3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgd2lsbCByZXF1aXJlIGxpYnJhcnkgdG8gYmUgc2VydmVkIGFzIHNhbWUgaG9zdCBhcyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0Nyb3NzRG9tYWluV29ya2VyczogdGhpcy5vcHRpb25zLmFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gRmluaXNoIGluaXRpYWxpemluZyBzY2VuZSBhbmQgc2V0dXAgZXZlbnRzIHdoZW4gbGF5ZXIgaXMgYWRkZWQgdG8gbWFwXG4gICAgICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uQWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG1hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4obWFwLmdldFpvb20oKSwgbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5pbW1lZGlhdGVSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnpvb21zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc3RhcnRab29tKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5wYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcucGFubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnZW5kJywgdGhpcy5ob29rcy5kcmFnZW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIG1hcC5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBNb2RpZnkgZGVmYXVsdCBsZWFmbGV0IHNjcm9sbCB3aGVlbCBiZWhhdmlvclxuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcihtYXApO1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwU2VsZWN0aW9uRXZlbnRIYW5kbGVycyhtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRXZlbnRzKHRoaXMub3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIEdMIGNhbnZhcyB0byBsYXllciBjb250YWluZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHZpZXdcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0YW5ncmFtIGV2ZW50c1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZTogdGhpcy5vblRhbmdyYW1WaWV3VXBkYXRlLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZSBsZWFmbGV0J3MgZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGFzIHRoZSBjYWxsYmFjayBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdpbml0Jyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25SZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2RyYWdlbmQnLCB0aGlzLmhvb2tzLmRyYWdlbmQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gY29vcmRzLnggKyAnLycgKyBjb29yZHMueSArICcvJyArIGNvb3Jkcy56O1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRpbGUta2V5Jywga2V5KTtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAnMjU2cHgnO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSAnMjU2cHgnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93RGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlYnVnX292ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS50ZXh0Q29udGVudCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudG9wID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudGV4dE91dGxpbmUgPSAnMXB4ICMwMDAwMDAnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBhZGRpbmcgPSAnOHB4JztcblxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGVidWdfb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJDb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkaXY7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBNb2RpZnkgbGVhZmxldCdzIGRlZmF1bHQgc2Nyb2xsIHdoZWVsIGJlaGF2aW9yIHRvIGhhdmUgYSBtdWNoIG1vcmUgc2Vuc2l0dmUvY29udGludW91cyB6b29tXG4gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIHNob3VsZCBiZSBkZXByZWNhdGVkIG9uY2UgbGVhZmxldCBjb250aW51b3VzIHpvb20gaXMgbW9yZSB3aWRlbHkgdXNlZCBhbmQgdGhlXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIGlzIHByZXN1bWFibHkgaW1wcm92ZWRcbiAgICAgICAgICAgIG1vZGlmeVNjcm9sbFdoZWVsQmVoYXZpb3I6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuc2Nyb2xsV2hlZWxab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlTY3JvbGxXaGVlbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLm9wdGlvbnMuem9vbVNuYXAgPSAwO1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsID0gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgbWFwLm9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWUgPSAxMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVWaWV3OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4odGhpcy5fbWFwLmdldFpvb20oKSwgdGhpcy5fbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXNpemVNYXAoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25UYW5ncmFtVmlld1VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8IHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0VmlldyhbdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sYXQsIHRoaXMuc2NlbmUudmlldy5jZW50ZXIubG5nXSwgdGhpcy5zY2VuZS52aWV3Lnpvb20sIHsgYW5pbWF0ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIENTUyBwb3NpdGlvbmluZyBMZWFmbGV0IGFwcGxpZXMgdG8gdGhlIGxheWVyLCBzaW5jZSBUYW5ncmFtJ3MgV2ViR0wgY2FudmFzXG4gICAgICAgICAgICAvLyBpcyBleHBlY3RlZCB0byBiZSAnYWJzb2x1dGVseScgcG9zaXRpb25lZC5cbiAgICAgICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCAhdGhpcy5zY2VuZSB8fCAhdGhpcy5zY2VuZS5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0b3BfbGVmdCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLnNjZW5lLmNvbnRhaW5lciwgdG9wX2xlZnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVGllIExlYWZsZXQgZXZlbnQgaGFuZGxlcnMgdG8gVGFuZ3JhbSBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RmVhdHVyZUF0KGV2ZW50LmNvbnRhaW5lclBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgc2VsZWN0aW9uLCB7IGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrKHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlbW92ZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RmVhdHVyZUF0KGV2ZW50LmNvbnRhaW5lclBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgc2VsZWN0aW9uLCB7IGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyKHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlbW92ZScsIHRoaXMuaG9va3MubW91c2Vtb3ZlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2VvdXQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3VzZSBsZWF2ZXMgbWFwLCBzZW5kIGFuIGFkZGl0aW9uYWwgc2VsZWN0aW9uIGV2ZW50IHRvIGluZGljYXRlIG5vIGZlYXR1cmUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyKHsgY2hhbmdlZDogdHJ1ZSwgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFNldCB1c2VyLWRlZmluZWQgaGFuZGxlcnMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uIGV2ZW50c1xuICAgICAgICAgICAgLy8gQ3VycmVudGx5IG9ubHkgb25lIGhhbmRsZXIgY2FuIGJlIGRlZmluZWQgZm9yIGVhY2ggZXZlbnQgdHlwZVxuICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgYXJlOiBgY2xpY2tgLCBgaG92ZXJgIChsZWFmbGV0IGBtb3VzZW1vdmVgKVxuICAgICAgICAgICAgc2V0U2VsZWN0aW9uRXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fc2VsZWN0aW9uX2V2ZW50cywgZXZlbnRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxheWVyIGNsYXNzXG4gICAgICAgIExlYWZsZXRMYXllciA9IGxheWVyQmFzZUNsYXNzLmV4dGVuZChsYXllckNsYXNzQ29uZmlnKTtcblxuICAgICAgICAvLyBQb2x5ZmlsbCBzb21lIDEuMCBtZXRob2RzXG4gICAgICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyLnJlbW92ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgTGVhZmxldExheWVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyZW1vdmUnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBMZWFmbGV0TGF5ZXIubGF5ZXJCYXNlQ2xhc3MgPSBsYXllckJhc2VDbGFzcztcbiAgICAgICAgTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID0gbGVhZmxldFZlcnNpb247XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9hbWJpZW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvZGlyZWN0aW9uYWxMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9wb2ludExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Nwb3RMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvc3BvdExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuXG4vLyBBYnN0cmFjdCBsaWdodFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmFtYmllbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzQoY29uZmlnLmFtYmllbnQgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5hbWJpZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZGlmZnVzZSA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IEdMU0wuZXhwYW5kVmVjNChjb25maWcuZGlmZnVzZSAhPSBudWxsID8gY29uZmlnLmRpZmZ1c2UgOiAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmRpZmZ1c2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjdWxhciA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuc3BlY3VsYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gR0xTTC5leHBhbmRWZWM0KGNvbmZpZy5zcGVjdWxhciB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5zcGVjdWxhcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaWdodCBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICAvLyAnY29uZmlnJyBtdXN0IGluY2x1ZGUgJ25hbWUnIGFuZCAndHlwZScsIGFsb25nIHdpdGggYW55IG90aGVyIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHN0YXRpYyBjcmVhdGUgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBpZiAoTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSh2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGxpZ2h0IGZvciBhIHN0eWxlOiBmcmFnbWVudCBsaWdodGluZywgdmVydGV4IGxpZ2h0aW5nLCBvciBub25lXG4gICAgc3RhdGljIHNldE1vZGUgKG1vZGUsIHN0eWxlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtb2RlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfVxuICAgICAgICBtb2RlID0gTGlnaHQuZW5hYmxlZCAmJiAoKG1vZGUgIT0gbnVsbCkgPyBtb2RlIDogJ2ZyYWdtZW50Jyk7IC8vIGRlZmF1bHQgdG8gZnJhZ21lbnQgbGlnaHRpbmdcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19GUkFHTUVOVCddID0gKG1vZGUgPT09ICdmcmFnbWVudCcpO1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX1ZFUlRFWCddID0gKG1vZGUgPT09ICd2ZXJ0ZXgnKTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgYWxsIHByb3ZpZGVkIGxpZ2h0IGRlZmluaXRpb25zLCBhbmQgY2FsY3VsYXRlIGN1bXVsYXRpdmUgbGlnaHQgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0IChsaWdodHMpIHtcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgaW5qZWN0aW9uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKExpZ2h0LmJsb2NrKTtcblxuICAgICAgICAvLyBJZiBsaWdodGluZyBpcyBnbG9iYWxseSBkaXNhYmxlZCwgbm90aGluZyBpcyBpbmplY3RlZCAobW9zdGx5IGZvciBkZWJ1Z2dpbmcgb3IgbGl2ZSBlZGl0aW5nKVxuICAgICAgICBpZiAoIUxpZ2h0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBjb2RlIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0IGluc3RhbmNlXG4gICAgICAgIGxldCBjYWxjdWxhdGVMaWdodHMgPSBcIlwiO1xuICAgICAgICBpZiAobGlnaHRzICYmIE9iamVjdC5rZXlzKGxpZ2h0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCB1bmlxdWVzIHR5cGVzIG9mIGxpZ2h0c1xuICAgICAgICAgICAgbGV0IHR5cGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2xpZ2h0c1tsaWdodF9uYW1lXS50eXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBlYWNoIHR5cGUgb2YgbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBMaWdodC50eXBlc1t0eXBlXS5pbmplY3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IHBlci1pbnN0YW5jZSBibG9ja3MgYW5kIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmaW5lIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgbGlnaHRzW2xpZ2h0X25hbWVdLmluamVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxpZ2h0cyArPSBgY2FsY3VsYXRlTGlnaHQoJHtsaWdodF9uYW1lfSwgX2V5ZVRvUG9pbnQsIF9ub3JtYWwpO1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBubyBsaWdodCBpcyBkZWZpbmVkLCB1c2UgMTAwJSBvbW5pZGlyZWN0aW9uYWwgZGlmZnVzZSBsaWdodFxuICAgICAgICAgICAgY2FsY3VsYXRlTGlnaHRzID0gYFxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZSA9IHZlYzQoMS4pO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdsdWUgdG9nZXRoZXIgdGhlIGZpbmFsIGxpZ2h0aW5nIGZ1bmN0aW9uIHRoYXQgc3VtcyBhbGwgdGhlIGxpZ2h0c1xuICAgICAgICBsZXQgY2FsY3VsYXRlRnVuY3Rpb24gPSBgXG4gICAgICAgICAgICB2ZWM0IGNhbGN1bGF0ZUxpZ2h0aW5nKGluIHZlYzMgX2V5ZVRvUG9pbnQsIGluIHZlYzMgX25vcm1hbCwgaW4gdmVjNCBfY29sb3IpIHtcblxuICAgICAgICAgICAgICAgIC8vIERvIGluaXRpYWwgbWF0ZXJpYWwgY2FsY3VsYXRpb25zIG92ZXIgbm9ybWFsLCBlbWlzc2lvbiwgYW1iaWVudCwgZGlmZnVzZSBhbmQgc3BlY3VsYXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF0ZXJpYWwoX2V5ZVRvUG9pbnQsX25vcm1hbCk7XG5cbiAgICAgICAgICAgICAgICAvLyBVbiByb2xsIHRoZSBsb29wIG9mIGluZGl2aWR1YWwgbGlndGhzIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICR7Y2FsY3VsYXRlTGlnaHRzfVxuXG4gICAgICAgICAgICAgICAgLy8gIEZpbmFsIGxpZ2h0IGludGVuc2l0eSBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1hdGVyaWFsLmVtaXNzaW9uO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfQU1CSUVOVFxuICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50ICogX2NvbG9yICogbWF0ZXJpYWwuYW1iaWVudDtcbiAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50ICogX2NvbG9yICogbWF0ZXJpYWwuZGlmZnVzZTtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2RpZmZ1c2UgKiBfY29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfU1BFQ1VMQVJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gbGlnaHRfYWNjdW11bGF0b3Jfc3BlY3VsYXIgKiBtYXRlcmlhbC5zcGVjdWxhcjtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgIC8vIENsYW1wIGZpbmFsIGNvbG9yXG4gICAgICAgICAgICAgICAgY29sb3IgPSBjbGFtcChjb2xvciwgMC4wLCAxLjApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgY2FsY3VsYXRlRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIENvbW1vbiBpbnN0YW5jZSBkZWZpbml0aW9uXG4gICAgaW5qZWN0ICgpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gIGBcbiAgICAgICAgICAgIHVuaWZvcm0gJHt0aGlzLnN0cnVjdF9uYW1lfSB1XyR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgICR7dGhpcy5zdHJ1Y3RfbmFtZX0gJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgbGV0IGFzc2lnbiA9IGBcbiAgICAgICAgICAgICR7dGhpcy5uYW1lfSA9IHVfJHt0aGlzLm5hbWV9O1xcblxuICAgICAgICBgO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGluc3RhbmNlKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnc2V0dXAnLCBhc3NpZ24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbFxuICAgIC8vIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gIFRocmVlIGNvbW1vbiBsaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfJHt0aGlzLm5hbWV9LmRpZmZ1c2VgLCB0aGlzLmRpZmZ1c2UpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV8ke3RoaXMubmFtZX0uc3BlY3VsYXJgLCB0aGlzLnNwZWN1bGFyKTtcbiAgICB9XG5cbn1cblxuTGlnaHQudHlwZXMgPSB7fTsgLy8gcmVmZXJlbmNlcyB0byBzdWJjbGFzc2VzIGJ5IHNob3J0IG5hbWVcbkxpZ2h0LmJsb2NrID0gJ2xpZ2h0aW5nJzsgLy8gc2hhZGVyIGJsb2NrIG5hbWVcbkxpZ2h0LmVuYWJsZWQgPSB0cnVlOyAvLyBsaWdodGluZyBjYW4gYmUgZ2xvYmFsbHkgZW5hYmxlZC9kaXNhYmxlZFxuXG5cbi8vIExpZ2h0IHN1YmNsYXNzZXNcbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnYW1iaWVudCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnQW1iaWVudExpZ2h0JztcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydhbWJpZW50J10gPSBBbWJpZW50TGlnaHQ7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2RpcmVjdGlvbmFsJztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IChjb25maWcuZGlyZWN0aW9uIHx8IFswLjIsIDAuNywgLTAuNV0pLm1hcChwYXJzZUZsb2F0KTsgLy8gW3gsIHksIHpdXG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydkaXJlY3Rpb25hbCddID0gRGlyZWN0aW9uYWxMaWdodDtcblxuXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1BvaW50TGlnaHQnO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb24gfHwgWzAsIDAsICcxMDBweCddO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFtdOyAvLyBwb3NpdGlvbiBpbiBleWVzcGFjZVxuICAgICAgICB0aGlzLm9yaWdpbiA9IGNvbmZpZy5vcmlnaW4gfHwgJ2dyb3VuZCc7XG4gICAgICAgIHRoaXMuYXR0ZW51YXRpb24gPSAhaXNOYU4ocGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pKSA/IHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSA6IDA7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5yYWRpdXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5yYWRpdXMpICYmIGNvbmZpZy5yYWRpdXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBjb25maWcucmFkaXVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBbbnVsbCwgY29uZmlnLnJhZGl1c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3BvaW50TGlnaHQpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBpc250YW5jZS1zcGVjaWZpYyBzZXR0aW5nc1xuICAgIGluamVjdCgpIHtcbiAgICAgICAgc3VwZXIuaW5qZWN0KCk7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSA9ICh0aGlzLmF0dGVudWF0aW9uICE9PSAwKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCAmJiB0aGlzLnJhZGl1c1swXSAhPSBudWxsKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFeWVQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHVwZGF0ZUV5ZVBvc2l0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnd29ybGQnKSB7XG4gICAgICAgICAgICAvLyBGb3Igd29ybGQgb3JpZ2luLCBmb3JtYXQgaXM6IFtsb25naXR1ZGUsIGxhdGl0dWRlLCBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXVxuXG4gICAgICAgICAgICAvLyBNb3ZlIGxpZ2h0J3Mgd29ybGQgcG9zaXRpb24gaW50byBjYW1lcmEgc3BhY2VcbiAgICAgICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnModGhpcy5wb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVswXSA9IHggLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1swXTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzFdID0geSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uWzJdLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnIHx8IHRoaXMub3JpZ2luID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgLy8gRm9yIGNhbWVyYSBvciBncm91bmQgb3JpZ2luLCBmb3JtYXQgaXM6IFt4LCB5LCB6XSBpbiBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXG5cbiAgICAgICAgICAgIC8vIExpZ2h0IGlzIGluIGNhbWVyYSBzcGFjZSBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMZWF2ZSBsaWdodCdzIHh5IGluIGNhbWVyYSBzcGFjZSwgYnV0IHogbmVlZHMgdG8gYmUgbW92ZWQgcmVsYXRpdmUgdG8gZ3JvdW5kIHBsYW5lXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllWzNdID0gMTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfJHt0aGlzLm5hbWV9LnBvc2l0aW9uYCwgdGhpcy5wb3NpdGlvbl9leWUpO1xuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmF0dGVudWF0aW9uRXhwb25lbnRgLCB0aGlzLmF0dGVudWF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5pbm5lclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzBdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5vdXRlclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzFdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxpZ2h0LnR5cGVzWydwb2ludCddID0gUG9pbnRMaWdodDtcblxuXG5jbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBQb2ludExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3Nwb3RsaWdodCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnU3BvdExpZ2h0JztcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IChjb25maWcuZGlyZWN0aW9uIHx8IFswLCAwLCAtMV0pLm1hcChwYXJzZUZsb2F0KTsgLy8gW3gsIHksIHpdXG4gICAgICAgIHRoaXMuZXhwb25lbnQgPSBjb25maWcuZXhwb25lbnQgPyBwYXJzZUZsb2F0KGNvbmZpZy5leHBvbmVudCkgOiAwLjI7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBjb25maWcuYW5nbGUgPyBwYXJzZUZsb2F0KGNvbmZpZy5hbmdsZSkgOiAyMDtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3Nwb3RMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RDb3NDdXRvZmZgLCBNYXRoLmNvcyh0aGlzLmFuZ2xlICogMy4xNDE1OSAvIDE4MCkpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90RXhwb25lbnRgLCB0aGlzLmV4cG9uZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydzcG90bGlnaHQnXSA9IFNwb3RMaWdodDtcbiIsImltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX21hdGVyaWFsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9tYXRlcmlhbC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWwge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcblxuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhbGwgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0cywgc28gdGhleSBjYW4gYmUgc2V0IGluIGJ1bGtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBvZiBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhciddKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHZhbHVlLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiB2YWx1ZS5tYXBwaW5nIHx8ICdzcGhlcmVtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyh2YWx1ZS5zY2FsZSAhPSBudWxsID8gdmFsdWUuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlLmFtb3VudCAhPSBudWxsID8gdmFsdWUuYW1vdW50IDogMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzID0gY29uZmlnLnNoaW5pbmVzcyA/IHBhcnNlRmxvYXQoY29uZmlnLnNoaW5pbmVzcykgOiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAoY29uZmlnLm5vcm1hbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb25maWcubm9ybWFsLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgbWFwcGluZzogY29uZmlnLm5vcm1hbC5tYXBwaW5nIHx8ICd0cmlwbGFuYXInLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLm5vcm1hbC5zY2FsZSAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29uZmlnLm5vcm1hbC5hbW91bnQgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuYW1vdW50IDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBhIG1hdGVyaWFsIGNvbmZpZyBibG9jayBoYXMgc3VmZmljaWVudCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIG1hdGVyaWFsXG4gICAgc3RhdGljIGlzVmFsaWQgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZW1pc3Npb24gPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmFtYmllbnQgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLnNwZWN1bGFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluamVjdCAoc3R5bGUpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgZGVmaW5lcyB0byBjb25maWd1cmUgdGV4dHVyZSBtYXBwaW5nLCB3aXRoIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkUsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBBbHNvIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEVuYWJsZXMgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IG9uXG4gICAgICAgIGZvciAobGV0IHByb3Agb2YgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInXSkge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX01BVEVSSUFMXyR7cHJvcC50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgICBsZXQgdGV4ZGVmID0gZGVmICsgJ19URVhUVVJFJztcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbZGVmXSA9ICh0aGlzW3Byb3BdICE9IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0gJiYgdGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZiArICdfJyArIHRoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpc1twcm9wXS5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIC8vIEFzIGFub3ZlLCBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRSddID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkVfJyArIHRoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpcy5ub3JtYWwubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5yZXBsYWNlU2hhZGVyQmxvY2soTWF0ZXJpYWwuYmxvY2ssIHNoYWRlclNyY19tYXRlcmlhbCwgJ01hdGVyaWFsJyk7XG4gICAgICAgIHN0eWxlLmFkZFNoYWRlckJsb2NrKCdzZXR1cCcsICdcXG5tYXRlcmlhbCA9IHVfbWF0ZXJpYWw7XFxuJywgJ01hdGVyaWFsJyk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyB1bmlmb3JtcyBpbiB0aGUgcGF0dGVybjpcbiAgICAgICAgLy8gdV9tYXRlcmlhbC5kaWZmdXNlLCB1X21hdGVyaWFsLmRpZmZ1c2VTY2FsZSB1X21hdGVyaWFsX2RpZmZ1c2VfdGV4dHVyZVxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJ10pIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybShgdV9tYXRlcmlhbF8ke3Byb3B9X3RleHR1cmVgLCB0aGlzW3Byb3BdLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9U2NhbGVgLCB0aGlzW3Byb3BdLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcF0uYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwuc2hpbmluZXNzJywgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKCd1X21hdGVyaWFsX25vcm1hbF90ZXh0dXJlJywgdGhpcy5ub3JtYWwudGV4dHVyZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXRlcmlhbC5ub3JtYWxTY2FsZScsIHRoaXMubm9ybWFsLnNjYWxlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwubm9ybWFsQW1vdW50JywgdGhpcy5ub3JtYWwuYW1vdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTWF0ZXJpYWwuYmxvY2sgPSAnbWF0ZXJpYWwnO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gVGhlIGxlYWZsZXQgbGF5ZXIgcGx1Z2luIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBwdWJsaWMgQVBJXG5pbXBvcnQge2xlYWZsZXRMYXllcn0gZnJvbSAnLi9sZWFmbGV0X2xheWVyJztcblxuLy8gVGhlIHNjZW5lIHdvcmtlciBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIGEgd29ya2VyIHRocmVhZCBpcyBpbnN0YW50aWF0ZWQsIGJ1dCBtdXN0IGFsd2F5cyBiZSBsb2FkZWRcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCB7U2NlbmVXb3JrZXJ9IGZyb20gJy4vc2NlbmVfd29ya2VyJztcblxuLy8gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSBleHBvc2VkIGZvciBkZWJ1Z2dpbmdcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdXRpbHMvdmVyc2lvbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0ICcuL3NvdXJjZXMvZ2VvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy90b3BvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy9tdnQnO1xuaW1wb3J0ICcuL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhEYXRhIGZyb20gJy4vZ2wvdmVydGV4X2RhdGEnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCB7bGF5ZXJfY2FjaGV9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbi8vIE1ha2Ugc29tZSBtb2R1bGVzIGFjY2Vzc2libGUgZm9yIGRlYnVnZ2luZ1xudmFyIGRlYnVnID0ge1xuICAgIGxvZyxcbiAgICB5YW1sLFxuICAgIFRocmVhZCxcbiAgICBVdGlscyxcbiAgICBHZW8sXG4gICAgRGF0YVNvdXJjZSxcbiAgICBHTFNMLFxuICAgIFNoYWRlclByb2dyYW0sXG4gICAgVmVydGV4RGF0YSxcbiAgICBUZXh0dXJlLFxuICAgIE1hdGVyaWFsLFxuICAgIExpZ2h0LFxuICAgIFNjZW5lLFxuICAgIFNjZW5lV29ya2VyLFxuICAgIFdvcmtlckJyb2tlcixcbiAgICBsYXllcl9jYWNoZSxcbiAgICBTdHlsZU1hbmFnZXIsXG4gICAgU3R5bGVQYXJzZXIsXG4gICAgQ29sbGlzaW9uLFxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG4gICAgQ2FudmFzVGV4dCxcbiAgICBkZWJ1Z1NldHRpbmdzXG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xuXG4gICAgLy8gQXR0YWNoIFByb21pc2UgcG9seWZpbGwgdG8gd2luZG93XG4gICAgLy8gQWxsb3dzIEZvbnRGYWNlT2JzZXJ2ZXIgdG8gdXNlIHBvbHlmaWxsICh3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBpdHMgb3duIGR1cGxpY2F0ZSBwb2x5ZmlsbClcbiAgICBpZiAod2luZG93LlByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgICAgIEpTWmlwLmV4dGVybmFsLlByb21pc2UgPSBQcm9taXNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbGVhZmxldExheWVyLFxuICAgIGRlYnVnLFxuICAgIHZlcnNpb25cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2dsL2NvbnRleHQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL2dsL3Zhbyc7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuL3N0eWxlcy9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFNjZW5lTG9hZGVyIGZyb20gJy4vc2NlbmVfbG9hZGVyJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgVGlsZU1hbmFnZXIgZnJvbSAnLi90aWxlX21hbmFnZXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBSZW5kZXJTdGF0ZU1hbmFnZXIgZnJvbSAnLi9nbC9yZW5kZXJfc3RhdGUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vc3R5bGVzL3RleHQvZm9udF9tYW5hZ2VyJztcblxuLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uOiBwYXNzIGFuIG9iamVjdCBkaXJlY3RseSwgb3IgYSBVUkwgYXMgc3RyaW5nIHRvIGxvYWQgcmVtb3RlbHlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ19zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTY2VuZS5pZCsrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDsgLy8gd2lsbCBiZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjZW5lIGlzIGxvYWRlZFxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgVmlldyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIoeyBzY2VuZTogdGhpcywgdmlldzogdGhpcy52aWV3IH0pO1xuICAgICAgICB0aGlzLm51bV93b3JrZXJzID0gb3B0aW9ucy5udW1Xb3JrZXJzIHx8IDI7XG4gICAgICAgIHRoaXMud29ya2VyX3VybCA9IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgOiB0cnVlO1xuICAgICAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0ge307XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcblxuICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3VycmVudCBzY2VuZSBidWlsZGluZyBzdGF0ZSAodGlsZXMgYmVpbmcgYnVpbHQsIGV0Yy4pXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgYSByZWRyYXdcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCByZWRyYXcgZXZlcnkgZnJhbWVcbiAgICAgICAgdGhpcy5wcmVVcGRhdGUgPSBvcHRpb25zLnByZVVwZGF0ZTsgICAgICAgICAgICAgLy8gb3B0aW9uYWwgcHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5wb3N0VXBkYXRlID0gb3B0aW9ucy5wb3N0VXBkYXRlOyAgICAgICAgICAgLy8gb3B0aW9uYWwgcG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3AgPSAhb3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcDsgIC8vIGRpc2FibGUgcmVuZGVyIGxvb3AgLSBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgU2NlbmUucmVuZGVyKCkgcGVyIGZyYW1lXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMubGFzdF9yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZnJhbWUgPSAwO1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBhbiBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgc2NlbmUgY29uZmlnIGlzIGludmFsaWRhdGVkXG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gbGFzdCBnZW5lcmF0aW9uIGlkIHdpdGggYSBjb21wbGV0ZSB2aWV3XG4gICAgICAgIHRoaXMuc2V0dXBEZWJ1ZygpO1xuXG4gICAgICAgIHRoaXMubG9nX2xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCAnd2Fybic7XG4gICAgICAgIGxvZy5zZXRMZXZlbCh0aGlzLmxvZ19sZXZlbCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZSAoY29uZmlnLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2VuZShjb25maWcsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExvYWQgKG9yIHJlbG9hZCkgc2NlbmUgY29uZmlnXG4gICAgLy8gT3B0aW9uYWxseSBzcGVjaWZ5IG5ldyBzY2VuZSBmaWxlIFVSTFxuICAgIGxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIExvYWQgc2NlbmUgZGVmaW5pdGlvbiAoc291cmNlcywgc3R5bGVzLCBldGMuKSwgdGhlbiBjcmVhdGUgc3R5bGVzICYgd29ya2Vyc1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbnZhcygpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRoaXMubG9hZFNjZW5lKGNvbmZpZ19zb3VyY2UsIGNvbmZpZ19wYXRoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5jcmVhdGVXb3JrZXJzKCkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIC8vIFNjZW5lIGxvYWRlZCBmcm9tIGEgSlMgb2JqZWN0IG1heSBjb250YWluIGZ1bmN0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgLy8gd2hpbGUgb25lIGxvYWRlZCBmcm9tIGEgVVJMIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplX2Z1bmNzOiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNvbnRleHQgbG9zc1xuICAgICAgICAgICAgbGV0IGV4dCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHQubG9zZUNvbnRleHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZUNhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUubGVmdCA9IDA7XG5cbiAgICAgICAgLy8gRm9yY2UgdGFuZ3JhbSBjYW52YXMgdW5kZXJuZWF0aCBhbGwgbGVhZmxldCBsYXllcnMsIGFuZCBzZXQgYmFja2dyb3VuZCB0byB0cmFuc3BhcmVudFxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZ2wgPSBDb250ZXh0LmdldENvbnRleHQodGhpcy5jYW52YXMsIHtcbiAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSwgcHJlbXVsdGlwbGllZEFscGhhOiB0cnVlLCAvLyBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgICAgICAgICBkZXZpY2VfcGl4ZWxfcmF0aW86IFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdXIgYnJvd3NlciBtYXkgbm90IHN1cHBvcnQgV2ViR0wsIG9yIGl0J3MgdHVybmVkIG9mZj8gXCIgK1xuICAgICAgICAgICAgICAgIFwiVmlzaXQgaHR0cDovL3dlYmdscmVwb3J0LmNvbS8gZm9yIG1vcmUgaW5mby5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplTWFwKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQpO1xuICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5pbml0KHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMgPSBuZXcgUmVuZGVyU3RhdGVNYW5hZ2VyKHRoaXMuZ2wpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgVVJMIHRvIGxvYWQgdGhlIHdlYiB3b3JrZXIgZnJvbVxuICAgIGdldFdvcmtlclVybCgpIHtcbiAgICAgICAgbGV0IHdvcmtlcl91cmwgPSB0aGlzLndvcmtlcl91cmwgfHwgVXRpbHMuZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcblxuICAgICAgICBpZiAoIXdvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGxvYWQgd29ya2VyIGJlY2F1c2UgY291bGRuJ3QgZmluZCBiYXNlIFVSTCB0aGF0IGxpYnJhcnkgd2FzIGxvYWRlZCBmcm9tXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGFsb25nc2lkZSBjb3JlIGxpYnJhcnlcbiAgICAgICAgLy8gTk9URTogd29ya2Fyb3VuZCBmb3IgaXNzdWUgd2hlcmUgbGFyZ2UgbGlicmFyaWVzIGludGVybWl0dGVudGx5IGZhaWwgdG8gbG9hZCBpbiB3ZWIgd29ya2VycyxcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBpbXBvcnRTY3JpcHRzKCkgY2FsbHMgYXJlIHVzZWQuIExvYWRpbmcgYWxsIHNjcmlwdHMgKGluY2x1ZGluZyBUYW5ncmFtIGl0c2VsZilcbiAgICAgICAgLy8gaW4gb25lIGNhbGwgYXQgYXQgd29ya2VyIGNyZWF0aW9uIHRpbWUgaGFzIG5vdCBleGhpYml0ZWQgdGhlIHNhbWUgaXNzdWUuXG4gICAgICAgIGxldCB1cmxzID0gWy4uLnRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0c107XG4gICAgICAgIHVybHMucHVzaCh3b3JrZXJfdXJsKTsgLy8gbG9hZCBUYW5ncmFtICpsYXN0KiAoaGFzIGJlZW4gbW9yZSByZWxpYWJsZSwgdGhvdWdoIHJlYXNvbiB1bmtub3duKVxuICAgICAgICBsZXQgYm9keSA9IGBpbXBvcnRTY3JpcHRzKCR7dXJscy5tYXAodXJsID0+IGAnJHt1cmx9J2ApLmpvaW4oJywnKX0pO2A7XG4gICAgICAgIHJldHVybiBVdGlscy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxpc3Qgb2YgYW55IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIChpZiBhbnkpXG4gICAgdXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMgKCkge1xuICAgICAgICBsZXQgcHJldl9zY3JpcHRzID0gWy4uLih0aGlzLmRhdGFfc291cmNlX3NjcmlwdHN8fFtdKV07IC8vIHNhdmUgbGlzdCBvZiBwcmV2aW91c2x5IGxvYWRlZCBzY3JpcHRzXG4gICAgICAgIGxldCBzY3JpcHRzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuc291cmNlcykubWFwKHMgPT4gdGhpcy5jb25maWcuc291cmNlc1tzXS5zY3JpcHRzKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdsb2FkaW5nIGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGluIHdvcmtlcjonLCBzY3JpcHRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMgPSBbXS5jb25jYXQoLi4uc2NyaXB0cykuc29ydCgpO1xuXG4gICAgICAgIC8vIFNjcmlwdHMgY2hhbmdlZD9cbiAgICAgICAgcmV0dXJuICEodGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmxlbmd0aCA9PT0gcHJldl9zY3JpcHRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBwcmV2X3NjcmlwdHNbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBXZWIgd29ya2VycyBoYW5kbGUgaGVhdnkgZHV0eSB0aWxlIGNvbnN0cnVjdGlvbjogbmV0d29ya2luZywgZ2VvbWV0cnkgcHJvY2Vzc2luZywgZXRjLlxuICAgIGNyZWF0ZVdvcmtlcnMoKSB7XG4gICAgICAgIC8vIFJlc2V0IG9sZCB3b3JrZXJzIChpZiBhbnkpIGlmIHdlIG5lZWQgdG8gcmUtaW5zdGFudGlhdGUgd2l0aCBuZXcgZXh0ZXJuYWwgc2NyaXB0c1xuICAgICAgICBpZiAodGhpcy51cGRhdGVEYXRhU291cmNlU2NyaXB0cygpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVdvcmtlcnModGhpcy5nZXRXb3JrZXJVcmwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbnRpYXRlIHdvcmtlcnMgZnJvbSBVUkwsIGluaXQgZXZlbnQgaGFuZGxlcnNcbiAgICBtYWtlV29ya2Vycyh1cmwpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkPTA7IGlkIDwgdGhpcy5udW1fd29ya2VyczsgaWQrKykge1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vyc1tpZF0gPSB3b3JrZXI7XG5cbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcblxuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6aW5nIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgbGV0IF9pZCA9IGlkO1xuICAgICAgICAgICAgcXVldWUucHVzaChXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5pbml0JywgdGhpcy5pZCwgaWQsIHRoaXMubnVtX3dvcmtlcnMsIHRoaXMubG9nX2xldmVsLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLnRoZW4oXG4gICAgICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemVkIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBTY2VuZS5tYWtlV29ya2VyczogZmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VyICR7X2lkfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gMDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKHRoaXMud29ya2Vycyk7XG5cbiAgICAgICAgICAgIC8vIExldCBWZXJ0ZXhFbGVtZW50cyBrbm93IGlmIDMyIGJpdCBpbmRpY2VzIGZvciBlbGVtZW50IGFycmF5cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgVWludDMyX2ZsYWcgPSB0aGlzLmdsLmdldEV4dGVuc2lvbihcIk9FU19lbGVtZW50X2luZGV4X3VpbnRcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnVmVydGV4RWxlbWVudHMuc2V0VWludDMyRmxhZycsIFVpbnQzMl9mbGFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveVdvcmtlcnMoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud29ya2VycykpIHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKG51bGwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucmVtb3ZlV29ya2VyKHdvcmtlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSb3VuZCByb2JpbiBzZWxlY3Rpb24gb2YgbmV4dCB3b3JrZXJcbiAgICBuZXh0V29ya2VyKCkge1xuICAgICAgICB2YXIgd29ya2VyID0gdGhpcy53b3JrZXJzW3RoaXMubmV4dF93b3JrZXJdO1xuICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gKHRoaXMubmV4dF93b3JrZXIgKyAxKSAlIHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfVxuXG4gICAgLy8gU2NlbmUgaXMgcmVhZHkgZm9yIHJlbmRlcmluZ1xuICAgIHJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlldy5yZWFkeSgpIHx8IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZXMsIGUuZy4gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkaXNwbGF5c1xuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKCkge1xuICAgICAgICBpZiAoVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVEZXZpY2VQaXhlbFJhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVidWlsZCgpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVzaXplTWFwKHRoaXMudmlldy5zaXplLmNzcy53aWR0aCwgdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzaXplTWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5zZXRWaWV3cG9ydFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZSh0aGlzLmdsLCB3aWR0aCwgaGVpZ2h0LCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBzY2VuZSBiZSByZWRyYXduIGF0IG5leHQgYW5pbWF0aW9uIGxvb3BcbiAgICByZXF1ZXN0UmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWRyYXcgc2NlbmUgaW1tZWRpYXRlbHkgLSBkb24ndCB3YWl0IGZvciBhbmltYXRpb24gbG9vcFxuICAgIC8vIFVzZSBzcGFyaW5nbHksIGJ1dCBmb3IgY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIGNsb3Nlc3QgcG9zc2libGUgc3luYyB3aXRoIG90aGVyIFVJIGVsZW1lbnRzLFxuICAgIC8vIHN1Y2ggYXMgb3RoZXIsIG5vbi1XZWJHTCBtYXAgbGF5ZXJzIChlLmcuIExlYWZsZXQgcmFzdGVyIGxheWVycywgbWFya2VycywgZXRjLilcbiAgICBpbW1lZGlhdGVSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHJlbmRlckxvb3AgKCkge1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IHRydWU7IC8vIG9ubHkgbGV0IHRoZSByZW5kZXIgbG9vcCBpbnN0YW50aWF0ZSBvbmNlXG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSBuZXh0IGZyYW1lIGlmIG5vdCBzY2hlZHVsZWQgdG8gc3RvcFxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3Bfc3RvcCkge1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3AuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCB0aGUgcmVuZGVyIGxvb3BcbiAgICBzZXR1cFJlbmRlckxvb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnJlbmRlckxvb3AoKTsgfSwgMCk7IC8vIGRlbGF5IHN0YXJ0IGJ5IG9uZSB0aWNrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIFJlbmRlciBvbiBkZW1hbmRcbiAgICAgICAgdmFyIHdpbGxfcmVuZGVyID0gIShcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMucmVhZHkoKSA9PT0gZmFsc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBQcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnByZVVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWlsIGlmIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGlmICghd2lsbF9yZW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7IC8vIHN1YmNsYXNzZXMgY2FuIHNldCB0aGlzIGJhY2sgdG8gdHJ1ZSB3aGVuIGFuaW1hdGlvbiBpcyBuZWVkZWRcblxuICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgIHRoaXMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdDb21wbGV0ZSgpOyAvLyBmaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5jb21wbGV0ZVNjcmVlbnNob3QoKTsgLy8gY29tcGxldGVzIHNjcmVlbnNob3QgY2FwdHVyZSBpZiByZXF1ZXN0ZWRcblxuICAgICAgICAvLyBQb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdFVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWRyYXcgZXZlcnkgZnJhbWUgaWYgYW5pbWF0aW5nXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZnJhbWUrKztcbiAgICAgICAgbG9nKCd0cmFjZScsICdTY2VuZS5yZW5kZXIoKScpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0eWxlcywgY2FtZXJhLCBsaWdodHNcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZSgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9zdHlsZXMpLmZvckVhY2goaSA9PiB0aGlzLnN0eWxlc1tpXS51cGRhdGUoKSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlcmFibGUgdGlsZSBsaXN0XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXNfY291bnQgPSB0aGlzLnJlbmRlcmFibGVfdGlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IHJlbmRlcmVkICR7dGhpcy5yZW5kZXJfY291bnR9IHByaW1pdGl2ZXMgKCR7c2l6ZX0gZmVhdHVyZXMgaW4gc2VsZWN0aW9uIG1hcClgKTtcbiAgICAgICAgICAgIH0sICgpID0+IHt9KTsgLy8gbm8gb3Agd2hlbiBwcm9taXNlIHJlamVjdHMgKG9ubHkgcHJpbnQgbGFzdCByZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gdGhpcy5yZW5kZXJfY291bnQ7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGFsbCBhY3RpdmUgc3R5bGVzLCBncm91cGVkIGJ5IGJsZW5kL2RlcHRoIHR5cGUgKG9wYXF1ZSwgb3ZlcmxheSwgZXRjLikgYW5kIGJ5IHByb2dyYW0gKHN0eWxlKVxuICAgIC8vIENhbGxlZCBib3RoIGZvciBtYWluIHJlbmRlciBwYXNzLCBhbmQgZm9yIHNlY29uZGFyeSBwYXNzZXMgbGlrZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgcmVuZGVyUGFzcyhwcm9ncmFtX2tleSA9ICdwcm9ncmFtJywgeyBhbGxvd19ibGVuZCB9ID0ge30pIHtcbiAgICAgICAgLy8gb3B0aW9uYWxseSBmb3JjZSBhbHBoYSBvZmYgKGUuZy4gZm9yIHNlbGVjdGlvbiBwYXNzKVxuICAgICAgICBhbGxvd19ibGVuZCA9IChhbGxvd19ibGVuZCA9PSBudWxsKSA/IHRydWUgOiBhbGxvd19ibGVuZDtcblxuICAgICAgICB0aGlzLmNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvcjogdHJ1ZSwgY2xlYXJfZGVwdGg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgYmxlbmQgb3JkZXJcbiAgICAgICAgbGV0IHN0eWxlcyA9IE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcykuXG4gICAgICAgICAgICBtYXAocyA9PiB0aGlzLnN0eWxlc1tzXSkuXG4gICAgICAgICAgICBzb3J0KFN0eWxlLmJsZW5kT3JkZXJTb3J0KTtcblxuICAgICAgICAvLyBSZW5kZXIgc3R5bGVzXG4gICAgICAgIGxldCBjb3VudCA9IDA7IC8vIGhvdyBtYW55IHByaW1pdGl2ZXMgd2VyZSByZW5kZXJlZFxuICAgICAgICBsZXQgbGFzdF9ibGVuZDtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc3R5bGVzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNbc107XG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSByZW5kZXIgc3RhdGUgd2hlbiBibGVuZCBtb2RlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5ibGVuZCAhPT0gbGFzdF9ibGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sXG4gICAgICAgICAgICAgICAgICAgIFN0eWxlLnJlbmRlcl9zdGF0ZXNbc3R5bGUuYmxlbmRdLCAgICAgICAvLyByZW5kZXIgc3RhdGUgZm9yIGJsZW5kIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgeyBibGVuZDogKGFsbG93X2JsZW5kICYmIHN0eWxlLmJsZW5kKSB9IC8vIGVuYWJsZS9kaXNhYmxlIGJsZW5kaW5nIChlLmcuIG5vIGJsZW5kIGZvciBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlclN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMucmVuZGVyU3R5bGUoc3R5bGUubmFtZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgbGFzdF9ibGVuZCA9IHN0eWxlLmJsZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHJlbmRlclN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSkge1xuICAgICAgICBsZXQgZmlyc3RfZm9yX3N0eWxlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJlbmRlcl9jb3VudCA9IDA7XG5cbiAgICAgICAgbGV0IHByb2dyYW0gPSB0aGlzLnN0eWxlc1tzdHlsZV1bcHJvZ3JhbV9rZXldO1xuICAgICAgICBpZiAoIXByb2dyYW0gfHwgIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVuZGVyIHRpbGUgR0wgZ2VvbWV0cmllc1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aGlzLnJlbmRlcmFibGVfdGlsZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5yZW5kZXJhYmxlX3RpbGVzW3RdO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5tZXNoZXNbc3R5bGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0dXAgc3R5bGUgaWYgcmVuZGVyaW5nIGZvciBmaXJzdCB0aW1lIHRoaXMgZnJhbWVcbiAgICAgICAgICAgIC8vIChsYXp5IGluaXQsIG5vdCBhbGwgc3R5bGVzIHdpbGwgYmUgdXNlZCBpbiBhbGwgc2NyZWVuIHZpZXdzOyBzb21lIHN0eWxlcyBtaWdodCBiZSBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0X2Zvcl9zdHlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpcnN0X2Zvcl9zdHlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS51c2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZV0uc2V0dXAoKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHNldCB1bmlmb3JtcyB3aGVuIHRoZXkgaGF2ZW4ndCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3RpbWUnLCB0aGlzLmFuaW1hdGVkID8gKCgoK25ldyBEYXRlKCkpIC0gdGhpcy5zdGFydF90aW1lKSAvIDEwMDApIDogMCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMubGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2ldLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcHJveHkgdGlsZXMgaWYgbmV3IHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZyB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoIXRpbGUuc2hvdWxkUHJveHlGb3JTdHlsZShzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYFNjZW5lLnJlbmRlclN0eWxlKCk6IFNraXAgcHJveHkgdGlsZSBmb3Igc3R5bGUgJyR7c3R5bGV9JyBgLCB0aWxlLCB0aWxlLnByb3h5X2Zvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIHRoaXMudmlldy5zZXR1cFRpbGUodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciB0aWxlXG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZXNbc3R5bGVdLnJlbmRlcih0aWxlLm1lc2hlc1tzdHlsZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jdXIgYWRkaXRpb25hbCByZW5kZXJzIHdoaWxlIHZpZXdwb3J0IGlzIG1vdmluZ1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcl9jb3VudCArPSB0aWxlLm1lc2hlc1tzdHlsZV0uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyX2NvdW50O1xuICAgIH1cblxuICAgIGNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvciwgY2xlYXJfZGVwdGggfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgY2xlYXJfY29sb3IgPSAoY2xlYXJfY29sb3IgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGNsZWFyX2RlcHRoID0gKGNsZWFyX2RlcHRoID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuXG4gICAgICAgIC8vIFNldCBHTCBzdGF0ZVxuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGNsZWFyX2RlcHRoIH0pO1xuXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChjbGVhcl9jb2xvciB8fCBjbGVhcl9kZXB0aCkge1xuICAgICAgICAgICAgbGV0IG1hc2sgPSAoY2xlYXJfY29sb3IgJiYgZ2wuQ09MT1JfQlVGRkVSX0JJVCkgfCAoY2xlYXJfZGVwdGggJiYgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlbmRlclN0YXRlKHsgZGVwdGhfdGVzdCwgZGVwdGhfd3JpdGUsIGN1bGxfZmFjZSwgYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgLy8gVE9ETzogd2hlbiB3ZSBhYnN0cmFjdCBvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVuZGVyIHBhc3NlcywgdGhlc2UgY2FuIGJlIHBlci1wYXNzIGNvbmZpZyBvcHRpb25zXG4gICAgICAgIGxldCByZW5kZXJfc3RhdGVzID0gdGhpcy5yZW5kZXJfc3RhdGVzO1xuICAgICAgICBkZXB0aF90ZXN0ID0gKGRlcHRoX3Rlc3QgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF90ZXN0OyAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBkZXB0aF93cml0ZSA9IChkZXB0aF93cml0ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3dyaXRlOyAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjdWxsX2ZhY2UgPSAoY3VsbF9mYWNlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZzsgICAgICAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBibGVuZCA9IChibGVuZCAhPSBudWxsKSA/IGJsZW5kIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5ibGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFsc2VcblxuICAgICAgICAvLyBSZXNldCBmcmFtZSBzdGF0ZVxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfdGVzdC5zZXQoeyBkZXB0aF90ZXN0OiBkZXB0aF90ZXN0IH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBkZXB0aF93cml0ZSB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5jdWxsaW5nLnNldCh7IGN1bGw6IGN1bGxfZmFjZSwgZmFjZTogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSk7XG5cbiAgICAgICAgLy8gQmxlbmRpbmcgb2YgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB0byBhY2NvdW50IGZvciBXZWJHTCBhbHBoYSBiZWhhdmlvciwgc2VlOlxuICAgICAgICAvLyBodHRwOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTE1MzM0MTZcbiAgICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgICAgICAvLyBPcGFxdWU6IGFsbCBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICBpZiAoYmxlbmQgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5TUkNfQUxQSEEsIGRzdDogZ2wuWkVST1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgYWxwaGEgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnb3ZlcmxheScgfHwgYmxlbmQgPT09ICdpbmxheScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlNSQ19BTFBIQSwgZHN0OiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZGRpdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5PTkUsIGRzdDogZ2wuT05FLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdWx0aXBsaWNhdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdtdWx0aXBseScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlpFUk8sIGRzdDogZ2wuU1JDX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7IGJsZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb24gYXQgZ2l2ZW4gcGl4ZWwuIFJ1bnMgYXN5bmMgYW5kIHJldHVybnMgcmVzdWx0cyB2aWEgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVBdChwaXhlbCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBcIlNjZW5lLmdldEZlYXR1cmVBdCgpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9pbnQgc2NhbGVkIHRvIFswLi4xXSByYW5nZVxuICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBwaXhlbC54ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLndpZHRoLFxuICAgICAgICAgICAgeTogcGl4ZWwueSAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS5oZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgLy8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNjZW5lIHJlLXJlbmRlcnMgZm9yIHRoZXNlIHRvIGJlIHByb2Nlc3NlZFxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0RmVhdHVyZUF0KHBvaW50KS5cbiAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IE9iamVjdC5hc3NpZ24oc2VsZWN0aW9uLCB7IHBpeGVsIH0pKS5cbiAgICAgICAgICAgIGNhdGNoKGVycm9yID0+IFByb21pc2UucmVzb2x2ZSh7IGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5LCB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGNvbmZpZyBvciByZS1jb21waWxpbmcgc3R5bGVzXG4gICAgLy8gVE9ETzogZGV0ZWN0IHdoaWNoIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVmcmVzaGVkL3JlYnVpbHQgKHN0eWxlc2hlZXQgY2hhbmdlcywgZXRjLilcbiAgICByZWJ1aWxkKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZEdlb21ldHJ5KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgYWxsIHRpbGVzXG4gICAgLy8gc3luYzogYm9vbGVhbiBvZiB3aGV0aGVyIHRvIHN5bmMgdGhlIGNvbmZpZyBvYmplY3QgdG8gdGhlIHdvcmtlclxuICAgIC8vIHNvdXJjZXM6IG9wdGlvbmFsIGFycmF5IG9mIGRhdGEgc291cmNlcyB0byBzZWxlY3RpdmVseSByZWJ1aWxkIChieSBkZWZhdWx0IGFsbCBvdXIgcmVidWlsdClcbiAgICByZWJ1aWxkR2VvbWV0cnkoeyBzeW5jID0gdHJ1ZSwgc291cmNlcyA9IG51bGwsIHNlcmlhbGl6ZV9mdW5jcywgcHJvZmlsZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gU2tpcCByZWJ1aWxkIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgdG8gb25lIHJlYnVpbGQgY2FsbCBhdCBhIHRpbWUsIG9ubHkgc2F2ZSBsYXN0IHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5xdWV1ZWQgJiYgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgaXQgZGlkIG5vdCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgJ1NjZW5lLnJlYnVpbGQ6IHJlcXVlc3Qgc3VwZXJjZWRlZCBieSBhIG5ld2VyIGNhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVzb2x2ZShmYWxzZSk7IC8vIGZhbHNlIGZsYWcgaW5kaWNhdGVzIHJlYnVpbGQgcmVxdWVzdCB3YXMgc3VwZXJjZWRlZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNhdmUgcXVldWVkIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnF1ZXVlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTY2VuZS5yZWJ1aWxkKCk6IHF1ZXVpbmcgcmVxdWVzdGApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG5cbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb25maWcgKGluIGNhc2UgSlMgb2JqZWN0cyB3ZXJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5KVxuICAgICAgICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuY29tcGlsZSh0aGlzLnVwZGF0ZUFjdGl2ZVN0eWxlcygpLCB0aGlzKTsgLy8gb25seSByZWNvbXBpbGUgbmV3bHkgYWN0aXZlIHN0eWxlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYnVpbGQgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucHJ1bmVUb1Zpc2libGVUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmJ1aWxkVGlsZSh0aWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpOyAvLyBwaWNrcyB1cCBhZGRpdGlvbmFsIHRpbGVzIGZvciBhbnkgbmV3L2NoYW5nZWQgZGF0YSBzb3VyY2VzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5jaGVja0J1aWxkUXVldWUoKTsgICAgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBubyB0aWxlcyB0byBidWlsZFxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlRW5kKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRpbGUgbWFuYWdlciBmaW5pc2hlZCBidWlsZGluZyB0aWxlc1xuICAgIC8vIFRPRE8gbW92ZSB0byB0aWxlIG1hbmFnZXJcbiAgICB0aWxlTWFuYWdlckJ1aWxkRG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogYnVpbGQgZ2VvbWV0cnkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgcmVidWlsZCBxdWV1ZWQ/XG4gICAgICAgICAgICB2YXIgcXVldWVkID0gdGhpcy5idWlsZGluZy5xdWV1ZWQ7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lOiBzdGFydGluZyBxdWV1ZWQgcmVidWlsZCgpIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGQoKS50aGVuKHF1ZXVlZC5yZXNvbHZlLCBxdWV1ZWQucmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgIExvYWQgKG9yIHJlbG9hZCkgdGhlIHNjZW5lIGNvbmZpZ1xuICAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICBsb2FkU2NlbmUoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlIHx8IHRoaXMuY29uZmlnX3NvdXJjZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVdGlscy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoIHx8IHRoaXMuY29uZmlnX3NvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVXRpbHMucGF0aEZvclVSTChjb25maWdfcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2NlbmVMb2FkZXIubG9hZFNjZW5lKHRoaXMuY29uZmlnX3NvdXJjZSwgdGhpcy5jb25maWdfcGF0aCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWQnLCB7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBzb3VyY2UgdG8gYSBzY2VuZSwgYXJndW1lbnRzIGBuYW1lYCBhbmQgYGNvbmZpZ2AgbmVlZCB0byBiZSBwcm92aWRlZDpcbiAgICAvLyAgLSBJZiB0aGUgbmFtZSBkb2Vzbid0IG1hdGNoIGEgc291cmNlcyBpdCB3aWxsIGNyZWF0ZSBpdFxuICAgIC8vICAtIHRoZSBgY29uZmlnYCBvYmogZm9sbG93IHRoZSBZQU1MIHNjZW5lIHNwZWMsIGV4OiBgYGB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiXX1gYGBcbiAgICAvLyAgICB0aGF0IGxvb2tzIGxpa2U6XG4gICAgLy9cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJvc21cIiwge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIiB9KTtcbiAgICAvL1xuICAgIC8vICAtIGFsc28gY2FuIGJlIHBhc3MgYSBgYGBkYXRhYGBgIG9iajogYGBge3R5cGU6ICdHZW9KU09OJywgZGF0YTogSlNPYmogXX1gYGBcbiAgICAvL1xuICAgIC8vICAgICAgdmFyIGdlb2pzb25fZGF0YSA9IHt9O1xuICAgIC8vICAgICAgLi4uXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwiZHluYW1pY19kYXRhXCIsIHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IGdlb2pzb25fZGF0YSB9KTtcbiAgICAvL1xuICAgIHNldERhdGFTb3VyY2UgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWNvbmZpZyB8fCAhY29uZmlnLnR5cGUgfHwgKCFjb25maWcudXJsICYmICFjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIk5vIG5hbWUgcHJvdmlkZWQgb3Igbm90IGEgdmFsaWQgY29uZmlnOlwiLCBuYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvYWQgPSAodGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xuXG4gICAgICAgIGlmIChzb3VyY2UuZGF0YSAmJiB0eXBlb2Ygc291cmNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gVXRpbHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzb3VyY2UuZGF0YSldKSk7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgbGV0IHByZXZfc291cmNlID0gdGhpcy5zb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tuYW1lXSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwge25hbWV9KSwgdGhpcy5zb3VyY2VzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb3VsZCBub3QgY3JlYXRlIGRhdGEgc291cmNlOiAke2UubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTY2VuZTogJHttZXNzYWdlfWAsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgeyB0eXBlOiAnc291cmNlcycsIHNvdXJjZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGF0YSBzb3VyY2UgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChEYXRhU291cmNlLmNoYW5nZWQodGhpcy5zb3VyY2VzW25hbWVdLCBwcmV2X3NvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU291cmNlcyB0aGF0IHdlcmUgcmVtb3ZlZFxuICAgICAgICBmb3IgKGxldCBzIG9mIHByZXZfc291cmNlX25hbWVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNvdXJjZXNbc10pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW3NdOyAvLyBUT0RPOiByZW1vdmUgZnJvbSB3b3JrZXJzIHRvbz9cbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIGZyb20gc291cmNlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICBpZiAocmVzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNldC5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHNvdXJjZXMgdGhhdCBnZW5lcmF0ZSBnZW9tZXRyeSB0aWxlc1xuICAgICAgICAvLyAoYWxsIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSBvbmx5IHJhc3RlciBzb3VyY2VzIGF0dGFjaGVkIHRvIG90aGVyIHNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIFV0aWxzLnZhbHVlcyh0aGlzLmNvbmZpZy5sYXllcnMpKSB7XG4gICAgICAgICAgICBpZiAobGF5ZXIuZGF0YSAmJiB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXS5nZW9tZXRyeV90aWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCB0ZXh0dXJlcyBpbiB0aGUgc2NlbmUgZGVmaW5pdGlvblxuICAgIGxvYWRUZXh0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCh0aGlzLmdsLCB0aGlzLmNvbmZpZy50ZXh0dXJlcykuXG4gICAgICAgICAgICB0aGVuKCgpID0+IFRleHR1cmUuY3JlYXRlRGVmYXVsdCh0aGlzLmdsKSk7IC8vIGNyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlIGZvciBwbGFjZWhvbGRlcnNcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgKGN1cnJlbnRseSBtYW51YWxseSkgYWZ0ZXIgc3R5bGVzIGFyZSB1cGRhdGVkIGluIHN0eWxlc2hlZXRcbiAgICB1cGRhdGVTdHlsZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiAhdGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NlbmUudXBkYXRlU3R5bGVzKCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIChSZSlidWlsZCBzdHlsZXMgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlX21hbmFnZXIuYnVpbGQodGhpcy5jb25maWcuc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXModGhpcyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgR0wgY29udGV4dCAodXNlZCB3aGVuIGluaXRpYWxpemluZyBvciByZS1pbml0aWFsaXppbmcgR0wgcmVzb3VyY2VzKVxuICAgICAgICBmb3IgKHZhciBzdHlsZSBvZiBVdGlscy52YWx1ZXModGhpcy5zdHlsZXMpKSB7XG4gICAgICAgICAgICBzdHlsZS5zZXRHTCh0aGlzLmdsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgJiBjb21waWxlIGFjdGl2ZSBzdHlsZXNcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmNvbXBpbGUoT2JqZWN0LmtleXModGhpcy5hY3RpdmVfc3R5bGVzKSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlQWN0aXZlU3R5bGVzKCkge1xuICAgICAgICAvLyBNYWtlIGEgc2V0IG9mIGN1cnJlbnRseSBhY3RpdmUgc3R5bGVzICh1c2VkIGluIGEgbGF5ZXIpXG4gICAgICAgIC8vIE5vdGU6IGRvZXNuJ3QgYWN0dWFsbHkgY2hlY2sgaWYgYW55IGdlb21ldHJ5IG1hdGNoZXMgdGhlIGxheWVyLCBqdXN0IHRoYXQgdGhlIHN0eWxlIGlzIHBvdGVudGlhbGx5IHJlbmRlcmFibGVcbiAgICAgICAgbGV0IHByZXZfc3R5bGVzID0gT2JqZWN0LmtleXModGhpcy5hY3RpdmVfc3R5bGVzIHx8IHt9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0ge307XG4gICAgICAgIGxldCBhbmltYXRlZCA9IGZhbHNlOyAvLyBpcyBhbnkgYWN0aXZlIHN0eWxlIGFuaW1hdGVkP1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBVdGlscy5yZWN1cnNlVmFsdWVzKHRoaXMuY29uZmlnLmxheWVycykpIHtcbiAgICAgICAgICAgIGlmIChsYXllciAmJiBsYXllci5kcmF3KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW25hbWUsIGdyb3VwXSBvZiBVdGlscy5lbnRyaWVzKGxheWVyLmRyYXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm4gb24gbm9uLW9iamVjdCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIHR5cGVvZiBncm91cCA9PT0gJ29iamVjdCcgJiYgZ3JvdXAudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSBbc3R5bGVfbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIGFkZGl0aW9uYWwgb3V0bGluZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLm91dGxpbmUgJiYgZ3JvdXAub3V0bGluZS5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKGdyb3VwLm91dGxpbmUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMgPSBzdHlsZXMuZmlsdGVyKHggPT4gdGhpcy5zdHlsZXNbeF0pLmZvckVhY2goc3R5bGVfbmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGVfbmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlX3N0eWxlc1tzdHlsZV9uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZS5hbmltYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgZXhwbGljaXRseSBzZXQgc2NlbmUgYW5pbWF0aW9uIGZsYWcgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIHR1cm4gb24gYW5pbWF0aW9uXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgYW5pbWF0ZWQgc3R5bGVzXG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgOiBhbmltYXRlZDtcblxuICAgICAgICAvLyBDb21waWxlIG5ld2x5IGFjdGl2ZSBzdHlsZXNcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcykuZmlsdGVyKHMgPT4gcHJldl9zdHlsZXMuaW5kZXhPZihzKSA9PT0gLTEpO1xuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYShuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc2V0QWN0aXZlQ2FtZXJhKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBsaWdodGluZ1xuICAgIGNyZWF0ZUxpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5saWdodHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmNvbmZpZy5saWdodHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGlnaHRzW2ldIHx8IHR5cGVvZiB0aGlzLmNvbmZpZy5saWdodHNbaV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGlnaHQgPSB0aGlzLmNvbmZpZy5saWdodHNbaV07XG4gICAgICAgICAgICBsaWdodC5uYW1lID0gaS5yZXBsYWNlKCctJywgJ18nKTsgLy8gbGlnaHQgbmFtZXMgYXJlIGluamVjdGVkIGluIHNoYWRlcnMsIGNhbid0IGhhdmUgaHlwaGVuc1xuICAgICAgICAgICAgbGlnaHQudmlzaWJsZSA9IChsaWdodC52aXNpYmxlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAobGlnaHQudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2xpZ2h0Lm5hbWVdID0gTGlnaHQuY3JlYXRlKHRoaXMudmlldywgbGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExpZ2h0LmluamVjdCh0aGlzLmxpZ2h0cyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgYmcgPSB0aGlzLmNvbmZpZy5zY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB7fTtcbiAgICAgICAgaWYgKGJnICYmIGJnLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGJnLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZC5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gWzAsIDAsIDAsIDBdOyAvLyBkZWZhdWx0IGJhY2tncm91bmQgVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBiYWNrZ3JvdW5kIGlzIGZ1bGx5IG9wYXF1ZSwgc2V0IGNhbnZhcyBiYWNrZ3JvdW5kIHRvIG1hdGNoXG4gICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQuY29sb3JbM10gPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICAgICAgYHJnYmEoJHt0aGlzLmJhY2tncm91bmQuY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoLi4udGhpcy5iYWNrZ3JvdW5kLmNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuIGludHJvc3BlY3Rpb24gbW9kZSBvbi9vZmZcbiAgICBzZXRJbnRyb3NwZWN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gdmFsIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzY2VuZSBjb25maWcsIGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAvLyByZWJ1aWxkIGNhbiBiZSBib29sZWFuLCBvciBhbiBvYmplY3QgY29udGFpbmluZyByZWJ1aWxkIG9wdGlvbnMgdG8gcGFzc3Rocm91Z2hcbiAgICB1cGRhdGVDb25maWcoeyByZWJ1aWxkID0gdHJ1ZSwgc2VyaWFsaXplX2Z1bmNzIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSArK1NjZW5lLmdlbmVyYXRpb247XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5jb25maWcuc2NlbmUgPSB0aGlzLmNvbmZpZy5zY2VuZSB8fCB7fTtcblxuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLnZpZXcucmVzZXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMaWdodHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEYXRhU291cmNlcygpO1xuICAgICAgICB0aGlzLmxvYWRUZXh0dXJlcygpO1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmQoKTtcbiAgICAgICAgRm9udE1hbmFnZXIubG9hZEZvbnRzKHRoaXMuY29uZmlnLmZvbnRzKTtcblxuICAgICAgICAvLyBUT0RPOiBkZXRlY3QgY2hhbmdlcyB0byBzdHlsZXM/IGFscmVhZHkgKGN1cnJlbnRseSkgbmVlZCB0byByZWNvbXBpbGUgYW55d2F5IHdoZW4gY2FtZXJhIG9yIGxpZ2h0cyBjaGFuZ2VcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgbGV0IGRvbmUgPSByZWJ1aWxkID9cbiAgICAgICAgICAgIHRoaXMucmVidWlsZChPYmplY3QuYXNzaWduKHsgc2VyaWFsaXplX2Z1bmNzIH0sIHR5cGVvZiByZWJ1aWxkID09PSAnb2JqZWN0JyAmJiByZWJ1aWxkKSkgOlxuICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7IC8vIHJlYnVpbGQoKSBhbHNvIHN5bmNzIGNvbmZpZ1xuXG4gICAgICAgIC8vIEZpbmlzaCBieSB1cGRhdGluZyBib3VuZHMgYW5kIHJlLXJlbmRlcmluZ1xuICAgICAgICByZXR1cm4gZG9uZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgY29uZmlnIGFuZCBzZW5kIHRvIHdvcmtlclxuICAgIHN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIC8vIFRlbGwgd29ya2VycyB3ZSdyZSBhYm91dCB0byByZWJ1aWxkIChzbyB0aGV5IGNhbiB1cGRhdGUgc3R5bGVzLCBldGMuKVxuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID1cbiAgICAgICAgICAgIHNlcmlhbGl6ZV9mdW5jcyA/IFV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnModGhpcy5jb25maWcpIDogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlQ29uZmlnJywge1xuICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ19zZXJpYWxpemVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byByZWxhdGVkIG9iamVjdHNcbiAgICBjcmVhdGVMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnZpZXcgPSB7XG4gICAgICAgICAgICBtb3ZlOiAoKSA9PiB0aGlzLnRyaWdnZXIoJ21vdmUnKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZXcuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnRleHR1cmUgPSB7XG4gICAgICAgICAgICB1cGRhdGU6ICgpID0+IHRoaXMuZGlydHkgPSB0cnVlLFxuICAgICAgICAgICAgd2FybmluZzogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignd2FybmluZycsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAndGV4dHVyZXMnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBUZXh0dXJlLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIgPSB7XG4gICAgICAgICAgICBlcnJvcjogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignZXJyb3InLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3NjZW5lJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgU2NlbmVMb2FkZXIuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVBbGwoKTtcbiAgICAgICAgdGhpcy52aWV3LnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuICAgICAgICBUZXh0dXJlLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuICAgICAgICBTY2VuZUxvYWRlci51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBGZWF0dXJlU2VsZWN0aW9uKHRoaXMuZ2wsIHRoaXMud29ya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5yZXNldEZlYXR1cmVTZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgZmVhdHVyZSBzZWxlY3Rpb24gbWFwIHNpemUgYWNyb3NzIGFsbCB3b3JrZXJzLiBSZXR1cm5zIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlX3NjcmVlbnNob3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlOyAvLyBvbmx5IGNhcHR1cmUgb25lIHNjcmVlbnNob3QgYXQgYSB0aW1lXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcblxuICAgICAgICAvLyBXaWxsIHJlc29sdmUgb25jZSByZW5kZXJpbmcgaXMgY29tcGxldGUgYW5kIHJlbmRlciBidWZmZXIgaXMgY2FwdHVyZWRcbiAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0ge307XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nLCBjYXB0dXJlcyByZW5kZXIgYnVmZmVyIGFuZCByZXNvbHZlcyBwcm9taXNlIHdpdGggaW1hZ2UgZGF0YVxuICAgIGNvbXBsZXRlU2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlX3NjcmVlbnNob3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IGRhdGEgVVJMLCBjb252ZXJ0IHRvIGJsb2JcbiAgICAgICAgICAgIC8vIFN0cmlwIGhvc3QvbWltZXR5cGUvZXRjLiwgY29udmVydCBiYXNlNjQgdG8gYmluYXJ5IHdpdGhvdXQgVVRGLTggbWFuZ2xpbmdcbiAgICAgICAgICAgIC8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdW5jb25lZC80MzcwODIyXG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIHZhciBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIHdpdGggc2NyZWVuc2hvdCBkYXRhXG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucmVzb2x2ZSh7IHVybCwgYmxvYiB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIFN0YXRzL2RlYnVnL3Byb2ZpbGluZyBtZXRob2RzXG5cbiAgICAvLyBQcm9maWxlIGhlbHBlcnMsIGlzc3VlcyBhIHByb2ZpbGUgb24gbWFpbiB0aHJlYWQgJiBhbGwgd29ya2Vyc1xuICAgIF9wcm9maWxlKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGBtYWluIHRocmVhZDogJHtuYW1lfWApO1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5wcm9maWxlJywgbmFtZSk7XG4gICAgfVxuXG4gICAgX3Byb2ZpbGVFbmQobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGVFbmQoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGVFbmQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBEZWJ1ZyBjb25maWcgYW5kIGZ1bmN0aW9uc1xuICAgIHNldHVwRGVidWcgKCkge1xuICAgICAgICBsZXQgc2NlbmUgPSB0aGlzO1xuICAgICAgICB0aGlzLmRlYnVnID0ge1xuICAgICAgICAgICAgLy8gUmVidWlsZCBnZW9tZXRyeSBhIGdpdmVuICMgb2YgdGltZXMgYW5kIHByaW50IGF2ZXJhZ2UsIG1pbiwgbWF4IHRpbWluZ3NcbiAgICAgICAgICAgIHRpbWVSZWJ1aWxkIChudW0gPSAxLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3ljbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBzY2VuZS5yZWJ1aWxkKG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMucHVzaCgrbmV3IERhdGUoKSAtIHN0YXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVzLmxlbmd0aCA8IG51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXZnID0gfn4odGltZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYikgLyB0aW1lcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBQcm9maWxlZCByZWJ1aWxkICR7bnVtfSB0aW1lczogJHthdmd9IGF2ZyAoJHtNYXRoLm1pbiguLi50aW1lcyl9IG1pbiwgJHtNYXRoLm1heCguLi50aW1lcyl9IG1heClgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGdlb21ldHJ5IGNvdW50cyBvZiB2aXNpYmxlIHRpbGVzLCBncm91cGVkIGJ5IHN0eWxlIG5hbWVcbiAgICAgICAgICAgIGdlb21ldHJ5Q291bnRCeVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdGlsZSBvZiBzY2VuZS50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGlsZS5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gPSBjb3VudHNbc3R5bGVdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5QmFzZVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfY291bnRzID0gc2NlbmUuZGVidWcuZ2VvbWV0cnlDb3VudEJ5U3R5bGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gc3R5bGVfY291bnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlID0gc2NlbmUuc3R5bGVzW3N0eWxlXS5idWlsdF9pbiA/IHN0eWxlIDogc2NlbmUuc3R5bGVzW3N0eWxlXS5iYXNlO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gPSBjb3VudHNbYmFzZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdICs9IHN0eWxlX2NvdW50c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG59XG5cblNjZW5lLmlkID0gMDsgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIGEgc2NlbmUgaW5zdGFuY2VcblNjZW5lLmdlbmVyYXRpb24gPSAwOyAvLyBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNjZW5lIGNvbmZpZyBpcyByZS1wYXJzZWRcbiIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbmV4cG9ydCBjbGFzcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gSWYgYSBiYXNlIHBhdGggd2FzIHByb3ZpZGVkLCB1c2UgaXQgZm9yIHJlc29sdmluZyBsb2NhbCBidW5kbGUgcmVzb3VyY2VzIG9ubHkgaWZcbiAgICAgICAgLy8gdGhlIGJhc2UgcGF0aCBpcyBhYnNvbHV0ZSwgb3IgdGhpcyBidW5kbGUncyBwYXRoIGlzIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXRoICYmICghVXRpbHMuaXNSZWxhdGl2ZVVSTChwYXRoKSB8fCBVdGlscy5pc1JlbGF0aXZlVVJMKHRoaXMudXJsKSkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBVdGlscy5wYXRoRm9yVVJMKHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF0aF9mb3JfcGFyZW50ID0gcGF0aCB8fCB0aGlzLnBhdGg7IC8vIGZvciByZXNvbHZpbmcgcGF0aHMgcmVsYXRpdmUgdG8gYSBwYXJlbnQgYnVuZGxlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgIC8vIEFuIGFuY2VzdG9yIGJ1bmRsZSBtYXkgYmUgYSBjb250YWluZXIgKGUuZy4gemlwIGZpbGUpIHRoYXQgbmVlZHMgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoc1xuICAgICAgICAvLyBmb3IgYW55IHNjZW5lcyBpdCBjb250YWlucywgZS5nLiBgcm9vdC56aXBgIGhhcyBhIGByb290LnlhbWxgIHRoYXQgaW5jbHVkZXMgYSBgZm9sZGVyL2NoaWxkLnlhbWxgOlxuICAgICAgICAvLyByZXNvdXJjZXMgd2l0aGluIGBjaGlsZC55YW1sYCBtdXN0IGJlIHJlc29sdmVkIHRocm91Z2ggdGhlIGJ1bmRsZSBmb3IgYHJvb3QuemlwYFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQuY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuaXNDb250YWluZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMubG9hZFJlc291cmNlKHRoaXMudXJsKTtcbiAgICB9XG5cbiAgICAvLyBJbmZvIGZvciByZXRyaWV2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZnJvbSB0aGlzIGJ1bmRsZVxuICAgIC8vIHVybDogZnVsbHkgcXVhbGlmaWVkIFVSTCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UgKGUuZy4gemlwcyB3aWxsIHRyYW5zZm9ybSB0aGlzIHRvIGJsb2IgVVJMKVxuICAgIC8vIHBhdGg6IG9yaWdpbmFsIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgYnVuZGxlIChmb3IgcmVzb2x2aW5nIHBhdGhzIHVwIHRoZSBidW5kbGUgdHJlZSlcbiAgICAvLyB0eXBlOiBmaWxlIGV4dGVuc2lvbiAodXNlZCBmb3IgZGV0ZXJtaW5pbmcgYnVuZGxlIHR5cGUsIGB5YW1sYCBvciBgemlwYClcbiAgICByZXNvdXJjZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxGb3IodXJsKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aEZvcih1cmwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlRm9yKHVybClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChVdGlscy5pc1JlbGF0aXZlVVJMKHVybCkgJiYgdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC51cmxGb3IodGhpcy5wYXRoX2Zvcl9wYXJlbnQgKyB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlscy5hZGRCYXNlVVJMKHVybCwgdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwYXRoRm9yKHVybCkge1xuICAgICAgICByZXR1cm4gVXRpbHMucGF0aEZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5leHRlbnNpb25Gb3JVUkwodXJsKTtcbiAgICB9XG5cbiAgICBpc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgWmlwU2NlbmVCdW5kbGUgZXh0ZW5kcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCkge1xuICAgICAgICBzdXBlcih1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgICAgIHRoaXMuemlwID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLnBhdGggPSAnJztcbiAgICB9XG5cbiAgICBpc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy56aXAgPSBuZXcgSlNaaXAoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmlvKHRoaXMudXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJylcbiAgICAgICAgICAgICAgICAudGhlbihib2R5ID0+IHRoaXMuemlwLmxvYWRBc3luYyhib2R5KSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnBhcnNlWmlwRmlsZXMoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvYWRSb290KCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVybEZvcih1cmwpIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXJsRm9yWmlwRmlsZShVdGlscy5mbGF0dGVuUmVsYXRpdmVVUkwodXJsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVybEZvcih1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIGlmIChVdGlscy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JaaXBGaWxlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnR5cGVGb3IodXJsKTtcbiAgICB9XG5cbiAgICBsb2FkUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJvb3QoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gVXRpbHMubG9hZFJlc291cmNlKHRoaXMudXJsRm9yWmlwRmlsZSh0aGlzLnJvb3QpKSk7XG4gICAgfVxuXG4gICAgZmluZFJvb3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYSBzaW5nbGUgWUFNTCBmaWxlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHppcFxuICAgICAgICBjb25zdCB5YW1scyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gdGhpcy5maWxlc1twYXRoXS5kZXB0aCA9PT0gMClcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiBVdGlscy5leHRlbnNpb25Gb3JVUkwocGF0aCkgPT09ICd5YW1sJyk7XG5cbiAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geWFtbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByb290IGZvdW5kXG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYENvdWxkIG5vdCBmaW5kIHJvb3Qgc2NlbmUgZm9yIGJ1bmRsZSAnJHt0aGlzLnVybH0nOiBgO1xuICAgICAgICAgICAgbXNnICs9IGBUaGUgemlwIGFyY2hpdmUncyByb290IGxldmVsIG11c3QgY29udGFpbiBhIHNpbmdsZSBzY2VuZSBmaWxlIHdpdGggdGhlICcueWFtbCcgZXh0ZW5zaW9uLiBgO1xuICAgICAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIG11bHRpcGxlIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWw6ICR7eWFtbHMubWFwKHIgPT4gJ1xcJycgKyByICsgJ1xcJycgKS5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBOTyBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IobXNnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHBhcnNlWmlwRmlsZXMoKSB7XG4gICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy56aXAuZm9yRWFjaCgocGF0aCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWxlLmRpcikge1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChmaWxlLmFzeW5jKCdhcnJheWJ1ZmZlcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoID0gcGF0aC5zcGxpdCgnLycpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVXRpbHMuZXh0ZW5zaW9uRm9yVVJMKHBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVybEZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5maWxlc1tmaWxlXSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzW2ZpbGVdLnVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbZmlsZV0udXJsID0gVXRpbHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLmZpbGVzW2ZpbGVdLmRhdGFdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdLnVybDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGVGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0gJiYgdGhpcy5maWxlc1tmaWxlXS50eXBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUgPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICd6aXAnIHx8ICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBVdGlscy5leHRlbnNpb25Gb3JVUkwodXJsKSA9PT0gJ3ppcCcpKSB7XG4gICAgICAgIHJldHVybiBuZXcgWmlwU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IHtjcmVhdGVTY2VuZUJ1bmRsZX0gZnJvbSAnLi9zY2VuZV9idW5kbGUnO1xuXG52YXIgU2NlbmVMb2FkZXI7XG5cbmV4cG9ydCBkZWZhdWx0IFNjZW5lTG9hZGVyID0ge1xuXG4gICAgLy8gTG9hZCBzY2VuZXMgZGVmaW5pdGlvbnMgZnJvbSBVUkwgJiBwcm9wcm9jZXNzXG4gICAgbG9hZFNjZW5lKHVybCwgcGF0aCA9IG51bGwpIHtcbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGggfSwgbnVsbCwgZXJyb3JzKS5cbiAgICAgICAgICAgIHRoZW4oY29uZmlnID0+IHRoaXMuZmluYWxpemUoY29uZmlnKSkuXG4gICAgICAgICAgICB0aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBzY2VuZSBmYWlsZWQgdG8gbG9hZCwgcmVqZWN0IHdpdGggZmlyc3QgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNjZW5lIGxvYWRlZCwgYnV0IHNvbWUgaW1wb3J0cyBoYWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBpbXBvcnQgc2NlbmU6ICR7ZXJyb3IudXJsfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZTogJ3NjZW5lX2ltcG9ydCcsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IGVycm9yLnVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZHMgc2NlbmUgZmlsZXMgZnJvbSBVUkwsIHJlY3Vyc2l2ZWx5IGxvYWRpbmcgJ2ltcG9ydCcgc2NlbmVzXG4gICAgLy8gT3B0aW9uYWwgKmluaXRpYWwqIHBhdGggb25seSAod29uJ3QgYmUgcGFzc2VkIHRvIHJlY3Vyc2l2ZSAnaW1wb3J0JyBjYWxscylcbiAgICAvLyBVc2VmdWwgZm9yIGxvYWRpbmcgcmVzb3VyY2VzIGluIGJhc2Ugc2NlbmUgZmlsZSBmcm9tIGEgc2VwYXJhdGUgbG9jYXRpb25cbiAgICAvLyAoZS5nLiBpbiBUYW5ncmFtIFBsYXksIHdoZW4gbW9kaWZpZWQgbG9jYWwgc2NlbmUgc2hvdWxkIHN0aWxsIHJlZmVyIHRvIG9yaWdpbmFsIHJlc291cmNlIFVSTHMpXG4gICAgbG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoLCB0eXBlIH0sIHBhcmVudCwgZXJyb3JzID0gW10pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1bmRsZSA9IGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlKTtcblxuICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWQoKS50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAvLyBhY2NlcHQgc2luZ2xlLXN0cmluZyBvciBhcnJheVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuaW1wb3J0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQgPSBbY29uZmlnLmltcG9ydF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuaW1wb3J0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IFVSTHMgb2Ygc2NlbmVzIHRvIGltcG9ydFxuICAgICAgICAgICAgbGV0IGltcG9ydHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHVybCBvZiBjb25maWcuaW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5wdXNoKGJ1bmRsZS5yZXNvdXJjZUZvcih1cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuaW1wb3J0OyAvLyBkb24ndCB3YW50IHRvIG1lcmdlIHRoaXMgcHJvcGVydHlcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoaW1wb3J0cy5tYXAocmVzb3VyY2UgPT4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUocmVzb3VyY2UsIGJ1bmRsZSwgZXJyb3JzKSkpLlxuICAgICAgICAgICAgICAgIHRoZW4oY29uZmlncyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgLi4uY29uZmlncywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHNjZW5lIGxvYWQgZXJyb3JzIGFzIHdlIGdvXG4gICAgICAgICAgICBlcnJvci51cmwgPSB1cmw7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhZGp1c3Qgd2l0aGluIGVhY2ggbG9jYWwgc2NlbmUgZmlsZSAodXN1YWxseSBieSBwYXRoKVxuICAgIG5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGRhdGEgc291cmNlXG4gICAgbm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBjb25maWcuc291cmNlcyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2YgIFV0aWxzLnZhbHVlcyhjb25maWcuc291cmNlcykpIHtcbiAgICAgICAgICAgIHNvdXJjZS51cmwgPSBidW5kbGUudXJsRm9yKHNvdXJjZS51cmwpO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2Uuc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc2NyaXB0cyA9IHNvdXJjZS5zY3JpcHRzLm1hcCh1cmwgPT4gYnVuZGxlLnVybEZvcih1cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZm9udHNcbiAgICBub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuZm9udHMgPSBjb25maWcuZm9udHMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgdmFsIG9mIFV0aWxzLnJlY3Vyc2VWYWx1ZXMoY29uZmlnLmZvbnRzKSkge1xuICAgICAgICAgICAgaWYgKHZhbC51cmwpIHtcbiAgICAgICAgICAgICAgICB2YWwudXJsID0gYnVuZGxlLnVybEZvcih2YWwudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBhbmQgY2VudHJhbGl6ZSB0ZXh0dXJlIGRlZmluaXRpb25zIGZvciBhIHNjZW5lIG9iamVjdFxuICAgIG5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy50ZXh0dXJlcyA9IGNvbmZpZy50ZXh0dXJlcyB8fCB7fTtcblxuICAgICAgICAvLyBBZGQgY3VycmVudCBzY2VuZSdzIGJhc2UgcGF0aCB0byBnbG9iYWxseSBkZWZpbmVkIHRleHR1cmVzXG4gICAgICAgIC8vIE9ubHkgYWRkcyBwYXRoIGZvciB0ZXh0dXJlcyB3aXRoIHJlbGF0aXZlIFVSTHMsIHNvIHRleHR1cmVzIGluIGltcG9ydGVkIHNjZW5lcyBnZXQgdGhlIGJhc2VcbiAgICAgICAgLy8gcGF0aCBvZiB0aGVpciBpbW1lZGlhdGUgc2NlbmUgZmlsZVxuICAgICAgICBpZiAoY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0dXJlIG9mIFV0aWxzLnZhbHVlcyhjb25maWcudGV4dHVyZXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmUudXJsID0gYnVuZGxlLnVybEZvcih0ZXh0dXJlLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSBcIlVSTCBzaG9ydGN1dFwiIHRleHR1cmVzLCBlLmcuIHRob3NlIHNwZWNpZmllZCBhcyBpbmxpbmUgVVJMIHN0cmluZ3MsIHRvIHRoZSBzY2VuZSdzIHRvcC1sZXZlbFxuICAgICAgICAvLyBzZXQgb2YgdGV4dHVyZXMgKGNvbmZpZy50ZXh0dXJlcykuIFRoZXJlIGFyZSAzIHN1Y2ggY2FzZXMgb2YgdGV4dHVyZXM6XG4gICAgICAgIC8vIC0gaW4gYSBzdHlsZSdzIGB0ZXh0dXJlYCBwcm9wZXJ0eVxuICAgICAgICAvLyAtIGluIGEgc3R5bGUncyBgbWF0ZXJpYWxgIHByb3BlcnRpZXNcbiAgICAgICAgLy8gLSBpbiBhIHN0eWxlJ3MgY3VzdG9tIHVuaWZvcm1zIChgc2hhZGVycy51bmlmb3Jtc2ApXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRleHR1cmUgYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhhdCBzdHJpbmcgbmFtZS4gVGhlIHRleHR1cmUncyBVUkxcbiAgICAgICAgLy8gaXMgZXhwYW5kZWQgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBzY2VuZSdzIGJhc2UgcGF0aC5cbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIG9mIFV0aWxzLnZhbHVlcyhjb25maWcuc3R5bGVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbdGV4XSA9IHsgdXJsOiB0ZXggfTtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IHRleDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbFxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIG9mIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleCA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbdGV4XSA9IHsgdXJsOiB0ZXggfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9IG9mIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBidW5kbGUudXJsRm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbdGV4XSA9IHsgdXJsOiB0ZXggfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1trZXldID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBTdWJzdGl0dXRlcyBnbG9iYWwgc2NlbmUgcHJvcGVydGllcyAodGhvc2UgZGVmaW5lZCBpbiB0aGUgYGNvbmZpZy5nbG9iYWxgIG9iamVjdCkgZm9yIGFueSBzdHlsZSB2YWx1ZXNcbiAgICAvLyBvZiB0aGUgZm9ybSBgZ2xvYmFsLmAsIGZvciBleGFtcGxlIGBjb2xvcjogZ2xvYmFsLnBhcmtfY29sb3JgIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIChpZiBhbnkpXG4gICAgLy8gZGVmaW5lZCBmb3IgdGhlIGBwYXJrX2NvbG9yYCBwcm9wZXJ0eSBpbiBgY29uZmlnLmdsb2JhbC5wYXJrX2NvbG9yYC5cbiAgICBhcHBseUdsb2JhbFByb3BlcnRpZXMoY29uZmlnKSB7XG4gICAgICAgIGlmICghY29uZmlnLmdsb2JhbCB8fCBPYmplY3Qua2V5cyhjb25maWcuZ2xvYmFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7IC8vIG5vIGdsb2JhbCBwcm9wZXJ0aWVzIHRvIHRyYW5zZm9ybVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGZsYXR0ZW5Qcm9wZXJ0aWVzKGNvbmZpZy5nbG9iYWwsIHNlcGFyYXRvcik7XG5cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wcyAob2JqKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IChvYmouc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykgJiYgKG9iai5zbGljZSg3KS5yZXBsYWNlKC9cXC4vZywgc2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAmJiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gcHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW3BdID0gYXBwbHlQcm9wcyhvYmpbcF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlQcm9wcyhjb25maWcpO1xuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgc29tZSBzY2VuZS13aWRlIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGZpbmFsLCBtZXJnZWQgc2NlbmVcbiAgICBmaW5hbGl6ZShjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgZ2xvYmFsIHNjZW5lIHByb3BlcnRpZXNcbiAgICAgICAgY29uZmlnID0gdGhpcy5hcHBseUdsb2JhbFByb3BlcnRpZXMoY29uZmlnKTtcblxuICAgICAgICAvLyBBc3NpZ24gaWRzIHRvIGRhdGEgc291cmNlc1xuICAgICAgICBsZXQgc291cmNlX2lkID0gMDtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25maWcuc291cmNlc1tzb3VyY2VdLmlkID0gc291cmNlX2lkKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvbmx5IG9uZSBjYW1lcmEgc3BlY2lmaWVkLCBzZXQgaXQgYXMgZGVmYXVsdFxuICAgICAgICBjb25maWcuY2FtZXJhcyA9IGNvbmZpZy5jYW1lcmFzIHx8IHt9O1xuICAgICAgICBpZiAoY29uZmlnLmNhbWVyYSkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IGNvbmZpZy5jYW1lcmE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBjYW1lcmFzIHNwZWNpZmllZCwgY3JlYXRlIG9uZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmNhbWVyYXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gY2FtZXJhIHNldCBhcyBhY3RpdmUsIHVzZSBmaXJzdCBvbmVcbiAgICAgICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBjYW1lcmEgb2YgVXRpbHMudmFsdWVzKGNvbmZpZy5jYW1lcmFzKSkge1xuICAgICAgICAgICAgaWYgKGNhbWVyYS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzW09iamVjdC5rZXlzKGNvbmZpZy5jYW1lcmFzKVswXV0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBjb25maWcubGlnaHRzID0gY29uZmlnLmxpZ2h0cyB8fCB7fTtcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IGNvbmZpZy5zdHlsZXMgfHwge307XG4gICAgICAgIGNvbmZpZy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IHt9O1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG59O1xuXG4vLyBGbGF0dGVuIG5lc3RlZCBwcm9wZXJ0aWVzIGZvciBzaW1wbGVyIHN0cmluZyBsb29rLXVwc1xuLy8gZS5nLiBnbG9iYWwuYmFja2dyb3VuZC5jb2xvciAtPiAnZ2xvYmFsOmJhY2tncm91bmQ6Y29sb3InXG5mdW5jdGlvbiBmbGF0dGVuUHJvcGVydGllcyAob2JqLCBzZXBhcmF0b3IgPSAnOicsIHByZWZpeCA9IG51bGwsIHByb3BzID0ge30pIHtcbiAgICBwcmVmaXggPSBwcmVmaXggPyAocHJlZml4ICsgc2VwYXJhdG9yKSA6ICcnO1xuXG4gICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IGtleSA9IHByZWZpeCArIHA7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcF07XG4gICAgICAgIHByb3BzW2tleV0gPSB2YWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5Qcm9wZXJ0aWVzKHZhbCwgc2VwYXJhdG9yLCBrZXksIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbnN1YnNjcmliZU1peGluKFNjZW5lTG9hZGVyKTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge3BhcnNlTGF5ZXJzfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5leHBvcnQgdmFyIFNjZW5lV29ya2VyID0gc2VsZjtcblxuLy8gV29ya2VyIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gd29ya2VyIHRocmVhZFxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcblxuT2JqZWN0LmFzc2lnbihzZWxmLCB7XG5cbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuXG4gICAgc291cmNlczoge1xuICAgICAgICB0aWxlczoge30sXG4gICAgICAgIG9iamVjdHM6IHt9XG4gICAgfSxcbiAgICBzdHlsZXM6IHt9LFxuICAgIGxheWVyczoge30sXG4gICAgdGlsZXM6IHt9LFxuICAgIG9iamVjdHM6IHt9LFxuICAgIGNvbmZpZzoge30sICAgICAvLyByYXcgY29uZmlnIChlLmcuIGZ1bmN0aW9ucywgZXRjLiBub3QgZXhwYW5kZWQpXG5cbiAgICAvLyBJbml0aWFsaXplIHdvcmtlclxuICAgIGluaXQgKHNjZW5lX2lkLCB3b3JrZXJfaWQsIG51bV93b3JrZXJzLCBsb2dfbGV2ZWwsIGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBzZWxmLnNjZW5lX2lkID0gc2NlbmVfaWQ7XG4gICAgICAgIHNlbGYuX3dvcmtlcl9pZCA9IHdvcmtlcl9pZDtcbiAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IG51bV93b3JrZXJzO1xuICAgICAgICBsb2cuc2V0TGV2ZWwobG9nX2xldmVsKTtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnNldFByZWZpeChzZWxmLl93b3JrZXJfaWQpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG4gICAgICAgIHJldHVybiB3b3JrZXJfaWQ7XG4gICAgfSxcblxuICAgIC8vIFN0YXJ0cyBhIGNvbmZpZyByZWZyZXNoXG4gICAgdXBkYXRlQ29uZmlnICh7IGNvbmZpZywgZ2VuZXJhdGlvbiwgaW50cm9zcGVjdGlvbiB9KSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnKTtcblxuICAgICAgICBzZWxmLmxhc3RfY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBzZWxmLmNvbmZpZyk7XG4gICAgICAgIHNlbGYuY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpO1xuICAgICAgICBzZWxmLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICBzZWxmLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uO1xuXG4gICAgICAgIC8vIERhdGEgYmxvY2sgZnVuY3Rpb25zIGFyZSBub3QgY29udGV4dCB3cmFwcGVkIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHN0eWxlIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgLy8gVE9ETzogcHJvYmFibHkgd2FudCBhIGNsZWFuZXIgd2F5IHRvIGV4Y2x1ZGUgdGhlc2VcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgaW4gY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXllcnNbbGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4cGFuZCBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICBzZWxmLmdsb2JhbCA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuZ2xvYmFsKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzXG4gICAgICAgIHNlbGYuY3JlYXRlRGF0YVNvdXJjZXMoY29uZmlnKTtcblxuICAgICAgICAvLyBFeHBhbmQgc3R5bGVzXG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnN0eWxlcywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgc2VsZi5zdHlsZXMgPSBzZWxmLnN0eWxlX21hbmFnZXIuYnVpbGQoY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHtcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHNlbGYuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIHN0eWxlczogc2VsZi5zdHlsZXMsXG4gICAgICAgICAgICBzb3VyY2VzOiBzZWxmLnNvdXJjZXMudGlsZXMsXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiBzZWxmLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgZWFjaCB0b3AtbGV2ZWwgbGF5ZXIgYXMgYSBzZXBhcmF0ZSB0cmVlXG4gICAgICAgIHNlbGYubGF5ZXJzID0gcGFyc2VMYXllcnMoY29uZmlnLmxheWVycyk7XG5cbiAgICAgICAgLy8gU3luYyB0ZXR4dXJlIGluZm8gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICBzZWxmLnN5bmNpbmdfdGV4dHVyZXMgPSBzZWxmLnN5bmNUZXh0dXJlcyhjb25maWcudGV4dHVyZXMpO1xuXG4gICAgICAgIC8vIFJldHVybiBwcm9taXNlIGZvciB3aGVuIGNvbmZpZyByZWZyZXNoIGZpbmlzaGVzXG4gICAgICAgIHNlbGYuY29uZmlndXJpbmcgPSBzZWxmLnN5bmNpbmdfdGV4dHVyZXMudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYHVwZGF0ZWQgY29uZmlnYCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzIGFuZCBjbGVhciB0aWxlIGNhY2hlIGlmIG5lY2Vzc2FyeVxuICAgIGNyZWF0ZURhdGFTb3VyY2VzIChjb25maWcpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnNvdXJjZXMpOyAvLyBwYXJzZSBuZXcgc291cmNlc1xuICAgICAgICBzZWxmLnNvdXJjZXMudGlsZXMgPSB7fTsgLy8gY2xlYXIgcHJldmlvdXMgc291cmNlc1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSBEYXRhU291cmNlLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9LCBjb25maWcuc291cmNlc1tuYW1lXSwge25hbWV9KSwgc2VsZi5zb3VyY2VzLnRpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNvdXJjZS50aWxlZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuc291cmNlcy50aWxlc1tuYW1lXSA9IHNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERpc3RyaWJ1dGUgb2JqZWN0IHNvdXJjZXMgYWNyb3NzIHdvcmtlcnNcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlkICUgc2VsZi5udW1fd29ya2VycyA9PT0gc2VsZi5fd29ya2VyX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgc291cmNlIGlmIG5vdCBjYWNoZWRcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VzLm9iamVjdHNbbmFtZV0gPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmxvYWQoc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aWxlIGNhY2hlIGlmIGRhdGEgc291cmNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgIXNlbGYubGFzdF9jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jb25maWcuc291cmNlcykuc29tZShzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VsZi5jb25maWcuc291cmNlc1tzXSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGYubGFzdF9jb25maWcuc291cmNlc1tzXSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc2VsZi50aWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiBjb25maWcgcmVmcmVzaCBpcyBmaW5pc2hlZFxuICAgIGF3YWl0Q29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ3VyaW5nO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBhIHRpbGU6IGxvYWQgZnJvbSB0aWxlIHNvdXJjZSBpZiBidWlsZGluZyBmb3IgZmlyc3QgdGltZSwgb3RoZXJ3aXNlIHJlYnVpbGQgd2l0aCBleGlzdGluZyBkYXRhXG4gICAgYnVpbGRUaWxlICh7IHRpbGUgfSkge1xuICAgICAgICAvLyBUaWxlIGNhY2hlZD9cbiAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsb2FkaW5nP1xuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aWxlIGNhY2hlXG4gICAgICAgIHRpbGUgPSBzZWxmLnRpbGVzW3RpbGUua2V5XSA9IE9iamVjdC5hc3NpZ24oc2VsZi5nZXRUaWxlKHRpbGUua2V5KSB8fCB7fSwgdGlsZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoc3R5bGVzLCBldGMuKSwgdGhlbiBidWlsZCB0aWxlXG4gICAgICAgIHJldHVybiBzZWxmLmF3YWl0Q29uZmlndXJhdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBidWlsZGluZyB0aGUgdGlsZVxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaWxlU291cmNlRGF0YSh0aWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmdldFRpbGUodGlsZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBhZnRlciBkYXRhIHNvdXJjZSBsb2FkIGJlY2F1c2UgdGlsZSB3YXMgcmVtb3ZlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgdGlsZSBsb2FkIGVycm9yKHMpIGZvciAke3RpbGUua2V5fTogJHt0aWxlLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgdGlsZSBsb2FkIGVycm9yIGZvciAke3RpbGUua2V5fTogJHt0aWxlLmVycm9yfSBhdDogJHtlcnJvci5zdGFja31gKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGlsZSBhbHJlYWR5IGxvYWRlZCwganVzdCByZWJ1aWxkXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHVzZWQgd29ya2VyIGNhY2hlIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCB0aGlzIHRpbGUncyBkYXRhIHNvdXJjZVxuICAgIGxvYWRUaWxlU291cmNlRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAoc2VsZi5zb3VyY2VzLnRpbGVzW3RpbGUuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlcy50aWxlc1t0aWxlLnNvdXJjZV0ubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7IGVycm9yOiBgRGF0YSBzb3VyY2UgJyR7dGlsZS5zb3VyY2V9JyBub3QgZm91bmRgIH07XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnRpbGVzW2tleV07XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB0aWxlXG4gICAgcmVtb3ZlVGlsZSAoa2V5KSB7XG4gICAgICAgIHZhciB0aWxlID0gc2VsZi50aWxlc1trZXldO1xuXG4gICAgICAgIGlmICh0aWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBpZiBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBjYW5jZWwgdGlsZSBsb2FkIGZvciAke2tleX1gKTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBUaWxlLmNhbmNlbCh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uY2xlYXJUaWxlKGtleSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZi50aWxlc1trZXldO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZW1vdmUgdGlsZSBmcm9tIGNhY2hlIGZvciAke2tleX1gKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBHZXQgYSBmZWF0dXJlIGZyb20gdGhlIHNlbGVjdGlvbiBtYXBcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uICh7IGlkLCBrZXkgfSA9IHt9KSB7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBGZWF0dXJlU2VsZWN0aW9uLm1hcFtrZXldO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBmZWF0dXJlOiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mZWF0dXJlKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBSZXNldHMgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRlXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uICgpIHtcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvLyBTZWxlY3Rpb24gbWFwIHNpemUgZm9yIHRoaXMgd29ya2VyXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUgKCkge1xuICAgICAgICByZXR1cm4gRmVhdHVyZVNlbGVjdGlvbi5nZXRNYXBTaXplKCk7XG4gICAgfSxcblxuICAgIC8vIFRleHR1cmUgaW5mbyBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSBtYWluIHRocmVhZCwgZS5nLiB3aWR0aC9oZWlnaHQsIHdoaWNoIHdlIG9ubHkga25vdyBhZnRlciB0aGUgdGV4dHVyZSBsb2Fkc1xuICAgIHN5bmNUZXh0dXJlcyAodGV4X2NvbmZpZykge1xuICAgICAgICBsZXQgdGV4dHVyZXMgPSBbXTtcbiAgICAgICAgaWYgKHRleF9jb25maWcpIHtcbiAgICAgICAgICAgIHRleHR1cmVzLnB1c2goLi4uT2JqZWN0LmtleXModGV4X2NvbmZpZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdzeW5jIHRleHR1cmVzIHRvIHdvcmtlcjonLCB0ZXh0dXJlcyk7XG4gICAgICAgIGlmICh0ZXh0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlcih0ZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBTeW5jIGRldmljZSBwaXhlbCByYXRpbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICB9LFxuXG4gICAgLy8gUHJvZmlsaW5nIGhlbHBlcnNcbiAgICBwcm9maWxlIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH0sXG5cbiAgICBwcm9maWxlRW5kIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH1cblxufSk7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlU2VsZWN0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB3b3JrZXJzKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsgLy8gcG9vbCBvZiB3b3JrZXJzIHRvIHJlcXVlc3QgZmVhdHVyZSBsb29rLXVwcyBmcm9tLCBrZXllZCBieSBpZFxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBTZWxlY3Rpb24gc3RhdGUgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHt9OyAvLyBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsOyAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXkgPSA1OyAvLyBkZWxheSB0aW1lIGZyb20gc2VsZWN0aW9uIHJlbmRlciB0byBmcmFtZWJ1ZmZlciBzYW1wbGUsIHRvIGF2b2lkIENQVS9HUFUgc3luYyBsb2NrXG4gICAgICAgIHRoaXMucmVhZF9kZWxheV90aW1lciA9IG51bGw7IC8vIGN1cnJlbnQgdGltZXIgKHNldFRpbWVvdXQpIGZvciBkZWxheWVkIHNlbGVjdGlvbiByZWFkc1xuXG4gICAgICAgIHRoaXMucGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgdGhpcy5waXhlbDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnBpeGVsLmJ1ZmZlcik7XG5cbiAgICAgICAgLy8gRnJhbWUgYnVmZmVyIGZvciBzZWxlY3Rpb25cbiAgICAgICAgLy8gVE9ETzogaW5pdGlhdGUgbGF6aWx5IGluIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuZmJvID0gdGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZmJvX3NpemUgPSB7IHdpZHRoOiAyNTYsIGhlaWdodDogMjU2IH07IC8vIFRPRE86IG1ha2UgY29uZmlndXJhYmxlIC8gYWRhcHRpdmUgYmFzZWQgb24gY2FudmFzIHNpemVcbiAgICAgICAgdGhpcy5mYm9fc2l6ZS5hc3BlY3QgPSB0aGlzLmZib19zaXplLndpZHRoIC8gdGhpcy5mYm9fc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgLy8gVGV4dHVyZSBmb3IgdGhlIEZCTyBjb2xvciBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fdGV4dHVyZSA9IFRleHR1cmUuY3JlYXRlKCB0aGlzLmdsLCAnc2VsZWN0aW9uX2ZibycsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIGZib190ZXh0dXJlLnNldERhdGEodGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQsIG51bGwsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGhpcy5nbC5URVhUVVJFXzJELCBmYm9fdGV4dHVyZS50ZXh0dXJlLCAwKTtcblxuICAgICAgICAvLyBSZW5kZXJidWZmZXIgZm9yIHRoZSBGQk8gZGVwdGggYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX2RlcHRoX3JiID0gdGhpcy5nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kUmVuZGVyYnVmZmVyKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuICAgICAgICB0aGlzLmdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UodGhpcy5nbC5SRU5ERVJCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQsIHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmdsICYmIHRoaXMuZmJvKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZmJvKTtcbiAgICAgICAgICAgIHRoaXMuZmJvID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZnJlZSB0ZXh0dXJlP1xuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIC8vIFN3aXRjaCB0byBGQk9cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgLy8gUnVucyBhc3luY2hyb25vdXNseSwgc2NoZWR1bGVzIHNlbGVjdGlvbiBidWZmZXIgdG8gYmUgdXBkYXRlZFxuICAgIGdldEZlYXR1cmVBdChwb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUXVldWUgcmVxdWVzdHMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBhbmQgdGhleSB3aWxsIGJlIHBpY2tlZCB1cCBieSB0aGUgcmVuZGVyIGxvb3BcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgPSAodGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCArIDEpIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RzW3RoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQsXG4gICAgICAgICAgICAgICAgcG9pbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFueSBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgIHBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2VsZWN0aW9uIHR5cGVzLCBzdWNoIGFzIGZlYXR1cmVzIHdpdGhpbiBhIGJveFxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCwgZmVhdHVyZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7IC8vIHNhdmUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7IC8vIGZ1bGwgc2V0IG9mIGRhdGEgc291cmNlcyBUT0RPOiBjZW50cmFsaXplIHRoZXNlIGxpa2UgdGV4dHVyZXM/XG4gICAgICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IGNvbmZpZy5wYWRfc2NhbGUgfHwgMC4wMDAxOyAvLyBzY2FsZSB0aWxlIHVwIGJ5IHNtYWxsIGZhY3RvciB0byBjb3ZlciBzZWFtc1xuICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IG51bGw7IC8vIHdpbmRpbmcgb3JkZXIgd2lsbCBhZGFwdCB0byBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLnJhc3RlcnMgPSAvLyBhdHRhY2hlZCByYXN0ZXIgdGlsZSBzb3VyY2VzXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5yYXN0ZXJzKSA/IFsuLi5uZXcgU2V0KGNvbmZpZy5yYXN0ZXJzKV0gOiBbXTsgLy8gZGUtZHVwZSB3aXRoIHNldCBjb252ZXJzaW9uXG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IGNvbmZpZy5tYXhfem9vbSB8fCBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBhIG5ldyBkYXRhIHNvdXJjZSB0eXBlLCB1bmRlciBhIHR5cGUgbmFtZVxuICAgIHN0YXRpYyByZWdpc3Rlcih0eXBlX2NsYXNzLCB0eXBlX25hbWUpIHtcbiAgICAgICAgaWYgKCF0eXBlX2NsYXNzIHx8ICF0eXBlX25hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIERhdGFTb3VyY2UudHlwZXNbdHlwZV9uYW1lXSA9IHR5cGVfY2xhc3M7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UudHlwZXMgPSB7fTsgLy8gc2V0IG9mIHN1cHBvcnRlZCBkYXRhIHNvdXJjZSBjbGFzc2VzLCByZWZlcmVuY2VkIGJ5IHR5cGUgbmFtZVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIGxvYWRpbmcgc291cmNlIC0gYWJzdHJhY3QgY2xhc3MgKioqL1xuXG5leHBvcnQgY2xhc3MgTmV0d29ya1NvdXJjZSBleHRlbmRzIERhdGFTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihzb3VyY2UpO1xuICAgICAgICB0aGlzLnVybCA9IFV0aWxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICBzb3VyY2VfZGF0YS5yZXF1ZXN0ID0gcHJvbWlzZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTsgLy8gcmVzb2x2ZSByZXF1ZXN0IGJ1dCBwYXNzIGFsb25nIGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6XG5cbiAgICBmb3JtYXRVcmwgKHVybF90ZW1wbGF0ZSwgZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ2Zvcm1hdFVybCcpO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAoZGVzdCwgc291cmNlLCByZXBvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgncGFyc2VTb3VyY2VEYXRhJyk7XG4gICAgfVxufVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIHRpbGUgbG9hZGluZyAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSk7XG5cbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudXJsX2hvc3RzID0gbnVsbDtcbiAgICAgICAgdmFyIGhvc3RfbWF0Y2ggPSB0aGlzLnVybC5tYXRjaCgve3M6XFxbKFtefStdKylcXF19Lyk7XG4gICAgICAgIGlmIChob3N0X21hdGNoICE9IG51bGwgJiYgaG9zdF9tYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnVybF9ob3N0cyA9IGhvc3RfbWF0Y2hbMV0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIHRoaXMubmV4dF9ob3N0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1hdFVybCh1cmxfdGVtcGxhdGUsIHRpbGUpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pO1xuICAgICAgICBsZXQgdXJsID0gdXJsX3RlbXBsYXRlLnJlcGxhY2UoJ3t4fScsIGNvb3Jkcy54KS5yZXBsYWNlKCd7eX0nLCBjb29yZHMueSkucmVwbGFjZSgne3p9JywgY29vcmRzLnopO1xuXG4gICAgICAgIGlmICh0aGlzLnVybF9ob3N0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgve3M6XFxbKFtefStdKylcXF19LywgdGhpcy51cmxfaG9zdHNbdGhpcy5uZXh0X2hvc3RdKTtcbiAgICAgICAgICAgIHRoaXMubmV4dF9ob3N0ID0gKHRoaXMubmV4dF9ob3N0ICsgMSkgJSB0aGlzLnVybF9ob3N0cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZm9yIHRoZSB4L3kveiB0aWxlIHBhdHRlcm4gaW4gVVJMIHRlbXBsYXRlXG4gICAgdXJsSGFzVGlsZVBhdHRlcm4odXJsKSB7XG4gICAgICAgIHJldHVybiB1cmwgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t4fScpID4gLTEgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t5fScpID4gLTEgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t6fScpID4gLTE7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtTb3VyY2UsIE5ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCB7ZGVjb2RlTXVsdGlQb2x5Z29ufSBmcm9tICcuL212dCc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbi8vIEZvciB0aWxpbmcgR2VvSlNPTiBjbGllbnQtc2lkZVxuaW1wb3J0IGdlb2pzb252dCBmcm9tICdnZW9qc29uLXZ0JztcblxuLyoqXG4gR2VvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgR2VvSlNPTlNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSk7XG4gICAgICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudGlsZV9pbmRleGVzID0ge307IC8vIGdlb2pzb24tdnQgdGlsZSBpbmRpY2VzLCBieSBsYXllciBuYW1lXG4gICAgICAgIHRoaXMubWF4X3pvb20gPSBNYXRoLm1heCh0aGlzLm1heF96b29tIHx8IDAsIDE1KTsgLy8gVE9ETzogbWF4IHpvb20gPCAxNSBjYXVzZXMgYXJ0aWZhY3RzL25vLWRyYXcgYXQgMjAsIGludmVzdGlnYXRlXG4gICAgICAgIHRoaXMucGFkX3NjYWxlID0gMDsgLy8gd2UgZG9uJ3Qgd2FudCBwYWRkaW5nIG9uIGF1dG8tdGlsZWQgc291cmNlc1xuICAgIH1cblxuICAgIF9sb2FkKGRlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBzdXBlci5fbG9hZCh7IHNvdXJjZV9kYXRhOiB7IGxheWVyczoge30gfSB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBsYXllcnMgPSBkYXRhLnNvdXJjZV9kYXRhLmxheWVycztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXSA9IGdlb2pzb252dChsYXllcnNbbGF5ZXJfbmFtZV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4X3pvb20sICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZTogMywgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudDogR2VvLnRpbGVfc2NhbGUsIC8vIHRpbGUgZXh0ZW50IChib3RoIHdpZHRoIGFuZCBoZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IDAuMDAwMSAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZF9kYXRhLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiB0aGlzLnRpbGVfaW5kZXhlcykge1xuICAgICAgICAgICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzW2xheWVyX25hbWVdID0gdGhpcy5nZXRUaWxlRmVhdHVyZXMoZGVzdCwgbGF5ZXJfbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZUZlYXR1cmVzKHRpbGUsIGxheWVyX25hbWUpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgYSBwYXJ0aWN1bGFyIHRpbGVcbiAgICAgICAgbGV0IHQgPSB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXS5nZXRUaWxlKGNvb3Jkcy56LCBjb29yZHMueCwgY29vcmRzLnkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZnJvbSBNVlQtc3R5bGUgSlNPTiBzdHJ1Y3QgdG8gR2VvSlNPTlxuICAgICAgICBsZXQgY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKHQgJiYgdC5mZWF0dXJlcykge1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgZmVhdHVyZSBvZiB0LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgLy8gR2VvSlNPTiBmZWF0dXJlXG4gICAgICAgICAgICAgICAgbGV0IGYgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHt9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnRhZ3NcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pO1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gMiB8fCBmZWF0dXJlLnR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZi5nZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmdlb21ldHJ5ID09IG51bGwpIHsgLy8gc2tpcCBwb2x5cyB0aGF0IGNvdWxkbid0IGJlIGRlY29kZWQgKGUuZy4gZGVnZW5lcmF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5mZWF0dXJlcy5wdXNoKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsIChkZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IHBhcnNlZF9yZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMocGFyc2VkX3Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBsYXllcnM7XG4gICAgfVxuXG4gICAgcHJlcHJvY2Vzc0xheWVycyAobGF5ZXJzKXtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGZWF0dXJlcyhsYXllci5mZWF0dXJlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcmVwcm9jZXNzIGZlYXR1cmVzLiBDdXJyZW50bHkgdXNlZCB0byBhZGQgYSBuZXcgXCJjZW50cm9pZFwiIGZlYXR1cmUgZm9yIHBvbHlnb24gbGFiZWxpbmdcbiAgICBwcmVwcm9jZXNzRmVhdHVyZXMgKGZlYXR1cmVzKSB7XG4gICAgICAgIC8vIERlZmluZSBjZW50cm9pZHMgZm9yIHBvbHlnb25zIGZvciBjZW50cm9pZCBsYWJlbCBwbGFjZW1lbnRcbiAgICAgICAgLy8gQXZvaWRzIHJlZHVuZGFudCBsYWJlbCBwbGFjZW1lbnQgZm9yIGVhY2ggZ2VuZXJhdGVkIHRpbGUgYXQgaGlnaGVyIHpvb20gbGV2ZWxzXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZV9sYWJlbF9jZW50cm9pZHMpe1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVzX2NlbnRyb2lkID0gW107XG4gICAgICAgICAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHtcImxhYmVsX3BsYWNlbWVudFwiIDogXCJ5ZXNcIn07XG5cbiAgICAgICAgICAgIGZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzLCBjZW50cm9pZF9mZWF0dXJlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXMsIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2VudHJvaWQgZmVhdHVyZSBmb3IgbGFyZ2VzdCBwb2x5Z29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWEgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWFfaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcmVhID0gR2VvLnBvbHlnb25BcmVhKGNvb3JkaW5hdGVzW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhfYXJlYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhX2luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXNbbWF4X2FyZWFfaW5kZXhdLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBhcHBlbmQgY2VudHJvaWQgZmVhdHVyZXMgdG8gZmVhdHVyZXMgYXJyYXlcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGZlYXR1cmVzLCBmZWF0dXJlc19jZW50cm9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHNpbmdsZSBvciBtdWx0aXBsZSBsYXllcnMgaW4gcmV0dXJuZWQgZGF0YVxuICAgIGdldExheWVycyAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScgfHwgZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4geyBfZGVmYXVsdDogZGF0YSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLyoqXG4gR2VvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIoc291cmNlKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgVVJMIHRpbGUgcGF0dGVybiwgaWYgbm90IGZvdW5kLCB0cmVhdCBhcyBzdGFuZGFsb25lIEdlb0pTT04vVG9wb0pTT04gb2JqZWN0XG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGluc3RhbmNlIHR5cGUgZnJvbSBwYXJlbnQgY2xhc3NcbiAgICAgICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ0dlb0pTT04nKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBpbnN0YW5jZSB0eXBlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGJhY2sgdG8gcGFyZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlR2VvSlNPTiAoZGF0YSwgdGlsZSwgc291cmNlKSB7XG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLnRyYW5zZm9ybShkYXRhLCB0aGlzLmV4dHJhX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlLmxheWVycyA9IEdlb0pTT05Tb3VyY2UucHJvdG90eXBlLmdldExheWVycyhkYXRhKTtcblxuICAgICAgICAvLyBBIFwic3ludGhldGljXCIgdGlsZSB0aGF0IGFkanVzdHMgdGhlIHRpbGUgbWluIGFuY2hvciB0byBhY2NvdW50IGZvciB0aWxlIGxvbmdpdHVkZSB3cmFwcGluZ1xuICAgICAgICBsZXQgYW5jaG9yID0ge1xuICAgICAgICAgICAgY29vcmRzOiB0aWxlLmNvb3JkcyxcbiAgICAgICAgICAgIG1pbjogR2VvLm1ldGVyc0ZvclRpbGUoR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgRGF0YVNvdXJjZS5wcm9qZWN0RGF0YShzb3VyY2UpOyAvLyBtZXJjYXRvciBwcm9qZWN0aW9uXG4gICAgICAgIERhdGFTb3VyY2Uuc2NhbGVEYXRhKHNvdXJjZSwgYW5jaG9yKTsgLy8gcmUtc2NhbGUgZnJvbSBtZXRlcnMgdG8gbG9jYWwgdGlsZSBjb29yZHNcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihHZW9KU09OVGlsZVNvdXJjZSwgJ0dlb0pTT04nKTsgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjZW50cm9pZCBwb2ludCBmZWF0dXJlIGZyb20gcG9seWdvbiBjb29yZGluYXRlcyBhbmQgcHJvdmlkZWQgZmVhdHVyZSBtZXRhLWRhdGFcbmZ1bmN0aW9uIGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24gKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKSB7XG4gICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGNvb3JkaW5hdGVzKTtcblxuICAgIC8vIGNsb25lIHByb3BlcnRpZXMgYW5kIG1peGl4IG5ld1Byb3BlcnRpZXNcbiAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24oY2VudHJvaWRfcHJvcGVydGllcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgcHJvcGVydGllczogY2VudHJvaWRfcHJvcGVydGllcyxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjZW50cm9pZFxuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgUGJmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGUsIFZlY3RvclRpbGVGZWF0dXJlfSBmcm9tICd2ZWN0b3ItdGlsZSc7XG5cbi8qKlxuIE1hcGJveCBWZWN0b3IgVGlsZSBmb3JtYXRcbiBAY2xhc3MgTVZUU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIE1WVFNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIoc291cmNlKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJhcnJheWJ1ZmZlclwiOyAvLyBiaW5hcnkgZGF0YVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICAvLyBDb252ZXJ0IE1hcGJveCB2ZWN0b3IgdGlsZSB0byBHZW9KU09OXG4gICAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpO1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFBiZihkYXRhKTtcbiAgICAgICAgc291cmNlLmRhdGEgPSBuZXcgVmVjdG9yVGlsZShidWZmZXIpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50b0dlb0pTT04oc291cmNlLmRhdGEpO1xuICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7IC8vIGNvbW1lbnQgb3V0IHRvIHNhdmUgcmF3IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBsYXllcnMvZmVhdHVyZXMgdXNpbmcgTWFwYm94IGxpYiBBUEksIGNvbnZlcnQgdG8gR2VvSlNPTiBmZWF0dXJlc1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGgga2V5cyBmb3IgZWFjaCBsYXllciwgZS5nLiB7IGxheWVyOiBnZW9qc29uIH1cbiAgICB0b0dlb0pTT04gKHRpbGUpIHtcbiAgICAgICAgdmFyIGxheWVycyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBsIGluIHRpbGUubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aWxlLmxheWVyc1tsXTtcbiAgICAgICAgICAgIHZhciBsYXllcl9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBsYXllci5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShmKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmVfZ2VvanNvbi5nZW9tZXRyeTtcbiAgICAgICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHI9MDsgciA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByaW5nID0gY29vcmRpbmF0ZXNbcl07XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHJpbmcubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZ1tjXS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdQb2ludCc7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJfZ2VvanNvbi5mZWF0dXJlcy5wdXNoKGZlYXR1cmVfZ2VvanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXllcnNbbF0gPSBsYXllcl9nZW9qc29uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG59XG5cbi8vIERlY29kZSBtdWx0aXBvbHlnb25zLCB3aGljaCBhcmUgZW5jb2RlZCBhcyBhIHNpbmdsZSBzZXQgb2YgcmluZ3Ncbi8vIFdpbmRpbmcgb3JkZXIgb2YgZmlyc3QgcmluZyBpcyBhc3N1bWVkIHRvIGluZGljYXRlIGV4dGVyaW9yIHJpbmcsXG4vLyB0aGUgb3Bwb3NpdGUgd2luZGluZyBvcmRlciBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBvbHlnb24uXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTXVsdGlQb2x5Z29uIChnZW9tKSB7XG4gICAgbGV0IHBvbHlzID0gW107XG4gICAgbGV0IHBvbHkgPSBbXTtcbiAgICBsZXQgb3V0ZXJfd2luZGluZztcbiAgICBmb3IgKGxldCByPTA7IHIgPCBnZW9tLmNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCByaW5nID0gZ2VvbS5jb29yZGluYXRlc1tyXTtcbiAgICAgICAgbGV0IHdpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcocmluZyk7XG4gICAgICAgIGlmICh3aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHplcm8tYXJlYSByaW5nc1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJfd2luZGluZyA9IG91dGVyX3dpbmRpbmcgfHwgd2luZGluZzsgLy8gYXNzdW1lIGZpcnN0IHJpbmcgaW5kaWNhdGVzIG91dGVyIHJpbmcgd2luZGluZ1xuXG4gICAgICAgIGlmICh3aW5kaW5nID09PSBvdXRlcl93aW5kaW5nICYmIHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICAgICAgICAgIHBvbHkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBwb2x5LnB1c2gocmluZyk7XG4gICAgfVxuICAgIGlmIChwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgb3IgbXVsdGk/XG4gICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5c1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9seXMubGVuZ3RoID4gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnTXVsdGlQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2VvbSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb207XG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoTVZUU291cmNlLCAnTVZUJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3RpbGUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihzb3VyY2UpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZih0aGlzLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnVuc2hpZnQodGhpcy5uYW1lKTsgLy8gYWRkIHRoaXMgcmFzdGVyIGFzIHRoZSBmaXJzdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gc291cmNlLmZpbHRlcmluZzsgLy8gb3B0aW9uYWwgdGV4dHVyZSBmaWx0ZXJpbmcgKG5lYXJlc3QsIGxpbmVhciwgbWlwbWFwKVxuXG4gICAgICAgIC8vIHNhdmUgdGV4dHVyZSBvYmplY3RzIGJ5IHRpbGUga2V5LCBzbyBVUkwgcmVtYWlucyBzdGFibGUgaWYgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcyxcbiAgICAgICAgLy8gZS5nLiBhdm9pZCByZS1sb2FkaW5nIHRoZSBzYW1lIHRpbGUgdGV4dHVyZSB1bmRlciBhIGRpZmZlcmVudCBzdWJkb21haW4gd2hlbiB1c2luZyB0aWxlIGhvc3RzXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkKHRpbGUpIHtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHt9O1xuICAgICAgICB0aWxlLnBhZF9zY2FsZSA9IHRoaXMucGFkX3NjYWxlO1xuICAgICAgICB0aWxlLnJhc3RlcnMgPSBbLi4udGhpcy5yYXN0ZXJzXTsgLy8gY29weSBsaXN0IG9mIHJhc3RlcnMgdG8gbG9hZCBmb3IgdGlsZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc2luZ2xlIHF1YWQgdGhhdCBmaWxscyB0aGUgZW50aXJlIHRpbGVcbiAgICAgICAgbGV0IHNjYWxlID0gR2VvLnRpbGVfc2NhbGU7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge1xuICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdLCBbc2NhbGUsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZSwgLXNjYWxlXSwgWzAsIC1zY2FsZV0sIFswLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgXV1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge31cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRpbGUuZGVmYXVsdF93aW5kaW5nID0gJ0NXJztcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGV4dHVyZSBpbmZvIGZvciBhIHJhc3RlciB0aWxlXG4gICAgdGlsZVRleHR1cmUgKHRpbGUpIHtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVzW2tleV0pIHtcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy5tYXhfem9vbSk7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5mb3JtYXRVcmwodGhpcy51cmwsIHsgY29vcmRzIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlc1trZXldID0geyB1cmwsIGZpbHRlcmluZzogdGhpcy5maWx0ZXJpbmcsIGNvb3JkcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzW2tleV07XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoUmFzdGVyVGlsZVNvdXJjZSwgJ1Jhc3RlcicpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge0dlb0pTT05Tb3VyY2UsIEdlb0pTT05UaWxlU291cmNlfSBmcm9tICcuL2dlb2pzb24nO1xuXG5pbXBvcnQgdG9wb2pzb24gZnJvbSAndG9wb2pzb24nO1xuXG4vKipcbiBUb3BvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgVG9wb0pTT05Tb3VyY2UgZXh0ZW5kcyBHZW9KU09OU291cmNlIHtcblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gdGhpcy50b0dlb0pTT04oZGF0YSk7XG5cbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKGRhdGEpO1xuICAgICAgICBzdXBlci5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBsYXllcnM7XG4gICAgfVxuXG4gICAgdG9HZW9KU09OIChkYXRhKSB7XG4gICAgICAgIC8vIFNpbmdsZSBsYXllclxuICAgICAgICBpZiAoZGF0YS5vYmplY3RzICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKVswXTtcbiAgICAgICAgICAgIGRhdGEgPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2xheWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxheWVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEub2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxheWVyc1trZXldID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSBsYXllcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldFRvcG9KU09ORmVhdHVyZSAodG9wb2xvZ3ksIG9iamVjdCkge1xuICAgIGxldCBmZWF0dXJlID0gdG9wb2pzb24uZmVhdHVyZSh0b3BvbG9neSwgb2JqZWN0KTtcblxuICAgIC8vIENvbnZlcnQgc2luZ2xlIGZlYXR1cmUgdG8gYSBmZWF0dXJlIGNvbGxlY3Rpb25cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5cbi8qKlxuIFRvcG9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgVG9wb0pTT05UaWxlU291cmNlIGV4dGVuZHMgR2VvSlNPTlRpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIG5vbi10aWxlZCBzb3VyY2UgaWYgdGlsZWQgc291cmNlIGZhaWxlZCB0byBpbnN0YW50aWF0ZVxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRvcG9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IFRvcG9KU09OU291cmNlLnByb3RvdHlwZS50b0dlb0pTT04oZGF0YSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihUb3BvSlNPTlRpbGVTb3VyY2UsICdUb3BvSlNPTicpOyAgICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG4iLCJpbXBvcnQge1N0eWxlc30gZnJvbSAnLi9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCB7bWF0Y2h9IGZyb20gJ21hdGNoLWZlYXR1cmUnO1xuXG5leHBvcnQgY29uc3Qgd2hpdGVMaXN0ID0gWydmaWx0ZXInLCAnZHJhdycsICd2aXNpYmxlJywgJ2RhdGEnXTtcblxuZXhwb3J0IGNvbnN0IGxheWVyX2NhY2hlID0ge307XG5cbmZ1bmN0aW9uIGNhY2hlS2V5IChsYXllcnMpIHtcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGsgPSBsYXllcnNbMF07XG4gICAgICAgIGZvciAodmFyIGk9MTsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgayArPSAnLycgKyBsYXllcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc1swXTtcbn1cblxuLy8gTWVyZ2UgbWF0Y2hpbmcgbGF5ZXIgdHJlZXMgaW50byBhIGZpbmFsIGRyYXcgZ3JvdXBcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyZWVzKG1hdGNoaW5nVHJlZXMsIGdyb3VwKSB7XG4gICAgbGV0IGRyYXdzLCB0cmVlRGVwdGggPSAwO1xuXG4gICAgbGV0IGRyYXcgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUgLy8gdmlzaWJsZSBieSBkZWZhdWx0XG4gICAgfTtcblxuICAgIC8vIEZpbmQgZGVlcGVzdCB0cmVlXG4gICAgZm9yIChsZXQgdD0wOyB0IDwgbWF0Y2hpbmdUcmVlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICBpZiAobWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGggPiB0cmVlRGVwdGgpIHtcbiAgICAgICAgICAgIHRyZWVEZXB0aCA9IG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbGF5ZXJzIHRvIHBhcnNlXG4gICAgaWYgKHRyZWVEZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRyZWVzIGluIHBhcmFsbGVsXG4gICAgZm9yIChsZXQgeD0wOyB4IDwgdHJlZURlcHRoOyB4KyspIHtcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHJlcXVlc3RlZCBkcmF3IGdyb3VwLCBmb3IgZWFjaCB0cmVlLCBhdCB0aGlzIGRlcHRoXG4gICAgICAgIGRyYXdzID0gbWF0Y2hpbmdUcmVlcy5tYXAodHJlZSA9PiB0cmVlW3hdICYmIHRyZWVbeF1bZ3JvdXBdKTtcbiAgICAgICAgaWYgKGRyYXdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGJ5IGxheWVyIG5hbWUgYmVmb3JlIG1lcmdpbmcsIHNvIGxheWVycyBhcmUgYXBwbGllZCBkZXRlcm1pbmlzdGljYWxseVxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGxheWVycyBtb2RpZnkgdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgICBkcmF3cy5zb3J0KChhLCBiKSA9PiAoYSAmJiBhLmxheWVyX25hbWUpID4gKGIgJiYgYi5sYXllcl9uYW1lKSA/IDEgOiAtMSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZHJhdyBvYmplY3RzXG4gICAgICAgIG1lcmdlT2JqZWN0cyhkcmF3LCAuLi5kcmF3cyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxheWVyIG5hbWVzLCB0aGV5IHdlcmUgb25seSB1c2VkIHRyYW5zaWVudGx5IHRvIHNvcnQgYW5kIGNhbGN1bGF0ZSBmaW5hbCBsYXllclxuICAgICAgICAvLyAoZmluYWwgbWVyZ2VkIG5hbWVzIHdpbGwgbm90IGJlIGFjY3VyYXRlIHNpbmNlIG9ubHkgb25lIHRyZWUgY2FuIHdpbilcbiAgICAgICAgZGVsZXRlIGRyYXcubGF5ZXJfbmFtZTtcbiAgICB9XG5cbiAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIG5vdCB2aXNpYmxlXG4gICAgaWYgKGRyYXcudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmNvbnN0IGJsYWNrbGlzdCA9IFsnYW55JywgJ2FsbCcsICdub3QnLCAnbm9uZSddO1xuXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGxheWVyLCBuYW1lLCBwYXJlbnQsIGRyYXcsIHZpc2libGUsIGZpbHRlciB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBMYXllci5pZCsrO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGxheWVyO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5mdWxsX25hbWUgPSB0aGlzLnBhcmVudCA/ICh0aGlzLnBhcmVudC5mdWxsX25hbWUgKyAnOicgKyB0aGlzLm5hbWUpIDogdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLmRyYXcgPSBkcmF3O1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlICE9PSB1bmRlZmluZWQgPyB2aXNpYmxlIDogKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnZpc2libGUpO1xuXG4gICAgICAgIC8vIERlbm9ybWFsaXplIGxheWVyIG5hbWUgdG8gZHJhdyBncm91cHNcbiAgICAgICAgaWYgKHRoaXMuZHJhdykge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXAgaW4gdGhpcy5kcmF3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3W2dyb3VwXSA9IHRoaXMuZHJhd1tncm91cF0gfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3W2dyb3VwXS5sYXllcl9uYW1lID0gdGhpcy5mdWxsX25hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZCAoKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQnVpbGRpbmcgbGF5ZXIgJyR7dGhpcy5mdWxsX25hbWV9J2ApO1xuICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyKCk7XG4gICAgICAgIHRoaXMuYnVpbGREcmF3KCk7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhdygpIHtcbiAgICAgICAgdGhpcy5kcmF3ID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZHJhdywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkRHJhdyA9IGNhbGN1bGF0ZURyYXcodGhpcyk7XG4gICAgfVxuXG4gICAgYnVpbGRGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX29yaWdpbmFsID0gdGhpcy5maWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZmlsdGVyLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuXG4gICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHRoaXMuZmlsdGVyO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIGZpbHRlciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCBvciBmdW5jdGlvbiwgYDtcbiAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWlsZFpvb21zKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUHJvcE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmICh0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBtYXRjaCh0aGlzLmZpbHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBcXGBmaWx0ZXI6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXIpfVxcYCBgO1xuICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZS5zdGFja31gO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFpvb21zIG9mdGVuIGN1bGwgbGFyZ2Ugc3dhdGhzIG9mIHRoZSBsYXllciB0cmVlLCBzbyB0aGV5IGdldCBzcGVjaWFsIHRyZWF0bWVudCBhbmQgYXJlIGNoZWNrZWQgZmlyc3RcbiAgICBidWlsZFpvb21zKCkge1xuICAgICAgICBsZXQgem9vbSA9IHRoaXMuZmlsdGVyICYmIHRoaXMuZmlsdGVyLiR6b29tO1xuICAgICAgICBsZXQgenR5cGUgPSB0eXBlb2Ygem9vbTtcbiAgICAgICAgaWYgKHpvb20gIT0gbnVsbCAmJiB6dHlwZSAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBkb24ndCBhY2NlbGVyYXRlIGZ1bmN0aW9uLWJhc2VkIGZpbHRlcnNcbiAgICAgICAgICAgIHRoaXMuem9vbXMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHp0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh6b29tKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9MDsgeiA8IHpvb20ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tW3pdXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoenR5cGUgPT09ICdvYmplY3QnICYmICh6b29tLm1pbiAhPSBudWxsIHx8IHpvb20ubWF4ICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHptaW4gPSB6b29tLm1pbiB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCB6bWF4ID0gem9vbS5tYXggfHwgMjU7IC8vIFRPRE86IHJlcGxhY2UgY29uc3RhbnQgZm9yIG1heCBwb3NzaWJsZSB6b29tXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej16bWluOyB6IDwgem1heDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbel0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyLiR6b29tOyAvLyBkb24ndCBwcm9jZXNzIHpvb20gdGhyb3VnaCB1c3VhbCBnZW5lcmljIGZpbHRlciBsb2dpY1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRQcm9wTWF0Y2hlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlciB8fCBBcnJheS5pc0FycmF5KHRoaXMuZmlsdGVyKSB8fCB0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxhY2tsaXN0LmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEoYXJyYXkgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXkuc3Vic3RyaW5nKDEpLCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGZWF0dXJlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLnB1c2goW2tleSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb1Byb3BNYXRjaGVzIChjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHRbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkb2VzTWF0Y2ggKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzX2J1aWx0KSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB6b29tIHByZS1maWx0ZXI6IHNraXAgcmVzdCBvZiBmaWx0ZXIgaWYgb3V0IG9mIGxheWVyIHpvb20gcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuem9vbXMgIT0gbnVsbCAmJiAhdGhpcy56b29tc1tjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXJlY3QgZmVhdHVyZSBwcm9wZXJ0eSBtYXRjaGVzXG4gICAgICAgIGlmICghdGhpcy5kb1Byb3BNYXRjaGVzKGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbnkgcmVtYWluaW5nIGZpbHRlciAobW9yZSBjb21wbGV4IG1hdGNoZXMgb3IgZHluYW1pYyBmdW5jdGlvbilcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZnVuY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgdGhpcyAke3RoaXMuZnVsbF9uYW1lfTogXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyX29yaWdpbmFsfVxcYCBgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZXJyb3IubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtc2csIGNvbnRleHQuZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIgPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5MYXllci5pZCA9IDA7XG5cblxuZXhwb3J0IGNsYXNzIExheWVyTGVhZiBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfbGVhZiA9IHRydWU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBMYXllclRyZWUgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX3RyZWUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwgW107XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIgKGxheWVyKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhd0dyb3VwcyAoY29udGV4dCkge1xuICAgICAgICBsZXQgbGF5ZXJzID0gW10sIGxheWVyX2lkcyA9IFtdO1xuICAgICAgICBtYXRjaEZlYXR1cmUoY29udGV4dCwgW3RoaXNdLCBsYXllcnMsIGxheWVyX2lkcyk7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVfa2V5ID0gY2FjaGVLZXkobGF5ZXJfaWRzKTtcblxuICAgICAgICAgICAgLy8gT25seSBldmFsdWF0ZSBlYWNoIGxheWVyIGNvbWJpbmF0aW9uIG9uY2UgKHVuZGVmaW5lZCBtZWFucyBub3QgeWV0IGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG51bGwgbWVhbnMgZXZhbHVhdGVkIHdpdGggbm8gZHJhdyBvYmplY3QpXG4gICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgdGhlIHVuaXF1ZSB2aXNpYmxlIGRyYXcgYmxvY2tzIGZvciB0aGlzIGxheWVyIHRyZWVcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LnZpc2libGUgIT09IGZhbHNlICYmIHguY2FsY3VsYXRlZERyYXcpO1xuICAgICAgICAgICAgICAgIGxldCBkcmF3X2tleXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IGRyYXdfZ3JvdXBzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGRyYXdfZ3JvdXBzW3JdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBnPTA7IGcgPCBsYXllci5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gbGF5ZXJbZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2tleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZWFjaCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHJhd19rZXkgaW4gZHJhd19rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBsYXllcl9jYWNoZVtjYWNoZV9rZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSA9IG1lcmdlVHJlZXMoZHJhd19ncm91cHMsIGRyYXdfa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNhdmUgdGhlIG9uZXMgdGhhdCB3ZXJlbid0IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ua2V5ID0gY2FjaGVfa2V5ICsgJy8nICsgZHJhd19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5sYXllcnMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LmZ1bGxfbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBObyBsYXllcnMgZXZhbHVhdGVkXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gJiYgT2JqZWN0LmtleXMobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsYXllcl9jYWNoZVtjYWNoZV9rZXldO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVMaXN0ZWQoa2V5KSB7XG4gICAgcmV0dXJuIHdoaXRlTGlzdC5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFByb3BzKG9iaikge1xuICAgIGxldCB3aGl0ZUxpc3RlZCA9IHt9LCBub25XaGl0ZUxpc3RlZCA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoaXNXaGl0ZUxpc3RlZChrZXkpKSB7XG4gICAgICAgICAgICB3aGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25XaGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRHJhdyhsYXllcikge1xuXG4gICAgbGV0IGRyYXcgID0gW107XG5cbiAgICBpZiAobGF5ZXIucGFyZW50KSB7XG4gICAgICAgIGxldCBjcyA9IGxheWVyLnBhcmVudC5jYWxjdWxhdGVkRHJhdyB8fCBbXTtcbiAgICAgICAgZHJhdy5wdXNoKC4uLmNzKTtcbiAgICB9XG5cbiAgICBkcmF3LnB1c2gobGF5ZXIuZHJhdyk7XG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyVHJlZShuYW1lLCBsYXllciwgcGFyZW50KSB7XG5cbiAgICBsZXQgcHJvcGVydGllcyA9IHsgbmFtZSwgbGF5ZXIsIHBhcmVudCB9O1xuICAgIGxldCBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXSA9IGdyb3VwUHJvcHMobGF5ZXIpO1xuICAgIGxldCBlbXB0eSA9IGlzRW1wdHkobm9uV2hpdGVMaXN0ZWQpO1xuICAgIGxldCBDcmVhdGU7XG5cbiAgICBpZiAoZW1wdHkgJiYgcGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJMZWFmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyVHJlZTtcbiAgICB9XG5cbiAgICBsZXQgciA9IG5ldyBDcmVhdGUoT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB3aGl0ZUxpc3RlZCkpO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkTGF5ZXIocik7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9uV2hpdGVMaXN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IG5vbldoaXRlTGlzdGVkW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZUxheWVyVHJlZShrZXksIHByb3BlcnR5LCByKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBsYXllclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgTGF5ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Q6IGNhbm5vdCBjcmVhdGUgbGF5ZXIgJyR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9J2A7XG4gICAgICAgICAgICAgICAgbXNnICs9IGAsIHVuZGVyIHBhcmVudCBsYXllciAnJHtyLmZ1bGxfbmFtZX0nLmA7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGEgc3R5bGUgbmFtZSwgdGhpcyBtYXkgYmUgYW4gaW5jb3JyZWN0bHkgbmVzdGVkIGxheWVyXG4gICAgICAgICAgICAgICAgaWYgKFN0eWxlc1tyLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIFRoZSBwYXJlbnQgJyR7ci5uYW1lfScgaXMgYWxzbyB0aGUgbmFtZSBvZiBhIHN0eWxlLCBkaWQgeW91IG1lYW4gdG8gY3JlYXRlIGEgJ2RyYXcnIGdyb3VwYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgdW5kZXIgJyR7cGFyZW50Lm5hbWV9J2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgaW5zdGVhZD9gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllcnMgKGxheWVycykge1xuICAgIGxldCBsYXllcl90cmVlcyA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICBsYXllcl90cmVlc1trZXldID0gcGFyc2VMYXllclRyZWUoa2V5LCBsYXllcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJfdHJlZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZlYXR1cmUoY29udGV4dCwgbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzX2lkcykge1xuICAgIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gICAgbGV0IGNoaWxkTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICBmb3IgKGxldCByPTA7IHIgPCBsYXllcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBsYXllcnNbcl07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuaXNfbGVhZikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmlzX3RyZWUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY2hpbGRNYXRjaGVkID0gbWF0Y2hGZWF0dXJlKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmxheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZE1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkO1xufVxuIiwiLy8gUmVuZGVycyBhbiBhcnJheSBzcGVjaWZ5aW5nIGEgbGluZSBwYXR0ZXJuIG9mIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgc3BhY2VzLFxuLy8gc2ltaWxhciB0byBhbiBTVkcgYGRhc2hhcnJheWAgb3IgQ2FudmFzIHNldExpbmVEYXNoKCksIGludG8gYSBieXRlIGFycmF5IG9mIFJHQkEgcGl4ZWxzXG4vLyBSZXR1cm5zOlxuLy8ge1xuLy8gICAgcGl4ZWw6IHJlbmRlcmVkIGltYWdlIGluIFVpbnQ4QXJyYXkgYnVmZmVyXG4vLyAgICBsZW5ndGg6IHBpeGVsIGxlbmd0aCBvZiByZW5kZXJlZCBkYXNoIHBhdHRlcm4gKHN1bSBvZiBhbGwgZGFzaGVzIGFuZCBzcGFjZXMpXG4vLyB9XG4vL1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9wYWludGluZy5odG1sI1N0cm9rZURhc2hhcnJheVByb3BlcnR5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3N0cm9rZS1kYXNoYXJyYXlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQvc2V0TGluZURhc2hcblxuY29uc3QgZGVmYXVsdF9kYXNoX2NvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5jb25zdCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3IgPSBbMCwgMCwgMCwgMF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlckRhc2hBcnJheSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGFzaF9waXhlbCA9IG9wdGlvbnMuZGFzaF9jb2xvciB8fCBkZWZhdWx0X2Rhc2hfY29sb3I7XG4gICAgY29uc3QgYmFja2dyb3VuZF9jb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZF9jb2xvciB8fCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3I7XG4gICAgY29uc3QgZGFzaGVzID0gcGF0dGVybjtcblxuICAgIC8vIElmIHBhdHRlcm4gaXMgb2RkLCByZXBlYXQgaXQgdG8gbWFrZSBpdCBldmVuIChzZWUgU1ZHIHNwZWMpXG4gICAgaWYgKGRhc2hlcy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhc2hlcywgZGFzaGVzKTtcbiAgICB9XG5cbiAgICBsZXQgZGFzaCA9IHRydWU7XG4gICAgbGV0IHBpeGVscyA9IFtdO1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGRhc2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IGRhc2hlc1tpXTtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc2VnbWVudDsgcysrKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShwaXhlbHMsIGRhc2ggPyBkYXNoX3BpeGVsIDogYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgZGFzaCA9ICFkYXNoOyAvLyBhbHRlcm5hdGUgYmV0d2VlbiBkYXNoZXMgYW5kIHNwYWNlc1xuICAgIH1cblxuICAgIHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHBpeGVscyk7IC8vIGNvbnZlcnQgdG8gdHlwZWQgYXJyYXlcbiAgICBjb25zdCBsZW5ndGggPSBwaXhlbHMubGVuZ3RoIC8gNDsgLy8gb25lIFJHQkEgYnl0ZSBzZXF1ZW5jZXMgdG8gb25lIHBpeGVsXG5cbiAgICByZXR1cm4geyBwaXhlbHMsIGxlbmd0aCB9O1xufVxuIiwiLy8gTGluZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlsaW5lc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWxpbmVzJztcbmltcG9ydCByZW5kZXJEYXNoQXJyYXkgZnJvbSAnLi9kYXNoYXJyYXknO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsIHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50fSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCB2YXIgTGluZXMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuT2JqZWN0LmFzc2lnbihMaW5lcywge1xuICAgIG5hbWU6ICdsaW5lcycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcbiAgICBzZWxlY3Rpb246IHRydWUsIC8vIHR1cm4gZmVhdHVyZSBzZWxlY3Rpb24gb25cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9leHRydWRlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIHdhbnQgYSBvcmRlciBpbiB2ZXJ0ZXggYXR0cmlidXRlcywgYW5kIHRvIGV4dHJ1ZGUgbGluZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9FWFRSVURFX0xJTkVTID0gdHJ1ZTtcblxuICAgICAgICAvLyBPcHRpb25hbCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBsaW5lIHRleHR1cmUgb3IgZGFzaCBhcnJheVxuICAgICAgICAvLyAobGF0dGVyIHdpbGwgYmUgcmVuZGVyZWQgYXQgY29tcGlsZS10aW1lLCB3aGVuIEdMIGNvbnRleHQgYXZhaWxhYmxlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlIHx8IHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgdGhpcy50ZXhjb29yZHMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBBZGRpdGlvbmFsIHNpbmdsZS1hbGxvY2F0ZWQgb2JqZWN0IHVzZWQgZm9yIGhvbGRpbmcgb3V0bGluZSBzdHlsZSBhcyBpdCBpcyBwcm9jZXNzZWRcbiAgICAgICAgLy8gU2VwYXJhdGUgZnJvbSB0aGlzLmZlYXR1cmVfc3R5bGUgc28gdGhhdCBvdXRsaW5lIHByb3BlcnRpZXMgZG8gbm90IG92ZXJ3cml0ZSBjYWxjdWxhdGVkXG4gICAgICAgIC8vIGlubGluZSBwcm9wZXJ0aWVzIChvdXRsaW5lIGNhbGwgaXMgbWFkZSAqd2l0aGluKiB0aGUgaW5saW5lIGNhbGwpXG4gICAgICAgIHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlID0ge307XG4gICAgICAgIHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7IC8vIHNhdmUgcmVmZXJlbmNlIHRvIG1haW4gY29tcHV0ZWQgc3R5bGUgb2JqZWN0XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgY29tcGlsZSAoKSB7XG4gICAgICAgIHRoaXMucGFyc2VMaW5lVGV4dHVyZSgpO1xuICAgICAgICByZXR1cm4gU3R5bGUuY29tcGlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBPcHRpb25hbGx5IGFwcGx5IGEgZGFzaCBhcnJheSBwYXR0ZXJuIHRvIHRoaXMgbGluZVxuICAgIHBhcnNlTGluZVRleHR1cmUgKCkge1xuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSBwYXR0ZXJuXG4gICAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGRhc2ggcGF0dGVybiAoZGVmYXVsdHMgdHJhbnNwYXJlbnQpXG4gICAgICAgICAgICBpZiAodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfQkFDS0dST1VORF9DT0xPUiA9XG4gICAgICAgICAgICAgICAgICAgIGB2ZWMzKCR7dGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3Iuc2xpY2UoMCwgMykuam9pbignLCAnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVuZGVyIGxpbmUgcGF0dGVyblxuICAgICAgICAgICAgbGV0IGRhc2ggPSByZW5kZXJEYXNoQXJyYXkodGhpcy5kYXNoKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9ICdfJyArIHRoaXMubmFtZSArICdfZGFzaGFycmF5JztcbiAgICAgICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHRoaXMudGV4dHVyZSwge1xuICAgICAgICAgICAgICAgIGRhdGE6IGRhc2gucGl4ZWxzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZGFzaC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiAnbmVhcmVzdCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lmeSBhIGxpbmUgdGV4dHVyZSAoZWl0aGVyIGRpcmVjdGx5LCBvciByZW5kZXJlZCBkYXNoIHBhdHRlcm4gZnJvbSBhYm92ZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0FMUEhBX1RFU1QgPSAwLjU7IC8vIHBpeGVscyBiZWxvdyB0aGlzIHRocmVzaG9sZCBhcmUgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gMTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgcGF0dGVybiBhc3BlY3QgcmF0aW8gYWZ0ZXIgdGV4dHVyZSBsb2Fkc1xuICAgICAgICAgICAgVGV4dHVyZS5nZXRJbmZvKHRoaXMudGV4dHVyZSkudGhlbih0ZXh0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gdGV4dHVyZS5oZWlnaHQgLyB0ZXh0dXJlLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCB6b29tIGdpdmVuIGluIGBjb250ZXh0YFxuICAgIGNhbGNXaWR0aCAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICh3aWR0aCAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eSh3aWR0aCwgY29udGV4dCkpIHx8IDA7XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCBuZXh0IHpvb20gKHVzZWQgZm9yIGxpbmUgd2lkdGggaW50ZXJwb2xhdGlvbilcbiAgICBjYWxjV2lkdGhOZXh0Wm9vbSAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC56b29tKys7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmNhbGNXaWR0aCh3aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuem9vbS0tO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAvLyBsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3LndpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHdpdGggbmVnYXRpdmUgd2lkdGhcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5uZXh0X3dpZHRoLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoKHdpZHRoID09PSAwICYmIG5leHRfd2lkdGggPT09IDApIHx8IG5leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSB0byBhIHBvc2l0aXZlIHZhbHVlIGF0IG5leHQgem9vbVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCB0byB1bml0cyBhbmQgcmVsYXRpdmUgY2hhbmdlIGZyb20gcHJldmlvdXMgem9vbVxuICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIGEgZ2l2ZW4gd2lkdGggaXMgdHdpY2UgYXMgYmlnIGluIHNjcmVlbiBzcGFjZSBhdCB0aGUgbmV4dCB6b29tXG4gICAgICAgIHN0eWxlLndpZHRoID0gd2lkdGggKiBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCA9IChuZXh0X3dpZHRoICogMikgLSB3aWR0aDtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAqPSBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAvPSAyOyAvLyBOQjogZGl2aWRlIGJ5IDIgYmVjYXVzZSBleHRydXNpb24gd2lkdGggaXMgaGFsdmVkIGluIGJ1aWxkZXIgLSByZW1vdmU/XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhlaWdodCBkZWZhdWx0cyB0byBmZWF0dXJlIGhlaWdodCwgYnV0IGV4dHJ1ZGUgc3R5bGUgY2FuIGR5bmFtaWNhbGx5IGFkanVzdCBoZWlnaHQgYnkgcmV0dXJuaW5nIGEgbnVtYmVyIG9yIGFycmF5IChpbnN0ZWFkIG9mIGEgYm9vbGVhbilcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56IHx8IDAsIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhaXNlIGxpbmUgaGVpZ2h0IGlmIGV4dHJ1ZGVkXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgc3R5bGUueiArPSBzdHlsZS5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcblxuICAgICAgICBzdHlsZS5jYXAgPSBkcmF3LmNhcDtcbiAgICAgICAgc3R5bGUuam9pbiA9IGRyYXcuam9pbjtcbiAgICAgICAgc3R5bGUubWl0ZXJfbGltaXQgPSBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gb3V0bGluZSBzdHlsZVxuICAgICAgICAvLyBSZXVzYWJsZSBvdXRsaW5lIHN0eWxlIG9iamVjdCwgbWFya2VkIGFzIGFscmVhZHkgd3JhcHBlZCBpbiBjYWNoZSBvYmplY3RzIChwcmVwcm9jZXNzZWQgPSB0cnVlKVxuICAgICAgICBzdHlsZS5vdXRsaW5lID0gc3R5bGUub3V0bGluZSB8fCB7IHdpZHRoOiB7fSwgbmV4dF93aWR0aDoge30sIHByZXByb2Nlc3NlZDogdHJ1ZSB9O1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUgJiYgZHJhdy5vdXRsaW5lLnZpc2libGUgIT09IGZhbHNlICYmIGRyYXcub3V0bGluZS5jb2xvciAmJiBkcmF3Lm91dGxpbmUud2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG91dGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIG91dGxpbmUgaXMgYXBwbGllZCBvbiBib3RoIHNpZGVzIG9mIGxpbmVcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX3dpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy5vdXRsaW5lLndpZHRoLCBjb250ZXh0KSAqIDI7XG4gICAgICAgICAgICBsZXQgb3V0bGluZV9uZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm91dGxpbmUubmV4dF93aWR0aCwgY29udGV4dCkgKiAyO1xuXG4gICAgICAgICAgICBpZiAoKG91dGxpbmVfd2lkdGggPT09IDAgJiYgb3V0bGluZV9uZXh0X3dpZHRoID09PSAwKSB8fCBvdXRsaW5lX3dpZHRoIDwgMCB8fCBvdXRsaW5lX25leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIGJldHdlZW4gemVybyBvciBncmVhdGVyIHdpZHRoXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1haW50YWluIGNvbnNpc3RlbnQgb3V0bGluZSB3aWR0aCBhcm91bmQgdGhlIGxpbmUgZmlsbFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBvdXRsaW5lX3dpZHRoICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gb3V0bGluZV9uZXh0X3dpZHRoICsgbmV4dF93aWR0aDtcblxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBkcmF3Lm91dGxpbmUuY29sb3I7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jYXAgPSBkcmF3Lm91dGxpbmUuY2FwIHx8IGRyYXcuY2FwO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuam9pbiA9IGRyYXcub3V0bGluZS5qb2luIHx8IGRyYXcuam9pbjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm1pdGVyX2xpbWl0ID0gZHJhdy5vdXRsaW5lLm1pdGVyX2xpbWl0IHx8IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5zdHlsZSA9IGRyYXcub3V0bGluZS5zdHlsZSB8fCB0aGlzLm5hbWU7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGRlZmluZWQgb3V0bGluZSBvcmRlciwgb3IgaW5oZXJpdGVkIGZyb20gaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChkcmF3Lm91dGxpbmUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm91dGxpbmUub3JkZXIsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIERvbid0IGxldCBvdXRsaW5lIGJlIGFib3ZlIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUub3V0bGluZS5vcmRlciA+IHN0eWxlLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPdXRsaW5lcyBhcmUgYWx3YXlzIGF0IGhhbGYtbGF5ZXIgaW50ZXJ2YWxzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggaW5uZXIgbGluZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyIC09IDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgZHJhdy5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggd2lsbCBiZSBjb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lKSB7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLmNvbG9yKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCByZS1jb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIGV4dHJ1c2lvbiB2ZWN0b3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcblxuICAgICAgICAvLyBzY2FsaW5nIHRvIHByZXZpb3VzIGFuZCBuZXh0IHpvb21cbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLm5leHRfd2lkdGg7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZExpbmVzKGxpbmVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gT3V0bGluZSAoYnVpbGQgZmlyc3Qgc28gdGhhdCBibGVuZGVkIGdlb21ldHJ5IHdpdGhvdXQgYSBkZXB0aCB0ZXN0IGlzIGRyYXduIGZpcnN0L3VuZGVyIHRoZSBpbm5lciBsaW5lKVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gc3dhcCBpbiBvdXRsaW5lLXNwZWNpZmljIHN0eWxlIGhvbGRlclxuICAgICAgICBpZiAoc3R5bGUub3V0bGluZSAmJiBzdHlsZS5vdXRsaW5lLmNvbG9yICE9IG51bGwgJiYgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgb3V0bGluZV9zdHlsZSA9IHRoaXMuc3R5bGVzW3N0eWxlLm91dGxpbmUuc3R5bGVdO1xuICAgICAgICAgICAgaWYgKG91dGxpbmVfc3R5bGUpIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lX3N0eWxlLmFkZEZlYXR1cmUoY29udGV4dC5mZWF0dXJlLCBzdHlsZS5vdXRsaW5lLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1haW4gbGluZVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlOyAvLyByZXN0b3JlIGNhbGN1bGF0ZWQgc3R5bGUgZm9yIGlubGluZVxuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBidWlsZFBvbHlsaW5lcyhcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3R5bGUud2lkdGgsXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXA6IHN0eWxlLmNhcCxcbiAgICAgICAgICAgICAgICBqb2luOiBzdHlsZS5qb2luLFxuICAgICAgICAgICAgICAgIG1pdGVyX2xpbWl0OiBzdHlsZS5taXRlcl9saW1pdCxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9leHRydWRlLFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfbm9ybWFsaXplOiAyNTYsIC8vIHZhbHVlcyBoYXZlIGFuIDgtYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3dpZHRoOiAoc3R5bGUud2lkdGggfHwgc3R5bGUubmV4dF93aWR0aCkgLyBjb250ZXh0LnRpbGUub3Zlcnpvb20yLCAvLyBVVnMgY2FuJ3QgY2FsYyBmb3IgemVyby13aWR0aCwgdXNlIG5leHQgem9vbSB3aWR0aCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICAgICAgY2xvc2VkX3BvbHlnb246IG9wdGlvbnMgJiYgb3B0aW9ucy5jbG9zZWRfcG9seWdvbixcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIFJlbmRlciBwb2x5Z29ucyBhcyBpbmRpdmlkdWFsIGxpbmVzXG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMocG9seWdvbnNbcF0sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgeyBjbG9zZWRfcG9seWdvbjogdHJ1ZSwgcmVtb3ZlX3RpbGVfZWRnZXM6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUG9pbnQgKyB0ZXh0IGxhYmVsIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFF1YWRzRm9yUG9pbnRzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2ludHMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uLy4uL3ZlY3Rvcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCB7VGV4dExhYmVsc30gZnJvbSAnLi4vdGV4dC90ZXh0X2xhYmVscyc7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuLi8uLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNGcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAgLy8gc3R5bGUgZW5hYmxlcyBmZWF0dXJlIHNlbGVjdGlvblxuICAgIGNvbGxpc2lvbjogdHJ1ZSwgIC8vIHN0eWxlIGluY2x1ZGVzIGEgY29sbGlzaW9uIHBhc3NcbiAgICBibGVuZDogJ292ZXJsYXknLCAvLyBvdmVybGF5cyBkcmF3biBvbiB0b3Agb2YgYWxsIG90aGVyIHN0eWxlcywgd2l0aCBibGVuZGluZ1xuXG4gICAgaW5pdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2Ugc2hhZGVyc1xuICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c1ZlcnRleDtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50O1xuXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9zaGFwZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX29mZnNldCcsIHNpemU6IDIsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cyA9IHRoaXMubmFtZSsnLXBvaW50cyc7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQgPSB0aGlzLm5hbWUrJy10ZXh0JztcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlcyA9IHt9OyAvLyB0cmFjayB3aGljaCBtaXNzaW5nIHNwcml0ZXMgd2UndmUgZm91bmQgKHJlZHVjZSBkdXBlIGxvZyBtZXNzYWdlcylcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0eWxlID0ge307XG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxpbmdcblxuICAgICAgICAvLyByZXF1aXJlIGNvbG9yIG9yIHRleHR1cmVcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvciAmJiAhdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcHJpdGUgPSBzdHlsZS5zcHJpdGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5zcHJpdGUsIGNvbnRleHQpO1xuICAgICAgICBzdHlsZS5zcHJpdGVfZGVmYXVsdCA9IGRyYXcuc3ByaXRlX2RlZmF1bHQ7IC8vIG9wdGlvbmFsIGZhbGxiYWNrIGlmICdzcHJpdGUnIG5vdCBmb3VuZFxuXG4gICAgICAgIC8vIGlmIHBvaW50IGhhcyB0ZXh0dXJlIGFuZCBzcHJpdGVzLCByZXF1aXJlIGEgdmFsaWQgc3ByaXRlIHRvIGRyYXdcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0gJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGlmICghc3ByaXRlICYmICFzdHlsZS5zcHJpdGVfZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc3ByaXRlIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGRlZmF1bHQgc3ByaXRlXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwcml0ZSA9IHN0eWxlLnNwcml0ZV9kZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIHNwcml0ZSAnJHtzcHJpdGV9JyBmb3IgdGV4dHVyZSAnJHt0aGlzLnRleHR1cmV9J2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwcml0ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9Jywgc3ByaXRlICcke3Nwcml0ZX0nIHdhcyBzcGVjaWZpZWQsIGJ1dCB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nIGhhcyBubyBzcHJpdGVzYCk7XG4gICAgICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyB0ZXhjb29yZCBzY2FsZSBpZiBuZWVkZWQgKGUuZy4gZm9yIHNwcml0ZSBzdWItYXJlYSlcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIHNwcml0ZSkge1xuICAgICAgICAgICAgc3ByaXRlX2luZm8gPSBUZXh0dXJlLmdldFNwcml0ZUluZm8odGhpcy50ZXh0dXJlLCBzcHJpdGUpO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3ByaXRlX2luZm8udGV4Y29vcmRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgLy8gcG9pbnQgc2l6ZSBkZWZpbmVkIGV4cGxpY2l0bHksIG9yIGRlZmF1bHRzIHRvIHNwcml0ZSBzaXplLCBvciBnZW5lcmljIGZhbGxiYWNrXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LnNpemU7XG4gICAgICAgIGlmICghc3R5bGUuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHNwcml0ZV9pbmZvKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHNwcml0ZV9pbmZvLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gWzE2LCAxNl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KHN0eWxlLnNpemUsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2l6ZSB3aWxsIGJlIHNjYWxlZCB0byAxNi1iaXQgc2lnbmVkIGludCwgc28gbWF4IGFsbG93ZWQgd2lkdGggKyBoZWlnaHQgb2YgMjU2IHBpeGVsc1xuICAgICAgICBzdHlsZS5zaXplID0gW1xuICAgICAgICAgICAgTWF0aC5taW4oKHN0eWxlLnNpemVbMF0gfHwgc3R5bGUuc2l6ZSksIDI1NiksXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVsxXSB8fCBzdHlsZS5zaXplKSwgMjU2KVxuICAgICAgICBdO1xuXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpIHx8IDA7XG4gICAgICAgIHN0eWxlLnNhbXBsZXIgPSAwOyAvLyAwID0gc3ByaXRlc1xuXG4gICAgICAgIHRoaXMuY29tcHV0ZUxheW91dChzdHlsZSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gVGV4dCBzdHlsaW5nXG4gICAgICAgIGxldCB0ZiA9XG4gICAgICAgICAgICBkcmF3LnRleHQgJiZcbiAgICAgICAgICAgIGRyYXcudGV4dC52aXNpYmxlICE9PSBmYWxzZSAmJiAvLyBleHBsaWNpdGx5IGhhbmRsZSBgdmlzaWJsZWAgcHJvcGVydHkgZm9yIG5lc3RlZCB0ZXh0XG4gICAgICAgICAgICB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdy50ZXh0LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICBpZiAodGYpIHtcbiAgICAgICAgICAgIHRmLmxheW91dC5wYXJlbnQgPSBzdHlsZTsgLy8gcGFyZW50IHBvaW50IHdpbGwgYXBwbHkgYWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IHRvIHRleHRcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgaGF2ZSBhIGRlZmF1bHQgcHJpb3JpdHkgb2YgMC41IGJlbG93IHRoZWlyIHBhcmVudCBwb2ludCAoKzAuNSwgcHJpb3JpdHkgaXMgbG93ZXItaXMtYmV0dGVyKVxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBhcyBsb25nIGFzIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgdGYubGF5b3V0LnByaW9yaXR5ID0gZHJhdy50ZXh0LnByaW9yaXR5ID8gTWF0aC5tYXgodGYubGF5b3V0LnByaW9yaXR5LCBzdHlsZS5wcmlvcml0eSArIDAuNSkgOiAoc3R5bGUucHJpb3JpdHkgKyAwLjUpO1xuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbnRvIHRpbGVcbiAgICAgICAgICAgIC8vICh0aGV5IHNob3VsZCBzdGF5IGZpeGVkIHJlbGF0aXZlIHRvIHRoZSBwb2ludClcbiAgICAgICAgICAgIHRmLmxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGlsZS5rZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2goe1xuICAgICAgICAgICAgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgc3R5bGUsXG4gICAgICAgICAgICB0ZXh0X2ZlYXR1cmU6IHRmXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWV1ZSA9IHRoaXMucXVldWVzW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggcG9pbnQgZmVhdHVyZSwgY3JlYXRlIG9uZSBvciBtb3JlIGxhYmVsc1xuICAgICAgICBsZXQgdGV4dF9vYmpzID0gW107XG4gICAgICAgIGxldCBwb2ludF9vYmpzID0gW107XG5cbiAgICAgICAgcXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZSA9IHEuZmVhdHVyZTtcbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG5cbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc3R5bGUuc2l6ZSwgZ2VvbWV0cnksIHN0eWxlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwb2ludF9vYmpzLnB1c2gocG9pbnRfb2JqKTtcblxuICAgICAgICAgICAgICAgIGlmIChxLnRleHRfZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhdzogcS50ZXh0X2ZlYXR1cmUuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHEudGV4dF9mZWF0dXJlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzX2tleTogcS50ZXh0X2ZlYXR1cmUudGV4dF9zZXR0aW5nc19rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IHEudGV4dF9mZWF0dXJlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2xhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZDogcG9pbnRfb2JqICAgLy8gbGluayBzbyB0ZXh0IG9ubHkgcmVuZGVycyB3aGVuIHBhcmVudCBwb2ludCBpcyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9vYmpzLnB1c2godGV4dF9vYmopO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyB0ZXh0IGZlYXR1cmUgaXMgb3B0aW9uYWwsIGNyZWF0ZSBhIHR3by13YXkgbGluayBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB3aWxsIG9ubHkgcmVuZGVyIHdoZW4gdGV4dCBpcyBhbHNvIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXEuZHJhdy50ZXh0Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmoubGlua2VkID0gdGV4dF9vYmo7IC8vIHR3by13YXkgbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb2xsaWRlIGJvdGggcG9pbnRzIGFuZCB0ZXh0LCB0aGVuIGJ1aWxkIGZlYXR1cmVzXG4gICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKFtcbiAgICAgICAgICAgICAgICAvLyBQb2ludHNcbiAgICAgICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZShwb2ludF9vYmpzLCB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KS50aGVuKHBvaW50X29ianMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmpzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gTGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0ZXh0X29ianMpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIGxhYmVscykpXG4gICAgICAgICAgICBdKS50aGVuKChbLCB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGxhYmVsc1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHMgJiYgdGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyID0gMTsgLy8gbm9uLTAgPSBsYWJlbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXS50ZXhjb29yZHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgLy8gU2l6ZSAoMWQgdmFsdWUgb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5zaXplLCB2ID0+IEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcChwYXJzZUZsb2F0KSA6IHBhcnNlRmxvYXQodikpO1xuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciAyZCBhcnJheSwgZXhwYW5kIDFkIHRvIDJkKVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dCBzdHlsaW5nXG4gICAgICAgIGRyYXcudGV4dCA9IHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdy50ZXh0KTsgLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB2YWxpZCB0ZXh0IHN0eWxpbmcgd2Fzbid0IHByb3ZpZGVkXG4gICAgICAgIGlmIChkcmF3LnRleHQpIHtcbiAgICAgICAgICAgIGRyYXcudGV4dC5rZXkgPSBkcmF3LmtleTsgLy8gY29weSBsYXllciBrZXkgZm9yIHVzZSBhcyBsYWJlbCByZXBlYXQgZ3JvdXBcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiBmYWxzZTtcblxuICAgICAgICAvLyBwb2x5Z29ucyByZW5kZXJpbmcgYXMgcG9pbnRzIHdpbGwgcmVuZGVyIGF0IGVhY2ggb2YgdGhlIHBvbHlnb24ncyB2ZXJ0aWNlcyBieSBkZWZhdWx0LFxuICAgICAgICAvLyBidXQgY2FuIGJlIHNldCB0byByZW5kZXIgYXQgdGhlIHBvbHlnb24ncyBjZW50cm9pZCBpbnN0ZWFkXG4gICAgICAgIC8vIFRPRE86IGNoYW5nZSBkZWZhdWx0IHRvIGJlIGNlbnRyb2lkLCBhbmQvb3IgcmVwbGFjZSB3aXRoIG1vcmUgZmxleGlibGUgJ3BsYWNlbWVudCdcbiAgICAgICAgLy8gcGFyYW1ldGVyIHRvIGFsbG93IHBsYWNlbWVudCBvbiB2ZXJ0ZXgsIGFsb25nIGEgbGluZSwgb3IgYXQgYSBwb2x5Z29uIGNlbnRyb2lkXG4gICAgICAgIGxheW91dC5jZW50cm9pZCA9IGRyYXcuY2VudHJvaWQ7XG5cbiAgICAgICAgLy8gbGFiZWwgYW5jaG9ycyAocG9pbnQgbGFiZWxzIG9ubHkpXG4gICAgICAgIC8vIGxhYmVsIHBvc2l0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgcmVsYXRpdmUgdG8gaXRzIG9yaWdpbmFsIHBvaW50XG4gICAgICAgIC8vIG9uZSBvZjogbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIGxheW91dC5hbmNob3IgPSBkcmF3LmFuY2hvcjtcblxuICAgICAgICAvLyBsYWJlbCBvZmZzZXQgYW5kIGJ1ZmZlciBpbiBwaXhlbCAoYXBwbGllZCBpbiBzY3JlZW4gc3BhY2UpXG4gICAgICAgIGxheW91dC5vZmZzZXQgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5vZmZzZXQsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuICAgICAgICBsYXlvdXQuYnVmZmVyID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuYnVmZmVyLCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcblxuICAgICAgICAvLyBsYWJlbCBwcmlvcml0eSAobG93ZXIgaXMgaGlnaGVyKVxuICAgICAgICBsZXQgcHJpb3JpdHkgPSBkcmF3LnByaW9yaXR5O1xuICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9IC0xID4+PiAwOyAvLyBkZWZhdWx0IHRvIG1heCBwcmlvcml0eSB2YWx1ZSBpZiBub25lIHNldFxuICAgICAgICB9XG4gICAgICAgIGxheW91dC5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBmcS5sYWJlbCA9IG5ldyBMYWJlbFBvaW50KGZxLnBvaW50X2xhYmVsLnBvc2l0aW9uLCB0ZXh0X2luZm8uc2l6ZS5jb2xsaXNpb25fc2l6ZSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgcG9pbnQgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIGxpbmUgdmVydGV4XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50c1tpXSwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIFBvaW50IGF0IGVhY2ggbGluZSB2ZXJ0ZXhcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmVzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludHMgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2VudHJvaWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludHMgPSByaW5nc1tsbl07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludHNbaV0sIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGNvbG9yID0gc3R5bGUuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIDAsIHsgc2l6ZTogMiB9KTtcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCBzdHlsZS56IHx8IDAsIHsgc2l6ZTogMSwgb2Zmc2V0OiAyIH0pO1xuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKSwgeyBzaXplOiAxLCBvZmZzZXQ6IDMgfSk7XG5cbiAgICAgICAgLy8gc2NhbGluZyB2ZWN0b3IgLSAoeCwgeSkgY29tcG9uZW50cyBwZXIgcGl4ZWwsIHogPSBhbmdsZSwgdyA9IHNjYWxpbmcgZmFjdG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NoYXBlJywgMCwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHRleHR1cmUgY29vcmRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3RleGNvb3JkJywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIG9mZnNldHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffb2Zmc2V0JywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX2NvbG9yJywgVmVjdG9yLm11bHQoY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zZWxlY3Rpb25fY29sb3InLCBWZWN0b3IubXVsdChzdHlsZS5zZWxlY3Rpb25fY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRRdWFkIChwb2ludHMsIHNpemUsIGFuZ2xlLCBzYW1wbGVyLCBvZmZzZXQsIHRleGNvb3JkX3NjYWxlLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlKSB7XG4gICAgICAgIGJ1aWxkUXVhZHNGb3JQb2ludHMoXG4gICAgICAgICAgICBwb2ludHMsXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25faW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNoYXBlX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9zaGFwZSxcbiAgICAgICAgICAgICAgICBvZmZzZXRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX29mZnNldFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWFkOiBzaXplLFxuICAgICAgICAgICAgICAgIHF1YWRfbm9ybWFsaXplOiAyNTYsICAgIC8vIHZhbHVlcyBoYXZlIGFuIDgtYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGFuZ2xlOiBhbmdsZSAqIDQwOTYsICAgIC8vIHZhbHVlcyBoYXZlIGEgMTItYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgc2hhcGVfdzogc2FtcGxlcixcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIHF1YWQgZm9yIHBvaW50IHNwcml0ZVxuICAgIGJ1aWxkIChzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IGxhYmVsID0gc3R5bGUubGFiZWw7XG5cbiAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICBbbGFiZWwucG9zaXRpb25dLCAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uXG4gICAgICAgICAgICBzdHlsZS5zaXplLCAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaW4gcGl4ZWxzXG4gICAgICAgICAgICBzdHlsZS5hbmdsZSwgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgIHN0eWxlLnNhbXBsZXIsICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBzYW1wbGVyIHRvIHVzZVxuICAgICAgICAgICAgbGFiZWwub2Zmc2V0LCAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZnJvbSBjZW50ZXIgaW4gcGl4ZWxzXG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMsICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlICAgIC8vIFZCTyBhbmQgZGF0YSBmb3IgY3VycmVudCB2ZXJ0ZXhcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcGFzcy10aHJvdWdoIHRvIGdlbmVyaWMgcG9pbnQgYnVpbGRlclxuICAgIGJ1aWxkTGluZXMgKGxpbmVzLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBidWlsZFBvaW50cyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zIChwb2ludHMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gQWRkIGxhYmVsIGZhZGUgdGltZVxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgeyBmYWRlX2luX3RpbWU6IHRoaXMuZmFkZV9pbl90aW1lIH0pO1xuICAgICAgICByZXR1cm4gU3R5bGUubWFrZU1lc2guY2FsbCh0aGlzLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbn0pO1xuIiwiLy8gUG9seWdvbiByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5Z29ucywgYnVpbGRFeHRydWRlZFBvbHlnb25zfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2x5Z29ucyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc192ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvbHlnb25zX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgdmFyIFBvbHlnb25zID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbi8vIGV4cG9ydCBzaGFkZXJzIGZvciB1c2UgaW4gbGluZXMuanNcbmV4cG9ydCB7XG4gICAgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50XG59O1xuXG5PYmplY3QuYXNzaWduKFBvbHlnb25zLCB7XG4gICAgbmFtZTogJ3BvbHlnb25zJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICB2ZXJ0ZXhfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIGZyYWdtZW50X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50LFxuICAgIHNlbGVjdGlvbjogdHJ1ZSwgLy8gdHVybiBmZWF0dXJlIHNlbGVjdGlvbiBvblxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2ljIGF0dHJpYnV0ZXMsIG90aGVycyBjYW4gYmUgYWRkZWQgKHNlZSB0ZXh0dXJlIFVWcyBiZWxvdylcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX25vcm1hbCcsIHNpemU6IDMsIHR5cGU6IGdsLkJZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSwgLy8gZ2V0cyBwYWRkZWQgdG8gNC1ieXRlc1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSBoYXZlIGEgbm9ybWFsIGFuZCBvcmRlciBhdHRyaWJ1dGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX05PUk1BTF9BVFRSSUJVVEUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcblxuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICAvLyB1c2UgZmVhdHVyZSdzIGhlaWdodCBhbmQgbWluX2hlaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMubWluX2hlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5taW5faGVpZ2h0O1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQsIG5vIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgYW5kIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVswXTtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gbm9ybWFsXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDEgKiAxMjc7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMsXG4gICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0LFxuICAgICAgICAgICAgd2luZGluZzogY29udGV4dC53aW5kaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRXh0cnVkZWQgcG9seWdvbnMgKGUuZy4gM0QgYnVpbGRpbmdzKVxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICBzdHlsZS56LCBzdHlsZS5oZWlnaHQsIHN0eWxlLm1pbl9oZWlnaHQsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9ub3JtYWwsXG4gICAgICAgICAgICAgICAgMTI3LCAvLyBzY2FsZSBub3JtYWxzIHRvIHNpZ25lZCBieXRlc1xuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciBwb2x5Z29uc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1aWxkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFJhc3RlciB0aWxlIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgbGV0IFJhc3RlclN0eWxlID0gT2JqZWN0LmNyZWF0ZShQb2x5Z29ucyk7XG5cbk9iamVjdC5hc3NpZ24oUmFzdGVyU3R5bGUsIHtcbiAgICBuYW1lOiAncmFzdGVyJyxcbiAgICBzdXBlcjogUG9seWdvbnMsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiBmYWxzZSwgLy8gbm8gZmVhdHVyZSBzZWxlY3Rpb24gYnkgZGVmYXVsdFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHJhc3RlciB0aWxlc1xuICAgICAgICB0aGlzLnJhc3RlciA9IHRoaXMucmFzdGVyIHx8ICdjb2xvcic7XG5cbiAgICAgICAgdGhpcy5zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIC8vIFJhc3RlciB0aWxlcyBkZWZhdWx0IHRvIHdoaXRlIHZlcnRleCBjb2xvciwgYXMgdGhpcyBjb2xvciB3aWxsIHRpbnQgdGhlIHVuZGVybHlpbmcgdGV4dHVyZVxuICAgICAgICBkcmF3LmNvbG9yID0gZHJhdy5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VwZXIuX3ByZXByb2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbn0pO1xuIiwiLy8gUmVuZGVyaW5nIHN0eWxlc1xuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZCT01lc2ggZnJvbSAnLi4vZ2wvdmJvX21lc2gnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL2xpZ2h0JztcbmltcG9ydCB7UmFzdGVyVGlsZVNvdXJjZX0gZnJvbSAnLi4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Jhc3RlcnMgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3Jhc3RlcnMuZ2xzbCcsICd1dGY4Jyk7XG5cbi8vIEJhc2UgY2xhc3NcblxuZXhwb3J0IHZhciBTdHlsZSA9IHtcbiAgICBpbml0ICh7IGdlbmVyYXRpb24sIHN0eWxlcywgc291cmNlcyA9IHt9LCBpbnRyb3NwZWN0aW9uIH0gPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNCdWlsdEluKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbHRfaW4gPSBmYWxzZTsgLy8gZXhwbGljaXRseSBzZXQgdG8gZmFsc2UgdG8gYXZvaWQgYW55IGNvbmZ1c2lvblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvLyBzY2VuZSBnZW5lcmF0aW9uIGlkIHRoaXMgc3R5bGUgd2FzIGNyZWF0ZWQgZm9yXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGVzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgc291cmNlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ2RlZmluZXMnKSAmJiB0aGlzLmRlZmluZXMpIHx8IHt9OyAvLyAjZGVmaW5lcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBzaGFkZXJzXG4gICAgICAgIHRoaXMuc2hhZGVycyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdzaGFkZXJzJykgJiYgdGhpcy5zaGFkZXJzKSB8fCB7fTsgLy8gc2hhZGVyIGN1c3RvbWl6YXRpb24gKHVuaWZvcm1zLCBkZWZpbmVzLCBibG9ja3MsIGV0Yy4pXG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb24gfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGZhbHNlOyAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN0eWxlIHN1cHBvcnRzIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbXMgYXJlIGN1cnJlbnRseSBjb21waWxpbmdcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9ncmFtcyBhcmUgZmluaXNoZWQgY29tcGlsaW5nXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgKGZvciBtYWluIHJlbmRlciBwYXNzKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIGZvciBmZWF0dXJlIHNlbGVjdGlvbiByZW5kZXIgcGFzc1xuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGZvciBmZWF0dXJlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIHNoYXJlZCB0byBsZXNzZW4gR0MvbWVtb3J5IHRocmFzaFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZSA9IFtdOyAgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzaW5nbGUtdmVydGV4IHRlbXBsYXRlLCBmaWxsZWQgb3V0IGJ5IGVhY2ggc3R5bGVcbiAgICAgICAgdGhpcy50aWxlX2RhdGEgPSB7fTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1N0eWxlJywgdGhpcy5uYW1lLCB0aGlzLmdlbmVyYXRpb25dLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgd29ybGQgY29vcmRzIHRvIHdyYXAgZXZlcnkgMTAwLDAwMCBtZXRlcnMsIGNhbiB0dXJuIG9mZiBieSBzZXR0aW5nIHRoaXMgdG8gJ2ZhbHNlJ1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9XT1JMRF9QT1NJVElPTl9XUkFQID0gMTAwMDAwO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuYmxlbmQgPSB0aGlzLmJsZW5kIHx8ICdvcGFxdWUnOyAgICAgICAgLy8gZGVmYXVsdDogb3BhcXVlIHN0eWxlcyBhcmUgZHJhd24gZmlyc3QsIHdpdGhvdXQgYmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZpbmVzW2BUQU5HUkFNX0JMRU5EXyR7dGhpcy5ibGVuZC50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRfb3JkZXIgPT0gbnVsbCkgeyAvLyBjb250cm9scyBvcmRlciBvZiByZW5kZXJpbmcgZm9yIHN0eWxlcyB3L25vbi1vcGFxdWUgYmxlbmRpbmdcbiAgICAgICAgICAgIHRoaXMuYmxlbmRfb3JkZXIgPSAtMTsgLy8gZGVmYXVsdHMgdG8gZmlyc3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBpc0J1aWx0SW4gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eSgnYnVpbHRfaW4nKSAmJiB0aGlzLmJ1aWx0X2luO1xuICAgIH0sXG5cbiAgICBmaWxsVmVydGV4VGVtcGxhdGUoYXR0cmlidXRlLCB2YWx1ZSwgeyBzaXplLCBvZmZzZXQgfSkge1xuICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ID09PSB1bmRlZmluZWQpID8gMCA6IG9mZnNldDtcblxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXhbYXR0cmlidXRlXTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIG5vIGluZGV4IGZvdW5kIGluIHZlcnRleCBsYXlvdXQgZm9yIGF0dHJpYnV0ZSAnJHthdHRyaWJ1dGV9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsdWUubGVuZ3RoID4gaSA/IHZhbHVlW2ldIDogdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpbmRleCArIGkgKyBvZmZzZXRdID0gdjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKioqIFN0eWxlIHBhcnNpbmcgYW5kIGdlb21ldHJ5IGNvbnN0cnVjdGlvbiAqKiovXG5cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0byBob2xkIGZlYXR1cmUgZGF0YSAoZm9yIGEgdGlsZSBvciBvdGhlciBvYmplY3QpXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IHtcbiAgICAgICAgICAgIHZlcnRleF9kYXRhOiBudWxsLFxuICAgICAgICAgICAgdW5pZm9ybXM6IHt9LFxuICAgICAgICAgICAgdGV4dHVyZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgfSxcblxuICAgIC8vIEZpbmFsaXplcyBhbiBvYmplY3QgaG9sZGluZyBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgdmFyIHRpbGVfZGF0YSA9IHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldID0gbnVsbDtcblxuICAgICAgICBpZiAodGlsZV9kYXRhICYmIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEudmVydGV4X2NvdW50ID4gMCkge1xuICAgICAgICAgICAgLy8gT25seSBrZWVwIGZpbmFsIGJ5dGUgYnVmZmVyXG4gICAgICAgICAgICB0aWxlX2RhdGEudmVydGV4X2RhdGEuZW5kKCk7XG4gICAgICAgICAgICB0aWxlX2RhdGEudmVydGV4X2VsZW1lbnRzID0gdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVsZW1lbnRfYnVmZmVyO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhID0gdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9idWZmZXI7IC8vIGNvbnZlcnQgZnJvbSBpbnN0YW5jZSB0byByYXcgdHlwZWQgYXJyYXlcblxuICAgICAgICAgICAgLy8gTG9hZCByYXN0ZXIgdGlsZXMgcGFzc2VkIGZyb20gZGF0YSBzb3VyY2VcbiAgICAgICAgICAgIC8vIEJsb2NrcyBtZXNoIGNvbXBsZXRpb24gdG8gYXZvaWQgZmxpY2tlcmluZ1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSYXN0ZXJUZXh0dXJlcyh0aWxlLCB0aWxlX2RhdGEpLnRoZW4oKCkgPT4gdGlsZV9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7IC8vIGRvbid0IHNlbmQgdGlsZSBkYXRhIGJhY2sgaWYgZG9lc24ndCBoYXZlIGdlb21ldHJ5XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSGFzIG1lc2ggZGF0YSBmb3IgYSBnaXZlbiB0aWxlP1xuICAgIGhhc0RhdGFGb3JUaWxlICh0aWxlX2tleSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZV9rZXldICE9IG51bGw7XG4gICAgfSxcblxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5wYXJzZUZlYXR1cmUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG5cbiAgICAgICAgLy8gU2tpcCBmZWF0dXJlP1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBmZWF0dXJlIGluIHRoaXMgcmVuZGVyIHN0eWxlP1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldLnZlcnRleF9kYXRhID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmNyZWF0ZVZlcnRleERhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVpbGRHZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBzdHlsZSwgdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldLnZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgYnVpbGRHZW9tZXRyeSAoZ2VvbWV0cnksIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUG9seWdvbnMoW2dlb21ldHJ5LmNvb3JkaW5hdGVzXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVzKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUG9pbnRzKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUG9pbnRzKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHBhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgb3JkZXIgaWYgaXQgd2FzIG5vdCBjYWNoZWRcbiAgICAgICAgICAgIHN0eWxlLm9yZGVyID0gdGhpcy5wYXJzZU9yZGVyKGRyYXcub3JkZXIsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvbiAob25seSBpZiBzdHlsZSBzdXBwb3J0cyBpdClcbiAgICAgICAgICAgIHZhciBzZWxlY3RhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBzdHlsZS5pbnRlcmFjdGl2ZSA9IHRoaXMuaW50cm9zcGVjdGlvbiB8fCBkcmF3LmludGVyYWN0aXZlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShzdHlsZS5pbnRlcmFjdGl2ZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgaXMgbWFya2VkIGFzIHNlbGVjdGFibGVcbiAgICAgICAgICAgIGlmIChzZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2VsZWN0aW9uX2NvbG9yID0gRmVhdHVyZVNlbGVjdGlvbi5tYWtlQ29sb3IoZmVhdHVyZSwgY29udGV4dC50aWxlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24uZGVmYXVsdENvbG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgc3R5bGUgPSB0aGlzLl9wYXJzZUZlYXR1cmUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsICdTdHlsZS5wYXJzZUZlYXR1cmU6IHN0eWxlIHBhcnNpbmcgZXJyb3InLCBmZWF0dXJlLCBzdHlsZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICB9LFxuXG4gICAgcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBQcmVwcm9jZXNzIGZpcnN0IHRpbWVcbiAgICAgICAgaWYgKCFkcmF3LnByZXByb2Nlc3NlZCkge1xuICAgICAgICAgICAgZHJhdyA9IHRoaXMuX3ByZXByb2Nlc3MoZHJhdyk7IC8vIG9wdGlvbmFsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAgICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcmF3LnByZXByb2Nlc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIG9wdGlvbmFsbHkgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NcbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gUGFyc2UgYW4gb3JkZXIgdmFsdWVcbiAgICBwYXJzZU9yZGVyIChvcmRlciwgY29udGV4dCkge1xuICAgICAgICAvLyBDYWxjdWxhdGUgb3JkZXIgaWYgaXQgd2FzIG5vdCBjYWNoZWRcbiAgICAgICAgaWYgKHR5cGVvZiBvcmRlciAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5jYWxjdWxhdGVPcmRlcihvcmRlciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yZGVyO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgZmluYWwgcHJlY2lzaW9uIGZvciBoYWxmLWxheWVycyAoZm9yIG91dGxpbmVzKVxuICAgIHNjYWxlT3JkZXIgKG9yZGVyKSB7XG4gICAgICAgIHJldHVybiBvcmRlciAqIDI7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGEgY29sb3Igb2YgY2hvb3NlIGEgZGVmYXVsdCBpZiBhY2NlcHRhYmxlLCByZXR1cm4gdW5kZWZpbmVkIGlmIGNvbG9yIG1pc3NpbmdcbiAgICBwYXJzZUNvbG9yKGNvbG9yLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIE5lZWQgZWl0aGVyIGEgY29sb3IsIG9yIGEgc2hhZGVyIGJsb2NrIGZvciAnY29sb3InIG9yICdmaWx0ZXInXG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5KGNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNoYWRlcnMuYmxvY2tzLmNvbG9yIHx8IHRoaXMuc2hhZGVycy5ibG9ja3MuZmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgZnVuY3Rpb25zIGFyZSBuby1vcHMgdW50aWwgb3ZlcnJpZGVuXG4gICAgYnVpbGRQb2x5Z29ucyAoKSB7fSxcbiAgICBidWlsZExpbmVzICgpIHt9LFxuICAgIGJ1aWxkUG9pbnRzICgpIHt9LFxuXG5cbiAgICAvKioqIEdMIHN0YXRlIGFuZCByZW5kZXJpbmcgKioqL1xuXG4gICAgc2V0R0wgKGdsKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5tYXhfdGV4dHVyZV9zaXplID0gVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSh0aGlzLmdsKTtcbiAgICB9LFxuXG4gICAgbWFrZU1lc2ggKHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFZCT01lc2godGhpcy5nbCwgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgdGhpcy52ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyIChtZXNoKSB7XG4gICAgICAgIHJldHVybiBtZXNoLnJlbmRlcigpO1xuICAgIH0sXG5cbiAgICBjb21waWxlICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdsKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYHN0eWxlLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5uYW1lfSBiZWNhdXNlIG5vIEdMIGNvbnRleHRgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21waWxpbmcpIHtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgc3R5bGUuY29tcGlsZSgpOiBza2lwcGluZyBmb3IgJHt0aGlzLm5hbWV9IGJlY2F1c2Ugc3R5bGUgaXMgYWxyZWFkeSBjb21waWxpbmdgKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBuZXcgU2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgICAgICB0aGlzLmdsLFxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtLmNvbXBpbGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVzOiBzZWxlY3Rpb25fZGVmaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmNvbXBpbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHN0eWxlICR7dGhpcy5uYW1lfSBlcnJvcjpgLCBlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIEFkZCBhIHNoYWRlciBibG9ja1xuICAgIGFkZFNoYWRlckJsb2NrIChrZXksIGJsb2NrLCBzY29wZSA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrcyA9IHRoaXMuc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XSA9IHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XSB8fCBbXTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldLnB1c2goYmxvY2spO1xuXG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXMgPSB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXNba2V5XS5wdXNoKHNjb3BlKTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIGFsbCBzaGFkZXIgYmxvY2tzIGZvciBrZXlcbiAgICByZW1vdmVTaGFkZXJCbG9jayAoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlcGxhY2VTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2hhZGVyQmxvY2soa2V5KTtcbiAgICAgICAgdGhpcy5hZGRTaGFkZXJCbG9jayhrZXksIGJsb2NrLCBzY29wZSk7XG4gICAgfSxcblxuICAgIC8qKiBUT0RPOiBjb3VsZCBwcm9iYWJseSBjb21iaW5lIGFuZCBnZW5lcmFsaXplIHRoaXMgd2l0aCBzaW1pbGFyIG1ldGhvZCBpbiBTaGFkZXJQcm9ncmFtXG4gICAgICogKGxpc3Qgb2YgZGVmaW5lIG9iamVjdHMgdGhhdCBpbmhlcml0IGZyb20gZWFjaCBvdGhlcilcbiAgICAgKi9cbiAgICBidWlsZERlZmluZUxpc3QgKCkge1xuICAgICAgICAvLyBBZGQgYW55IGN1c3RvbSBkZWZpbmVzIHRvIGJ1aWx0LWluIHN0eWxlIGRlZmluZXNcbiAgICAgICAgdmFyIGRlZmluZXMgPSB7fTsgLy8gY3JlYXRlIGEgbmV3IG9iamVjdCB0byBhdm9pZCBtdXRhdGluZyBhIHByb3RvdHlwZSB2YWx1ZSB0aGF0IG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBzdHlsZXNcbiAgICAgICAgaWYgKHRoaXMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkIGluIHRoaXMuZGVmaW5lcykge1xuICAgICAgICAgICAgICAgIGRlZmluZXNbZF0gPSB0aGlzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hhZGVycyAhPSBudWxsICYmIHRoaXMuc2hhZGVycy5kZWZpbmVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoZCBpbiB0aGlzLnNoYWRlcnMuZGVmaW5lcykge1xuICAgICAgICAgICAgICAgIGRlZmluZXNbZF0gPSB0aGlzLnNoYWRlcnMuZGVmaW5lc1tkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lcztcblxuICAgIH0sXG5cbiAgICAvLyBEZXRlcm1pbmVzIGlmICdyYXN0ZXInIHBhcmFtZXRlciBpcyBzZXQgdG8gYSB2YWxpZCB2YWx1ZVxuICAgIGhhc1Jhc3RlcnMgKCkge1xuICAgICAgICByZXR1cm4gKFsnY29sb3InLCAnbm9ybWFsJywgJ2N1c3RvbSddLmluZGV4T2YodGhpcy5yYXN0ZXIpID4gLTEpO1xuICAgIH0sXG5cbiAgICAvLyBTZXR1cCByYXN0ZXIgYWNjZXNzIGluIHNoYWRlcnNcbiAgICBzZXR1cFJhc3RlcnMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgcmFzdGVyIHRleHR1cmVzIGFuZCBjb25maWd1cmUgaG93IGZpcnN0IHJhc3RlciBpcyBhcHBsaWVkXG4gICAgICAgIGlmICh0aGlzLnJhc3RlciA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUkFTVEVSX1RFWFRVUkVfQ09MT1IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucmFzdGVyID09PSAnbm9ybWFsJykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUkFTVEVSX1RFWFRVUkVfTk9STUFMID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGN1c3RvbSByYXN0ZXIgKHNhbXBsZXJzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYnV0IG5vdCBhdXRvbWF0aWNhbGx5IGFwcGxpZWQpXG5cbiAgICAgICAgLy8gQSBnaXZlbiBzdHlsZSBtYXkgYmUgYnVpbHQgd2l0aCBtdWx0aXBsZSBkYXRhIHNvdXJjZXMsIGVhY2ggb2Ygd2hpY2ggbWF5IGF0dGFjaFxuICAgICAgICAvLyBhIHZhcmlhYmxlIG51bWJlciBvZiByYXN0ZXIgc291cmNlcyAoMCB0byBOLCB3aGVyZSBOIGlzIHRoZSBtYXggbnVtYmVyIG9mIHJhc3RlciBzb3VyY2VzXG4gICAgICAgIC8vIGRlZmluZWQgZm9yIHRoZSBzY2VuZSkuIFRoaXMgbWVhbnMgd2UgZG9uJ3Qga25vdyAqd2hpY2gqIG9yICpob3cgbWFueSogcmFzdGVycyB3aWxsIGJlXG4gICAgICAgIC8vIGJvdW5kIG5vdywgYXQgaW5pdGlhbCBjb21waWxlLXRpbWU7IHdlIG9ubHkga25vdyB0aGlzIGF0IGdlb21ldHJ5IGJ1aWxkLXRpbWUuIFRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGNhbiBiaW5kIGFzIG1hbnkgcmFzdGVyIHNvdXJjZXMgYXMgbmVlZGVkLCB3ZSBkZWNsYXJlIG91ciB1bmlmb3JtIGFycmF5cyB0byBob2xkXG4gICAgICAgIC8vIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBzb3VyY2VzLiBBdCByZW5kZXIgdGltZSwgb25seSB0aGUgbmVjZXNzYXJ5IG51bWJlciBvZiByYXN0ZXJzXG4gICAgICAgIC8vIGFyZSBib3VuZCAodGhlIHJlbWFpbmluZyBzbG90cyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgYWNjZXNzZWQpLlxuICAgICAgICBsZXQgbnVtX3Jhc3Rlcl9zb3VyY2VzID1cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc291cmNlcylcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiB0aGlzLnNvdXJjZXNbc10gaW5zdGFuY2VvZiBSYXN0ZXJUaWxlU291cmNlKVxuICAgICAgICAgICAgLmxlbmd0aDtcblxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OVU1fUkFTVEVSX1NPVVJDRVMgPSBgaW50KCR7bnVtX3Jhc3Rlcl9zb3VyY2VzfSlgO1xuICAgICAgICBpZiAobnVtX3Jhc3Rlcl9zb3VyY2VzID4gMCkge1xuICAgICAgICAgICAgLy8gVXNlIG1vZGVsIHBvc2l0aW9uIG9mIHRpbGUncyBjb29yZGluYXRlIHpvb20gZm9yIHJhc3RlciB0aWxlIHRleHR1cmUgVVZzXG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NT0RFTF9QT1NJVElPTl9CQVNFX1pPT01fVkFSWUlORyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFVuaWZvcm1zIGFuZCBtYWNyb3MgZm9yIHJhc3RlciBzYW1wbGVyc1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlU2hhZGVyQmxvY2soJ3Jhc3RlcicsIHNoYWRlclNyY19yYXN0ZXJzLCAnUmFzdGVyJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gTG9hZCByYXN0ZXIgdGlsZSB0ZXh0dXJlcyBhbmQgc2V0IHVuaWZvcm1zXG4gICAgYnVpbGRSYXN0ZXJUZXh0dXJlcyAodGlsZSwgdGlsZV9kYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNSYXN0ZXJzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25maWdzID0ge307IC8vIHRleHR1cmUgY29uZmlncyB0byBwYXNzIHRvIHRleHR1cmUgYnVpbGRlciwga2V5ZWQgYnkgdGV4dHVyZSBuYW1lXG4gICAgICAgIGxldCBpbmRleCA9IHt9OyAgIC8vIGluZGV4IGludG8gcmFzdGVyIHNhbXBsZXIgYXJyYXksIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuXG4gICAgICAgIC8vIFRPRE86IGRhdGEgc291cmNlIGNvdWxkIHJldHJpZXZlIHJhc3RlciB0ZXh0dXJlIFVSTHNcbiAgICAgICAgdGlsZS5yYXN0ZXJzLm1hcChyID0+IHRoaXMuc291cmNlc1tyXSkuZmlsdGVyKHggPT4geCkuZm9yRWFjaCgoc291cmNlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBzb3VyY2UudGlsZVRleHR1cmUodGlsZSk7XG4gICAgICAgICAgICAgICAgY29uZmlnc1tjb25maWcudXJsXSA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICBpbmRleFtjb25maWcudXJsXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWdzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgdGV4dHVyZXMgb24gbWFpbiB0aHJlYWQgYW5kIHJldHVybiB3aGVuIGRvbmVcbiAgICAgICAgLy8gV2Ugd2FudCB0byBibG9jayB0aGUgYnVpbGRpbmcgb2YgYSByYXN0ZXIgdGlsZSBtZXNoIHVudGlsIGl0cyB0ZXh0dXJlIGlzIGxvYWRlZCxcbiAgICAgICAgLy8gdG8gYXZvaWQgZmxpY2tlcmluZyB3aGlsZSBsb2FkaW5nICh0ZXh0dXJlIHdpbGwgcmVuZGVyIGFzIGJsYWNrKVxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycubG9hZFRleHR1cmVzJywgY29uZmlncylcbiAgICAgICAgICAgIC50aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRleHR1cmVzIHx8IHRleHR1cmVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2FybmluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0ZXh0dXJlIHVuaWZvcm1zIChyZXR1cm5lZCBhZnRlciBsb2FkaW5nIGZyb20gbWFpbiB0aHJlYWQpXG4gICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zID0gdGlsZV9kYXRhLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcyA9IHRpbGVfZGF0YS50ZXh0dXJlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGxldCB1X3NhbXBsZXJzID0gdGlsZV9kYXRhLnVuaWZvcm1zWyd1X3Jhc3RlcnMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X3NpemVzID0gdGlsZV9kYXRhLnVuaWZvcm1zWyd1X3Jhc3Rlcl9zaXplcyddID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHVfb2Zmc2V0cyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfb2Zmc2V0cyddID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbdG5hbWUsIHR3aWR0aCwgdGhlaWdodF0gb2YgdGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFt0bmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXN0ZXJfY29vcmRzID0gY29uZmlnc1t0bmFtZV0uY29vcmRzOyAvLyB0aWxlIGNvb3JkcyBvZiByYXN0ZXIgdGlsZVxuXG4gICAgICAgICAgICAgICAgICAgIHVfc2FtcGxlcnNbaV0gPSB0bmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godG5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHVfc2l6ZXNbaV0gPSBbdHdpZHRoLCB0aGVpZ2h0XTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaWxlIGdlb21ldHJ5IG1heSBiZSBhdCBhIGhpZ2hlciB6b29tIHRoYW4gdGhlIHJhc3RlciB0aWxlIHRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGFuIG92ZXJ6b29tZWQgcmFzdGVyIHRpbGUpLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWRqdXN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByYXN0ZXIgdGV4dHVyZSBVVnMgdG8gb2Zmc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBzdGFydGluZyBwb2ludCBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBnZW9tZXRyeSB0aWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5jb29yZHMueiA+IHJhc3Rlcl9jb29yZHMueikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6ID0gdGlsZS5jb29yZHMueiAtIHJhc3Rlcl9jb29yZHMuejsgLy8gIyBvZiBsZXZlbHMgcmFzdGVyIHNvdXJjZSBpcyBvdmVyem9vbWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHoyID0gTWF0aC5wb3coMiwgZHopO1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aWxlLmNvb3Jkcy54ICUgZHoyKSAvIGR6MixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHoyIC0gMSAtICh0aWxlLmNvb3Jkcy55ICUgZHoyKSkgLyBkejIsIC8vIEdMIHRleHR1cmUgY29vcmRzIGFyZSArWSB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyBkejJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1X29mZnNldHNbaV0gPSBbMCwgMCwgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH0sXG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICAvLyBTdHlsZS1zcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgLy8gaWYgKHR5cGVvZiB0aGlzLmFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyAgICAgdGhpcy5hbmltYXRpb24oKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbmltcG9ydCB7UG9seWdvbnN9IGZyb20gJy4vcG9seWdvbnMvcG9seWdvbnMnO1xuaW1wb3J0IHtMaW5lc30gZnJvbSAnLi9saW5lcy9saW5lcyc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi9wb2ludHMvcG9pbnRzJztcbmltcG9ydCB7VGV4dFN0eWxlfSBmcm9tICcuL3RleHQvdGV4dCc7XG5pbXBvcnQge1Jhc3RlclN0eWxlfSBmcm9tICcuL3Jhc3Rlci9yYXN0ZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX2FjY2Vzc29ycyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvYWNjZXNzb3JzLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX2xheWVyT3JkZXIgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL2xheWVyX29yZGVyLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvbkdsb2JhbHMgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9nbG9iYWxzLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvblZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IGNsYXNzIFN0eWxlTWFuYWdlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgICAgIHRoaXMuYmFzZV9zdHlsZXMgPSB7fTtcblxuICAgICAgICAvLyBBZGQgYnVpbHQtaW4gcmVuZGVyaW5nIHN0eWxlc1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoUG9seWdvbnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKExpbmVzKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2ludHMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFRleHRTdHlsZSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoUmFzdGVyU3R5bGUpKTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgYWxsIHN0eWxlc1xuICAgIGluaXQgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdnbG9iYWwnKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jaygnc2V0dXAnKTtcblxuICAgICAgICAvLyBNb2RlbCBhbmQgd29ybGQgcG9zaXRpb24gYWNjZXNzb3JzXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ2dsb2JhbCcsIHNoYWRlclNyY19hY2Nlc3NvcnMpO1xuXG4gICAgICAgIC8vIExheWVyIHJlLW9yZGVyaW5nIGZ1bmN0aW9uXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ2dsb2JhbCcsIHNoYWRlclNyY19sYXllck9yZGVyKTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvbiBnbG9iYWxcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX3NlbGVjdGlvbkdsb2JhbHMpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIHZlcnRleCBzaGFkZXIgc3VwcG9ydFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnc2V0dXAnLCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4KTtcblxuICAgICAgICAvLyBNaW5pbXVtIHZhbHVlIGZvciBmbG9hdCBjb21wYXJpc29uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9FUFNJTE9OID0gMC4wMDAwMTtcblxuICAgICAgICAvLyBNaW5pbXVtIGRlcHRoIGJ1ZmZlciB2YWx1ZSBzZXBhcmF0aW5nIGVhY2ggYG9yZGVyYCB1bml0XG4gICAgICAgIC8vIEFzc3VtZSBtaW4gMTYtYml0IGRlcHRoIGJ1ZmZlciwgaW4gcHJhY3RpY2UgdXNlcyAxNC1iaXRzLCAxIGV4dHJhIGJpdCB0byBoYW5kbGUgdmlydHVhbCBoYWxmLWxheWVyc1xuICAgICAgICAvLyBmb3Igb3V0bGluZXMgKGluc2VydGVkIGluIGJldHdlZW4gbGF5ZXJzKSwgYW5vdGhlciBleHRyYSBiaXQgdG8gcHJldmVudCBwcmVjaXNpb24gbG9zc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9ERUxUQSA9IDEgLyAoMSA8PCAxNCk7XG5cbiAgICAgICAgLy8gSW50ZXJuYWwgdGlsZSBzY2FsZVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9USUxFX1NDQUxFID1cbiAgICAgICAgICAgIGB2ZWMzKCR7R2VvLnRpbGVfc2NhbGV9LiwgJHtHZW8udGlsZV9zY2FsZX0uLCB1X21ldGVyc19wZXJfcGl4ZWwgKiAke0dlby50aWxlX3NpemV9LilgO1xuXG4gICAgICAgIC8vIEluY3JlYXNlcyBwcmVjaXNpb24gZm9yIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzLlRBTkdSQU1fSEVJR0hUX1NDQUxFID0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGFsbCBzdHlsZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuICAgIGRlc3Ryb3kgKGdsKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3R5bGVzKS5mb3JFYWNoKChfbmFtZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbX25hbWVdO1xuICAgICAgICAgICAgaWYgKHN0eWxlLmdsID09PSBnbCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGVNYW5hZ2VyLmRlc3Ryb3k6IGRlc3Ryb3lpbmcgcmVuZGVyIHN0eWxlICR7c3R5bGUubmFtZX1gKTtcblxuICAgICAgICAgICAgICAgIGlmICghc3R5bGUuaXNCdWlsdEluKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIGZvciAobGV0IHMgb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgIHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNvdXJjZXMucHVzaChzdHlsZSk7XG5cbiAgICAgICAgLy8gRmxhZ3MgLSBPUidkLCB0cnVlIGlmIGFueSBzdHlsZSBoYXMgaXQgc2V0XG4gICAgICAgIHN0eWxlLmFuaW1hdGVkID0gc291cmNlcy5zb21lKHggPT4geCAmJiB4LmFuaW1hdGVkKTtcbiAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc291cmNlcy5zb21lKHggPT4geCAmJiB4LnRleGNvb3Jkcyk7XG5cbiAgICAgICAgLy8gT3ZlcndyaXRlcyAtIGxhc3QgZGVmaW5pdGlvbiB3aW5zXG4gICAgICAgIHN0eWxlLmJhc2UgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmFzZSkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIHN0eWxlLmxpZ2h0aW5nID0gc291cmNlcy5tYXAoeCA9PiB4LmxpZ2h0aW5nKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS50ZXh0dXJlID0gc291cmNlcy5tYXAoeCA9PiB4LnRleHR1cmUpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5yYXN0ZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHgucmFzdGVyKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoID0gc291cmNlcy5tYXAoeCA9PiB4LmRhc2gpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG4gICAgICAgIHN0eWxlLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoX2JhY2tncm91bmRfY29sb3IpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG4gICAgICAgIGlmIChzb3VyY2VzLnNvbWUoeCA9PiB4Lmhhc093blByb3BlcnR5KCdibGVuZCcpICYmIHguYmxlbmQpKSB7XG4gICAgICAgICAgICAvLyBvbmx5IG1peCBibGVuZCBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGxldCBiYXNlIHN0eWxlIGNob29zZSBibGVuZGluZyBtb2RlXG4gICAgICAgICAgICAvLyBoYXNPd25Qcm9wZXJ0eSBjaGVjayBnaXZlcyBwcmVmZXJlbmNlIHRvIGJhc2Ugc3R5bGUgcHJvdG90eXBlXG4gICAgICAgICAgICBzdHlsZS5ibGVuZCA9IHNvdXJjZXMubWFwKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5ibGVuZF9vcmRlciA9IHNvdXJjZXMubWFwKHggPT4geC5ibGVuZF9vcmRlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcblxuICAgICAgICAvLyBNZXJnZXMgLSBwcm9wZXJ0eS1zcGVjaWZpYyBydWxlcyBmb3IgbWVyZ2luZyB2YWx1ZXNcbiAgICAgICAgc3R5bGUuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5kZWZpbmVzKS5maWx0ZXIoeCA9PiB4KSk7IC8vIGludGVybmFsIGRlZmluZXMgKG5vdCB1c2VyLWRlZmluZWQpXG4gICAgICAgIHN0eWxlLm1hdGVyaWFsID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uc291cmNlcy5tYXAoeCA9PiB4Lm1hdGVyaWFsKS5maWx0ZXIoeCA9PiB4KSk7XG5cbiAgICAgICAgLy8gTWl4IHNoYWRlciBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMubWl4U2hhZGVycyhzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIC8vIE1peCB0aGUgcHJvcGVydGVzIGluIHRoZSBcInNoYWRlcnNcIiBibG9ja1xuICAgIG1peFNoYWRlcnMgKHN0eWxlLCBzdHlsZXMsIHNvdXJjZXMpIHtcbiAgICAgICAgbGV0IHNoYWRlcnMgPSB7fTsgLy8gbmV3bHkgbWl4ZWQgc2hhZGVycyBwcm9wZXJ0aWVzXG4gICAgICAgIGxldCBzaGFkZXJfbWVyZ2VzID0gc291cmNlcy5tYXAoeCA9PiB4LnNoYWRlcnMpLmZpbHRlcih4ID0+IHgpOyAvLyBqdXN0IHRoZSBzb3VyY2Ugc3R5bGVzIHdpdGggc2hhZGVyIHByb3BlcnRpZXNcblxuICAgICAgICAvLyBEZWZpbmVzXG4gICAgICAgIHNoYWRlcnMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNoYWRlcl9tZXJnZXMubWFwKHggPT4geC5kZWZpbmVzKS5maWx0ZXIoeCA9PiB4KSk7XG5cbiAgICAgICAgLy8gVW5pZm9ybXNcbiAgICAgICAgc2hhZGVycy51bmlmb3JtcyA9IHt9OyAgLy8gdW5pZm9ybXMgZm9yIHRoaXMgc3R5bGUsIGJvdGggZXhwbGljaXRseSBkZWZpbmVkLCBhbmQgbWl4ZWQgZnJvbSBvdGhlciBzdHlsZXNcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybXMgPSAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB8fCB7fTsgLy8gdW5pZm9ybXMgZXhwbGljaXRseSBkZWZpbmVkIGJ5ICp0aGlzKiBzdHlsZVxuICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3BlcyA9IHt9OyAvLyB0cmFja3Mgd2hpY2ggc3R5bGUgZWFjaCB1bmlmb3JtIG9yaWdpbmF0ZWQgZnJvbSAodGhpcyBvbmUsIG9yIGFuY2VzdG9yKVxuXG4gICAgICAgIC8vIE1peCBpbiB1bmlmb3JtcyBmcm9tIGFuY2VzdG9ycywgcHJvdmlkaW5nIG1lYW5zIHRvIGFjY2Vzc1xuICAgICAgICBzb3VyY2VzXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geC5zaGFkZXJzICYmIHguc2hhZGVycy51bmlmb3JtcylcbiAgICAgICAgICAgIC5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHUgaW4geC5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdID0geC5uYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmluZSBnZXR0ZXIgYW5kIHNldHRlciBmb3IgdGhpcyB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRlciByZXR1cm5zIHZhbHVlIGZvciB0aGlzIHN0eWxlIGlmIHByZXNlbnQsIG90aGVyd2lzZSBhc2tzIGFwcHJvcHJpYXRlIGFuY2VzdG9yIGZvciBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXR0ZXIgc2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgc3R5bGUgKHdoZXRoZXIgcHJldmlvdXNseSBwcmVzZW50IGluIHRoaXMgc3R5bGUgb3Igbm90KVxuICAgICAgICAgICAgICAgICAgICAvLyBNaW1pY3MgSlMgcHJvdG90eXBlL2hhc093blByb3BlcnR5IGJlaGF2aW9yLCBidXQgd2l0aCBtdWx0aXBsZSBhbmNlc3RvcnMgKHZpYSBtaXhpbnMpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaGFkZXJzLnVuaWZvcm1zLCB1LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZm9ybSBpcyBleHBsaWNpdGx5IGRlZmluZWQgb24gdGhpcyBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFkZXJzLl91bmlmb3Jtc1t1XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaGFkZXJzLl91bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZm9ybSB3YXMgbWl4ZWQgZnJvbSBhbm90aGVyIHN0eWxlLCBmb3J3YXJkIHJlcXVlc3QgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSBjaGVjayBpcyBuZWVkZWQgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gaWYgYSBwcmV2aW91c2x5IGRlZmluZWQgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXMgIT09IHNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlc1tzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XV0uc2hhZGVycy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zW3VdID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0ZW5zaW9uczogYnVpbGQgYSBsaXN0IG9mIHVuaXF1ZSBleHRlbnNpb25zXG4gICAgICAgIHNoYWRlcnMuZXh0ZW5zaW9ucyA9IE9iamVjdC5rZXlzKHNoYWRlcl9tZXJnZXNcbiAgICAgICAgICAgIC5tYXAoeCA9PiB4LmV4dGVuc2lvbnMpXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1ciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldltjdXJdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYXJyYXkgb2YgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXIuZm9yRWFjaCh4ID0+IHByZXZbeF0gPSB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9LCB7fSkgfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTaGFkZXIgYmxvY2tzXG4gICAgICAgIC8vIE1hcmsgYWxsIHNoYWRlciBibG9ja3MgZm9yIHRoZSB0YXJnZXQgc3R5bGUgYXMgb3JpZ2luYXRpbmcgd2l0aCBpdHMgb3duIG5hbWVcbiAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy5ibG9ja3MpIHtcbiAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXMgfHwge307XG4gICAgICAgICAgICBmb3IgKGxldCBbaywgYmxvY2tdIG9mIFV0aWxzLmVudHJpZXMoc3R5bGUuc2hhZGVycy5ibG9ja3MpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gPSBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3Blc1trXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShibG9jaykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10ucHVzaCguLi5ibG9jay5tYXAoKCkgPT4gc3R5bGUubmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10ucHVzaChzdHlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNZXJnZSBzaGFkZXIgYmxvY2tzLCBrZWVwaW5nIHRyYWNrIG9mIHdoaWNoIHN0eWxlIGVhY2ggYmxvY2sgb3JpZ2luYXRlZCBmcm9tXG4gICAgICAgIGxldCBtaXhlZCA9IHt9OyAvLyBhbGwgc2NvcGVzIG1peGVkIHNvIGZhclxuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc2hhZGVyX21lcmdlcykge1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IFt0LCBibG9ja10gb2YgVXRpbHMuZW50cmllcyhzb3VyY2UuYmxvY2tzKSkge1xuICAgICAgICAgICAgICAgIGxldCBibG9ja19zY29wZSA9IHNvdXJjZS5ibG9ja19zY29wZXNbdF07XG5cbiAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2Nrc1t0XSA9IHNoYWRlcnMuYmxvY2tzW3RdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tfc2NvcGVzW3RdID0gc2hhZGVycy5ibG9ja19zY29wZXNbdF0gfHwgW107XG5cbiAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZGl6ZSBvbiBhcnJheXMgKGJsb2NrIGNhbiBiZSBzaW5nbGUgb3IgbXVsdGktdmFsdWUpXG4gICAgICAgICAgICAgICAgYmxvY2sgPSBBcnJheS5pc0FycmF5KGJsb2NrKSA/IGJsb2NrIDogW2Jsb2NrXTtcbiAgICAgICAgICAgICAgICBibG9ja19zY29wZSA9IEFycmF5LmlzQXJyYXkoYmxvY2tfc2NvcGUpID8gYmxvY2tfc2NvcGUgOiBbYmxvY2tfc2NvcGVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYj0wOyBiIDwgYmxvY2subGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBibG9ja3Mgd2UndmUgYWxyZWFkeSBtaXhlZCBpbiBmcm9tIHRoZSBzYW1lIHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGVhdGluZyBzY29wZSBpbmRpY2F0ZXMgYSBkaWFtb25kIHBhdHRlcm4gd2hlcmUgYSBzdHlsZSBpcyBiZWluZyBtaXhlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZWRbYmxvY2tfc2NvcGVbYl1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtaXhlZF9zb3VyY2VbYmxvY2tfc2NvcGVbYl1dID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2Nrc1t0XS5wdXNoKGJsb2NrW2JdKTtcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0ucHVzaChibG9ja19zY29wZVtiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgc3R5bGVzIG1peGVkIGluIGZyb20gdGhpcyBzb3VyY2UgLSB0aGV5IGNvdWxkIGJlIG11bHRpLWxldmVsIGFuY2VzdG9ycyxcbiAgICAgICAgICAgIC8vIGJleW9uZCB0aGUgZmlyc3QtbGV2ZWwgXCJwYXJlbnRzXCIgZGVmaW5lZCBpbiB0aGlzIHN0eWxlJ3MgYG1peGAgbGlzdFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtaXhlZCwgbWl4ZWRfc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUubWl4ZWQsIG1peGVkKTsgLy8gYWRkIGFsbCBuZXdseSBtaXhlZCBzdHlsZXNcblxuICAgICAgICBzdHlsZS5zaGFkZXJzID0gc2hhZGVyczsgLy8gYXNzaWduIGJhY2sgdG8gc3R5bGVcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyBzdHlsZVxuICAgIC8vIG5hbWU6IG5hbWUgb2YgbmV3IHN0eWxlXG4gICAgLy8gY29uZmlnOiBwcm9wZXJ0aWVzIG9mIG5ldyBzdHlsZVxuICAgIC8vIHN0eWxlczogd29ya2luZyBzZXQgb2Ygc3R5bGVzIGJlaW5nIGJ1aWx0ICh1c2VkIGZvciBtaXhpbmcgaW4gZXhpc3Rpbmcgc3R5bGVzKVxuICAgIGNyZWF0ZSAobmFtZSwgY29uZmlnLCBzdHlsZXMgPSB7fSkge1xuICAgICAgICBsZXQgc3R5bGUgPSBtZXJnZU9iamVjdHMoe30sIGNvbmZpZyk7IC8vIGRlZXAgY29weVxuICAgICAgICBzdHlsZS5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBTdHlsZSBtaXhpbnNcbiAgICAgICAgc3R5bGUgPSB0aGlzLm1peChzdHlsZSwgc3R5bGVzKTtcblxuICAgICAgICAvLyBIYXMgYmFzZSBzdHlsZT9cbiAgICAgICAgLy8gT25seSByZW5kZXJhYmxlIChpbnN0YW50aWF0ZWQpIHN0eWxlcyBzaG91bGQgYmUgaW5jbHVkZWQgZm9yIHJ1bi10aW1lIHVzZVxuICAgICAgICAvLyBPdGhlcnMgYXJlIGludGVybWVkaWFyeS9hYnN0cmFjdCwgdXNlZCBkdXJpbmcgc3R5bGUgY29tcG9zaXRpb24gYnV0IG5vdCBleGVjdXRpb25cbiAgICAgICAgaWYgKHN0eWxlLmJhc2UgJiYgdGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbbmFtZV0gPSBzdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLmJhc2VdKSwgc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgc3R5bGVzXG4gICAgYnVpbGQgKHN0eWxlcykge1xuICAgICAgICAvLyBTb3J0IHN0eWxlcyBieSBkZXBlbmRlbmN5LCB0aGVuIGJ1aWxkIHRoZW1cbiAgICAgICAgbGV0IHN0eWxlX2RlcHMgPSBPYmplY3Qua2V5cyhzdHlsZXMpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gdGhpcy5pbmhlcml0YW5jZURlcHRoKGEsIHN0eWxlcykgLSB0aGlzLmluaGVyaXRhbmNlRGVwdGgoYiwgc3R5bGVzKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE9ubHkga2VlcCBidWlsdC1pbiBiYXNlIHN0eWxlc1xuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2Vfc3R5bGVzW3NuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc1tzbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc1tzbmFtZV0ucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdFxuICAgICAgICBsZXQgd3MgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgc25hbWUgb2Ygc3R5bGVfZGVwcykge1xuICAgICAgICAgICAgd3Nbc25hbWVdID0gdGhpcy5jcmVhdGUoc25hbWUsIHN0eWxlc1tzbmFtZV0sIHdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlcztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBzdHlsZXNcbiAgICBpbml0U3R5bGVzIChzY2VuZSA9IHt9KSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgYWxsXG4gICAgICAgIGZvciAobGV0IHNuYW1lIGluIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc1tzbmFtZV0uaW5pdChzY2VuZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhIHN0eWxlIGtleSBpbiBhIHNldCBvZiBzdHlsZXMgdG8gYWRkLCBjb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmhlcml0YW5jZSBjaGFpblxuICAgIGluaGVyaXRhbmNlRGVwdGggKGtleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCBwYXJlbnRzID0gMDtcblxuICAgICAgICB3aGlsZSh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghc3R5bGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgc2NlbmUgZGVmIGVycm9yLCB0cnlpbmcgdG8gZXh0ZW5kIGEgc3R5bGUgdGhhdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERlcGVuZGVuY3kgY2hhaW4gZW5kcyB3aGVuIHRoaXMgc3R5bGUgaXNuJ3QgbWl4aW5nIGluIGFueSBvdGhlcnNcbiAgICAgICAgICAgIGlmICghc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIG5leHQgcGFyZW50IHN0eWxlXG4gICAgICAgICAgICBwYXJlbnRzKys7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLm1peCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBtaXhpbnMsIGZpbmQgdGhlIGRlZXBlc3Qgb25lXG4gICAgICAgICAgICAgICAgcGFyZW50cyArPSBNYXRoLm1heCguLi5zdHlsZS5taXgubWFwKHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBUcnlpbmcgdG8gbWl4IGludG8gaXRzZWxmIVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmhlcml0YW5jZURlcHRoKHMsIHN0eWxlcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBzdHlsZS5taXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgc2luZ2xlIG1peGluLCBjb250aW51ZSBsb29wIHVwIHRoZSB0cmVlXG4gICAgICAgICAgICAgICAga2V5ID0gc3R5bGUubWl4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH1cblxuICAgIC8vIENvbXBpbGUgYWxsIHN0eWxlc1xuICAgIGNvbXBpbGUgKGtleXMsIHNjZW5lKSB7XG4gICAgICAgIGtleXMgPSBrZXlzIHx8IE9iamVjdC5rZXlzKHRoaXMuc3R5bGVzKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuc3R5bGVzW2tleV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmNvbXBpbGUoKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFN0eWxlTWFuYWdlci5jb21waWxlKCk6IGNvbXBpbGVkIHN0eWxlICR7a2V5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYFN0eWxlTWFuYWdlci5jb21waWxlKCk6IGVycm9yIGNvbXBpbGluZyBzdHlsZSAke2tleX06YCwgZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgc2NlbmUudHJpZ2dlcignd2FybmluZycsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0eWxlcycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBjb21waWxpbmcgc3R5bGUgJHtrZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcl9lcnJvcnM6IHN0eWxlLnByb2dyYW0gJiYgc3R5bGUucHJvZ3JhbS5zaGFkZXJfZXJyb3JzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ2RlYnVnJywgYFN0eWxlTWFuYWdlci5jb21waWxlKCk6IGNvbXBpbGVkIGFsbCBzdHlsZXNgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYWxsIHN0eWxlcyB3aXRoIG1lc2ggZGF0YSBmb3IgYSBnaXZlbiB0aWxlXG4gICAgc3RhdGljIHN0eWxlc0ZvclRpbGUgKHRpbGVfa2V5LCBzdHlsZXMpIHtcbiAgICAgICAgbGV0IHRpbGVfc3R5bGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICBpZiAoc3R5bGVzW3NdLmhhc0RhdGFGb3JUaWxlKHRpbGVfa2V5KSkge1xuICAgICAgICAgICAgICAgIHRpbGVfc3R5bGVzLnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVfc3R5bGVzO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IHBhcnNlQ1NTQ29sb3IgZnJvbSAnY3NzY29sb3JwYXJzZXInO1xuXG5leHBvcnQgdmFyIFN0eWxlUGFyc2VyID0ge307XG5cbi8vIFdyYXBzIHN0eWxlIGZ1bmN0aW9ucyBhbmQgcHJvdmlkZXMgYSBzY29wZSBvZiBjb21tb25seSBhY2Nlc3NpYmxlIGRhdGE6XG4vLyAtIGZlYXR1cmU6IHRoZSAncHJvcGVydGllcycgb2YgdGhlIGZlYXR1cmUsIGUuZy4gYWNjZXNzZWQgYXMgJ2ZlYXR1cmUubmFtZSdcbi8vIC0gZ2xvYmFsOiB1c2VyLWRlZmluZWQgcHJvcGVydGllcyBvbiB0aGUgYGdsb2JhbGAgb2JqZWN0IGluIHRoZSBzY2VuZSBmaWxlXG4vLyAtICR6b29tOiB0aGUgY3VycmVudCBtYXAgem9vbSBsZXZlbFxuLy8gLSAkZ2VvbWV0cnk6IHRoZSB0eXBlIG9mIGdlb21ldHJ5LCAncG9pbnQnLCAnbGluZScsIG9yICdwb2x5Z29uJ1xuLy8gLSAkbWV0ZXJzX3Blcl9waXhlbDogY29udmVyc2lvbiBmb3IgbWV0ZXJzL3BpeGVscyBhdCBjdXJyZW50IG1hcCB6b29tXG5TdHlsZVBhcnNlci53cmFwRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICAgIHZhciBmID0gYFxuICAgICAgICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzO1xuICAgICAgICB2YXIgZ2xvYmFsID0gY29udGV4dC5nbG9iYWw7XG4gICAgICAgIHZhciAkem9vbSA9IGNvbnRleHQuem9vbTtcbiAgICAgICAgdmFyICRsYXllciA9IGNvbnRleHQubGF5ZXI7XG4gICAgICAgIHZhciAkZ2VvbWV0cnkgPSBjb250ZXh0Lmdlb21ldHJ5O1xuICAgICAgICB2YXIgJG1ldGVyc19wZXJfcGl4ZWwgPSBjb250ZXh0Lm1ldGVyc19wZXJfcGl4ZWw7XG5cbiAgICAgICAgdmFyIHZhbCA9IChmdW5jdGlvbigpeyAke2Z1bmN9IH0oKSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkpIHtcbiAgICAgICAgICAgIHZhbCA9IG51bGw7IC8vIGNvbnZlcnQgTmFOcyB0byBudWxsc1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICBgO1xuICAgIHJldHVybiBmO1xufTtcblxuXG4vLyBTdHlsZSBwYXJzaW5nXG5cblN0eWxlUGFyc2VyLnplcm9QYWlyID0gT2JqZWN0LmZyZWV6ZShbMCwgMF0pOyAvLyBzaW5nbGUgYWxsb2NhdGlvbiBmb3IgemVybyB2YWx1ZXMgdGhhdCB3b24ndCBiZSBtb2RpZmllZFxuXG4vLyBTdHlsZSBkZWZhdWx0c1xuU3R5bGVQYXJzZXIuZGVmYXVsdHMgPSB7XG4gICAgY29sb3I6IFsxLCAxLCAxLCAxXSxcbiAgICB3aWR0aDogMSxcbiAgICBzaXplOiAxLFxuICAgIGV4dHJ1ZGU6IGZhbHNlLFxuICAgIGhlaWdodDogMjAsXG4gICAgbWluX2hlaWdodDogMCxcbiAgICBvcmRlcjogMCxcbiAgICB6OiAwLFxuICAgIG1hdGVyaWFsOiB7XG4gICAgICAgIGFtYmllbnQ6IDEsXG4gICAgICAgIGRpZmZ1c2U6IDFcbiAgICB9XG59O1xuXG4vLyBTdHlsZSBtYWNyb3NcblN0eWxlUGFyc2VyLm1hY3JvcyA9IHtcbiAgICAvLyBwc2V1ZG8tcmFuZG9tIGNvbG9yIGJ5IGdlb21ldHJ5IGlkXG4gICAgJ1N0eWxlLmNvbG9yLnBzZXVkb1JhbmRvbUNvbG9yJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwICUgMSksICAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMCAlIDEpLCAgIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMDAwMDAgJSAxKSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAxXG4gICAgICAgIF07XG4gICAgfSxcblxuICAgIC8vIHJhbmRvbSBjb2xvclxuICAgICdTdHlsZS5jb2xvci5yYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gWzAuNyAqIE1hdGgucmFuZG9tKCksIDAuNyAqIE1hdGgucmFuZG9tKCksIDAuNyAqIE1hdGgucmFuZG9tKCksIDFdO1xuICAgIH1cbn07XG5cbi8vIEEgY29udGV4dCBvYmplY3QgdGhhdCBpcyBwYXNzZWQgdG8gc3R5bGUgcGFyc2luZyBmdW5jdGlvbnMgdG8gcHJvdmlkZSBhIHNjb3BlIG9mIGNvbW1vbmx5IHVzZWQgdmFsdWVzXG5TdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0ID0gZnVuY3Rpb24gKGZlYXR1cmUsIHRpbGUsIGdsb2JhbCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZlYXR1cmUsXG4gICAgICAgIHRpbGUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgem9vbTogdGlsZS5zdHlsZV96b29tLFxuICAgICAgICBnZW9tZXRyeTogR2VvLmdlb21ldHJ5VHlwZShmZWF0dXJlLmdlb21ldHJ5LnR5cGUpLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy50ZXh0X2J1ZmZlciA9IDg7IC8vIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucHhfc2l6ZSA9IHB4X3NpemU7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY2FjaGVkIHNpemUsIG9yIGNvbXB1dGUgdmlhIGNhbnZhc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwgIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvc1t0ZXh0XS50ZXh0X3NldHRpbmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0U2l6ZSh0ZXh0LCB0ZXh0X3NldHRpbmdzLnRyYW5zZm9ybSwgdGV4dF9zZXR0aW5ncy50ZXh0X3dyYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMuaGl0cysrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIHRleHQgc2l6ZXMgYmFjayB0byB3b3JrZXIgKGtlZXAgY29tcHV0ZWQgdGV4dCBsaW5lIGluZm9cbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbWFpbiB0aHJlYWQsIGZvciBmdXR1cmUgcmVuZGVyaW5nKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm9zW3RleHRdLnNpemUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdLnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGV4dCBiYXNlZCBvbiBjdXJyZW50IGZvbnQgc3R5bGVcbiAgICAvLyBJbmNsdWRlcyB3b3JkIHdyYXBwaW5nLCByZXR1cm5zIHNpemUgaW5mbyBmb3Igd2hvbGUgdGV4dCBibG9jayBhbmQgaW5kaXZpZHVhbCBsaW5lc1xuICAgIHRleHRTaXplICh0ZXh0LCB0cmFuc2Zvcm0sIHRleHRfd3JhcCkge1xuICAgICAgICBsZXQgc3RyID0gdGhpcy5hcHBseVRleHRUcmFuc2Zvcm0odGV4dCwgdHJhbnNmb3JtKTtcbiAgICAgICAgbGV0IGN0eCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IHRoaXMudGV4dF9idWZmZXIgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbzsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBXb3JkIHdyYXBwaW5nXG4gICAgICAgIC8vIExpbmUgYnJlYWtzIGNhbiBiZSBjYXVzZWQgYnk6XG4gICAgICAgIC8vICAtIGltcGxpY2l0IGxpbmUgYnJlYWsgd2hlbiBhIG1heGltdW0gY2hhcmFjdGVyIHRocmVzaG9sZCBpcyBleGNlZWRlZCBwZXIgbGluZSAodGV4dF93cmFwKVxuICAgICAgICAvLyAgLSBleHBsaWNpdCBsaW5lIGJyZWFrIGluIHRoZSBsYWJlbCB0ZXh0IChcXG4pXG4gICAgICAgIGxldCB3b3JkcztcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0X3dyYXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3b3JkcyA9IHN0ci5zcGxpdCgnICcpOyAvLyBzcGxpdCB3b3JkcyBvbiBzcGFjZXNcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdvcmRzID0gW3N0cl07IC8vIG5vIG1heCBsaW5lIHdvcmQgd3JhcHBpbmcgKGJ1dCBuZXcgbGluZXMgd2lsbCBzdGlsbCBiZSBpbiBlZmZlY3QpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld19saW5lX3RlbXBsYXRlID0geyB3aWR0aDogMCwgY2hhcnM6IDAsIHRleHQ6ICcnIH07XG4gICAgICAgIGxldCBsaW5lID0gT2JqZWN0LmFzc2lnbih7fSwgbmV3X2xpbmVfdGVtcGxhdGUpOyAvLyBjdXJyZW50IGxpbmVcbiAgICAgICAgbGV0IGxpbmVzID0gW107IC8vIGNvbXBsZXRlZCBsaW5lc1xuICAgICAgICBsZXQgbWF4X3dpZHRoID0gMDsgLy8gbWF4IHdpZHRoIHRvIGZpdCBhbGwgbGluZXNcblxuICAgICAgICAvLyBhZGQgY3VycmVudCBsaW5lIGJ1ZmZlciB0byBjb21wbGV0ZWQgbGluZXMsIG9wdGlvbmFsbHkgc3RhcnQgbmV3IGxpbmVcbiAgICAgICAgZnVuY3Rpb24gYWRkTGluZSAobmV3X2xpbmUpIHtcbiAgICAgICAgICAgIGxpbmUudGV4dCA9IGxpbmUudGV4dC50cmltKCk7XG4gICAgICAgICAgICBpZiAobGluZS50ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lLndpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxpbmUudGV4dCkud2lkdGg7XG4gICAgICAgICAgICAgICAgbWF4X3dpZHRoID0gTWF0aC5tYXgobWF4X3dpZHRoLCBNYXRoLmNlaWwobGluZS53aWR0aCkpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3X2xpbmUpIHtcbiAgICAgICAgICAgICAgICBsaW5lID0gT2JqZWN0LmFzc2lnbih7fSwgbmV3X2xpbmVfdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgaXRlcmF0ZSBvbiBzcGFjZS1icmVhayBncm91cHMgKHdpbGwgYmUgb25lIGlmIG1heCBsaW5lIGxlbmd0aCBvZmYpLCB0aGVuIGl0ZXJhdGUgb24gbGluZS1icmVhayBncm91cHNcbiAgICAgICAgZm9yIChsZXQgdz0wOyB3IDwgd29yZHMubGVuZ3RoOyB3KyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1t3XS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgYWRkaW5nIGN1cnJlbnQgd29yZCB3b3VsZCBvdmVyZmxvdywgYWRkIGEgbmV3IGxpbmUgaW5zdGVhZFxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJzICsgd29yZC5sZW5ndGggPiB0ZXh0X3dyYXAgJiYgbGluZS5jaGFycyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTGluZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhZGQgY3VycmVudCB3b3JkIChwbHVzIHNwYWNlKVxuICAgICAgICAgICAgICAgIGxpbmUuY2hhcnMgKz0gd29yZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGxpbmUudGV4dCArPSB3b3JkICsgJyAnO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgbGluZSBicmVha3MgcHJlc2VudCwgYWRkIG5ldyBsaW5lICh1bmxlc3Mgb24gbGFzdCBsaW5lKVxuICAgICAgICAgICAgICAgIGlmIChicmVha3MubGVuZ3RoID4gMSAmJiBuIDwgYnJlYWtzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTGluZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRkTGluZShmYWxzZSk7XG5cbiAgICAgICAgLy8gRmluYWwgZGltZW5zaW9ucyBvZiB0ZXh0XG4gICAgICAgIGxldCBoZWlnaHQgPSBsaW5lcy5sZW5ndGggKiBsaW5lX2hlaWdodDtcblxuICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBbXG4gICAgICAgICAgICBtYXhfd2lkdGggLyBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8sXG4gICAgICAgICAgICBoZWlnaHQgLyBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgbWF4X3dpZHRoICsgYnVmZmVyICogMixcbiAgICAgICAgICAgIGhlaWdodCArIGJ1ZmZlciAqIDJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgbG9naWNhbF9zaXplID0gdGV4dHVyZV9zaXplLm1hcCh2ID0+IHYgLyBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuXG4gICAgICAgIC8vIFJldHVybnMgbGluZXMgKHcvcGVyLWxpbmUgaW5mbyBmb3IgZHJhd2luZykgYW5kIHRleHQncyBvdmVyYWxsIGJvdW5kaW5nIGJveCArIGNhbnZhcyBzaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHNpemU6IHsgY29sbGlzaW9uX3NpemUsIHRleHR1cmVfc2l6ZSwgbG9naWNhbF9zaXplLCBsaW5lX2hlaWdodCB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRHJhdyBvbmUgb3IgbW9yZSBsaW5lcyBvZiB0ZXh0IGF0IHNwZWNpZmllZCBsb2NhdGlvbiwgYWRqdXN0aW5nIGZvciBidWZmZXIgYW5kIGJhc2VsaW5lXG4gICAgZHJhd1RleHQgKGxpbmVzLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHRyYW5zZm9ybSwgYWxpZ24gfSkge1xuICAgICAgICBhbGlnbiA9IGFsaWduIHx8ICdjZW50ZXInO1xuXG4gICAgICAgIGZvciAobGV0IGxpbmVfbnVtPTA7IGxpbmVfbnVtIDwgbGluZXMubGVuZ3RoOyBsaW5lX251bSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xpbmVfbnVtXTtcbiAgICAgICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybShsaW5lLnRleHQsIHRyYW5zZm9ybSk7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gdGhpcy50ZXh0X2J1ZmZlciAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIFRleHQgYWxpZ25tZW50XG4gICAgICAgICAgICBsZXQgdHg7XG4gICAgICAgICAgICBpZiAoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHR4ID0geCArIGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXS8yIC0gbGluZS53aWR0aC8yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0gLSBsaW5lLndpZHRoIC0gYnVmZmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgQ2FudmFzIFRleHRNZXRyaWNzIChub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIHlldCksXG4gICAgICAgICAgICAvLyAwLjc1IGJ1ZmZlciBwcm9kdWNlcyBhIGJldHRlciBhcHByb3hpbWF0ZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dFxuICAgICAgICAgICAgbGV0IHR5ID0geSArIGJ1ZmZlciAqIDAuNzUgKyAobGluZV9udW0gKyAxKSAqIGxpbmVfaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAoc3Ryb2tlICYmIHN0cm9rZV93aWR0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFRleHQoc3RyLCB0eCwgdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGRwciAqIHRoaXMudGV4dF9idWZmZXI7XG4gICAgICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBzaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgYnVmZmVyLCB5ICsgYnVmZmVyLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVswXSwgZHByICogY29sbGlzaW9uX3NpemVbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3MuZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICAvLyBzdHJva2UgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBzbyB0aGUgb3V0ZXIgYm9yZGVyIGlzIHRoZSBlZGdlIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgbGluZVdpZHRoLCB5ICsgbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMF0gLSAyICogbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMV0gLSAyICogbGluZVdpZHRoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJhc3Rlcml6ZSAodGV4dHMsIHRleHR1cmVfc2l6ZSkge1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBpbmZvLnRleHRfc2V0dGluZ3M7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVzID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5saW5lczsgLy8gZ2V0IHByZXZpb3VzbHkgY29tcHV0ZWQgbGluZXMgb2YgdGV4dFxuXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBlYWNoIGFsaWdubWVudCBuZWVkcyB0byBiZSByZW5kZXJlZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0KGxpbmVzLCBpbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLCBpbmZvLnNpemUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogdGV4dF9zZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Vfd2lkdGg6IHRleHRfc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0ZXh0X3NldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnblxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpbmZvLmFsaWduW2FsaWduXS50ZXhjb29yZHMgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGxhY2UgdGV4dCBsYWJlbHMgd2l0aGluIGFuIGF0bGFzIG9mIHRoZSBnaXZlbiBtYXggc2l6ZVxuICAgIHNldFRleHR1cmVUZXh0UG9zaXRpb25zICh0ZXh0cywgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAvLyBGaW5kIHdpZGVzdCBsYWJlbFxuICAgICAgICBsZXQgd2lkZXN0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm9zW3RleHRdLnNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gd2lkZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGVzdCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGF5b3V0IGxhYmVscywgc3RhY2tlZCBpbiBjb2x1bW5zXG4gICAgICAgIGxldCBjeCA9IDAsIGN5ID0gMDsgLy8gY3VycmVudCB4L3kgcG9zaXRpb24gaW4gYXRsYXNcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7ICAgICAvLyBvdmVyYWxsIGF0bGFzIGhlaWdodFxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVkIHNpemUgaXMgc2FtZSBmb3IgYWxsIGFsaWdubWVudHNcbiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZTtcblxuICAgICAgICAgICAgICAgIC8vIGJ1dCBlYWNoIGFsaWdubWVudCBuZWVkcyB0byBiZSByZW5kZXJlZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24gPSBbY3gsIGN5XTsgLy8gYWRkIGxhYmVsIHRvIGN1cnJlbnQgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gd2lkZXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2N4ICsgd2lkZXN0LCBoZWlnaHRdOyAvLyBvdmVyYWxsIGF0bGFzIHNpemVcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYmVmb3JlIHJhc3Rlcml6YXRpb25cbiAgICBhcHBseVRleHRUcmFuc2Zvcm0gKHRleHQsIHRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSAnY2FwaXRhbGl6ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9udCBDU1Mtc3R5bGUgc2l6ZSAoJzEycHgnLCAnMTRwdCcsICcxLjVlbScsIGV0Yy4pIHRvIHBpeGVsIHNpemUgKGFkanVzdGVkIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pXG4gICAgLy8gRGVmYXVsdHMgdW5pdHMgdG8gcGl4ZWxzIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBzdGF0aWMgZm9udFBpeGVsU2l6ZSAoc2l6ZSkge1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSA9ICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpID8gc2l6ZSA6IFN0cmluZyhzaXplKTsgLy8gbmVlZCBhIHN0cmluZyBmb3IgcmVnZXhcblxuICAgICAgICBsZXQgWywgcHhfc2l6ZSwgdW5pdHNdID0gc2l6ZS5tYXRjaChDYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSkgfHwgW107XG4gICAgICAgIHVuaXRzID0gdW5pdHMgfHwgJ3B4JztcblxuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAqPSAxNjtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCJwdFwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDAuNzU7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwiJVwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDYuMjU7XG4gICAgICAgIH1cblxuICAgICAgICBweF9zaXplID0gcGFyc2VGbG9hdChweF9zaXplKTtcbiAgICAgICAgcHhfc2l6ZSAqPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBweF9zaXplO1xuICAgIH1cblxufVxuXG4vLyBFeHRyYWN0IGZvbnQgc2l6ZSBhbmQgdW5pdHNcbkNhbnZhc1RleHQuZm9udF9zaXplX3JlID0gLygoPzpbMC05XSpcXC4pP1swLTldKylcXHMqKHB4fHB0fGVtfCUpPy87XG5cbi8vIENhY2hlIHNpemVzIG9mIHJlbmRlcmVkIHRleHRcbkNhbnZhc1RleHQudGV4dF9jYWNoZSA9IHt9OyAvLyBieSB0ZXh0IHN0eWxlLCB0aGVuIHRleHQgc3RyaW5nXG5DYW52YXNUZXh0LmNhY2hlX3N0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiIsIi8qIGdsb2JhbCBGb250RmFjZSAqL1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBGb250RmFjZU9ic2VydmVyIGZyb20gJ2ZvbnRmYWNlb2JzZXJ2ZXInO1xuXG5jb25zdCBGb250TWFuYWdlciA9IHtcblxuICAgIC8vIEZvbnQgZGV0ZWN0aW9uXG4gICAgZm9udHNfbG9hZGVkOiBQcm9taXNlLnJlc29sdmUoKSwgLy8gcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWVzdGVkIGZvbnRzIGhhdmUgYmVlbiBkZXRlY3RlZFxuXG4gICAgLy8gTG9hZCBzZXQgb2YgY3VzdG9tIGZvbnQgZmFjZXNcbiAgICAvLyBgZm9udHNgIGlzIGFuIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIGEgZm9udCBmYW1pbHkgbmFtZSwgYW5kIHRoZSB2YWx1ZSBpcyBvbmUgb3IgbW9yZSBmb250IGZhY2VcbiAgICAvLyBkZWZpbml0aW9ucy4gVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBzdWNoIG9iamVjdHMuXG4gICAgLy8gSWYgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlICdleHRlcm5hbCcgaXMgdXNlZCwgaXQgaW5kaWNhdGVzIHRoZSB0aGUgZm9udCB3aWxsIGJlIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLlxuICAgIGxvYWRGb250cyAoZm9udHMpIHtcbiAgICAgICAgaWYgKGZvbnRzKSB7XG4gICAgICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBmb250cykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHF1ZXVlLnB1c2godGhpcy5sb2FkRm9udEZhY2UoZmFtaWx5LCBmYWNlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZvbnRzW2ZhbWlseV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9udHNfbG9hZGVkID0gUHJvbWlzZS5hbGwocXVldWUuZmlsdGVyKHggPT4geCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRzX2xvYWRlZDtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCBhIHNpbmdsZSBmb250IGZhY2VcbiAgICAvLyBgZmFjZWAgY29udGFpbnMgdGhlIGZvbnQgZmFjZSBkZWZpbml0aW9uLCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGB3ZWlnaHRgLCBgc3R5bGVgLCBhbmQgYHVybGAuXG4gICAgLy8gSWYgdGhlIGB1cmxgIGlzIGRlZmluZWQsIHRoZSBmb250IGlzIGluamVjdGVkIGludG8gdGhlIGRvY3VtZW50IGFzIGEgQ1NTIGZvbnQtZmFjZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0J3MgdmFsdWUgaXMgdGhlIHNwZWNpYWwgc3RyaW5nICdleHRlcm5hbCcsIG9yIGlmIG5vIGB1cmxgIGlzIGRlZmluZWQsIHRoZW4gdGhlIGZvbnQgZmFjZVxuICAgIC8vIGlzIGFzc3VtZWQgaXMgYXNzdW1lZCB0byBiZWVuIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gICAgLy8gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb250IGZhY2UgaGFzIGxvYWRlZCwgb3IgdGltZXMgb3V0LlxuICAgIGxvYWRGb250RmFjZSAoZmFtaWx5LCBmYWNlKSB7XG4gICAgICAgIGlmIChmYWNlID09IG51bGwgfHwgKHR5cGVvZiBmYWNlICE9PSAnb2JqZWN0JyAmJiBmYWNlICE9PSAnZXh0ZXJuYWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7IGZhbWlseSB9O1xuICAgICAgICBsZXQgaW5qZWN0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBmYWNlKTtcblxuICAgICAgICAgICAgLy8gSWYgVVJMIGlzIGRlZmluZWQsIGluamVjdCBmb250IGludG8gZG9jdW1lbnRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFjZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5qZWN0ID0gdGhpcy5pbmplY3RGb250RmFjZShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIGZvbnQgdG8gbG9hZFxuICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgRm9udEZhY2VPYnNlcnZlcihmYW1pbHksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaW5qZWN0LnRoZW4oKCkgPT4gb2JzZXJ2ZXIubG9hZCgpKS50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZXMsIGZvbnQgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0cywgZm9udCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgTk9UIGF2YWlsYWJsZWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBhIGZvbnQgZmFjZSB2aWEgZWl0aGVyIHRoZSBuYXRpdmUgRm9udEZhY2UgQVBJLCBvciBDU1MgaW5qZWN0aW9uXG4gICAgLy8gVE9ETzogY29uc2lkZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZm9ybWF0IFVSTHMgcGVyIGZhY2UsIHVuaWNvZGUgcmFuZ2VzXG4gICAgaW5qZWN0Rm9udEZhY2UgKHsgZmFtaWx5LCB1cmwsIHdlaWdodCwgc3R5bGUgfSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZyA9ICh3aW5kb3cuRm9udEZhY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGJsb2IgVVJMcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEkgd2lsbCBiZSB1c2VkIG9yIG5vdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJICppcyogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgaXMgcmVhZCBpbnRvIGEgcmF3IGRhdGEgYXJyYXkuXG4gICAgICAgIC8vIE5COiBpdCdzIGluZWZmaWNpZW50IHRvIGJlIGNvbnZlcnRpbmcgYmxvYiBVUkxzIGludG8gdHlwZWQgYXJyYXlzIGhlcmUsIHNpbmNlIHRoZXkgb3JpZ2luYXRlZFxuICAgICAgICAvLyBhcyByYXcgZGF0YSAqYmVmb3JlKiB0aGV5IHdlcmUgY29udmVydGVkIGludG8gYmxvYiBVUkxzLiBIb3dldmVyLCB0aGlzIHByb2Nlc3Mgc2hvdWxkIGJlIGZhc3Qgc2luY2VcbiAgICAgICAgLy8gdGhlc2UgYXJlIG5hdGl2ZSBicm93c2VyIGZ1bmN0aW9ucyBhbmQgYWxsIGRhdGEgaXMgbG9jYWwgKG5vIG5ldHdvcmsgcmVxdWVzdCksIGFuZCBpdCBrZWVwcyB0aGVcbiAgICAgICAgLy8gbG9naWMgc3RyZWFtbGluZWQgYnkgYWxsb3dpbmcgdXMgdG8gY29udGludWUgdG8gdXNlIGEgVVJMLWJhc2VkIGludGVyZmFjZSBmb3IgYWxsIHNjZW5lIHJlc291cmNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJIGlzICpub3QqIHN1cHBvcnRlZCwgdGhlIGJsb2IgVVJMIGRhdGEgaXMgY29udmVydGVkIHRvIGEgYmFzZTY0IGRhdGEgVVJMLlxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBzZWN1cml0eSByZXN0cmljaW9ucyBpbiBzb21lIGJyb3dzZXJzLlxuICAgICAgICAvLyBBbHNvIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYnJhbXN0ZWluL2ZvbnRsb2FkZXIvYmxvYi81OThlOTM5OTExN2JkYzk0NmZmNzg2ZmEyYzUwMDdhNmJkN2QzYjllL3NyYy9mb250ZmFjZS5qcyNMMTQ1LUwxNTNcbiAgICAgICAgbGV0IHByZXByb2Nlc3MgPSBQcm9taXNlLnJlc29sdmUodXJsKTtcbiAgICAgICAgaWYgKHVybC5zbGljZSgwLCA1KSA9PT0gJ2Jsb2I6Jykge1xuICAgICAgICAgICAgcHJlcHJvY2VzcyA9IFV0aWxzLmlvKHVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7IC8vIHVzZSByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwnICsgYnRvYShzdHIpOyAvLyBiYXNlNjQgZW5jb2RlIGFzIGRhdGEgVVJMXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlcHJvY2Vzcy50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgRm9udEZhY2UgQVBJXG4gICAgICAgICAgICAgICAgbGV0IGZhY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgeyAvLyBhZGQgYXMgVVJMXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBgdXJsKCR7ZW5jb2RlVVJJKGRhdGEpfSlgLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7IC8vIGFkZCBhcyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gbmV3IEZvbnRGYWNlKGZhbWlseSwgZGF0YSwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoZmFjZSk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdBZGRpbmcgRm9udEZhY2UgdG8gZG9jdW1lbnQuZm9udHM6JywgZmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgQ1NTIGluamVjdGlvblxuICAgICAgICAgICAgICAgIGxldCBjc3MgPSBgXG4gICAgICAgICAgICAgICAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICcke2ZhbWlseX0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ICR7d2VpZ2h0IHx8ICdub3JtYWwnfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6ICR7c3R5bGUgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlX2VsKTtcbiAgICAgICAgICAgICAgICBzdHlsZV9lbC5zaGVldC5pbnNlcnRSdWxlKGNzcywgMCk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdJbmplY3RpbmcgQ1NTIGZvbnQgZmFjZTonLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvbnRNYW5hZ2VyO1xuIiwiLy8gVGV4dCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtQb2ludHN9IGZyb20gJy4uL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgTGFiZWxMaW5lIGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9saW5lJztcblxuZXhwb3J0IGxldCBUZXh0U3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvaW50cyk7XG5cbk9iamVjdC5hc3NpZ24oVGV4dFN0eWxlLCB7XG4gICAgbmFtZTogJ3RleHQnLFxuICAgIHN1cGVyOiBQb2ludHMsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiBmYWxzZSwgLy8gbm8gZmVhdHVyZSBzZWxlY3Rpb24gZm9yIHRleHQgYnkgZGVmYXVsdFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGUgKHBhcmVudCBjbGFzcykgcmVxdWlyZXMgdGV4dHVyaW5nIHRvIGJlIHR1cm5lZCBvblxuICAgICAgICAvLyAobGFiZWxzIGFyZSBhbHdheXMgZHJhd24gd2l0aCB0ZXh0dXJlcylcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUE9JTlRfVEVYVFVSRSA9IHRydWU7XG5cbiAgICAgICAgLy8gRGlzYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gZmFsc2U7XG5cbiAgICAgICAgLy8gTWFudWFsbHkgdW4tbXVsdGlwbHkgYWxwaGEsIGJlY2F1c2UgQ2FudmFzIHRleHQgcmFzdGVyaXphdGlvbiBpcyBwcmUtbXVsdGlwbGllZFxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9VTk1VTFRJUExZX0FMUEhBID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB0ZXh0IHdoZW4gdGlsZSBpcyB6b29taW5nIG91dCwgZS5nLiBhY3RpbmcgYXMgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVRfUkFURSA9IDI7IC8vIGZhZGUgYXQgMngsIGUuZy4gZnVsbHkgdHJhbnNwYXJlbnQgYXQgMC41IHpvb20gbGV2ZWwgYXdheVxuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxID0gdGhpcy5wYXJzZVRleHRGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuICAgICAgICBpZiAoIXEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHEuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHEuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHEubGF5b3V0LnZlcnRleCA9IGZhbHNlOyAvLyB2ZXJ0ZXggcGxhY2VtZW50IG9wdGlvbiBub3QgYXBwbGljYWJsZSB0byBzdGFuZGFsb25lIGxhYmVsc1xuXG4gICAgICAgIC8vIFF1ZXVlIHRoZSBmZWF0dXJlIGZvciBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaChxKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB3aXRoIGNvbGxpc2lvbiBtYW5hZ2VyXG4gICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLm5hbWUsIHRpbGUua2V5KTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBzdGFydERhdGEgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG4gICAgICAgIHJldHVybiBTdHlsZS5zdGFydERhdGEuY2FsbCh0aGlzLCB0aWxlKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgdGhpcy5xdWV1ZXNbdGlsZS5rZXldKS5cbiAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCBsYWJlbHMpKS5cbiAgICAgICAgICAgIHRoZW4oKHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBzdHlsaW5nIG9iamVjdCBleHBlY3RlZCBieSBTdHlsZSBjbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gU2V0cyB1cCBjYWNoaW5nIGZvciBkcmF3IHByb3BlcnRpZXNcbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3KTtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHModGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemUsIGZxLmZlYXR1cmUuZ2VvbWV0cnksIGZxLmxheW91dCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVfbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZxbCA9IE9iamVjdC5jcmVhdGUoZnEpO1xuICAgICAgICAgICAgICAgIGZxbC5sYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGRzIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBnZW9tZXRyeVxuICAgIGJ1aWxkTGFiZWxzIChzaXplLCBnZW9tZXRyeSwgbGF5b3V0KSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMobGluZXNbaV0sIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9pbnRcIikge1xuICAgICAgICAgICAgbGV0IHBvaW50cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludHNbaV0sIHNpemUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBsaW5lIGdlb21ldHJ5XG4gICAgYnVpbGRMaW5lTGFiZWxzIChsaW5lLCBzaXplLCBsYXlvdXQsIGxhYmVscykge1xuICAgICAgICBsZXQgc3ViZGl2ID0gTWF0aC5taW4obGF5b3V0LnN1YmRpdiwgbGluZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKHN1YmRpdiA+IDEpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBtdWx0aXBsZSBsYWJlbHMgZm9yIGxpbmUsIHdpdGggZWFjaCBhbGxvdHRlZCBhIHJhbmdlIG9mIHNlZ21lbnRzXG4gICAgICAgICAgICAvLyBpbiB3aGljaCBpdCB3aWxsIGF0dGVtcHQgdG8gcGxhY2VcbiAgICAgICAgICAgIGxldCBzZWdfcGVyX2RpdiA9IChsaW5lLmxlbmd0aCAtIDEpIC8gc3ViZGl2O1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3ViZGl2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IE1hdGguZmxvb3IoaSAqIHNlZ19wZXJfZGl2KTtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBNYXRoLmZsb29yKChpKzEpICogc2VnX3Blcl9kaXYpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KSk7IC8vIFRPRE86IHN3YXAgY29uc3RydWN0b3IgYXJnIG9yZGVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IG51bGw7XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpKTsgLy8gVE9ETzogc3dhcCBjb25zdHJ1Y3RvciBhcmcgb3JkZXJcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG5cblRleHRTdHlsZS50ZXh0dXJlX2lkID0gMDsgLy8gbmFtZXNwYWNlcyBwZXItdGlsZSBsYWJlbCB0ZXh0dXJlc1xuIiwiLy8gVGV4dCBsYWJlbCByZW5kZXJpbmcgbWV0aG9kcywgY2FuIGJlIG1peGVkIGludG8gYSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi8uLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi8uLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgVGV4dFNldHRpbmdzIGZyb20gJy4uL3RleHQvdGV4dF9zZXR0aW5ncyc7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuLi90ZXh0L2NhbnZhc190ZXh0JztcblxuLy8gbmFtZXNwYWNlcyBsYWJlbCB0ZXh0dXJlcyAoZW5zdXJlcyBuZXcgdGV4dHVyZSBuYW1lIHdoZW4gYSB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzKVxubGV0IHRleHRfdGV4dHVyZV9pZCA9IDA7XG5cbmV4cG9ydCBjb25zdCBUZXh0TGFiZWxzID0ge1xuXG4gICAgcmVzZXRUZXh0ICgpIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy50ZXh0cyA9IHt9OyAvLyB1bmlxdWUgdGV4dHMsIGdyb3VwZWQgYnkgdGlsZSwgYnkgc3R5bGVcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVlVGV4dCAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgfSxcblxuICAgIHBhcnNlVGV4dEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBsYWJlbCB0ZXh0XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5wYXJzZVRleHRTb3VyY2UoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gdGV4dCBmb3IgdGhpcyBmZWF0dXJlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRleHQgc3R5bGUgYW5kIGxheW91dCBzZXR0aW5ncyBmb3IgdGhpcyBmZWF0dXJlIGxhYmVsXG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLmNvbXB1dGVUZXh0TGF5b3V0KHt9LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBUZXh0U2V0dGluZ3MuY29tcHV0ZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gVGV4dFNldHRpbmdzLmtleSh0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAvLyBmaXJzdCBsYWJlbCBpbiB0aWxlLCBvciB3aXRoIHRoaXMgc3R5bGU/XG4gICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV0gfHwge307XG4gICAgICAgIGxldCBzaXplcyA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSB8fCB7fTtcblxuICAgICAgICAvLyB1bmlxdWUgdGV4dCBzdHJpbmdzLCBncm91cGVkIGJ5IHRleHQgZHJhd2luZyBzdHlsZVxuICAgICAgICBpZiAoIXNpemVzW3RleHRdKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBsYWJlbCB3aXRoIHRoaXMgdGV4dC9zdHlsZS90aWxlIGNvbWJpbmF0aW9uLCBtYWtlIGEgbmV3IGxhYmVsIGVudHJ5XG4gICAgICAgICAgICBzaXplc1t0ZXh0XSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHJlZjogMCAvLyAjIG9mIHRpbWVzIHRoaXMgdGV4dC9zdHlsZSBjb21ibyBhcHBlYXJzIGluIHRpbGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHJhdywgdGV4dCwgdGV4dF9zZXR0aW5nc19rZXksIGxheW91dFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYWJlbCB0ZXh0LCBkZWZhdWx0IGlzIHZhbHVlIG9mIGZlYXR1cmUucHJvcGVydGllcy5uYW1lXG4gICAgLy8gLSBTdHJpbmcgdmFsdWUgaW5kaWNhdGVzIGEgZmVhdHVyZSBwcm9wZXJ0eSBsb29rLXVwLCBlLmcuIGBzaG9ydF9uYW1lYCBtZWFucyB1c2UgZmVhdHVyZS5wcm9wZXJ0aWVzLnNob3J0X25hbWVcbiAgICAvLyAtIEZ1bmN0aW9uIHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUgYXMgdGhlIGxhYmVsIHRleHQgKGZvciBjdXN0b20gbGFiZWxzKVxuICAgIC8vIC0gQXJyYXkgKG9mIHN0cmluZ3MgYW5kL29yIGZ1bmN0aW9ucykgZGVmaW5lcyBhIGxpc3Qgb2YgZmFsbGJhY2tzLCBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBydWxlcyxcbiAgICAvLyAgIHdpdGggdGhlIGZpcnN0IG5vbi1udWxsIHZhbHVlIHVzZWQgYXMgdGhlIGxhYmVsIHRleHRcbiAgICAvLyAgIGUuZy4gYFtuYW1lOmVzLCBuYW1lOmVuLCBuYW1lXWAgcHJlZmVycyBTcGFuaXNoIG5hbWVzLCBmb2xsb3dlZCBieSBFbmdsaXNoLCBhbmQgbGFzdCB0aGUgZGVmYXVsdCBsb2NhbCBuYW1lXG4gICAgcGFyc2VUZXh0U291cmNlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0O1xuICAgICAgICBsZXQgc291cmNlID0gZHJhdy50ZXh0X3NvdXJjZSB8fCAnbmFtZSc7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlW3NdXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNvdXJjZVtzXShjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpZiB3ZSBmb3VuZCBhIHRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc291cmNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG5cbiAgICBwcmVwYXJlVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBxdWV1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50ZXh0c1t0aWxlLmtleV18fHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgY2FsbCB0byBtYWluIHRocmVhZCwgYXNrIGZvciB0ZXh0IHBpeGVsIHNpemVzXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5jYWxjVGV4dFNpemVzJywgdGhpcy50ZXh0c1t0aWxlLmtleV0pLnRoZW4odGV4dHMgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY2FsY1RleHRTaXplcygpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuICAgICAgICAgICAgaWYgKCF0ZXh0cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUZXh0TGFiZWxzKHRpbGUua2V5LCBxdWV1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBjb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBsYWJlbHMpIHtcbiAgICAgICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHt9LCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbGxpc2lvbi5jb2xsaWRlKGxhYmVscywgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSkudGhlbihsYWJlbHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jb2xsaWRlKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dHMgPSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICAgICAgICAgIHRoaXMuY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscyk7XG5cbiAgICAgICAgICAgIC8vIHNldCBhbGlnbm1lbnRzXG4gICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG4gICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduID0gdGV4dF9pbmZvLmFsaWduIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXSA9IHt9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHNlY29uZCBjYWxsIHRvIG1haW4gdGhyZWFkLCBmb3IgcmFzdGVyaXppbmcgdGhlIHNldCBvZiB0ZXh0c1xuICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLnJhc3Rlcml6ZVRleHRzJywgdGlsZS5rZXksIHRleHRzKS50aGVuKCh7IHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1yYXN0ZXJpemVUZXh0cygpYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB1bnVzZWQgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmFzdGVyaXphdGlvblxuICAgIGN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpIHtcbiAgICAgICAgLy8gQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9uIGlzIHVzZWRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICB0ZXh0c1tsYWJlbC50ZXh0X3NldHRpbmdzX2tleV1bbGFiZWwudGV4dF0ucmVmKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdGhhdCBoYXZlIG5vIHZpc2libGUgbGFiZWxzXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRzW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzW3N0eWxlXVt0ZXh0XS5yZWYgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV1bdGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRleHRzW3N0eWxlXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCB0ZXh0IHN0cmluZyxcbiAgICAvLyB3ZXJlIGl0IHRvIGJlIHJlbmRlcmVkLiBUaGlzIGluZm8gaXMgdGhlbiB1c2VkIHRvIHBlcmZvcm0gaW5pdGlhbCBsYWJlbCBjdWxsaW5nLCAqYmVmb3JlKlxuICAgIC8vIGxhYmVscyBhcmUgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgY2FsY1RleHRTaXplcyAodGV4dHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnRleHRTaXplcyh0ZXh0cyk7XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY3JlYXRlIGF0bGFzIG9mIGxhYmVscyBmb3IgYSB0aWxlXG4gICAgcmFzdGVyaXplVGV4dHMgKHRpbGVfa2V5LCB0ZXh0cykge1xuICAgICAgICBsZXQgY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IGNhbnZhcy5zZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyh0ZXh0cywgdGhpcy5tYXhfdGV4dHVyZV9zaXplKTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0ZXh0IHN1bW1hcnkgZm9yIHRpbGUgJHt0aWxlX2tleX06IGZpdHMgaW4gJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4YCk7XG5cbiAgICAgICAgLy8gZml0cyBpbiBtYXggdGV4dHVyZSBzaXplP1xuICAgICAgICBpZiAodGV4dHVyZV9zaXplWzBdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplICYmIHRleHR1cmVfc2l6ZVsxXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhbnZhcyBzaXplICYgcmFzdGVyaXplIGFsbCB0aGUgdGV4dCBzdHJpbmdzIHdlIG5lZWRcbiAgICAgICAgICAgIGNhbnZhcy5yZXNpemUoLi4udGV4dHVyZV9zaXplKTtcbiAgICAgICAgICAgIGNhbnZhcy5yYXN0ZXJpemUodGV4dHMsIHRleHR1cmVfc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgW1xuICAgICAgICAgICAgICAgIGBMYWJlbCBhdGxhcyBmb3IgdGlsZSAke3RpbGVfa2V5fSBpcyAke3RleHR1cmVfc2l6ZVswXX14JHt0ZXh0dXJlX3NpemVbMV19cHgsIGAsXG4gICAgICAgICAgICAgICAgYGJ1dCBtYXggR0wgdGV4dHVyZSBzaXplIGlzICR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXgke3RoaXMubWF4X3RleHR1cmVfc2l6ZX1weGBdLmpvaW4oJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHRleHR1cmVcbiAgICAgICAgbGV0IHQgPSAnbGFiZWxzLScgKyB0aWxlX2tleSArICctJyArICh0ZXh0X3RleHR1cmVfaWQrKyk7XG4gICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGNhbnZhcy5jYW52YXMsXG4gICAgICAgICAgICBmaWx0ZXJpbmc6ICdsaW5lYXInLFxuICAgICAgICAgICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBUZXh0dXJlLnJldGFpbih0KTtcblxuICAgICAgICByZXR1cm4geyB0ZXh0cywgdGV4dHVyZTogdCB9OyAvLyB0ZXh0dXJlIGlzIHJldHVybmVkIGJ5IG5hbWUgKG5vdCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgcHJlcHJvY2Vzc1RleHQgKGRyYXcpIHtcbiAgICAgICAgLy8gRm9udCBzZXR0aW5ncyBhcmUgcmVxdWlyZWRcbiAgICAgICAgaWYgKCFkcmF3IHx8ICFkcmF3LmZvbnQgfHwgdHlwZW9mIGRyYXcuZm9udCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbG9yc1xuICAgICAgICBkcmF3LmZvbnQuZmlsbCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LmZpbGwpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS5jb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGZvbnQgYW5kIHRleHQgc3Ryb2tlIHNpemVzXG4gICAgICAgIGRyYXcuZm9udC5weF9zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc2l6ZSwgQ2FudmFzVGV4dC5mb250UGl4ZWxTaXplKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS53aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLndpZHRoLCBwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5idWZmZXIgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuYnVmZmVyLCB2ID0+IChBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2LCB2XSkubWFwKHBhcnNlRmxvYXQpIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcGVhdCBydWxlc1xuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBBZGRpdGlvbmFsIHRleHQtc3BlY2lmaWMgbGF5b3V0IHNldHRpbmdzXG4gICAgY29tcHV0ZVRleHRMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuXG4gICAgICAgIC8vIGNvbW1vbiBzZXR0aW5ncyB3L3BvaW50c1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmNvbXB1dGVMYXlvdXQobGF5b3V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IHRydWU7XG4gICAgICAgIGxheW91dC5tb3ZlX2ludG9fdGlsZSA9IChkcmF3Lm1vdmVfaW50b190aWxlICE9IG51bGwpID8gZHJhdy5tb3ZlX2ludG9fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gbGFiZWwgbGluZSBleGNlZWQgcGVyY2VudGFnZVxuICAgICAgICBpZiAoZHJhdy5saW5lX2V4Y2VlZCAmJiBkcmF3LmxpbmVfZXhjZWVkLnN1YnN0cigtMSkgPT09ICclJykge1xuICAgICAgICAgICAgbGF5b3V0LmxpbmVfZXhjZWVkID0gcGFyc2VGbG9hdChkcmF3LmxpbmVfZXhjZWVkLnN1YnN0cigwLGRyYXcubGluZV9leGNlZWQubGVuZ3RoLTEpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxheW91dC5saW5lX2V4Y2VlZCA9IDgwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwZWF0IG1pbmltdW0gZGlzdGFuY2VcbiAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgPSBHZW8udGlsZV9zaXplO1xuICAgICAgICB9XG4gICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyByZXBlYXQgZ3JvdXAga2V5XG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG5cbiAgICAgICAgLy8gTWF4IG51bWJlciBvZiBzdWJkaXZpc2lvbnMgdG8gdHJ5XG4gICAgICAgIGxheW91dC5zdWJkaXYgPSB0aWxlLm92ZXJ6b29tMjtcblxuICAgICAgICBsYXlvdXQuYWxpZ24gPSBkcmF3LmFsaWduO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICBdLmpvaW4oJy8nKTtcbiAgICB9LFxuXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgc3R5bGU6ICdub3JtYWwnLFxuICAgICAgICB3ZWlnaHQ6IG51bGwsXG4gICAgICAgIHNpemU6ICcxMnB4JyxcbiAgICAgICAgcHhfc2l6ZTogMTIsXG4gICAgICAgIGZhbWlseTogJ0hlbHZldGljYScsXG4gICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgIHRleHRfd3JhcDogMTUsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgc3Ryb2tlOiBudWxsLFxuICAgICAgICBzdHJva2Vfd2lkdGg6IDBcbiAgICB9LFxuXG4gICAgY29tcHV0ZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcblxuICAgICAgICBkcmF3LmZvbnQgPSBkcmF3LmZvbnQgfHwgdGhpcy5kZWZhdWx0cztcblxuICAgICAgICAvLyBVc2UgZmlsbCBpZiBzcGVjaWZpZWQsIG9yIGRlZmF1bHRcbiAgICAgICAgc3R5bGUuZmlsbCA9IChkcmF3LmZvbnQuZmlsbCAmJiBVdGlscy50b0NTU0NvbG9yKFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5KGRyYXcuZm9udC5maWxsLCBjb250ZXh0KSkpIHx8IHRoaXMuZGVmYXVsdHMuZmlsbDtcblxuICAgICAgICAvLyBGb250IHByb3BlcnRpZXMgYXJlIG1vZGVsZWQgYWZ0ZXIgQ1NTIG5hbWVzOlxuICAgICAgICAvLyAtIGZhbWlseTogSGVsdmV0aWNhLCBGdXR1cmEsIGV0Yy5cbiAgICAgICAgLy8gLSBzaXplOiBpbiBwdCwgcHgsIG9yIGVtXG4gICAgICAgIC8vIC0gc3R5bGU6IG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG4gICAgICAgIC8vIC0gd2VpZ2h0OiBub3JtYWwsIGJvbGQsIGV0Yy5cbiAgICAgICAgLy8gLSB0cmFuc2Zvcm06IGNhcGl0YWxpemUsIHVwcGVyY2FzZSwgbG93ZXJjYXNlXG4gICAgICAgIHN0eWxlLnN0eWxlID0gZHJhdy5mb250LnN0eWxlIHx8IHRoaXMuZGVmYXVsdHMuc3R5bGU7XG4gICAgICAgIHN0eWxlLndlaWdodCA9IGRyYXcuZm9udC53ZWlnaHQgfHwgdGhpcy5kZWZhdWx0cy53ZWlnaHQ7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuZmFtaWx5KSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSBkcmF3LmZvbnQuZmFtaWx5O1xuICAgICAgICAgICAgaWYgKHN0eWxlLmZhbWlseSAhPT0gdGhpcy5kZWZhdWx0cy5mYW1pbHkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5mYW1pbHkgKz0gJywgJyArIHRoaXMuZGVmYXVsdHMuZmFtaWx5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUuZmFtaWx5ID0gdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBkcmF3LmZvbnQudHJhbnNmb3JtO1xuXG4gICAgICAgIC8vIG9yaWdpbmFsIHNpemUgKG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgICAgICBzdHlsZS5zaXplID0gZHJhdy5mb250LnNpemUgfHwgdGhpcy5kZWZhdWx0cy5zaXplO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZWQgcGl4ZWwgc2l6ZVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnB4X3NpemU7XG5cbiAgICAgICAgLy8gVXNlIHN0cm9rZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS5jb2xvcikge1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlID0gVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnN0cm9rZSk7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2Vfd2lkdGg7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggKj0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG4gICAgICAgIGlmICh0ZXh0X3dyYXAgPT0gbnVsbCAmJiBHZW8uZ2VvbWV0cnlUeXBlKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSkgIT09ICdsaW5lJykge1xuICAgICAgICAgICAgLy8gcG9pbnQgbGFiZWxzIChmb3IgcG9pbnQgYW5kIHBvbHlnb24gZmVhdHVyZXMpIGhhdmUgd29yZCB3cmFwIG9uIHcvZGVmYXVsdCBtYXggbGVuZ3RoLFxuICAgICAgICAgICAgLy8gbGluZSBsYWJlbHMgZGVmYXVsdCBvZmZcbiAgICAgICAgICAgIHRleHRfd3JhcCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXR0aW5nIHRvICd0cnVlJyBjYXVzZXMgZGVmYXVsdCB3cmFwIHZhbHVlIHRvIGJlIHVzZWRcbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGV4dF93cmFwID0gdGhpcy5kZWZhdWx0cy50ZXh0X3dyYXA7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUudGV4dF93cmFwID0gdGV4dF93cmFwO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuY29vcmRzLnopO1xuICAgICAgICB0aGlzLnVuaXRzX3Blcl9waXhlbCA9IEdlby51bml0c19wZXJfcGl4ZWwgLyB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG4gICAgICAgIHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tID0gR2VvLnVuaXRzUGVyTWV0ZXIodGhpcy5jb29yZHMueikgKiB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG5cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTsgLy8gcmVuZGVyYWJsZSBWQk8gbWVzaGVzIGtleWVkIGJ5IHN0eWxlXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgdGhhdCB0aGUgdGlsZSBvd25zIChsYWJlbHMsIGV0Yy4pXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBtIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIFRleHR1cmUucmVsZWFzZSh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5idWlsZFRpbGUnLCB7IHRpbGU6IHRoaXMuYnVpbGRBc01lc3NhZ2UoKSB9KS5jYXRjaChlID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiB3b3JrZXIgdG8gY2FuY2VsIGxvYWRpbmdcbiAgICAgICAgU3RhdGljIG1ldGhvZCBiZWNhdXNlIHRoZSB3b3JrZXIgb25seSBoYXMgb2JqZWN0IHJlcHJlc2VudGF0aW9ucyBvZiB0aWxlIGRhdGEsIHRoZXJlIGlzIG5vXG4gICAgICAgIHRpbGUgaW5zdGFuY2UgY3JlYXRlZCB5ZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEgJiYgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGdlb21ldHJ5IGZvciB0aWxlIC0gY2FsbGVkIGJ5IHdlYiB3b3JrZXJcbiAgICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRpbGUga2V5cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBtYWluIHRocmVhZCAoc28gdGhhdCB3ZSBjYW4gbWluaW1pemUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHdvcmtlciBhbmQgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIGJ1aWxkR2VvbWV0cnkgKHRpbGUsIHsgc2NlbmVfaWQsIGxheWVycywgc3R5bGVzLCBnbG9iYWwgfSkge1xuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aWxlLmRlYnVnLmZlYXR1cmVzID0gMDtcblxuICAgICAgICBsZXQgZGF0YSA9IHRpbGUuc291cmNlX2RhdGE7XG5cbiAgICAgICAgQ29sbGlzaW9uLnN0YXJ0VGlsZSh0aWxlLmtleSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBsYXllclxuICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2xheWVyX25hbWVdO1xuICAgICAgICAgICAgLy8gU2tpcCBsYXllcnMgd2l0aCBubyBkYXRhIHNvdXJjZSBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8ICFsYXllci5jb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBMYXllciAke2xheWVyX25hbWV9IHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZW9tZXRyeSBkYXRhIHNvdXJjZSBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNvdXJjZSBuYW1lcyBkb24ndCBtYXRjaFxuICAgICAgICAgICAgaWYgKGxheWVyLmNvbmZpZy5kYXRhLnNvdXJjZSAhPT0gdGlsZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZm9yIG9uZSBvciBtb3JlIGxheWVycyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllcnMgPSBUaWxlLmdldERhdGFGb3JTb3VyY2UoZGF0YSwgbGF5ZXIuY29uZmlnLmRhdGEsIGxheWVyX25hbWUpO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgZmVhdHVyZXMgaW4gbGF5ZXJcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZV9sYXllcnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlX2xheWVyID0gc291cmNlX2xheWVyc1tzXTtcbiAgICAgICAgICAgICAgICBsZXQgZ2VvbSA9IHNvdXJjZV9sYXllci5nZW9tO1xuICAgICAgICAgICAgICAgIGlmICghZ2VvbSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IGdlb20uZmVhdHVyZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBnZW9tLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBmZWF0dXJlcyB3L28gZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53aW5kaW5nID0gdGlsZS5kZWZhdWx0X3dpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc291cmNlID0gdGlsZS5zb3VyY2U7ICAgICAgICAvLyBhZGQgZGF0YSBzb3VyY2UgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVyID0gc291cmNlX2xheWVyLmxheWVyOyAgLy8gYWRkIGRhdGEgc291cmNlIGxheWVyIG5hbWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZHJhdyBncm91cHMgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllci5idWlsZERyYXdHcm91cHMoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGRyYXcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGRyYXdfZ3JvdXBzW2dyb3VwX25hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBncm91cF9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3N0eWxlX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlICcke3N0eWxlX25hbWV9JyBub3QgZm91bmQsIHNraXBwaW5nIGxheWVyICcke2xheWVyX25hbWV9JzpgLCBncm91cCwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGF5ZXJzID0gZ3JvdXAubGF5ZXJzOyAgLy8gYWRkIG1hdGNoaW5nIGRyYXcgbGF5ZXJzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ3JvdXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpIC0gdGlsZS5kZWJ1Zy5yZW5kZXJpbmc7XG5cbiAgICAgICAgLy8gU2VuZCBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCBhcyB0aGV5IGZpbmlzaCBidWlsZGluZywgaW4gdHdvIGdyb3VwczogY29sbGlzaW9uIHZzLiBub24tY29sbGlzaW9uXG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFN0eWxlTWFuYWdlci5zdHlsZXNGb3JUaWxlKHRpbGUua2V5LCBzdHlsZXMpLm1hcChzID0+IHN0eWxlc1tzXSk7XG4gICAgICAgIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+IHN0eWxlLmNvbGxpc2lvbiA/ICdjb2xsaXNpb24nIDogJ25vbi1jb2xsaXNpb24nKTtcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUubmFtZSk7IC8vIGNhbGwgZm9yIGVhY2ggc3R5bGVcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gJ3N0eWxlcycpOyAvLyBhbGwgc3R5bGVzIGluIHNpbmdsZSBjYWxsIChwcmV2aW91cyBiZWhhdmlvcilcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzaF9kYXRhW3NdLnRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMubWVzaF9kYXRhOyAvLyBUT0RPOiBtaWdodCB3YW50IHRvIHByZXNlcnZlIHRoaXMgZm9yIHJlYnVpbGRpbmcgZ2VvbWV0cmllcyB3aGVuIHN0eWxlcy9ldGMuIGNoYW5nZT9cblxuICAgICAgICAvLyBBZGQgbmV3IHRpbGUgZGF0YVxuICAgICAgICBpZiAocHJvZ3Jlc3Muc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5tZXNoZXMgPSBtZXNoZXM7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gdGV4dHVyZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lc2hlcyA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXNoZXMsIG1lc2hlcyk7XG4gICAgICAgICAgICB0ZXh0dXJlcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHR1cmVzLmluZGV4T2YodCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHVyZXMucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZXMgPSB0aWxlLm1lc2hfZGF0YVtzXS50ZXh0dXJlcztcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbGVhc2luZyB0ZXh0dXJlICR7dH0gZm9yIHRpbGUgJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSByZWxhdGl2ZSB0byB2aWV3XG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuY29vcmRzO1xuICAgICAgICBpZiAoY29vcmRzLnogIT09IHRoaXMudmlldy5jZW50ZXIudGlsZS56KSB7XG4gICAgICAgICAgICBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCB0aGlzLnZpZXcuY2VudGVyLnRpbGUueik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gY29vcmRzLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBjb29yZHMueSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFzIGEgcHJveHkgdGlsZSBmb3IgYW5vdGhlciB0aWxlXG4gICAgc2V0UHJveHlGb3IgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IHRoaXMucHJveHlfZm9yIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAxOyAvLyBkcmF3IHByb3hpZXMgYSBoYWxmLWxheWVyIGJhY2sgKG9yZGVyIGlzIHNjYWxlZCAyeCB0byBhdm9pZCBpbnRlZ2VyIHRydW5jYXRpb24pXG4gICAgICAgICAgICB0aWxlLnByb3hpZWRfYXMgPSAodGlsZS5zdHlsZV96b29tID4gdGhpcy5zdHlsZV96b29tID8gJ2NoaWxkJyA6ICdwYXJlbnQnKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb3h5IHRpbGVzIG9ubHkgbmVlZCB0byByZW5kZXIgYSBzcGVjaWZpYyBzdHlsZSBpZiBhbnkgb2YgdGhlIHRpbGVzIHRoZXkgYXJlIHByb3h5aW5nICpmb3IqXG4gICAgLy8gaGF2ZW4ndCBmaW5pc2hlZCBsb2FkaW5nIHRoYXQgc3R5bGUgeWV0LiBJZiBhbGwgcHJveGllZCB0aWxlcyAqaGF2ZSogZGF0YSBmb3IgdGhhdCBzdHlsZSwgdGhlbiBpdCdzXG4gICAgLy8gc2FmZSB0byBoaWRlIHRoZSBwcm94eSB0aWxlJ3MgdmVyc2lvbi5cbiAgICBzaG91bGRQcm94eUZvclN0eWxlIChzdHlsZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMucHJveHlfZm9yIHx8IHRoaXMucHJveHlfZm9yLnNvbWUodCA9PiB0Lm1lc2hlc1tzdHlsZV0gPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1vZGVsIG1hdHJpeCBhbmQgdGlsZSB1bmlmb3Jtc1xuICAgIHNldHVwUHJvZ3JhbSAoeyBtb2RlbCwgbW9kZWwzMiB9LCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUgb3JpZ2luXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnNGZ2JywgJ3VfdGlsZV9vcmlnaW4nLCBbdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5zdHlsZV96b29tLCB0aGlzLmNvb3Jkcy56XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aWxlX3Byb3h5X2RlcHRoJywgdGhpcy5wcm94eV9kZXB0aCk7XG5cbiAgICAgICAgLy8gTW9kZWwgLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHdvcmxkIHNwYWNlIChtZXRlcnMsIGFic29sdXRlIG1lcmNhdG9yIHBvc2l0aW9uKVxuICAgICAgICBtYXQ0LmlkZW50aXR5KG1vZGVsKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobW9kZWwsIG1vZGVsLCB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW4ueCwgdGhpcy5taW4ueSwgMCkpO1xuICAgICAgICBtYXQ0LnNjYWxlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMuc3Bhbi54IC8gR2VvLnRpbGVfc2NhbGUsIC0xICogdGhpcy5zcGFuLnkgLyBHZW8udGlsZV9zY2FsZSwgMSkpOyAvLyBzY2FsZSB0aWxlIGxvY2FsIGNvb3JkcyB0byBtZXRlcnNcbiAgICAgICAgbWF0NC5jb3B5KG1vZGVsMzIsIG1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbCcsIG1vZGVsMzIpO1xuXG4gICAgICAgIC8vIEZhZGUgaW4gbGFiZWxzIGFjY29yZGluZyB0byBwcm94eSBzdGF0dXMsIGF2b2lkaW5nIFwiZmxpY2tlcmluZ1wiIHdoZXJlXG4gICAgICAgIC8vIGxhYmVscyBxdWlja2x5IGdvIGZyb20gaW52aXNpYmxlIGJhY2sgdG8gdmlzaWJsZVxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3VfZmFkZV9pbicsIHRoaXMucHJveGllZF9hcyAhPT0gJ2NoaWxkJyk7XG4gICAgfVxuXG4gICAgLy8gU2xpY2UgYSBzdWJzZXQgb2Yga2V5cyBvdXQgb2YgYSB0aWxlXG4gICAgLy8gSW5jbHVkZXMgYSBtaW5pbXVtIHNldCBvZiBwcmUtZGVmaW5lZCBrZXlzIGZvciBsb2FkIHN0YXRlLCBkZWJ1Zy4gZXRjLlxuICAgIC8vIFdlIHVzZSB0aGlzIHRvIHNlbmQgYSBzdWJzZXQgb2YgdGhlIHRpbGUgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQsIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5IGRhdGEgdHJhbnNmZXJcbiAgICAvLyAoZS5nLiB2ZXJ5IGxhcmdlIGl0ZW1zIGxpa2UgZmVhdHVyZSBnZW9tZXRyeSBhcmUgbm90IG5lZWRlZCBvbiB0aGUgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIHNsaWNlICh0aWxlLCBrZXlzKSB7XG4gICAgICAgIGxldCBrZWVwID0gW1xuICAgICAgICAgICAgJ2tleScsXG4gICAgICAgICAgICAnbG9hZGluZycsXG4gICAgICAgICAgICAnbG9hZGVkJyxcbiAgICAgICAgICAgICdnZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAnZGVidWcnXG4gICAgICAgIF07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZWVwLnB1c2goLi4ua2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCB0aGUgdGlsZSBzdWJzZXRcbiAgICAgICAgdmFyIHRpbGVfc3Vic2V0ID0ge307XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZWVwKSB7XG4gICAgICAgICAgICB0aWxlX3N1YnNldFtrZXldID0gdGlsZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVfc3Vic2V0O1xuICAgIH1cblxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvdGhlcikge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBvdGhlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaW50RGVidWcgKCkge1xuICAgICAgICBsb2coJ2RlYnVnJywgYFRpbGU6IGRlYnVnIGZvciAke3RoaXMua2V5fTogWyAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnKX0gXWApO1xuICAgIH1cblxufVxuXG5UaWxlLmNvb3JkX2NoaWxkcmVuID0ge307IC8vIG9ubHkgYWxsb2NhdGUgY2hpbGRyZW4gY29vcmRpbmF0ZXMgb25jZSBwZXIgY29vcmRpbmF0ZVxuIiwiaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBUaWxlUHlyYW1pZCBmcm9tICcuL3RpbGVfcHlyYW1pZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBzY2VuZSwgdmlldyB9KSB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMgPSBbXTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgY29vcmRzIG9mIHRpbGVfY29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3Jkc1tjb29yZHMua2V5XSA9IGNvb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2libGUgY29vcmRzIGNoYW5nZWRcbiAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhIG5ldyB2aWV3IG1hbmFnZXIgb2JqZWN0XG4gICAgICAgIGxldCBuZXdfY29vcmRzID0gT2JqZWN0LmtleXModGhpcy52aXNpYmxlX2Nvb3Jkcyk7XG4gICAgICAgIGxldCBjb29yZHNfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocHJldl9jb29yZHMubGVuZ3RoICE9PSBuZXdfY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29vcmRzX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldl9jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgbmV3X2Nvb3Jkcy5zb3J0KCk7XG4gICAgICAgICAgICBpZiAoIXByZXZfY29vcmRzLmV2ZXJ5KChjLCBpKSA9PiBuZXdfY29vcmRzW2ldID09PSBjKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVTdGF0ZXMgKCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUXVldWVkQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm94eVRpbGVzKCk7XG4gICAgICAgIHRoaXMudmlldy5wcnVuZVRpbGVzRm9yVmlldygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3h5VGlsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBwcm94aWVzXG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB0aWxlLnNldFByb3h5Rm9yKG51bGwpKTtcblxuICAgICAgICBsZXQgcHJveHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuem9vbV9kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0ICYmIHRpbGUuY29vcmRzLnogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gdGhpcy5weXJhbWlkLmdldEFuY2VzdG9yKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcygpIHtcbiAgICAgICAgbGV0IHRpbGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW3RdO1xuICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiB0aWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVzO1xuICAgIH1cblxuICAgIGlzTG9hZGluZ1Zpc2libGVUaWxlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLnNvbWUoayA9PiB0aGlzLnRpbGVzW2tdLnZpc2libGUgJiYgIXRoaXMudGlsZXNba10uYnVpbHQpO1xuICAgIH1cblxuICAgIC8vIFF1ZXVlIGEgdGlsZSBmb3IgbG9hZFxuICAgIHF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzW3RoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGhdID0gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHF1ZXVlZCB0aWxlc1xuICAgIGxvYWRRdWV1ZWRDb29yZGluYXRlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgcXVldWVkIHRpbGVzIGZyb20gY2VudGVyIHRpbGVcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYS54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYS55KTtcbiAgICAgICAgICAgIGxldCBiZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYi54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYi55KTtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMuZm9yRWFjaChjb29yZHMgPT4gdGhpcy5sb2FkQ29vcmRpbmF0ZShjb29yZHMpKTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGlsZXMgdG8gY292ZXIgYSBnaXZlbiBsb2dpY2FsIHRpbGUgY29vcmRpbmF0ZVxuICAgIGxvYWRDb29yZGluYXRlKGNvb3Jkcykge1xuICAgICAgICAvLyBTa2lwIGlmIG5vdCBhdCBjdXJyZW50IHNjZW5lIHpvb21cbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG5lY2Vzc2FyeSB0aWxlcyBmb3IgZWFjaCBzb3VyY2VcbiAgICAgICAgZm9yIChsZXQgcyBpbiB0aGlzLnNjZW5lLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNjZW5lLnNvdXJjZXNbc107XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS50aWxlZCB8fCAhc291cmNlLmdlb21ldHJ5X3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBrZXkgPSBUaWxlLmtleShjb29yZHMsIHNvdXJjZSwgdGhpcy52aWV3LnRpbGVfem9vbSk7XG4gICAgICAgICAgICBpZiAoa2V5ICYmICF0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gVGlsZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyOiB0aGlzLnNjZW5lLm5leHRXb3JrZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVfem9vbTogdGhpcy52aWV3LnN0eWxlWm9vbShjb29yZHMueiksXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlld1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5rZWVwVGlsZSh0aWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkVGlsZSh0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgYW5kIGJ1aWxkIGEgbGlzdCBvZiB0aWxlc1xuICAgIGJ1aWxkVGlsZXModGlsZXMpIHtcbiAgICAgICAgVGlsZS5zb3J0KHRpbGVzKS5mb3JFYWNoKHRpbGUgPT4gdGhpcy5idWlsZFRpbGUodGlsZSkpO1xuICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgIH1cblxuICAgIGJ1aWxkVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RhcnQodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkodGlsZSk7XG4gICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIHRpbGUuYnVpbGQodGhpcy5zY2VuZS5nZW5lcmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcgZm9yIGEgc2luZ2xlIHRpbGUgKGluaXRpYWwgbG9hZCwgb3IgcmVidWlsZClcbiAgICBidWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQoeyB0aWxlLCBwcm9ncmVzcyB9KSB7XG4gICAgICAgIC8vIFJlbW92ZWQgdGhpcyB0aWxlIGR1cmluZyBsb2FkP1xuICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBwcmV2aW91c2x5IHJlbW92ZWRgKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJ1aWx0IHdpdGggYW4gb3V0ZGF0ZWQgc2NlbmUgY29uZmlndXJhdGlvbj9cbiAgICAgICAgZWxzZSBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLnNjZW5lLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgZGlzY2FyZGVkIHRpbGUgJHt0aWxlLmtleX0gaW4gVGlsZU1hbmFnZXIuYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkIGJlY2F1c2UgYnVpbHQgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgc2NlbmUgY29uZmlnIGdlbiAke3RpbGUuZ2VuZXJhdGlvbn0sIGN1cnJlbnQgJHt0aGlzLnNjZW5lLmdlbmVyYXRpb259YCk7XG4gICAgICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGlsZSB3aXRoIHByb3BlcnRpZXMgZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW3RpbGUua2V5XS5tZXJnZSh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICB0aWxlLmJ1aWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5idWlsZE1lc2hlcyh0aGlzLnNjZW5lLnN0eWxlcywgcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVCdWlsZFN0b3AodGlsZS5rZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gd2ViIHdvcmtlciBlbmNvdW50ZXJzIGFuIGVycm9yIGJ1aWxkaW5nIGEgdGlsZVxuICAgIGJ1aWxkVGlsZUVycm9yKHRpbGUpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGBFcnJvciBidWlsZGluZyB0aWxlICR7dGlsZS5rZXl9OmAsIHRpbGUuZXJyb3IpO1xuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgIHRpbGVCdWlsZFN0YXJ0KGtleSkge1xuICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzID0gdGhpcy5idWlsZGluZ190aWxlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlc1trZXldID0gdHJ1ZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdGFydCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICB0aWxlQnVpbGRTdG9wKGtleSkge1xuICAgICAgICAvLyBEb25lIGJ1aWxkaW5nP1xuICAgICAgICBpZiAodGhpcy5idWlsZGluZ190aWxlcykge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdG9wIGZvciAke2tleX06ICR7T2JqZWN0LmtleXModGhpcy5idWlsZGluZ190aWxlcykubGVuZ3RofWApO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBzdGF0dXMgb2YgdGlsZSBidWlsZGluZyBxdWV1ZSBhbmQgbm90aWZ5IHNjZW5lIHdoZW4gd2UncmUgZG9uZVxuICAgIGNoZWNrQnVpbGRRdWV1ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkaW5nX3RpbGVzIHx8IE9iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnRpbGVNYW5hZ2VyQnVpbGREb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdW0gb2YgYSBkZWJ1ZyBwcm9wZXJ0eSBhY3Jvc3MgdGlsZXNcbiAgICBnZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF0gIT0gbnVsbCAmJiAodHlwZW9mIGZpbHRlciAhPT0gJ2Z1bmN0aW9uJyB8fCBmaWx0ZXIodGhpcy50aWxlc1t0XSkgPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICAvLyBBdmVyYWdlIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdBdmVyYWdlKHByb3AsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIC8gT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlUHlyYW1pZCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCA9IDM7IC8vICMgb2YgbGV2ZWxzIGRlZXAgdG8gc2VhcmNoIGZvciBkZXNjZW5kYW50IHByb3h5IHRpbGVzXG4gICAgfVxuXG4gICAgc291cmNlVGlsZXMoY29vcmQsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XSAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzICYmXG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1tjb29yZC5rZXldLnNvdXJjZXMuZ2V0KHNvdXJjZS5uYW1lKSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMuZ2V0KHRpbGUuc291cmNlLm5hbWUpKSB7XG4gICAgICAgICAgICBjb29yZC5zb3VyY2VzLnNldCh0aWxlLnNvdXJjZS5uYW1lLCBuZXcgTWFwKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXMuZ2V0KHRpbGUuc291cmNlLm5hbWUpLnNldCh0aWxlLnN0eWxlX3pvb20sIHRpbGUpO1xuXG4gICAgICAgIC8vIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgdXAgdGhlIHRpbGUgcHlyYW1pZFxuICAgICAgICBmb3IgKGxldCB6ID0gdGlsZS5jb29yZHMueiAtIDE7IHogPj0gMDsgei0tKSB7XG4gICAgICAgICAgICBsZXQgdXAgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHopO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvb3Jkc1t1cC5rZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XSA9IHsgZGVzY2VuZGFudHM6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29vcmRzW3VwLmtleV0uZGVzY2VuZGFudHMrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZVRpbGUodGlsZSkge1xuICAgICAgICAvLyBSZW1vdmUgdGFyZ2V0IHRpbGVcbiAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXModGlsZS5jb29yZHMsIHRpbGUuc291cmNlKTtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcblxuICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICBzb3VyY2VfdGlsZXMuZGVsZXRlKHRpbGUuc3R5bGVfem9vbSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgc291cmNlXG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzLmRlbGV0ZSh0aWxlLnNvdXJjZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29yZHNba2V5XS5zb3VyY2VzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV0uc291cmNlcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29yZHNba2V5XS5kZXNjZW5kYW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHdob2xlIGNvb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgdXAgdGhlIHRpbGUgcHlyYW1pZFxuICAgICAgICBmb3IgKGxldCB6ID0gdGlsZS5jb29yZHMueiAtIDE7IHogPj0gMDsgei0tKSB7XG4gICAgICAgICAgICBsZXQgZG93biA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAodGhpcy5jb29yZHNbZG93bi5rZXldICYmIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cyA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMtLTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID09PSAwICYmICF0aGlzLmNvb3Jkc1tkb3duLmtleV0uc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNbZG93bi5rZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEFuY2VzdG9yICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0pIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgb3Zlcnpvb21lZCB0aWxlcyBhdCBzYW1lIGNvb3JkaW5hdGUgem9vbVxuICAgICAgICBpZiAoc3R5bGVfem9vbSA+IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSBzdHlsZV96b29tIC0gMTsgeiA+PSBzb3VyY2UubWF4X3pvb207IHotLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzLmhhcyh6KSAmJiBzb3VyY2VfdGlsZXMuZ2V0KHopLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlcy5nZXQoeik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZV96b29tID0gc291cmNlLm1heF96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIHVwXG4gICAgICAgIHN0eWxlX3pvb20tLTtcbiAgICAgICAgbGV0IHBhcmVudCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbShjb29yZHMsIGNvb3Jkcy56IC0gMSk7XG4gICAgICAgIGxldCBwYXJlbnRfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKHBhcmVudCwgc291cmNlKTtcbiAgICAgICAgaWYgKHBhcmVudF90aWxlcyAmJiBwYXJlbnRfdGlsZXMuaGFzKHN0eWxlX3pvb20pICYmIHBhcmVudF90aWxlcy5nZXQoc3R5bGVfem9vbSkubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzLmdldChzdHlsZV96b29tKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbmNlc3RvciwgdHJ5IG5leHQgbGV2ZWxcbiAgICAgICAgLy8gVE9ETzogbWF4IGRlcHRoIGxldmVscyB0byBjaGVja1xuICAgICAgICBpZiAocGFyZW50LnogPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNlc3Rvcih7IGNvb3JkczogcGFyZW50LCBzdHlsZV96b29tLCBzb3VyY2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXREZXNjZW5kYW50cyAoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSB9LCBsZXZlbCA9IDEpIHtcbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG5cbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgb3Zlcnpvb21lZCB0aWxlcyBhdCBzYW1lIGNvb3JkaW5hdGUgem9vbVxuICAgICAgICBpZiAoc3R5bGVfem9vbSA+PSBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNvb3Jkcywgc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VhcmNoX21heF96b29tID0gTWF0aC5tYXgoR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSwgc3R5bGVfem9vbSArIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSBzdHlsZV96b29tICsgMTsgeiA8PSBzZWFyY2hfbWF4X3pvb207IHorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzLmhhcyh6KSAmJiBzb3VyY2VfdGlsZXMuZ2V0KHopLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXMuZ2V0KHopKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGVzIGF0IG5leHQgem9vbSBkb3duXG4gICAgICAgIGlmICh0aGlzLmNvb3Jkc1tjb29yZHMua2V5XSAmJiB0aGlzLmNvb3Jkc1tjb29yZHMua2V5XS5kZXNjZW5kYW50cyA+IDApIHtcbiAgICAgICAgICAgIHN0eWxlX3pvb20rKztcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIFRpbGUuY2hpbGRyZW5Gb3JDb29yZGluYXRlKGNvb3JkcykpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNoaWxkLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZF90aWxlcyAmJiBjaGlsZF90aWxlcy5oYXMoc3R5bGVfem9vbSkgJiYgY2hpbGRfdGlsZXMuZ2V0KHN0eWxlX3pvb20pLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzLmdldChzdHlsZV96b29tKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGNoaWxkLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggJiYgY2hpbGQueiA8PSBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaCguLi50aGlzLmdldERlc2NlbmRhbnRzKHsgY29vcmRzOiBjaGlsZCwgc291cmNlLCBzdHlsZV96b29tIH0sIGxldmVsICsgMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBkcmF3cyBhIGJsdWUgcmVjdGFuZ2xlIGJvcmRlciBhcm91bmQgdGhlIGNvbGxpc2lvbiBib3ggb2YgYSBsYWJlbFxuICAgIGRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzOiBmYWxzZSxcbiAgICAvLyBkcmF3cyBhIGdyZWVuIHJlY3RhbmdsZSBib3JkZXIgd2l0aGluIHRoZSB0ZXh0dXJlIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzOiBmYWxzZSxcbiAgICAvLyBzdXBwcmVzZXMgZmFkZS1pbiBvZiBsYWJlbHNcbiAgICBzdXBwcmVzc19sYWJlbF9mYWRlX2luOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvLyBEZWVwL3JlY3Vyc2l2ZSBtZXJnZSBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIGEgZGVzdGluYXRpb24gb2JqZWN0XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZU9iamVjdHMgKGRlc3QsIC4uLnNvdXJjZXMpIHtcbiAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW3NdO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSB0aGUgc291cmNlIGludG8gdGhlIGRlc3RpbmF0aW9uIGlmIGl0IGlzIGEgYSBub24tbnVsbCBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgICAgICAvLyAoZS5nLiBkb24ndCBtZXJnZSBhcnJheXMsIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNjYWxhciB2YWx1ZXM7IG51bGwgdmFsdWVzIHdpbGwgb3ZlcndyaXRlL2VyYXNlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUpXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzdFtrZXldICE9PSBudWxsICYmIHR5cGVvZiBkZXN0W2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRlc3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKGRlc3Rba2V5XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKHt9LCB2YWx1ZSk7IC8vIGRlc3RpbmF0aW9uIG5vdCBhbiBvYmplY3QsIG92ZXJ3cml0ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUgaWYgdGhlIHNvdXJjZSBwcm9wZXJ0eSBpczogYSBzY2FsYXIgKG51bWJlci9zdHJpbmcpLFxuICAgICAgICAgICAgLy8gYW4gYXJyYXksIG9yIGEgbnVsbCB2YWx1ZVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5kZWZpbmVkIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkXG4gICAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsImltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT0JCIHtcblxuICAgIGNvbnN0cnVjdG9yICh4LCB5LCBhLCB3LCBoKSB7XG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gW3csIGhdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYTtcbiAgICAgICAgdGhpcy5jZW50cm9pZCA9IFt4LCB5XTtcbiAgICAgICAgdGhpcy5xdWFkID0gW107XG4gICAgICAgIHRoaXMuYXhlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgbW92ZSAocHgsIHB5KSB7XG4gICAgXHR0aGlzLmNlbnRyb2lkID0gW3B4LCBweV07XG5cbiAgICBcdHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0RXh0ZW50ICgpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgYWFiYiA9IFtpbmYsIGluZiwgLWluZiwgLWluZl07XG5cbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICBhYWJiWzBdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzBdLCBhYWJiWzBdKTtcbiAgICAgICAgICAgIGFhYmJbMV0gPSBNYXRoLm1pbih0aGlzLnF1YWRbaV1bMV0sIGFhYmJbMV0pO1xuICAgICAgICAgICAgYWFiYlsyXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVswXSwgYWFiYlsyXSk7XG4gICAgICAgICAgICBhYWJiWzNdID0gTWF0aC5tYXgodGhpcy5xdWFkW2ldWzFdLCBhYWJiWzNdKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIGFhYmI7XG4gICAgfVxuXG4gICAgcGVycEF4ZXMgKCkge1xuICAgIFx0dGhpcy5heGVzWzBdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzNdKSk7XG4gICAgXHR0aGlzLmF4ZXNbMV0gPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5zdWIodGhpcy5xdWFkWzJdLCB0aGlzLnF1YWRbMV0pKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgIFx0bGV0IHggPSBbIE1hdGguY29zKHRoaXMuYW5nbGUpLCBNYXRoLnNpbih0aGlzLmFuZ2xlKV07XG4gICAgXHRsZXQgeSA9IFstTWF0aC5zaW4odGhpcy5hbmdsZSksIE1hdGguY29zKHRoaXMuYW5nbGUpXTtcblxuICAgIFx0eCA9IFZlY3Rvci5tdWx0KHgsIHRoaXMuZGltZW5zaW9uWzBdIC8gMi4wKTtcbiAgICBcdHkgPSBWZWN0b3IubXVsdCh5LCB0aGlzLmRpbWVuc2lvblsxXSAvIDIuMCk7XG5cbiAgICBcdHRoaXMucXVhZFswXSA9IFZlY3Rvci5zdWIoVmVjdG9yLnN1Yih0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLWxlZnRcbiAgICBcdHRoaXMucXVhZFsxXSA9IFZlY3Rvci5zdWIoVmVjdG9yLmFkZCh0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbMl0gPSBWZWN0b3IuYWRkKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbM10gPSBWZWN0b3IuYWRkKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLWxlZnRcblxuICAgIFx0dGhpcy5wZXJwQXhlcygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcm9qZWN0VG9BeGlzIChvYmIsIGF4aXMpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgbWluID0gaW5mO1xuICAgIFx0bGV0IG1heCA9IC1pbmY7XG5cbiAgICBcdGxldCBxdWFkID0gb2JiLnF1YWQ7XG5cbiAgICBcdC8vIGZvciBlYWNoIGF4aXMsIHByb2plY3Qgb2JiIHF1YWQgdG8gaXQgYW5kIGZpbmQgbWluIGFuZCBtYXggdmFsdWVzXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgbGV0IGQgPSAgVmVjdG9yLmRvdChxdWFkW2ldLCBheGlzKTtcbiAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgZCk7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGQpO1xuICAgIFx0fVxuXG4gICAgXHRyZXR1cm4gW21pbiwgbWF4XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXhpc0NvbGxpZGUgKG9iYl9hLCBvYmJfYiwgYXhlcykge1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICBcdFx0bGV0IGFfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9hLCBheGVzW2ldKTtcbiAgICBcdFx0bGV0IGJfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9iLCBheGVzW2ldKTtcblxuICAgIFx0XHRpZiAoYl9wcm9qWzBdID4gYV9wcm9qWzFdIHx8IGJfcHJvalsxXSA8IGFfcHJvalswXSkge1xuICAgIFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICBcdFx0fVxuICAgIFx0fVxuICAgIFx0cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGludGVyc2VjdChvYmJfYSwgb2JiX2IpIHtcbiAgICBcdHJldHVybiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYS5heGVzKSAmJiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYi5heGVzKTtcbiAgICB9XG5cbn1cblxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3Vic2NyaWJlTWl4aW4gKHRhcmdldCkge1xuXG4gICAgdmFyIGxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAvLyB2YXIgbGlzdGVuZXJzID0gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcblxuICAgICAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAvLyAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmVBbGwoKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgICAgICAgIC8vIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG59XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBNYXJrIHRocmVhZCBhcyBtYWluIG9yIHdvcmtlclxuY29uc3QgVGhyZWFkID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IFRocmVhZDtcblxudHJ5IHtcbiAgICBpZiAod2luZG93LmRvY3VtZW50ICE9PSBIVE1MRG9jdW1lbnQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSBmYWxzZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IHRydWU7XG4gICAgfVxufVxuY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2VsZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSB0cnVlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUGF0Y2ggZm9yIDNyZCBwYXJ0eSBsaWJzIHRoYXQgcmVxdWlyZSB0aGVzZSBnbG9iYWxzIHRvIGJlIHByZXNlbnQuIFNwZWNpZmljYWxseSwgRm9udEZhY2VPYnNlcnZlci5cbiAgICAgICAgLy8gQnJpdHRsZSBzb2x1dGlvbiBidXQgYWxsb3dzIHRoYXQgbGlicmFyeSB0byBsb2FkIG9uIHdvcmtlciB0aHJlYWRzLlxuICAgICAgICBzZWxmLndpbmRvdyA9IHsgZG9jdW1lbnQ6IHt9IH07XG4gICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLndpbmRvdy5kb2N1bWVudDtcbiAgICB9XG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIHV0aWxpdGllc1xuLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbnZhciBVdGlscztcbmV4cG9ydCBkZWZhdWx0IFV0aWxzID0ge307XG5cbi8vIEFkZCBhIGJhc2UgVVJMIGZvciBzY2hlbWVsZXNzIG9yIHByb3RvY29sLWxlc3MgVVJMc1xuLy8gRGVmYXVsdHMgdG8gYWRkaW5nIGN1cnJlbnQgd2luZG93IHByb3RvY29sIGFuZCBiYXNlLCBvciBhZGRzIGEgY3VzdG9tIGJhc2UgaWYgc3BlY2lmaWVkXG4vLyBNYXliZSB1c2UgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMgaWYgbW9yZSByb2J1c3QgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWRcblV0aWxzLmFkZEJhc2VVUkwgPSBmdW5jdGlvbiAodXJsLCBiYXNlKSB7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNjaGVtZWxlc3MsIGFkZCBwcm90b2NvbFxuICAgIGlmICh1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKSB7XG4gICAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIHVybDtcbiAgICB9XG4gICAgLy8gTm8gaHR0cChzKSBvciBkYXRhLCBhZGQgYmFzZVxuICAgIGVsc2UgaWYgKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pIDwgMCkge1xuICAgICAgICB2YXIgcmVsYXRpdmUgPSAodXJsWzBdICE9PSAnLycpO1xuICAgICAgICB2YXIgYmFzZV9pbmZvO1xuICAgICAgICBpZiAoYmFzZSkge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyAvLyB1c2UgYSB0ZW1wb3JhcnkgZWxlbWVudCB0byBwYXJzZSBVUkxcbiAgICAgICAgICAgIGJhc2VfaW5mby5ocmVmID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgICAgICAgbGV0IHBhdGggPSBVdGlscy5wYXRoRm9yVVJMKGJhc2VfaW5mby5ocmVmKTtcbiAgICAgICAgICAgIHVybCA9IHBhdGggKyB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFYXN5IHdheVxuICAgICAgICAgICAgaWYgKGJhc2VfaW5mby5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlX2luZm8ub3JpZ2luICsgJy8nICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFyZCB3YXkgKElFMTEpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gdXJsLm1hdGNoKC9eKChodHRwfGh0dHBzfGRhdGF8YmxvYik6XFwvXFwvW15cXC9dKlxcLykvKTtcbiAgICAgICAgICAgICAgICBvcmlnaW4gPSAob3JpZ2luICYmIG9yaWdpbi5sZW5ndGggPiAxKSA/IG9yaWdpblswXSA6ICcnO1xuICAgICAgICAgICAgICAgIHVybCA9IG9yaWdpbiArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufTtcblxuVXRpbHMucGF0aEZvclVSTCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnNlYXJjaCgvXihkYXRhfGJsb2IpOi8pID09PSAtMSkge1xuICAgICAgICBsZXQgcXMgPSB1cmwuaW5kZXhPZignPycpO1xuICAgICAgICBpZiAocXMgPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBxcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzaCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgICAgIGlmIChoYXNoID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgaGFzaCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cigwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59O1xuXG5VdGlscy5pc1JlbGF0aXZlVVJMID0gZnVuY3Rpb24gKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAhKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pID4gLTEgfHwgdXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJyk7XG59O1xuXG4vLyBSZXNvbHZlcyAnLi8nIGFuZCAnLi4vJyBjb21wb25lbnRzIGZyb20gcmVsYXRpdmUgcGF0aCwgdG8gZ2V0IGEgXCJmbGF0dGVuZWRcIiBwYXRoXG5VdGlscy5mbGF0dGVuUmVsYXRpdmVVUkwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgbGV0IGRpcnMgPSAodXJsIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGQgPSAxOyBkIDwgZGlycy5sZW5ndGg7IGQrKykge1xuICAgICAgICBpZiAoZGlyc1tkXSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLCAxKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaXJzW2RdID09PSAnLi4nKSB7XG4gICAgICAgICAgICBkID0gZCArIDA7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLTEsIDIpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJzLmpvaW4oJy8nKTtcbn07XG5cblV0aWxzLmV4dGVuc2lvbkZvclVSTCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICBsZXQgbGFzdF9kb3QgPSB1cmwubGFzdEluZGV4T2YoJy4nKTtcbiAgICBpZiAobGFzdF9kb3QgPiAtMSkge1xuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhsYXN0X2RvdCArIDEpO1xuICAgIH1cbn07XG5cbi8vIEFkZCBhIHNldCBvZiBxdWVyeSBzdHJpbmcgcGFyYW1zIHRvIGEgVVJMXG4vLyBwYXJhbXM6IGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzXG5VdGlscy5hZGRQYXJhbXNUb1VSTCA9IGZ1bmN0aW9uICh1cmwsIHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zIHx8IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgdmFyIHFzX2luZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICB2YXIgaGFzaF9pbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG5cbiAgICAvLyBTYXZlIGFuZCB0cmltIGhhc2hcbiAgICB2YXIgaGFzaCA9ICcnO1xuICAgIGlmIChoYXNoX2luZGV4ID4gLTEpIHtcbiAgICAgICAgaGFzaCA9IHVybC5zbGljZShoYXNoX2luZGV4KTtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2hfaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHF1ZXJ5IHN0cmluZ1xuICAgIGlmIChxc19pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcXNfaW5kZXggPSB1cmwubGVuZ3RoO1xuICAgICAgICB1cmwgKz0gJz8nO1xuICAgIH1cbiAgICBxc19pbmRleCsrOyAvLyBhZHZhbmNlZCBwYXN0ICc/J1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgc3RyaW5nIHBhcmFtc1xuICAgIHZhciB1cmxfcGFyYW1zID0gJyc7XG4gICAgZm9yICh2YXIgcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgdXJsX3BhcmFtcyArPSBgJHtwfT0ke3BhcmFtc1twXX0mYDtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgbmV3IHF1ZXJ5IHN0cmluZyBwYXJhbXMgYW5kIHJlc3RvcmUgaGFzaFxuICAgIC8vIE5PVEU6IGRvZXNuJ3QgcmVwbGFjZSBhbnkgdmFsdWVzIGFscmVhZHkgcHJlc2VudCBvbiBxdWVyeSBzdHJpbmcsIGp1c3QgaW5zZXJ0cyBkdXBlIHZhbHVlc1xuICAgIHVybCA9IHVybC5zbGljZSgwLCBxc19pbmRleCkgKyB1cmxfcGFyYW1zICsgdXJsLnNsaWNlKHFzX2luZGV4KSArIGhhc2g7XG5cbiAgICByZXR1cm4gdXJsO1xufTtcblxuLy8gQmFzaWMgU2FmYXJpIGRldGVjdGlvblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83OTQ0NDYwL2RldGVjdC1zYWZhcmktYnJvd3NlclxuVXRpbHMuaXNTYWZhcmkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59O1xuXG4vLyBQb2x5ZmlsbCAoZm9yIFNhZmFyaSBjb21wYXRpYmlsaXR5KVxuVXRpbHMuX2NyZWF0ZU9iamVjdFVSTCA9IHVuZGVmaW5lZDtcblV0aWxzLmNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBpZiAoVXRpbHMuX2NyZWF0ZU9iamVjdFVSTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFV0aWxzLl9jcmVhdGVPYmplY3RVUkwgPSAod2luZG93LlVSTCAmJiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCkgfHwgKHdpbmRvdy53ZWJraXRVUkwgJiYgd2luZG93LndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgVXRpbHMuX2NyZWF0ZU9iamVjdFVSTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgVXRpbHMuX2NyZWF0ZU9iamVjdFVSTCA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwgKG9yIHZlbmRvciBwcmVmaXgpIG5vdCBmb3VuZCwgdW5hYmxlIHRvIGNyZWF0ZSBsb2NhbCBibG9iIFVSTHNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChVdGlscy5fY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5fY3JlYXRlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbn07XG5cblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30pIHtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXF1ZXN0Lm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGlmIChbJ3RleHQnLCAnanNvbiddLmluZGV4T2YocmVxdWVzdC5yZXNwb25zZVR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdSZXF1ZXN0IGVycm9yIHdpdGggYSBzdGF0dXMgb2YgJyArIHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgJ3JlcXVlc3QnLCB7XG4gICAgICAgIHZhbHVlOiByZXF1ZXN0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn07XG5cblV0aWxzLnBhcnNlUmVzb3VyY2UgPSBmdW5jdGlvbiAoYm9keSkge1xuICAgIHZhciBkYXRhO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGpzeWFtbCAnanNvbicgb3B0aW9uIGFsbG93cyBkdXBsaWNhdGUga2V5c1xuICAgICAgICAvLyBLZWVwaW5nIHRoaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgc2hvdWxkIGNvbnNpZGVyIG1pZ3JhdGluZyB0byByZXF1aXJpbmdcbiAgICAgICAgLy8gdW5pcXVlIGtleXMsIGFzIHRoaXMgaXMgWUFNTCBzcGVjLiBCdXQgVGFuZ3JhbSBFUyBjdXJyZW50bHkgYWNjZXB0cyBkdXBlIGtleXMgYXMgd2VsbCxcbiAgICAgICAgLy8gc28gc2hvdWxkIGNvbnNpZGVyIGhvdyBiZXN0IHRvIHVuaWZ5LlxuICAgICAgICBkYXRhID0geWFtbC5zYWZlTG9hZChib2R5LCB7IGpzb246IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn07XG5cblV0aWxzLmxvYWRSZXNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIFV0aWxzLmlvKHNvdXJjZSkudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gVXRpbHMucGFyc2VSZXNvdXJjZShib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gTmVlZGVkIGZvciBvbGRlciBicm93c2VycyB0aGF0IHN0aWxsIHN1cHBvcnQgV2ViR0wgKFNhZmFyaSA2IGV0Yy4pXG5VdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAxMDAwIC82MCk7XG4gICAgICAgICAgICB9O1xuICAgIH1cbn07XG5cbi8vIFN0cmluZ2lmeSBhbiBvYmplY3QgaW50byBKU09OLCBidXQgY29udmVydCBmdW5jdGlvbnMgdG8gc3RyaW5nc1xuVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24oaywgdikge1xuICAgICAgICAvLyBDb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXJpYWxpemVkO1xufTtcblxuLy8gUmVjdXJzaXZlbHkgcGFyc2UgYW4gb2JqZWN0LCBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgc3RyaW5nIHByb3BlcnRpZXMgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb25zIGJhY2sgaW50byBmdW5jdGlvbnNcblV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgd3JhcCkge1xuICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLnN0cmluZ1RvRnVuY3Rpb24ob2JqLCB3cmFwKTtcbiAgICB9XG4gICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgZWxzZSBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgIG9ialtwXSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhvYmpbcF0sIHdyYXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59O1xuXG4vLyBDb252ZXJ0IHN0cmluZyBiYWNrIGludG8gYSBmdW5jdGlvblxuVXRpbHMuc3RyaW5nVG9GdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbCwgd3JhcCkge1xuICAgIC8vIFBhcnNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgYm9keVxuICAgIGxldCBmbWF0Y2ggPVxuICAgICAgICAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgIHZhbC5tYXRjaCgvXlxccypmdW5jdGlvblteKF0qXFwoKFteKV0qKVxcKVxccyo/XFx7KFtcXHNcXFNdKilcXH0kL20pO1xuXG4gICAgaWYgKGZtYXRjaCAmJiBmbWF0Y2gubGVuZ3RoID4gMikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHNyYyA9IGZtYXRjaFsyXTtcbiAgICAgICAgICAgIGxldCBhcmdzID0gZm1hdGNoWzFdLmxlbmd0aCA+IDAgJiYgZm1hdGNoWzFdLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICAgICAgYXJncyA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3MgOiBbJ2NvbnRleHQnXTsgLy8gZGVmYXVsdCB0byBzaW5nbGUgJ2NvbnRleHQnIGFyZ3VtZW50XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd3JhcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgd3JhcChzcmMpKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmFyZ3MsIHNyYyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBmYWxsLWJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgaWYgcGFyc2luZyBmYWlsZWRcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbi8vIERlZmF1bHQgdG8gYWxsb3dpbmcgaGlnaCBwaXhlbCBkZW5zaXR5XG4vLyBSZXR1cm5zIHRydWUgaWYgZGlzcGxheSBkZW5zaXR5IGNoYW5nZWRcblV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IHRydWU7XG5VdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBwcmV2ID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IChVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG4gICAgcmV0dXJuIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAhPT0gcHJldjtcbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbn1cblxuLy8gR2V0IFVSTCB0aGF0IHRoZSBjdXJyZW50IHNjcmlwdCB3YXMgbG9hZGVkIGZyb21cbi8vIElmIGN1cnJlbnRTY3JpcHQgaXMgbm90IGF2YWlsYWJsZSwgbG9vcHMgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBzZWFyY2hpbmcgZm9yIGEgbGlzdCBvZiBwcm92aWRlZCBwYXRoc1xuLy8gZS5nLiBVdGlscy5maW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuVXRpbHMuZmluZEN1cnJlbnRVUkwgPSBmdW5jdGlvbiAoLi4ucGF0aHMpIHtcbiAgICAvLyBGaW5kIGN1cnJlbnRseSBleGVjdXRpbmcgc2NyaXB0XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7XG4gICAgaWYgKHNjcmlwdCkge1xuICAgICAgICByZXR1cm4gc2NyaXB0LnNyYztcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRocykpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgb24gbG9vcGluZyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIGlmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgcz0wOyBzIDwgc2NyaXB0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgcGF0aCBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgIGlmIChzY3JpcHRzW3NdLnNyYy5pbmRleE9mKHBhdGgpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0c1tzXS5zcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gVXNlZCBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gcG93ZXItb2YtMiBhbmQgbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbi8vIFZpYTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcyMjI0Ny93ZWJnbC13YWl0LWZvci10ZXh0dXJlLXRvLWxvYWRcblV0aWxzLmlzUG93ZXJPZjIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59O1xuXG5VdGlscy5uZXh0UG93ZXJPZjIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2cyKHZhbHVlKSkpO1xufTtcblxuLy8gSW50ZXJwb2xhdGUgJ3gnIGFsb25nIGEgc2VyaWVzIG9mIGNvbnRyb2wgcG9pbnRzXG4vLyAncG9pbnRzJyBpcyBhbiBhcnJheSBvZiBjb250cm9sIHBvaW50cyBpbiB0aGUgZm9ybSBbeCwgeV1cbi8vXG4vLyBFeGFtcGxlOlxuLy8gICAgIENvbnRyb2wgcG9pbnRzOlxuLy8gICAgICAgICBbMCwgNV06ICB3aGVuIHg9MCwgeT01XG4vLyAgICAgICAgIFs0LCAxMF06IHdoZW4geD00LCB5PTEwXG4vL1xuLy8gICAgIFV0aWxzLmludGVycG9sYXRlKDIsIFtbMCwgNV0sIFs0LCAxMF1dKTtcbi8vICAgICAtPiBjb21wdXRlcyB4PTIsIGhhbGZ3YXkgYmV0d2VlbiB4PTAgYW5kIHg9NDogKDEwIC0gNSkgLyAyICs1XG4vLyAgICAgLT4gcmV0dXJucyA3LjVcbi8vXG4vLyBUT0RPOiBhZGQgb3RoZXIgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGJlc2lkZXMgbGluZWFyXG4vL1xuVXRpbHMuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbih4LCBwb2ludHMsIHRyYW5zZm9ybSkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCByZXNlbWJsZSBhIGxpc3Qgb2YgY29udHJvbCBwb2ludHMsIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvaW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG4gICAgZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG5cbiAgICB2YXIgeDEsIHgyLCBkLCB5LCB5MSwgeTI7XG5cbiAgICAvLyBNaW4gYm91bmRzXG4gICAgaWYgKHggPD0gcG9pbnRzWzBdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbMF1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1heCBib3VuZHNcbiAgICBlbHNlIGlmICh4ID49IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmluZCB3aGljaCBjb250cm9sIHBvaW50cyB4IGlzIGJldHdlZW5cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHggPj0gcG9pbnRzW2ldWzBdICYmIHggPCBwb2ludHNbaSsxXVswXSkge1xuICAgICAgICAgICAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgICAgICAgeDEgPSBwb2ludHNbaV1bMF07XG4gICAgICAgICAgICAgICAgeDIgPSBwb2ludHNbaSsxXVswXTtcblxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50c1tpXVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBwb2ludHNbaV1bMV0ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdW2NdIC0gcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHZhbHVlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV0gLSBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5O1xufTtcblxuLy8gSXRlcmF0b3JzIChFUzYgZ2VuZXJhdG9ycylcblxuLy8gSXRlcmF0b3IgZm9yIGtleS92YWx1ZSBwYWlycyBvZiBhbiBvYmplY3RcblV0aWxzLmVudHJpZXMgPSBmdW5jdGlvbiogKG9iaikge1xuICAgIGZvciAodmFyIGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldXTtcbiAgICB9XG59O1xuXG4vLyBJdGVyYXRvciBmb3IgdmFsdWVzIG9mIGFuIG9iamVjdFxuVXRpbHMudmFsdWVzID0gZnVuY3Rpb24qIChvYmopIHtcbiAgICBmb3IgKHZhciBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICB9XG59O1xuXG4vLyBSZWN1cnNpdmUgaXRlcmF0b3JzIGZvciBhbGwgcHJvcGVydGllcyBvZiBhbiBvYmplY3QsIG5vIG1hdHRlciBob3cgZGVlcGx5IG5lc3RlZFxuLy8gVE9ETzogZml4IGZvciBjaXJjdWxhciBzdHJ1Y3R1cmVzXG5VdGlscy5yZWN1cnNlRW50cmllcyA9IGZ1bmN0aW9uKiAob2JqKSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICBpZiAob2JqW2tleV0pIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldLCBvYmpdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogVXRpbHMucmVjdXJzZUVudHJpZXMob2JqW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuVXRpbHMucmVjdXJzZVZhbHVlcyA9IGZ1bmN0aW9uKiAob2JqKSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICBpZiAob2JqW2tleV0pIHtcbiAgICAgICAgICAgIHlpZWxkIG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogVXRpbHMucmVjdXJzZVZhbHVlcyhvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5VdGlscy5yYWRUb0RlZyA9IGZ1bmN0aW9uIChyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiAxODAgLyBNYXRoLlBJO1xufTtcblxuVXRpbHMudG9DU1NDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIGlmIChjb2xvclszXSA9PT0gMSkgeyAvLyBmdWxsIG9wYWNpdHlcbiAgICAgICAgcmV0dXJuIGByZ2IoJHtjb2xvci5zbGljZSgwLCAzKS5tYXAoYyA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgIH1cbiAgICAvLyBSR0IgaXMgYmV0d2VlbiBbMCwgMjU1XSBvcGFjaXR5IGlzIGJldHdlZW4gWzAsIDFdXG4gICAgcmV0dXJuIGByZ2JhKCR7Y29sb3IubWFwKChjLCBpKSA9PiAoaSA8IDMgJiYgTWF0aC5yb3VuZChjICogMjU1KSkgfHwgYykuam9pbignLCAnKX0pYDtcbn07XG5cblV0aWxzLnBvaW50SW5UaWxlID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50WzBdID49IDAgJibCoHBvaW50WzFdID4gLUdlby50aWxlX3NjYWxlICYmIHBvaW50WzBdIDwgR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMV0gPD0gMDtcbn07XG5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzYxNjQ2MS9nZW5lcmF0ZS1hLWhhc2gtZnJvbS1zdHJpbmctaW4tamF2YXNjcmlwdC1qcXVlcnlcblV0aWxzLmhhc2hTdHJpbmcgPSBmdW5jdGlvbihzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGhhc2ggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBsZXQgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNocjtcbiAgICAgICAgaGFzaCB8PSAwO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaDtcbn07XG5cblV0aWxzLmRlYm91bmNlID0gZnVuY3Rpb24gKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLFxuICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgbGV0IGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykge1xuICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwibGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmxldCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uLy4uL3BhY2thZ2UuanNvbicsICd1dGY4JykpO1xubGV0IHZlcnNpb247XG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uID0gJ3YnICsgcGtnLnZlcnNpb247XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBXb3JrZXJCcm9rZXIgcm91dGVzIG1lc3NhZ2VzIGJldHdlZW4gd2ViIHdvcmtlcnMgYW5kIHRoZSBtYWluIHRocmVhZCwgYWxsb3dpbmcgZm9yIHNpbXBsZXJcbi8vIGFzeW5jIGNvZGUgdmlhIHByb21pc2VzLiBFeGFtcGxlIHVzYWdlOlxuLy9cbi8vIEluIHdlYiB3b3JrZXIsIHJlZ2lzdGVyIHNlbGYgYXMgYSBjYWxsYWJsZSBcInRhcmdldFwiLCBhbmQgZGVmaW5lIGEgbWV0aG9kOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG4vL1xuLy8gICAgIHNlbGYuc3F1YXJlID0gZnVuY3Rpb24gKHgpIHtcbi8vICAgICAgICAgcmV0dXJuIHggKiB4O1xuLy8gICAgIH07XG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGludm9rZSB0aGF0IG1ldGhvZCBhbmQgcmVjZWl2ZSB0aGUgcmVzdWx0IChpZiBhbnkpIGFzIGEgcHJvbWlzZS5cbi8vXG4vLyAgICAgd29ya2VyID0gbmV3IFdvcmtlciguLi4pO1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuc3F1YXJlJywgNSkudGhlbihmdW5jdGlvbih5KSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgMjVcbi8vXG4vLyBBc3luYyBjb2RlOlxuLy9cbi8vIEZvciBzeW5jaHJvbm91cyBjb2RlIHRoYXQgbXVzdCBwYXNzIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBtYWluIHRocmVhZCwgdGhlIGZ1bmN0aW9uIGNhbiBzaW1wbHlcbi8vIHJldHVybiBhbiBpbW1lZGlhdGUgdmFsdWUgKHNlZSBleGFtcGxlIGFib3ZlKS4gRm9yIGNhc2VzIHdoZXJlIHRoZSB3b3JrZXIgbWV0aG9kIG5lZWRzIHRvIHJ1blxuLy8gYXN5bmNocm9ub3VzIGNvZGUsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgcHJvbWlzZSwgYW5kIHRoZSByZXNvbHZlZCBvciByZWplY3RlZCB2YWx1ZSB3aWxsXG4vLyBiZSBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuLy9cbi8vIEVycm9yIGhhbmRsaW5nOlxuLy9cbi8vIElmIHRoZSB3b3JrZXIgbWV0aG9kIGVpdGhlciB0aHJvd3MgYW4gZXJyb3IsIG9yIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQsIGl0IHdpbGwgYmVcbi8vIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbi4gVGhlc2UgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OlxuLy9cbi8vICAgICBJbiB3b3JrZXIsIHRocm93aW5nIGFuIGVycm9yOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gd29ya2VyLCByZXR1cm5pbmcgYSByZWplY3RlZCBwcm9taXNlOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJykpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiBtYWluIHRocmVhZCwgYm90aCBlcnJvcnMgYXJlIHJlY2VpdmVkIGFzIGEgcHJvbWlzZSByZWplY3Rpb246XG4vL1xuLy8gICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5icm9rZW4nKS50aGVuKFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MhJyk7XG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IhJywgZXJyb3IpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICAtPiBwcmludHMgJ2Vycm9yISBlcnJvciBpbiB3b3JrZXInXG4vL1xuLy8gQ2FsbGluZyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZDpcbi8vXG4vLyBUaGUgc2FtZSBzdHlsZSBvZiBjYWxscyBjYW4gYmUgbWFkZSAqZnJvbSogYSB3ZWIgd29ya2VyLCB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZSBBUEkgaXMgdGhlIHNhbWVcbi8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCwgJ3dvcmtlcicsIGlzIG5vdCBuZWVkZWQgZm9yIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgpLFxuLy8gc2luY2UgdGhlIG1haW4gdGhyZWFkIGlzIHRoZSBpbXBsaWNpdCB0YXJnZXQuXG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGRlZmluZSBhIG1ldGhvZCBhbmQgcmVnaXN0ZXIgaXQ6XG4vL1xuLy8gICAgIHZhciBnZW9tZXRyeSA9IHtcbi8vICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih4LCB5KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnZ2VvbWV0cnknLCBnZW9tZXRyeSk7XG4vL1xuLy8gSW4gd29ya2VyIHRocmVhZCk6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnZ2VvbWV0cnkubGVuZ3RoJywgMywgNCkudGhlbihmdW5jdGlvbihkKSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGQpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgNVxuLy9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxudmFyIFdvcmtlckJyb2tlcjtcbmV4cG9ydCBkZWZhdWx0IFdvcmtlckJyb2tlciA9IHt9O1xuXG4vLyBHbG9iYWwgbGlzdCBvZiBhbGwgd29ya2VyIG1lc3NhZ2VzXG4vLyBVbmlxdWVseSB0cmFja3MgZXZlcnkgY2FsbCBtYWRlIGJldHdlZW4gbWFpbiB0aHJlYWQgYW5kIGEgd29ya2VyXG52YXIgbWVzc2FnZV9pZCA9IDA7XG52YXIgbWVzc2FnZXMgPSB7fTtcblxuLy8gUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlciB0aHJlYWRcbnZhciB0YXJnZXRzID0ge307XG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKG5hbWUsIHRhcmdldCkge1xuICAgIHRhcmdldHNbbmFtZV0gPSB0YXJnZXQ7XG59O1xuXG4vLyBHaXZlbiBhIGRvdC1ub3RhdGlvbi1zdHlsZSBtZXRob2QgbmFtZSwgZS5nLiAnT2JqZWN0Lm9iamVjdC5tZXRob2QnLFxuLy8gZmluZCB0aGUgb2JqZWN0IHRvIGNhbGwgdGhlIG1ldGhvZCBvbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0c1xuZnVuY3Rpb24gZmluZFRhcmdldCAobWV0aG9kKSB7XG4gICAgdmFyIGNoYWluID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYWluID0gbWV0aG9kLnNwbGl0KCcuJyk7XG4gICAgICAgIG1ldGhvZCA9IGNoYWluLnBvcCgpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzO1xuXG4gICAgZm9yIChsZXQgbT0wOyBtIDwgY2hhaW4ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgaWYgKHRhcmdldFtjaGFpblttXV0pIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtjaGFpblttXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21ldGhvZCwgdGFyZ2V0XTtcbn1cblxuLy8gTWFpbiB0aHJlYWQ6XG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2Vcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwTWFpblRocmVhZCAoKSB7XG5cbiAgICB2YXIgd29ya2VyX2lkID0gMDtcbiAgICB2YXIgd29ya2VycyA9IG5ldyBNYXAoKTtcblxuICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIGEgd29ya2VyLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIHdvcmtlcjogb25lIG9yIG1vcmUgd2ViIHdvcmtlciBpbnN0YW5jZXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byAoc2luZ2xlIHZhbHVlIG9yIGFycmF5KVxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIGluIHRoZSB3b3JrZXJcbiAgICAvLyAgIC0gbWVzc2FnZTogc3ByZWFkIG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSB3b3JrZXIgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKHdvcmtlciwgbWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgd29ya2VyIHNwZWNpZmllZCwgcG9zdCB0byBtdWx0aXBsZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3b3JrZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgd29ya2VyLm1hcCh3ID0+IFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3LCBtZXRob2QsIC4uLm1lc3NhZ2UpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdtYWluX3NlbmQnLCAgICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBtZXNzYWdlX2lkLCAgICAgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSwgZm9yIGxpZmUgb2YgcHJvZ3JhbVxuICAgICAgICAgICAgbWV0aG9kLCAgICAgICAgICAgICAgICAgLy8gd2lsbCBkaXNwYXRjaCB0byBhIGZ1bmN0aW9uIG9mIHRoaXMgbmFtZSB3aXRoaW4gdGhlIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2R9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEFkZCBhIHdvcmtlciB0byBjb21tdW5pY2F0ZSB3aXRoIC0gZWFjaCB3b3JrZXIgbXVzdCBiZSByZWdpc3RlcmVkIGZyb20gdGhlIG1haW4gdGhyZWFkXG4gICAgV29ya2VyQnJva2VyLmFkZFdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgaWYgKCEod29ya2VyIGluc3RhbmNlb2YgV29ya2VyKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGFkZCBub24tV29ya2VyIG9iamVjdGAsIHdvcmtlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcmVkIHdvcmtlcnNcbiAgICAgICAgd29ya2Vycy5zZXQod29ya2VyLCB3b3JrZXJfaWQrKyk7XG5cbiAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJNYWluVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSB3b3JrZXIsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGluaXRpYXRpbmcgYSBjYWxsIGZyb20gdGhlIHdvcmtlciwgZGlzcGF0Y2ggdGhlbSxcbiAgICAgICAgICAgIC8vIGFuZCBzZW5kIGFueSByZXR1cm4gdmFsdWUgYmFjayB0byB0aGUgd29ya2VyXG4gICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG9iamVjdCBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLnJlbW92ZVdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgaWYgKCF3b3JrZXJzLmhhcyh3b3JrZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgcmVtb3ZlIHVucmVnaXN0ZXJlZCBvYmplY3RgLCB3b3JrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2Vycy5kZWxldGUod29ya2VyKTtcbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIGV2ZW50IGhhbmRsZXJzIGZyb20gd29ya2VyIGFzIHdlbGw/XG4gICAgfTtcblxuICAgIC8vIEV4cG9zZSBmb3IgZGVidWdnaW5nXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgfTtcblxuICAgIFdvcmtlckJyb2tlci5nZXRNZXNzYWdlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlX2lkO1xuICAgIH07XG5cbn1cblxuLy8gV29ya2VyIHRocmVhZHM6XG4vLyAtIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuLy8gLSBTZW5kIG1lc3NhZ2VzIHRvIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBXb3JrZXJUaHJlYWQgKCkge1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBtYWluIHRocmVhZFxuICAgIC8vICAgLSBtZXNzYWdlOiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgbWFpbiB0aHJlYWQgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnd29ya2VyX3NlbmQnLCAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgbWV0aG9kIG9mIHRoaXMgbmFtZSBvbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlcldvcmtlclRocmVhZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fcmVwbHknKSB7XG4gICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgIGlmIChtZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWFpbiB0aHJlYWQsIGRpc3BhdGNoIHRoZW0sIGFuZCBzZW5kIGJhY2sgYSByZXBseVxuICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIHdvcmtlciBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtZXRob2QgPSAodHlwZW9mIHRhcmdldFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpICYmIHRhcmdldFttZXRob2RfbmFtZV07XG5cbiAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBiZWNhdXNlIHdvcmtlciBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZW5kIHJldHVybiB2YWx1ZSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gQXN5bmMgcmVzdWx0XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZXN1bHRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHJlc3VsdC50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbn1cblxuLy8gU3BlY2lhbCB2YWx1ZSB3cmFwcGVyLCB0byBpbmRpY2F0ZSB0aGF0IHdlIHdhbnQgdG8gZmluZCBhbmQgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZVxuV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzID0gZnVuY3Rpb24gKC4uLnZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoLi4udmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRyYW5zZmVyYWJsZXMgPSBmaW5kVHJhbnNmZXJhYmxlcyh0aGlzLnZhbHVlKTtcbn07XG5cbi8vIEJ1aWxkIGEgbGlzdCBvZiB0cmFuc2ZlcmFibGUgb2JqZWN0cyBmcm9tIGEgc291cmNlIG9iamVjdFxuLy8gUmV0dXJucyBhIGxpc3Qgb2YgaW5mbyBhYm91dCBlYWNoIHRyYW5zZmVyYWJsZTpcbi8vICAgLSBvYmplY3Q6IHRoZSBhY3R1YWwgdHJhbnNmZXJhYmxlIG9iamVjdFxuLy8gICAtIHBhcmVudDogdGhlIHBhcmVudCBvYmplY3QgdGhhdCB0aGUgdHJhbnNmZXJhYmxlIGlzIGEgcHJvcGVydHkgb2YgKGlmIGFueSlcbi8vICAgLSBwcm9wZXJ0eTogdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHRyYW5zZmVyYWJsZSBvbiB0aGUgcGFyZW50IG9iamVjdCAoaWYgYW55KVxuLy8gVE9ETzogYWRkIG9wdGlvbiBpbiBjYXNlIHlvdSBET04nVCB3YW50IHRvIHRyYW5zZmVyIG9iamVjdHNcbmZ1bmN0aW9uIGZpbmRUcmFuc2ZlcmFibGVzKHNvdXJjZSwgcGFyZW50ID0gbnVsbCwgcHJvcGVydHkgPSBudWxsLCBsaXN0ID0gW10pIHtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAvLyBDaGVjayBlYWNoIGFycmF5IGVsZW1lbnRcbiAgICAgICAgc291cmNlLmZvckVhY2goKHgsIGkpID0+IGZpbmRUcmFuc2ZlcmFibGVzKHgsIHNvdXJjZSwgaSwgbGlzdCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJcyB0aGUgb2JqZWN0IGEgdHJhbnNmZXJhYmxlIGFycmF5IGJ1ZmZlcj9cbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goeyBvYmplY3Q6IHNvdXJjZSwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPciBsb29rcyBsaWtlIGEgdHlwZWQgYXJyYXkgKGhhcyBhbiBhcnJheSBidWZmZXIgcHJvcGVydHkpP1xuICAgICAgICBlbHNlIGlmIChzb3VyY2UuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLmJ1ZmZlciwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgZWFjaCBwcm9wZXJ0eVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZmluZFRyYW5zZmVyYWJsZXMoc291cmNlW3Byb3BdLCBzb3VyY2UsIHByb3AsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyBSZW1vdmUgbmV1dGVyZWQgdHJhbnNmZXJhYmxlcyBmcm9tIHBhcmVudCBvYmplY3RzLCBhcyB0aGV5IHNob3VsZCBubyBsb25nZXIgYmUgYWNjZXNzZWQgYWZ0ZXIgdHJhbnNmZXJcbmZ1bmN0aW9uIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmFuc2ZlcmFibGVzLmZpbHRlcih0ID0+IHQucGFyZW50ICYmIHQucHJvcGVydHkpLmZvckVhY2godCA9PiBkZWxldGUgdC5wYXJlbnRbdC5wcm9wZXJ0eV0pO1xufVxuXG4vLyBNZXNzYWdlIHBheWxvYWQgY2FuIGJlIHN0cmluZ2lmaWVkIGZvciBmYXN0ZXIgdHJhbnNmZXIsIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgdHJhbnNmZXJhYmxlIG9iamVjdHNcbmZ1bmN0aW9uIG1heWJlRW5jb2RlIChwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKSB7XG4gICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5cbi8vIFBhcnNlIHN0cmluZ2lmaWVkIG1lc3NhZ2UgcGF5bG9hZFxuZnVuY3Rpb24gbWF5YmVEZWNvZGUgKGRhdGEpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhKTtcbn1cblxuLy8gU2V0dXAgdGhpcyB0aHJlYWQgYXMgYXBwcm9wcmlhdGVcbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIHNldHVwTWFpblRocmVhZCgpO1xufVxuXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgIHNldHVwV29ya2VyVGhyZWFkKCk7XG59XG4iLCIvKioqIFZlY3RvciBmdW5jdGlvbnMgLSB2ZWN0b3JzIHByb3ZpZGVkIGFzIFt4LCB5LCB6XSBhcnJheXMgKioqL1xuXG52YXIgVmVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgVmVjdG9yID0ge307XG5cblZlY3Rvci5zZXQgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBWID0gW107XG4gICAgdmFyIGxpbSA9IHYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgVltpXSA9IHZbaV07XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuVmVjdG9yLm5lZyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXSAqIC0xO1xuICAgIH1cbiAgICByZXR1cm4gVjtcbn07XG5cbi8vIEFkZGl0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuYWRkID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgdltpXSA9IHYxW2ldICsgdjJbaV07XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gU3Vic3RyYWN0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3Iuc3ViID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gLSB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG5WZWN0b3Iuc2lnbmVkX2FyZWEgPSBmdW5jdGlvbiAodjEsIHYyLCB2Mykge1xuICAgIHJldHVybiAodjJbMF0tdjFbMF0pKih2M1sxXS12MVsxXSkgLSAodjNbMF0tdjFbMF0pKih2MlsxXS12MVsxXSk7XG59O1xuXG4vLyBNdWx0aXBsaWNhdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLm11bHQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgbGVuID0gdjEubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgaWYgKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gTXVsaXRwbHkgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE11bHRpcGx5IHR3byB2ZWN0b3JzXG4gICAgICAgIGxlbiA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAqIHYyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gRGl2aXNpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5kaXYgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgaTtcbiAgICBpZih0eXBlb2YgdjIgPT09ICdudW1iZXInKXtcbiAgICAgICAgLy8gRGl2aWRlIGJ5IHNjYWxhclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXZpZGUgdG8gdmVjdG9yc1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBHZXQgMkQgcGVycGVuZGljdWxhclxuVmVjdG9yLnBlcnAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFsgdjJbMV0gLSB2MVsxXSxcbiAgICAgICAgICAgICB2MVswXSAtIHYyWzBdIF07XG59O1xuXG4vLyBHZXQgMkQgdmVjdG9yIHJvdGF0ZWRcblZlY3Rvci5yb3QgPSBmdW5jdGlvbiAodiwgYSkge1xuICAgIHZhciBjID0gTWF0aC5jb3MoYSk7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihhKTtcbiAgICByZXR1cm4gW3ZbMF0gKiBjIC0gdlsxXSAqIHMsXG4gICAgICAgICAgICB2WzBdICogcyArIHZbMV0gKiBjXTtcbn07XG5cbi8vIEdldCAyRCBoZWFkaW5nIGFuZ2xlXG5WZWN0b3IuYW5nbGUgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeSx4KTtcbn07XG5cbi8vIEdldCBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG5WZWN0b3IuYW5nbGVCZXR3ZWVuID0gZnVuY3Rpb24oQSwgQil7XG4gICAgdmFyIGRlbHRhID0gVmVjdG9yLmRvdChBLCBCKTtcbiAgICBpZiAoZGVsdGEgPCAtMSkge1xuICAgICAgICBkZWx0YSA9IC0xO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5hY29zKGRlbHRhKTtcbn07XG5cbi8vIENvbXBhcmUgdHdvIHBvaW50c1xuVmVjdG9yLmlzRXF1YWwgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIGxlbiA9IHYxLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmICh2MVtpXSAhPT0gdjJbaV0pe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aCBzcXVhcmVkXG5WZWN0b3IubGVuZ3RoU3EgPSBmdW5jdGlvbiAodilcbntcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl0pO1xuICAgIH1cbn07XG5cbi8vIFZlY3RvciBsZW5ndGhcblZlY3Rvci5sZW5ndGggPSBmdW5jdGlvbiAodilcbntcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFZlY3Rvci5sZW5ndGhTcSh2KSk7XG59O1xuXG4vLyBOb3JtYWxpemUgYSB2ZWN0b3JcblZlY3Rvci5ub3JtYWxpemUgPSBmdW5jdGlvbiAodilcbntcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGQsIHZbMl0gLyBkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWzAsIDAsIDBdO1xuICAgIH1cbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcblxuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgfVxuXG59XG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9pcy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvbWF0aC9sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zZXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9nZXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCJub2RlX21vZHVsZXMvYml0LXR3aWRkbGUvdHdpZGRsZS5qcyIsIm5vZGVfbW9kdWxlcy9ib3gtaW50ZXJzZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL2JydXRlLmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL2ludGVyc2VjdC5qcyIsIm5vZGVfbW9kdWxlcy9ib3gtaW50ZXJzZWN0L2xpYi9tZWRpYW4uanMiLCJub2RlX21vZHVsZXMvYm94LWludGVyc2VjdC9saWIvcGFydGl0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2JveC1pbnRlcnNlY3QvbGliL3NvcnQuanMiLCJub2RlX21vZHVsZXMvYm94LWludGVyc2VjdC9saWIvc3dlZXAuanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vbWF0aC9sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hhcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ludm9rZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fa2V5b2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21ldGEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2R1cC9kdXAuanMiLCJub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9mb250ZmFjZW9ic2VydmVyL2ZvbnRmYWNlb2JzZXJ2ZXIuc3RhbmRhbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvc2ltcGxpZnkuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvaW52ZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2NvcHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2xvb2tBdC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L211bHRpcGx5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvcGVyc3BlY3RpdmUuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9zY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3RyYW5zbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1zaGFkZXItZXJyb3JzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYmluYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy91bmRlZmluZWQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWVyZ2UuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3BhaXJzLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2Jhc2U2NC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvY29tcHJlc3NlZE9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvY29tcHJlc3Npb25zLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZGVmYXVsdHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2V4dGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2xvYWQuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9ub2RlanNVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvQXJyYXlSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9EYXRhUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvTm9kZUJ1ZmZlclJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL1N0cmluZ1JlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL1VpbnQ4QXJyYXlSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9yZWFkZXJGb3IuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3NpZ25hdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NvbnZlcnRXb3JrZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9DcmMzMlByb2JlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vRGF0YVdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0dlbmVyaWNXb3JrZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9TdHJlYW1IZWxwZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N1cHBvcnQuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3V0ZjguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBFbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBFbnRyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvemlwT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvbWF0Y2gtZmVhdHVyZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL3BiZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24vdG9wb2pzb24uanMiLCJub2RlX21vZHVsZXMvdHlwZWRhcnJheS1wb29sL3Bvb2wuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsInNyYy9idWlsZGVycy9jb21tb24uanMiLCJzcmMvYnVpbGRlcnMvcG9pbnRzLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlnb25zLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlsaW5lcy5qcyIsInNyYy9jYW1lcmEuanMiLCJzcmMvZ2VvLmpzIiwic3JjL2dsL2NvbnN0YW50cy5qcyIsInNyYy9nbC9jb250ZXh0LmpzIiwic3JjL2dsL2V4dGVuc2lvbnMuanMiLCJzcmMvZ2wvZ2xzbC5qcyIsInNyYy9nbC9yZW5kZXJfc3RhdGUuanMiLCJzcmMvZ2wvc2hhZGVyX3Byb2dyYW0uanMiLCJzcmMvZ2wvdGV4dHVyZS5qcyIsInNyYy9nbC92YW8uanMiLCJzcmMvZ2wvdmJvX21lc2guanMiLCJzcmMvZ2wvdmVydGV4X2RhdGEuanMiLCJzcmMvZ2wvdmVydGV4X2VsZW1lbnRzLmpzIiwic3JjL2dsL3ZlcnRleF9sYXlvdXQuanMiLCJzcmMvbGFiZWxzL2NvbGxpc2lvbi5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3JlcGVhdF9ncm91cC5qcyIsInNyYy9sZWFmbGV0X2xheWVyLmpzIiwic3JjL2xpZ2h0LmpzIiwic3JjL21hdGVyaWFsLmpzIiwic3JjL21vZHVsZS5qcyIsInNyYy9zY2VuZS5qcyIsInNyYy9zY2VuZV9idW5kbGUuanMiLCJzcmMvc2NlbmVfbG9hZGVyLmpzIiwic3JjL3NjZW5lX3dvcmtlci5qcyIsInNyYy9zZWxlY3Rpb24uanMiLCJzcmMvc291cmNlcy9kYXRhX3NvdXJjZS5qcyIsInNyYy9zb3VyY2VzL2dlb2pzb24uanMiLCJzcmMvc291cmNlcy9tdnQuanMiLCJzcmMvc291cmNlcy9yYXN0ZXIuanMiLCJzcmMvc291cmNlcy90b3BvanNvbi5qcyIsInNyYy9zdHlsZXMvbGF5ZXIuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2Rhc2hhcnJheS5qcyIsInNyYy9zdHlsZXMvbGluZXMvbGluZXMuanMiLCJzcmMvc3R5bGVzL3BvaW50cy9wb2ludHMuanMiLCJzcmMvc3R5bGVzL3BvbHlnb25zL3BvbHlnb25zLmpzIiwic3JjL3N0eWxlcy9yYXN0ZXIvcmFzdGVyLmpzIiwic3JjL3N0eWxlcy9zdHlsZS5qcyIsInNyYy9zdHlsZXMvc3R5bGVfbWFuYWdlci5qcyIsInNyYy9zdHlsZXMvc3R5bGVfcGFyc2VyLmpzIiwic3JjL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0LmpzIiwic3JjL3N0eWxlcy90ZXh0L2ZvbnRfbWFuYWdlci5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0LmpzIiwic3JjL3N0eWxlcy90ZXh0L3RleHRfbGFiZWxzLmpzIiwic3JjL3N0eWxlcy90ZXh0L3RleHRfc2V0dGluZ3MuanMiLCJzcmMvdGlsZS5qcyIsInNyYy90aWxlX21hbmFnZXIuanMiLCJzcmMvdGlsZV9weXJhbWlkLmpzIiwic3JjL3V0aWxzL2RlYnVnX3NldHRpbmdzLmpzIiwic3JjL3V0aWxzL2Vycm9ycy5qcyIsInNyYy91dGlscy9nbC1tYXRyaXguanMiLCJzcmMvdXRpbHMvbG9nLmpzIiwic3JjL3V0aWxzL21lZGlhX2NhcHR1cmUuanMiLCJzcmMvdXRpbHMvbWVyZ2UuanMiLCJzcmMvdXRpbHMvb2JiLmpzIiwic3JjL3V0aWxzL3N1YnNjcmliZS5qcyIsInNyYy91dGlscy90aHJlYWQuanMiLCJzcmMvdXRpbHMvdXRpbHMuanMiLCJzcmMvdXRpbHMvdmVyc2lvbi5qcyIsInNyYy91dGlscy93b3JrZXJfYnJva2VyLmpzIiwic3JjL3ZlY3Rvci5qcyIsInNyYy92aWV3LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNU5BOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN2VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2piQTs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzd2REE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7O0FDQUE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBOztBQ0ZBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25nQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1cEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixnQkFBdkIsRUFBeUMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQXBCLEVBQXVCLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBMUMsRUFBNkMsS0FBSyxJQUFsRCxDQUF6QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssZ0JBQWpEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixzQkFBdEIsRUFBOEMsZ0JBQU0sa0JBQXBEOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxZQUFaLENBQXlCLE9BQXpCO0FBQ0g7Ozs7O2tCQWpUZ0IsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gcmF3QXNhcCBwcm92aWRlcyBldmVyeXRoaW5nIHdlIG5lZWQgZXhjZXB0IGV4Y2VwdGlvbiBtYW5hZ2VtZW50LlxudmFyIHJhd0FzYXAgPSByZXF1aXJlKFwiLi9yYXdcIik7XG4vLyBSYXdUYXNrcyBhcmUgcmVjeWNsZWQgdG8gcmVkdWNlIEdDIGNodXJuLlxudmFyIGZyZWVUYXNrcyA9IFtdO1xuLy8gV2UgcXVldWUgZXJyb3JzIHRvIGVuc3VyZSB0aGV5IGFyZSB0aHJvd24gaW4gcmlnaHQgb3JkZXIgKEZJRk8pLlxuLy8gQXJyYXktYXMtcXVldWUgaXMgZ29vZCBlbm91Z2ggaGVyZSwgc2luY2Ugd2UgYXJlIGp1c3QgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuXG52YXIgcGVuZGluZ0Vycm9ycyA9IFtdO1xudmFyIHJlcXVlc3RFcnJvclRocm93ID0gcmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIodGhyb3dGaXJzdEVycm9yKTtcblxuZnVuY3Rpb24gdGhyb3dGaXJzdEVycm9yKCkge1xuICAgIGlmIChwZW5kaW5nRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBwZW5kaW5nRXJyb3JzLnNoaWZ0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGxzIGEgdGFzayBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHJldHVybmluZywgaW4gaXRzIG93biBldmVudCwgd2l0aCBwcmlvcml0eVxuICogb3ZlciBvdGhlciBldmVudHMgbGlrZSBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlcGFpbnQuIEFuIGVycm9yIHRocm93biBmcm9tIGFuXG4gKiBldmVudCB3aWxsIG5vdCBpbnRlcnJ1cHQsIG5vciBldmVuIHN1YnN0YW50aWFsbHkgc2xvdyBkb3duIHRoZSBwcm9jZXNzaW5nIG9mXG4gKiBvdGhlciBldmVudHMsIGJ1dCB3aWxsIGJlIHJhdGhlciBwb3N0cG9uZWQgdG8gYSBsb3dlciBwcmlvcml0eSBldmVudC5cbiAqIEBwYXJhbSB7e2NhbGx9fSB0YXNrIEEgY2FsbGFibGUgb2JqZWN0LCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vXG4gKiBhcmd1bWVudHMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYXNhcDtcbmZ1bmN0aW9uIGFzYXAodGFzaykge1xuICAgIHZhciByYXdUYXNrO1xuICAgIGlmIChmcmVlVGFza3MubGVuZ3RoKSB7XG4gICAgICAgIHJhd1Rhc2sgPSBmcmVlVGFza3MucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmF3VGFzayA9IG5ldyBSYXdUYXNrKCk7XG4gICAgfVxuICAgIHJhd1Rhc2sudGFzayA9IHRhc2s7XG4gICAgcmF3QXNhcChyYXdUYXNrKTtcbn1cblxuLy8gV2Ugd3JhcCB0YXNrcyB3aXRoIHJlY3ljbGFibGUgdGFzayBvYmplY3RzLiAgQSB0YXNrIG9iamVjdCBpbXBsZW1lbnRzXG4vLyBgY2FsbGAsIGp1c3QgbGlrZSBhIGZ1bmN0aW9uLlxuZnVuY3Rpb24gUmF3VGFzaygpIHtcbiAgICB0aGlzLnRhc2sgPSBudWxsO1xufVxuXG4vLyBUaGUgc29sZSBwdXJwb3NlIG9mIHdyYXBwaW5nIHRoZSB0YXNrIGlzIHRvIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIHJlY3ljbGVcbi8vIHRoZSB0YXNrIG9iamVjdCBhZnRlciBpdHMgc2luZ2xlIHVzZS5cblJhd1Rhc2sucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy50YXNrLmNhbGwoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoYXNhcC5vbmVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGhvb2sgZXhpc3RzIHB1cmVseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAgICAgICAgIC8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdFxuICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBpdHMgZXhpc3RlbmNlLlxuICAgICAgICAgICAgYXNhcC5vbmVycm9yKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEluIGEgd2ViIGJyb3dzZXIsIGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC4gSG93ZXZlciwgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgcXVldWUgb2YgcGVuZGluZyB0YXNrcywgd2UgcmV0aHJvdyB0aGUgZXJyb3IgaW4gYVxuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgdHVybi5cbiAgICAgICAgICAgIHBlbmRpbmdFcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICByZXF1ZXN0RXJyb3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICAgICAgZnJlZVRhc2tzW2ZyZWVUYXNrcy5sZW5ndGhdID0gdGhpcztcbiAgICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFVzZSB0aGUgZmFzdGVzdCBtZWFucyBwb3NzaWJsZSB0byBleGVjdXRlIGEgdGFzayBpbiBpdHMgb3duIHR1cm4sIHdpdGhcbi8vIHByaW9yaXR5IG92ZXIgb3RoZXIgZXZlbnRzIGluY2x1ZGluZyBJTywgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZWRyYXdcbi8vIGV2ZW50cyBpbiBicm93c2Vycy5cbi8vXG4vLyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayB3aWxsIHBlcm1hbmVudGx5IGludGVycnVwdCB0aGUgcHJvY2Vzc2luZyBvZlxuLy8gc3Vic2VxdWVudCB0YXNrcy4gVGhlIGhpZ2hlciBsZXZlbCBgYXNhcGAgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IGEgdGFzaywgdGhhdCB0aGUgdGFzayBxdWV1ZSB3aWxsIGNvbnRpbnVlIGZsdXNoaW5nIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLCBidXQgaWYgeW91IHVzZSBgcmF3QXNhcGAgZGlyZWN0bHksIHlvdSBhcmUgcmVzcG9uc2libGUgdG9cbi8vIGVpdGhlciBlbnN1cmUgdGhhdCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB5b3VyIHRhc2ssIG9yIHRvIG1hbnVhbGx5XG4vLyBjYWxsIGByYXdBc2FwLnJlcXVlc3RGbHVzaGAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbm1vZHVsZS5leHBvcnRzID0gcmF3QXNhcDtcbmZ1bmN0aW9uIHJhd0FzYXAodGFzaykge1xuICAgIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHJlcXVlc3RGbHVzaCgpO1xuICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgfVxuICAgIC8vIEVxdWl2YWxlbnQgdG8gcHVzaCwgYnV0IGF2b2lkcyBhIGZ1bmN0aW9uIGNhbGwuXG4gICAgcXVldWVbcXVldWUubGVuZ3RoXSA9IHRhc2s7XG59XG5cbnZhciBxdWV1ZSA9IFtdO1xuLy8gT25jZSBhIGZsdXNoIGhhcyBiZWVuIHJlcXVlc3RlZCwgbm8gZnVydGhlciBjYWxscyB0byBgcmVxdWVzdEZsdXNoYCBhcmVcbi8vIG5lY2Vzc2FyeSB1bnRpbCB0aGUgbmV4dCBgZmx1c2hgIGNvbXBsZXRlcy5cbnZhciBmbHVzaGluZyA9IGZhbHNlO1xuLy8gYHJlcXVlc3RGbHVzaGAgaXMgYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbWV0aG9kIHRoYXQgYXR0ZW1wdHMgdG8ga2lja1xuLy8gb2ZmIGEgYGZsdXNoYCBldmVudCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBgZmx1c2hgIHdpbGwgYXR0ZW1wdCB0byBleGhhdXN0XG4vLyB0aGUgZXZlbnQgcXVldWUgYmVmb3JlIHlpZWxkaW5nIHRvIHRoZSBicm93c2VyJ3Mgb3duIGV2ZW50IGxvb3AuXG52YXIgcmVxdWVzdEZsdXNoO1xuLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRhc2sgdG8gZXhlY3V0ZSBpbiB0aGUgdGFzayBxdWV1ZS4gVGhpcyBpc1xuLy8gcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8gYGZsdXNoYCBzbyB0aGF0IGl0IGNhbiBiZSByZXN1bWVkIGlmXG4vLyBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbnZhciBpbmRleCA9IDA7XG4vLyBJZiBhIHRhc2sgc2NoZWR1bGVzIGFkZGl0aW9uYWwgdGFza3MgcmVjdXJzaXZlbHksIHRoZSB0YXNrIHF1ZXVlIGNhbiBncm93XG4vLyB1bmJvdW5kZWQuIFRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb24sIHRoZSB0YXNrIHF1ZXVlIHdpbGwgcGVyaW9kaWNhbGx5XG4vLyB0cnVuY2F0ZSBhbHJlYWR5LWNvbXBsZXRlZCB0YXNrcy5cbnZhciBjYXBhY2l0eSA9IDEwMjQ7XG5cbi8vIFRoZSBmbHVzaCBmdW5jdGlvbiBwcm9jZXNzZXMgYWxsIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCB3aXRoXG4vLyBgcmF3QXNhcGAgdW5sZXNzIGFuZCB1bnRpbCBvbmUgb2YgdGhvc2UgdGFza3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbi8vIElmIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLCBgZmx1c2hgIGVuc3VyZXMgdGhhdCBpdHMgc3RhdGUgd2lsbCByZW1haW5cbi8vIGNvbnNpc3RlbnQgYW5kIHdpbGwgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmIHdoZW4gY2FsbGVkIGFnYWluLlxuLy8gSG93ZXZlciwgYGZsdXNoYCBkb2VzIG5vdCBtYWtlIGFueSBhcnJhbmdlbWVudHMgdG8gYmUgY2FsbGVkIGFnYWluIGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duLlxuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIHRhc2suIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGxcbiAgICAgICAgLy8gYmVnaW4gZmx1c2hpbmcgb24gdGhlIG5leHQgdGFzayB0aGUgdGFzayB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICBxdWV1ZVtjdXJyZW50SW5kZXhdLmNhbGwoKTtcbiAgICAgICAgLy8gUHJldmVudCBsZWFraW5nIG1lbW9yeSBmb3IgbG9uZyBjaGFpbnMgb2YgcmVjdXJzaXZlIGNhbGxzIHRvIGBhc2FwYC5cbiAgICAgICAgLy8gSWYgd2UgY2FsbCBgYXNhcGAgd2l0aGluIHRhc2tzIHNjaGVkdWxlZCBieSBgYXNhcGAsIHRoZSBxdWV1ZSB3aWxsXG4gICAgICAgIC8vIGdyb3csIGJ1dCB0byBhdm9pZCBhbiBPKG4pIHdhbGsgZm9yIGV2ZXJ5IHRhc2sgd2UgZXhlY3V0ZSwgd2UgZG9uJ3RcbiAgICAgICAgLy8gc2hpZnQgdGFza3Mgb2ZmIHRoZSBxdWV1ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBleGVjdXRlZC5cbiAgICAgICAgLy8gSW5zdGVhZCwgd2UgcGVyaW9kaWNhbGx5IHNoaWZ0IDEwMjQgdGFza3Mgb2ZmIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKGluZGV4ID4gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIC8vIE1hbnVhbGx5IHNoaWZ0IGFsbCB2YWx1ZXMgc3RhcnRpbmcgYXQgdGhlIGluZGV4IGJhY2sgdG8gdGhlXG4gICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgZm9yICh2YXIgc2NhbiA9IDAsIG5ld0xlbmd0aCA9IHF1ZXVlLmxlbmd0aCAtIGluZGV4OyBzY2FuIDwgbmV3TGVuZ3RoOyBzY2FuKyspIHtcbiAgICAgICAgICAgICAgICBxdWV1ZVtzY2FuXSA9IHF1ZXVlW3NjYW4gKyBpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggLT0gaW5kZXg7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBpbmRleCA9IDA7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIGNvbGxlY3RlZCBmcm9tXG4vLyBldmVyeSBhdmFpbGFibGUgU2F1Y2VMYWJzIFNlbGVuaXVtIHdlYiBkcml2ZXIgd29ya2VyIGF0IHRpbWUgb2Ygd3JpdGluZy5cbi8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFtRy01VVlHdXA1cXhHZEVNV2toUDZCV0N6MDUzTlViMkUxUW9VVFUxNnVBL2VkaXQjZ2lkPTc4MzcyNDU5M1xuXG4vLyBTYWZhcmkgNiBhbmQgNi4xIGZvciBkZXNrdG9wLCBpUGFkLCBhbmQgaVBob25lIGFyZSB0aGUgb25seSBicm93c2VycyB0aGF0XG4vLyBoYXZlIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgYnV0IG5vdCB1bi1wcmVmaXhlZCBNdXRhdGlvbk9ic2VydmVyLlxuLy8gTXVzdCB1c2UgYGdsb2JhbGAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4vLyBNdXRhdGlvbk9ic2VydmVycyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBoYXZlIGhpZ2ggcHJpb3JpdHkgYW5kIHdvcmtcbi8vIHJlbGlhYmx5IGV2ZXJ5d2hlcmUgdGhleSBhcmUgaW1wbGVtZW50ZWQuXG4vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLlxuLy9cbi8vIC0gQW5kcm9pZCA0LTQuM1xuLy8gLSBDaHJvbWUgMjYtMzRcbi8vIC0gRmlyZWZveCAxNC0yOVxuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciAxMVxuLy8gLSBpUGFkIFNhZmFyaSA2LTcuMVxuLy8gLSBpUGhvbmUgU2FmYXJpIDctNy4xXG4vLyAtIFNhZmFyaSA2LTdcbmlmICh0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcblxuLy8gTWVzc2FnZUNoYW5uZWxzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGdpdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgSFRNTFxuLy8gdGFzayBxdWV1ZSwgYXJlIGltcGxlbWVudGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLCBTYWZhcmkgNS4wLTEsIGFuZCBPcGVyYVxuLy8gMTEtMTIsIGFuZCBpbiB3ZWIgd29ya2VycyBpbiBtYW55IGVuZ2luZXMuXG4vLyBBbHRob3VnaCBtZXNzYWdlIGNoYW5uZWxzIHlpZWxkIHRvIGFueSBxdWV1ZWQgcmVuZGVyaW5nIGFuZCBJTyB0YXNrcywgdGhleVxuLy8gd291bGQgYmUgYmV0dGVyIHRoYW4gaW1wb3NpbmcgdGhlIDRtcyBkZWxheSBvZiB0aW1lcnMuXG4vLyBIb3dldmVyLCB0aGV5IGRvIG5vdCB3b3JrIHJlbGlhYmx5IGluIEludGVybmV0IEV4cGxvcmVyIG9yIFNhZmFyaS5cblxuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTAgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGhhcyBzZXRJbW1lZGlhdGUgYnV0IGRvZXNcbi8vIG5vdCBoYXZlIE11dGF0aW9uT2JzZXJ2ZXJzLlxuLy8gQWx0aG91Z2ggc2V0SW1tZWRpYXRlIHlpZWxkcyB0byB0aGUgYnJvd3NlcidzIHJlbmRlcmVyLCBpdCB3b3VsZCBiZVxuLy8gcHJlZmVycmFibGUgdG8gZmFsbGluZyBiYWNrIHRvIHNldFRpbWVvdXQgc2luY2UgaXQgZG9lcyBub3QgaGF2ZVxuLy8gdGhlIG1pbmltdW0gNG1zIHBlbmFsdHkuXG4vLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAgTW9iaWxlIChhbmRcbi8vIERlc2t0b3AgdG8gYSBsZXNzZXIgZXh0ZW50KSB0aGF0IHJlbmRlcnMgYm90aCBzZXRJbW1lZGlhdGUgYW5kXG4vLyBNZXNzYWdlQ2hhbm5lbCB1c2VsZXNzIGZvciB0aGUgcHVycG9zZXMgb2YgQVNBUC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcS9pc3N1ZXMvMzk2XG5cbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xufSBlbHNlIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoZmx1c2gpO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCByZXF1ZXN0cyB0aGF0IHRoZSBoaWdoIHByaW9yaXR5IGV2ZW50IHF1ZXVlIGJlIGZsdXNoZWQgYXNcbi8vIHNvb24gYXMgcG9zc2libGUuXG4vLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbi8vIHF1ZXVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSBOb2RlLmpz4oCZc1xuLy8gYHByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiKWAgb3IgYnkgYSBkb21haW4uXG5yYXdBc2FwLnJlcXVlc3RGbHVzaCA9IHJlcXVlc3RGbHVzaDtcblxuLy8gVG8gcmVxdWVzdCBhIGhpZ2ggcHJpb3JpdHkgZXZlbnQsIHdlIGluZHVjZSBhIG11dGF0aW9uIG9ic2VydmVyIGJ5IHRvZ2dsaW5nXG4vLyB0aGUgdGV4dCBvZiBhIHRleHQgbm9kZSBiZXR3ZWVuIFwiMVwiIGFuZCBcIi0xXCIuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIHZhciB0b2dnbGUgPSAxO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cblxuLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4vLyBvcmlnaW5hbCBmb3VuZGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuXG4vLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuXG4vLyBTYWZhcmkgNi4wLjUgKGF0IGxlYXN0KSBpbnRlcm1pdHRlbnRseSBmYWlscyB0byBjcmVhdGUgbWVzc2FnZSBwb3J0cyBvbiBhXG4vLyBwYWdlJ3MgZmlyc3QgbG9hZC4gVGhhbmtmdWxseSwgdGhpcyB2ZXJzaW9uIG9mIFNhZmFyaSBzdXBwb3J0c1xuLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU1lc3NhZ2VDaGFubmVsKGNhbGxiYWNrKSB7XG4vLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbi8vICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBGb3IgcmVhc29ucyBleHBsYWluZWQgYWJvdmUsIHdlIGFyZSBhbHNvIHVuYWJsZSB0byB1c2UgYHNldEltbWVkaWF0ZWBcbi8vIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLlxuLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbi8vIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGFzc2lnbiBgc2V0SW1tZWRpYXRlYCB0byBgcmVxdWVzdEZsdXNoYCBiZWNhdXNlXG4vLyBgc2V0SW1tZWRpYXRlYCBtdXN0IGJlIGNhbGxlZCAqYnkgbmFtZSogYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHdyYXBwZWQgaW4gYVxuLy8gY2xvc3VyZS5cbi8vIE5ldmVyIGZvcmdldC5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbi8vIHNjcm9sbGluZy4gVGhpcyBwcm9ibGVtIGRvZXMgbm90IGltcGFjdCBBU0FQIGJlY2F1c2UgU2FmYXJpIDYuMCBzdXBwb3J0c1xuLy8gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQgaW5zdGVhZC5cbi8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbi8vIGlzIHRvIGFkZCBhIHNjcm9sbCBldmVudCBsaXN0ZW5lciB0aGF0IGNhbGxzIGZvciBhIGZsdXNoLlxuXG4vLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbi8vIGFwcHJveGltYXRlbHkgNyBpbiB3ZWIgd29ya2VycyBpbiBGaXJlZm94IDggdGhyb3VnaCAxOCwgYW5kIHNvbWV0aW1lcyBub3Rcbi8vIGV2ZW4gdGhlbi5cblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIHZhciB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVUaW1lciwgMCk7XG4gICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoaXMgdGltZXIgZ2V0cyBmcmVxdWVudGx5IGRyb3BwZWQgaW4gRmlyZWZveFxuICAgICAgICAvLyB3b3JrZXJzLCB3ZSBlbmxpc3QgYW4gaW50ZXJ2YWwgaGFuZGxlIHRoYXQgd2lsbCB0cnkgdG8gZmlyZVxuICAgICAgICAvLyBhbiBldmVudCAyMCB0aW1lcyBwZXIgc2Vjb25kIHVudGlsIGl0IHN1Y2NlZWRzLlxuICAgICAgICB2YXIgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbChoYW5kbGVUaW1lciwgNTApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVyKCkge1xuICAgICAgICAgICAgLy8gV2hpY2hldmVyIHRpbWVyIHN1Y2NlZWRzIHdpbGwgY2FuY2VsIGJvdGggdGltZXJzIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUaGlzIGlzIGZvciBgYXNhcC5qc2Agb25seS5cbi8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4vLyBpdHMgZXhpc3RlbmNlLlxucmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXI7XG5cbi8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuLy8gaW50byB0aGlzIEFTQVAgcGFja2FnZS4gSXQgd2FzIGxhdGVyIGFkYXB0ZWQgdG8gUlNWUCB3aGljaCBtYWRlIGZ1cnRoZXJcbi8vIGFtZW5kbWVudHMuIFRoZXNlIGRlY2lzaW9ucywgcGFydGljdWxhcmx5IHRvIG1hcmdpbmFsaXplIE1lc3NhZ2VDaGFubmVsIGFuZFxuLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuLy8gYmFjayBpbnRvIEFTQVAgcHJvcGVyLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL2NkZGY3MjMyNTQ2YTljZjg1ODUyNGI3NWNkZTZmOWVkZjcyNjIwYTcvbGliL3JzdnAvYXNhcC5qc1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb21cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2lzLWl0ZXJhYmxlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5XCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hcFwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9tYXRoL2xvZzJcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2Fzc2lnblwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2ZyZWV6ZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc2V0XCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZik7XG5cbnZhciBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxudmFyIF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSAoMCwgX2dldE93blByb3BlcnR5RGVzY3JpcHRvcjIuZGVmYXVsdCkob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBwYXJlbnQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShvYmplY3QpO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7XG4gICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGdldHRlciA9IGRlc2MuZ2V0O1xuXG4gICAgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7XG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxudmFyIF9zZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZXRQcm90b3R5cGVPZik7XG5cbnZhciBfY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIF9jcmVhdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlKTtcblxudmFyIF90eXBlb2YyID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArICh0eXBlb2Ygc3VwZXJDbGFzcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoc3VwZXJDbGFzcykpKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mMi5kZWZhdWx0ID8gKDAsIF9zZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICgodHlwZW9mIGNhbGwgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKGNhbGwpKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pc0l0ZXJhYmxlMiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2lzLWl0ZXJhYmxlXCIpO1xuXG52YXIgX2lzSXRlcmFibGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJdGVyYWJsZTIpO1xuXG52YXIgX2dldEl0ZXJhdG9yMiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxudmFyIF9nZXRJdGVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRJdGVyYXRvcjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7XG4gICAgdmFyIF9hcnIgPSBbXTtcbiAgICB2YXIgX24gPSB0cnVlO1xuICAgIHZhciBfZCA9IGZhbHNlO1xuICAgIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBfaSA9ICgwLCBfZ2V0SXRlcmF0b3IzLmRlZmF1bHQpKGFyciksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSB0cnVlO1xuICAgICAgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfYXJyO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9pc0l0ZXJhYmxlMy5kZWZhdWx0KShPYmplY3QoYXJyKSkpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9mcm9tID0gcmVxdWlyZShcIi4uL2NvcmUtanMvYXJyYXkvZnJvbVwiKTtcblxudmFyIF9mcm9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Zyb20pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoMCwgX2Zyb20yLmRlZmF1bHQpKGFycik7XG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaXRlcmF0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2wvaXRlcmF0b3JcIik7XG5cbnZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXG52YXIgX3N5bWJvbCA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbFwiKTtcblxudmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZihfaXRlcmF0b3IyLmRlZmF1bHQpID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG5mdW5jdGlvbiBpbml0ICgpIHtcbiAgdmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG4gIH1cblxuICByZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbiAgcmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG59XG5cbmluaXQoKVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG4gIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG4gIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcblxuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlblxuXG4gIHZhciBMID0gMFxuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qKlxuICogQml0IHR3aWRkbGluZyBoYWNrcyBmb3IgSmF2YVNjcmlwdC5cbiAqXG4gKiBBdXRob3I6IE1pa29sYSBMeXNlbmtvXG4gKlxuICogUG9ydGVkIGZyb20gU3RhbmZvcmQgYml0IHR3aWRkbGluZyBoYWNrIGxpYnJhcnk6XG4gKiAgICBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWxcbiAqL1xuXG5cInVzZSBzdHJpY3RcIjsgXCJ1c2UgcmVzdHJpY3RcIjtcblxuLy9OdW1iZXIgb2YgYml0cyBpbiBhbiBpbnRlZ2VyXG52YXIgSU5UX0JJVFMgPSAzMjtcblxuLy9Db25zdGFudHNcbmV4cG9ydHMuSU5UX0JJVFMgID0gSU5UX0JJVFM7XG5leHBvcnRzLklOVF9NQVggICA9ICAweDdmZmZmZmZmO1xuZXhwb3J0cy5JTlRfTUlOICAgPSAtMTw8KElOVF9CSVRTLTEpO1xuXG4vL1JldHVybnMgLTEsIDAsICsxIGRlcGVuZGluZyBvbiBzaWduIG9mIHhcbmV4cG9ydHMuc2lnbiA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuICh2ID4gMCkgLSAodiA8IDApO1xufVxuXG4vL0NvbXB1dGVzIGFic29sdXRlIHZhbHVlIG9mIGludGVnZXJcbmV4cG9ydHMuYWJzID0gZnVuY3Rpb24odikge1xuICB2YXIgbWFzayA9IHYgPj4gKElOVF9CSVRTLTEpO1xuICByZXR1cm4gKHYgXiBtYXNrKSAtIG1hc2s7XG59XG5cbi8vQ29tcHV0ZXMgbWluaW11bSBvZiBpbnRlZ2VycyB4IGFuZCB5XG5leHBvcnRzLm1pbiA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgcmV0dXJuIHkgXiAoKHggXiB5KSAmIC0oeCA8IHkpKTtcbn1cblxuLy9Db21wdXRlcyBtYXhpbXVtIG9mIGludGVnZXJzIHggYW5kIHlcbmV4cG9ydHMubWF4ID0gZnVuY3Rpb24oeCwgeSkge1xuICByZXR1cm4geCBeICgoeCBeIHkpICYgLSh4IDwgeSkpO1xufVxuXG4vL0NoZWNrcyBpZiBhIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3b1xuZXhwb3J0cy5pc1BvdzIgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiAhKHYgJiAodi0xKSkgJiYgKCEhdik7XG59XG5cbi8vQ29tcHV0ZXMgbG9nIGJhc2UgMiBvZiB2XG5leHBvcnRzLmxvZzIgPSBmdW5jdGlvbih2KSB7XG4gIHZhciByLCBzaGlmdDtcbiAgciA9ICAgICAodiA+IDB4RkZGRikgPDwgNDsgdiA+Pj49IHI7XG4gIHNoaWZ0ID0gKHYgPiAweEZGICApIDw8IDM7IHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdDtcbiAgc2hpZnQgPSAodiA+IDB4RiAgICkgPDwgMjsgdiA+Pj49IHNoaWZ0OyByIHw9IHNoaWZ0O1xuICBzaGlmdCA9ICh2ID4gMHgzICAgKSA8PCAxOyB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7XG4gIHJldHVybiByIHwgKHYgPj4gMSk7XG59XG5cbi8vQ29tcHV0ZXMgbG9nIGJhc2UgMTAgb2YgdlxuZXhwb3J0cy5sb2cxMCA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuICAodiA+PSAxMDAwMDAwMDAwKSA/IDkgOiAodiA+PSAxMDAwMDAwMDApID8gOCA6ICh2ID49IDEwMDAwMDAwKSA/IDcgOlxuICAgICAgICAgICh2ID49IDEwMDAwMDApID8gNiA6ICh2ID49IDEwMDAwMCkgPyA1IDogKHYgPj0gMTAwMDApID8gNCA6XG4gICAgICAgICAgKHYgPj0gMTAwMCkgPyAzIDogKHYgPj0gMTAwKSA/IDIgOiAodiA+PSAxMCkgPyAxIDogMDtcbn1cblxuLy9Db3VudHMgbnVtYmVyIG9mIGJpdHNcbmV4cG9ydHMucG9wQ291bnQgPSBmdW5jdGlvbih2KSB7XG4gIHYgPSB2IC0gKCh2ID4+PiAxKSAmIDB4NTU1NTU1NTUpO1xuICB2ID0gKHYgJiAweDMzMzMzMzMzKSArICgodiA+Pj4gMikgJiAweDMzMzMzMzMzKTtcbiAgcmV0dXJuICgodiArICh2ID4+PiA0KSAmIDB4RjBGMEYwRikgKiAweDEwMTAxMDEpID4+PiAyNDtcbn1cblxuLy9Db3VudHMgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zXG5mdW5jdGlvbiBjb3VudFRyYWlsaW5nWmVyb3Modikge1xuICB2YXIgYyA9IDMyO1xuICB2ICY9IC12O1xuICBpZiAodikgYy0tO1xuICBpZiAodiAmIDB4MDAwMEZGRkYpIGMgLT0gMTY7XG4gIGlmICh2ICYgMHgwMEZGMDBGRikgYyAtPSA4O1xuICBpZiAodiAmIDB4MEYwRjBGMEYpIGMgLT0gNDtcbiAgaWYgKHYgJiAweDMzMzMzMzMzKSBjIC09IDI7XG4gIGlmICh2ICYgMHg1NTU1NTU1NSkgYyAtPSAxO1xuICByZXR1cm4gYztcbn1cbmV4cG9ydHMuY291bnRUcmFpbGluZ1plcm9zID0gY291bnRUcmFpbGluZ1plcm9zO1xuXG4vL1JvdW5kcyB0byBuZXh0IHBvd2VyIG9mIDJcbmV4cG9ydHMubmV4dFBvdzIgPSBmdW5jdGlvbih2KSB7XG4gIHYgKz0gdiA9PT0gMDtcbiAgLS12O1xuICB2IHw9IHYgPj4+IDE7XG4gIHYgfD0gdiA+Pj4gMjtcbiAgdiB8PSB2ID4+PiA0O1xuICB2IHw9IHYgPj4+IDg7XG4gIHYgfD0gdiA+Pj4gMTY7XG4gIHJldHVybiB2ICsgMTtcbn1cblxuLy9Sb3VuZHMgZG93biB0byBwcmV2aW91cyBwb3dlciBvZiAyXG5leHBvcnRzLnByZXZQb3cyID0gZnVuY3Rpb24odikge1xuICB2IHw9IHYgPj4+IDE7XG4gIHYgfD0gdiA+Pj4gMjtcbiAgdiB8PSB2ID4+PiA0O1xuICB2IHw9IHYgPj4+IDg7XG4gIHYgfD0gdiA+Pj4gMTY7XG4gIHJldHVybiB2IC0gKHY+Pj4xKTtcbn1cblxuLy9Db21wdXRlcyBwYXJpdHkgb2Ygd29yZFxuZXhwb3J0cy5wYXJpdHkgPSBmdW5jdGlvbih2KSB7XG4gIHYgXj0gdiA+Pj4gMTY7XG4gIHYgXj0gdiA+Pj4gODtcbiAgdiBePSB2ID4+PiA0O1xuICB2ICY9IDB4ZjtcbiAgcmV0dXJuICgweDY5OTYgPj4+IHYpICYgMTtcbn1cblxudmFyIFJFVkVSU0VfVEFCTEUgPSBuZXcgQXJyYXkoMjU2KTtcblxuKGZ1bmN0aW9uKHRhYikge1xuICBmb3IodmFyIGk9MDsgaTwyNTY7ICsraSkge1xuICAgIHZhciB2ID0gaSwgciA9IGksIHMgPSA3O1xuICAgIGZvciAodiA+Pj49IDE7IHY7IHYgPj4+PSAxKSB7XG4gICAgICByIDw8PSAxO1xuICAgICAgciB8PSB2ICYgMTtcbiAgICAgIC0tcztcbiAgICB9XG4gICAgdGFiW2ldID0gKHIgPDwgcykgJiAweGZmO1xuICB9XG59KShSRVZFUlNFX1RBQkxFKTtcblxuLy9SZXZlcnNlIGJpdHMgaW4gYSAzMiBiaXQgd29yZFxuZXhwb3J0cy5yZXZlcnNlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gIChSRVZFUlNFX1RBQkxFWyB2ICAgICAgICAgJiAweGZmXSA8PCAyNCkgfFxuICAgICAgICAgIChSRVZFUlNFX1RBQkxFWyh2ID4+PiA4KSAgJiAweGZmXSA8PCAxNikgfFxuICAgICAgICAgIChSRVZFUlNFX1RBQkxFWyh2ID4+PiAxNikgJiAweGZmXSA8PCA4KSAgfFxuICAgICAgICAgICBSRVZFUlNFX1RBQkxFWyh2ID4+PiAyNCkgJiAweGZmXTtcbn1cblxuLy9JbnRlcmxlYXZlIGJpdHMgb2YgMiBjb29yZGluYXRlcyB3aXRoIDE2IGJpdHMuICBVc2VmdWwgZm9yIGZhc3QgcXVhZHRyZWUgY29kZXNcbmV4cG9ydHMuaW50ZXJsZWF2ZTIgPSBmdW5jdGlvbih4LCB5KSB7XG4gIHggJj0gMHhGRkZGO1xuICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gIHkgJj0gMHhGRkZGO1xuICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vRXh0cmFjdHMgdGhlIG50aCBpbnRlcmxlYXZlZCBjb21wb25lbnRcbmV4cG9ydHMuZGVpbnRlcmxlYXZlMiA9IGZ1bmN0aW9uKHYsIG4pIHtcbiAgdiA9ICh2ID4+PiBuKSAmIDB4NTU1NTU1NTU7XG4gIHYgPSAodiB8ICh2ID4+PiAxKSkgICYgMHgzMzMzMzMzMztcbiAgdiA9ICh2IHwgKHYgPj4+IDIpKSAgJiAweDBGMEYwRjBGO1xuICB2ID0gKHYgfCAodiA+Pj4gNCkpICAmIDB4MDBGRjAwRkY7XG4gIHYgPSAodiB8ICh2ID4+PiAxNikpICYgMHgwMDBGRkZGO1xuICByZXR1cm4gKHYgPDwgMTYpID4+IDE2O1xufVxuXG5cbi8vSW50ZXJsZWF2ZSBiaXRzIG9mIDMgY29vcmRpbmF0ZXMsIGVhY2ggd2l0aCAxMCBiaXRzLiAgVXNlZnVsIGZvciBmYXN0IG9jdHJlZSBjb2Rlc1xuZXhwb3J0cy5pbnRlcmxlYXZlMyA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgeCAmPSAweDNGRjtcbiAgeCAgPSAoeCB8ICh4PDwxNikpICYgNDI3ODE5MDMzNTtcbiAgeCAgPSAoeCB8ICh4PDw4KSkgICYgMjUxNzE5Njk1O1xuICB4ICA9ICh4IHwgKHg8PDQpKSAgJiAzMjcyMzU2MDM1O1xuICB4ICA9ICh4IHwgKHg8PDIpKSAgJiAxMjI3MTMzNTEzO1xuXG4gIHkgJj0gMHgzRkY7XG4gIHkgID0gKHkgfCAoeTw8MTYpKSAmIDQyNzgxOTAzMzU7XG4gIHkgID0gKHkgfCAoeTw8OCkpICAmIDI1MTcxOTY5NTtcbiAgeSAgPSAoeSB8ICh5PDw0KSkgICYgMzI3MjM1NjAzNTtcbiAgeSAgPSAoeSB8ICh5PDwyKSkgICYgMTIyNzEzMzUxMztcbiAgeCB8PSAoeSA8PCAxKTtcbiAgXG4gIHogJj0gMHgzRkY7XG4gIHogID0gKHogfCAoejw8MTYpKSAmIDQyNzgxOTAzMzU7XG4gIHogID0gKHogfCAoejw8OCkpICAmIDI1MTcxOTY5NTtcbiAgeiAgPSAoeiB8ICh6PDw0KSkgICYgMzI3MjM1NjAzNTtcbiAgeiAgPSAoeiB8ICh6PDwyKSkgICYgMTIyNzEzMzUxMztcbiAgXG4gIHJldHVybiB4IHwgKHogPDwgMik7XG59XG5cbi8vRXh0cmFjdHMgbnRoIGludGVybGVhdmVkIGNvbXBvbmVudCBvZiBhIDMtdHVwbGVcbmV4cG9ydHMuZGVpbnRlcmxlYXZlMyA9IGZ1bmN0aW9uKHYsIG4pIHtcbiAgdiA9ICh2ID4+PiBuKSAgICAgICAmIDEyMjcxMzM1MTM7XG4gIHYgPSAodiB8ICh2Pj4+MikpICAgJiAzMjcyMzU2MDM1O1xuICB2ID0gKHYgfCAodj4+PjQpKSAgICYgMjUxNzE5Njk1O1xuICB2ID0gKHYgfCAodj4+PjgpKSAgICYgNDI3ODE5MDMzNTtcbiAgdiA9ICh2IHwgKHY+Pj4xNikpICAmIDB4M0ZGO1xuICByZXR1cm4gKHY8PDIyKT4+MjI7XG59XG5cbi8vQ29tcHV0ZXMgbmV4dCBjb21iaW5hdGlvbiBpbiBjb2xleGljb2dyYXBoaWMgb3JkZXIgKHRoaXMgaXMgbWlzdGFrZW5seSBjYWxsZWQgbmV4dFBlcm11dGF0aW9uIG9uIHRoZSBiaXQgdHdpZGRsaW5nIGhhY2tzIHBhZ2UpXG5leHBvcnRzLm5leHRDb21iaW5hdGlvbiA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHQgPSB2IHwgKHYgLSAxKTtcbiAgcmV0dXJuICh0ICsgMSkgfCAoKCh+dCAmIC1+dCkgLSAxKSA+Pj4gKGNvdW50VHJhaWxpbmdaZXJvcyh2KSArIDEpKTtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gYm94SW50ZXJzZWN0V3JhcHBlclxuXG52YXIgcG9vbCA9IHJlcXVpcmUoJ3R5cGVkYXJyYXktcG9vbCcpXG52YXIgc3dlZXAgPSByZXF1aXJlKCcuL2xpYi9zd2VlcCcpXG52YXIgYm94SW50ZXJzZWN0SXRlciA9IHJlcXVpcmUoJy4vbGliL2ludGVyc2VjdCcpXG5cbmZ1bmN0aW9uIGJveEVtcHR5KGQsIGJveCkge1xuICBmb3IodmFyIGo9MDsgajxkOyArK2opIHtcbiAgICBpZighKGJveFtqXSA8PSBib3hbaitkXSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vL1VucGFjayBib3hlcyBpbnRvIGEgZmxhdCB0eXBlZCBhcnJheSwgcmVtb3ZlIGVtcHR5IGJveGVzXG5mdW5jdGlvbiBjb252ZXJ0Qm94ZXMoYm94ZXMsIGQsIGRhdGEsIGlkcykge1xuICB2YXIgcHRyID0gMFxuICB2YXIgY291bnQgPSAwXG4gIGZvcih2YXIgaT0wLCBuPWJveGVzLmxlbmd0aDsgaTxuOyArK2kpIHtcbiAgICB2YXIgYiA9IGJveGVzW2ldXG4gICAgaWYoYm94RW1wdHkoZCwgYikpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGZvcih2YXIgaj0wOyBqPDIqZDsgKytqKSB7XG4gICAgICBkYXRhW3B0cisrXSA9IGJbal1cbiAgICB9XG4gICAgaWRzW2NvdW50KytdID0gaVxuICB9XG4gIHJldHVybiBjb3VudFxufVxuXG4vL1BlcmZvcm0gdHlwZSBjb252ZXJzaW9ucywgY2hlY2sgYm91bmRzXG5mdW5jdGlvbiBib3hJbnRlcnNlY3QocmVkLCBibHVlLCB2aXNpdCwgZnVsbCkge1xuICB2YXIgbiA9IHJlZC5sZW5ndGhcbiAgdmFyIG0gPSBibHVlLmxlbmd0aFxuXG4gIC8vSWYgZWl0aGVyIGFycmF5IGlzIGVtcHR5LCB0aGVuIHdlIGNhbiBza2lwIHRoaXMgd2hvbGUgdGhpbmdcbiAgaWYobiA8PSAwIHx8IG0gPD0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy9Db21wdXRlIGRpbWVuc2lvbiwgaWYgaXQgaXMgMCB0aGVuIHdlIHNraXBcbiAgdmFyIGQgPSAocmVkWzBdLmxlbmd0aCk+Pj4xXG4gIGlmKGQgPD0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHJldHZhbFxuXG4gIC8vQ29udmVydCByZWQgYm94ZXNcbiAgdmFyIHJlZExpc3QgID0gcG9vbC5tYWxsb2NEb3VibGUoMipkKm4pXG4gIHZhciByZWRJZHMgICA9IHBvb2wubWFsbG9jSW50MzIobilcbiAgbiA9IGNvbnZlcnRCb3hlcyhyZWQsIGQsIHJlZExpc3QsIHJlZElkcylcblxuICBpZihuID4gMCkge1xuICAgIGlmKGQgPT09IDEgJiYgZnVsbCkge1xuICAgICAgLy9TcGVjaWFsIGNhc2U6IDFkIGNvbXBsZXRlXG4gICAgICBzd2VlcC5pbml0KG4pXG4gICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcENvbXBsZXRlKFxuICAgICAgICBkLCB2aXNpdCwgXG4gICAgICAgIDAsIG4sIHJlZExpc3QsIHJlZElkcyxcbiAgICAgICAgMCwgbiwgcmVkTGlzdCwgcmVkSWRzKVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vQ29udmVydCBibHVlIGJveGVzXG4gICAgICB2YXIgYmx1ZUxpc3QgPSBwb29sLm1hbGxvY0RvdWJsZSgyKmQqbSlcbiAgICAgIHZhciBibHVlSWRzICA9IHBvb2wubWFsbG9jSW50MzIobSlcbiAgICAgIG0gPSBjb252ZXJ0Qm94ZXMoYmx1ZSwgZCwgYmx1ZUxpc3QsIGJsdWVJZHMpXG5cbiAgICAgIGlmKG0gPiAwKSB7XG4gICAgICAgIHN3ZWVwLmluaXQobittKVxuXG4gICAgICAgIGlmKGQgPT09IDEpIHtcbiAgICAgICAgICAvL1NwZWNpYWwgY2FzZTogMWQgYmlwYXJ0aXRlXG4gICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICBkLCB2aXNpdCwgXG4gICAgICAgICAgICAwLCBuLCByZWRMaXN0LCAgcmVkSWRzLFxuICAgICAgICAgICAgMCwgbSwgYmx1ZUxpc3QsIGJsdWVJZHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9HZW5lcmFsIGNhc2U6ICBkPjFcbiAgICAgICAgICByZXR2YWwgPSBib3hJbnRlcnNlY3RJdGVyKFxuICAgICAgICAgICAgZCwgdmlzaXQsICAgIGZ1bGwsXG4gICAgICAgICAgICBuLCByZWRMaXN0LCAgcmVkSWRzLFxuICAgICAgICAgICAgbSwgYmx1ZUxpc3QsIGJsdWVJZHMpXG4gICAgICAgIH1cblxuICAgICAgICBwb29sLmZyZWUoYmx1ZUxpc3QpXG4gICAgICAgIHBvb2wuZnJlZShibHVlSWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBvb2wuZnJlZShyZWRMaXN0KVxuICAgIHBvb2wuZnJlZShyZWRJZHMpXG4gIH1cblxuICByZXR1cm4gcmV0dmFsXG59XG5cbi8vVXNlci1mcmllbmRseSB3cmFwcGVyLCBoYW5kbGUgZnVsbCBpbnB1dCBhbmQgbm8tdmlzaXRvciBjYXNlc1xuZnVuY3Rpb24gYm94SW50ZXJzZWN0V3JhcHBlcihhcmcwLCBhcmcxLCBhcmcyKSB7XG4gIHZhciByZXN1bHRcbiAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXN1bHQgPSBbXVxuICAgICAgYm94SW50ZXJzZWN0KGFyZzAsIGFyZzAsIGZ1bmN0aW9uKGksaikge1xuICAgICAgICByZXN1bHQucHVzaChbaSwgal0pXG4gICAgICB9LCB0cnVlKVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIGNhc2UgMjpcbiAgICAgIGlmKHR5cGVvZiBhcmcxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciB2aXNpdCA9IGFyZzFcbiAgICAgICAgcmV0dXJuIGJveEludGVyc2VjdChhcmcwLCBhcmcwLCB2aXNpdCwgdHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IFtdXG4gICAgICAgIGJveEludGVyc2VjdChhcmcwLCBhcmcxLCBmdW5jdGlvbihpLGopIHtcbiAgICAgICAgICByZXN1bHQucHVzaChbaSwgal0pXG4gICAgICAgIH0sIGZhbHNlKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGJveEludGVyc2VjdChhcmcwLCBhcmcxLCBhcmcyLCBmYWxzZSlcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdib3gtaW50ZXJzZWN0OiBJbnZhbGlkIGFyZ3VtZW50cycpXG4gIH1cbn0iLCIndXNlIHN0cmljdCdcblxudmFyIERJTUVOU0lPTiAgID0gJ2QnXG52YXIgQVhJUyAgICAgICAgPSAnYXgnXG52YXIgVklTSVQgICAgICAgPSAndnYnXG52YXIgRkxJUCAgICAgICAgPSAnZnAnXG5cbnZhciBFTEVNX1NJWkUgICA9ICdlcydcblxudmFyIFJFRF9TVEFSVCAgID0gJ3JzJ1xudmFyIFJFRF9FTkQgICAgID0gJ3JlJ1xudmFyIFJFRF9CT1hFUyAgID0gJ3JiJ1xudmFyIFJFRF9JTkRFWCAgID0gJ3JpJ1xudmFyIFJFRF9QVFIgICAgID0gJ3JwJ1xuXG52YXIgQkxVRV9TVEFSVCAgPSAnYnMnXG52YXIgQkxVRV9FTkQgICAgPSAnYmUnXG52YXIgQkxVRV9CT1hFUyAgPSAnYmInXG52YXIgQkxVRV9JTkRFWCAgPSAnYmknXG52YXIgQkxVRV9QVFIgICAgPSAnYnAnXG5cbnZhciBSRVRWQUwgICAgICA9ICdydidcblxudmFyIElOTkVSX0xBQkVMID0gJ1EnXG5cbnZhciBBUkdTID0gW1xuICBESU1FTlNJT04sXG4gIEFYSVMsXG4gIFZJU0lULFxuICBSRURfU1RBUlQsXG4gIFJFRF9FTkQsXG4gIFJFRF9CT1hFUyxcbiAgUkVEX0lOREVYLFxuICBCTFVFX1NUQVJULFxuICBCTFVFX0VORCxcbiAgQkxVRV9CT1hFUyxcbiAgQkxVRV9JTkRFWFxuXVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJydXRlRm9yY2UocmVkTWFqb3IsIGZsaXAsIGZ1bGwpIHtcbiAgdmFyIGZ1bmNOYW1lID0gJ2JydXRlRm9yY2UnICsgXG4gICAgKHJlZE1ham9yID8gJ1JlZCcgOiAnQmx1ZScpICsgXG4gICAgKGZsaXAgPyAnRmxpcCcgOiAnJykgK1xuICAgIChmdWxsID8gJ0Z1bGwnIDogJycpXG5cbiAgdmFyIGNvZGUgPSBbJ2Z1bmN0aW9uICcsIGZ1bmNOYW1lLCAnKCcsIEFSR1Muam9pbigpLCAnKXsnLFxuICAgICd2YXIgJywgRUxFTV9TSVpFLCAnPTIqJywgRElNRU5TSU9OLCAnOyddXG5cbiAgdmFyIHJlZExvb3AgPSBcbiAgICAnZm9yKHZhciBpPScgKyBSRURfU1RBUlQgKyAnLCcgKyBSRURfUFRSICsgJz0nICsgRUxFTV9TSVpFICsgJyonICsgUkVEX1NUQVJUICsgJzsnICtcbiAgICAgICAgJ2k8JyArIFJFRF9FTkQgKyc7JyArXG4gICAgICAgICcrK2ksJyArIFJFRF9QVFIgKyAnKz0nICsgRUxFTV9TSVpFICsgJyl7JyArXG4gICAgICAgICd2YXIgeDA9JyArIFJFRF9CT1hFUyArICdbJyArIEFYSVMgKyAnKycgKyBSRURfUFRSICsgJ10sJyArXG4gICAgICAgICAgICAneDE9JyArIFJFRF9CT1hFUyArICdbJyArIEFYSVMgKyAnKycgKyBSRURfUFRSICsgJysnICsgRElNRU5TSU9OICsgJ10sJyArXG4gICAgICAgICAgICAneGk9JyArIFJFRF9JTkRFWCArICdbaV07J1xuXG4gIHZhciBibHVlTG9vcCA9IFxuICAgICdmb3IodmFyIGo9JyArIEJMVUVfU1RBUlQgKyAnLCcgKyBCTFVFX1BUUiArICc9JyArIEVMRU1fU0laRSArICcqJyArIEJMVUVfU1RBUlQgKyAnOycgK1xuICAgICAgICAnajwnICsgQkxVRV9FTkQgKyAnOycgK1xuICAgICAgICAnKytqLCcgKyBCTFVFX1BUUiArICcrPScgKyBFTEVNX1NJWkUgKyAnKXsnICtcbiAgICAgICAgJ3ZhciB5MD0nICsgQkxVRV9CT1hFUyArICdbJyArIEFYSVMgKyAnKycgKyBCTFVFX1BUUiArICddLCcgK1xuICAgICAgICAgICAgKGZ1bGwgPyAneTE9JyArIEJMVUVfQk9YRVMgKyAnWycgKyBBWElTICsgJysnICsgQkxVRV9QVFIgKyAnKycgKyBESU1FTlNJT04gKyAnXSwnIDogJycpICtcbiAgICAgICAgICAgICd5aT0nICsgQkxVRV9JTkRFWCArICdbal07J1xuXG4gIGlmKHJlZE1ham9yKSB7XG4gICAgY29kZS5wdXNoKHJlZExvb3AsIElOTkVSX0xBQkVMLCAnOicsIGJsdWVMb29wKVxuICB9IGVsc2Uge1xuICAgIGNvZGUucHVzaChibHVlTG9vcCwgSU5ORVJfTEFCRUwsICc6JywgcmVkTG9vcClcbiAgfVxuXG4gIGlmKGZ1bGwpIHtcbiAgICBjb2RlLnB1c2goJ2lmKHkxPHgwfHx4MTx5MCljb250aW51ZTsnKVxuICB9IGVsc2UgaWYoZmxpcCkge1xuICAgIGNvZGUucHVzaCgnaWYoeTA8PXgwfHx4MTx5MCljb250aW51ZTsnKVxuICB9IGVsc2Uge1xuICAgIGNvZGUucHVzaCgnaWYoeTA8eDB8fHgxPHkwKWNvbnRpbnVlOycpXG4gIH1cblxuICBjb2RlLnB1c2goJ2Zvcih2YXIgaz0nK0FYSVMrJysxO2s8JytESU1FTlNJT04rJzsrK2speycrXG4gICAgJ3ZhciByMD0nK1JFRF9CT1hFUysnW2srJytSRURfUFRSKyddLCcrXG4gICAgICAgICdyMT0nK1JFRF9CT1hFUysnW2srJytESU1FTlNJT04rJysnK1JFRF9QVFIrJ10sJytcbiAgICAgICAgJ2IwPScrQkxVRV9CT1hFUysnW2srJytCTFVFX1BUUisnXSwnK1xuICAgICAgICAnYjE9JytCTFVFX0JPWEVTKydbaysnK0RJTUVOU0lPTisnKycrQkxVRV9QVFIrJ107JytcbiAgICAgICdpZihyMTxiMHx8YjE8cjApY29udGludWUgJyArIElOTkVSX0xBQkVMICsgJzt9JyArXG4gICAgICAndmFyICcgKyBSRVRWQUwgKyAnPScgKyBWSVNJVCArICcoJylcblxuICBpZihmbGlwKSB7XG4gICAgY29kZS5wdXNoKCd5aSx4aScpXG4gIH0gZWxzZSB7XG4gICAgY29kZS5wdXNoKCd4aSx5aScpXG4gIH1cblxuICBjb2RlLnB1c2goJyk7aWYoJyArIFJFVFZBTCArICchPT12b2lkIDApcmV0dXJuICcgKyBSRVRWQUwgKyAnO319fScpXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmdW5jTmFtZSwgXG4gICAgY29kZTogY29kZS5qb2luKCcnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJydXRlRm9yY2VQbGFubmVyKGZ1bGwpIHtcbiAgdmFyIGZ1bmNOYW1lID0gJ2JydXRlRm9yY2UnICsgKGZ1bGwgPyAnRnVsbCcgOiAnUGFydGlhbCcpXG4gIHZhciBwcmVmaXggPSBbXVxuICB2YXIgZmFyZ3MgPSBBUkdTLnNsaWNlKClcbiAgaWYoIWZ1bGwpIHtcbiAgICBmYXJncy5zcGxpY2UoMywgMCwgRkxJUClcbiAgfVxuXG4gIHZhciBjb2RlID0gWydmdW5jdGlvbiAnICsgZnVuY05hbWUgKyAnKCcgKyBmYXJncy5qb2luKCkgKyAnKXsnXVxuXG4gIGZ1bmN0aW9uIGludm9rZShyZWRNYWpvciwgZmxpcCkge1xuICAgIHZhciByZXMgPSBnZW5lcmF0ZUJydXRlRm9yY2UocmVkTWFqb3IsIGZsaXAsIGZ1bGwpXG4gICAgcHJlZml4LnB1c2gocmVzLmNvZGUpXG4gICAgY29kZS5wdXNoKCdyZXR1cm4gJyArIHJlcy5uYW1lICsgJygnICsgQVJHUy5qb2luKCkgKyAnKTsnKVxuICB9XG5cbiAgY29kZS5wdXNoKCdpZignICsgUkVEX0VORCArICctJyArIFJFRF9TVEFSVCArICc+JyArXG4gICAgICAgICAgICAgICAgICAgIEJMVUVfRU5EICsgJy0nICsgQkxVRV9TVEFSVCArICcpeycpXG5cbiAgaWYoZnVsbCkge1xuICAgIGludm9rZSh0cnVlLCBmYWxzZSlcbiAgICBjb2RlLnB1c2goJ31lbHNleycpXG4gICAgaW52b2tlKGZhbHNlLCBmYWxzZSlcbiAgfSBlbHNlIHtcbiAgICBjb2RlLnB1c2goJ2lmKCcgKyBGTElQICsgJyl7JylcbiAgICBpbnZva2UodHJ1ZSwgdHJ1ZSlcbiAgICBjb2RlLnB1c2goJ31lbHNleycpXG4gICAgaW52b2tlKHRydWUsIGZhbHNlKVxuICAgIGNvZGUucHVzaCgnfX1lbHNle2lmKCcgKyBGTElQICsgJyl7JylcbiAgICBpbnZva2UoZmFsc2UsIHRydWUpXG4gICAgY29kZS5wdXNoKCd9ZWxzZXsnKVxuICAgIGludm9rZShmYWxzZSwgZmFsc2UpXG4gICAgY29kZS5wdXNoKCd9JylcbiAgfVxuICBjb2RlLnB1c2goJ319cmV0dXJuICcgKyBmdW5jTmFtZSlcblxuICB2YXIgY29kZVN0ciA9IHByZWZpeC5qb2luKCcnKSArIGNvZGUuam9pbignJylcbiAgdmFyIHByb2MgPSBuZXcgRnVuY3Rpb24oY29kZVN0cilcbiAgcmV0dXJuIHByb2MoKVxufVxuXG5cbmV4cG9ydHMucGFydGlhbCA9IGJydXRlRm9yY2VQbGFubmVyKGZhbHNlKVxuZXhwb3J0cy5mdWxsICAgID0gYnJ1dGVGb3JjZVBsYW5uZXIodHJ1ZSkiLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBib3hJbnRlcnNlY3RJdGVyXG5cbnZhciBwb29sID0gcmVxdWlyZSgndHlwZWRhcnJheS1wb29sJylcbnZhciBiaXRzID0gcmVxdWlyZSgnYml0LXR3aWRkbGUnKVxudmFyIGJydXRlRm9yY2UgPSByZXF1aXJlKCcuL2JydXRlJylcbnZhciBicnV0ZUZvcmNlUGFydGlhbCA9IGJydXRlRm9yY2UucGFydGlhbFxudmFyIGJydXRlRm9yY2VGdWxsID0gYnJ1dGVGb3JjZS5mdWxsXG52YXIgc3dlZXAgPSByZXF1aXJlKCcuL3N3ZWVwJylcbnZhciBmaW5kTWVkaWFuID0gcmVxdWlyZSgnLi9tZWRpYW4nKVxudmFyIGdlblBhcnRpdGlvbiA9IHJlcXVpcmUoJy4vcGFydGl0aW9uJylcblxuLy9Ud2lkZGxlIHBhcmFtZXRlcnNcbnZhciBCUlVURV9GT1JDRV9DVVRPRkYgICAgPSAxMjggICAgICAgLy9DdXQgb2ZmIGZvciBicnV0ZSBmb3JjZSBzZWFyY2hcbnZhciBTQ0FOX0NVVE9GRiAgICAgICAgICAgPSAoMTw8MjIpICAgLy9DdXQgb2ZmIGZvciB0d28gd2F5IHNjYW5cbnZhciBTQ0FOX0NPTVBMRVRFX0NVVE9GRiAgPSAoMTw8MjIpICBcblxuLy9QYXJ0aXRpb24gZnVuY3Rpb25zXG52YXIgcGFydGl0aW9uSW50ZXJpb3JDb250YWluc0ludGVydmFsID0gZ2VuUGFydGl0aW9uKFxuICAnIShsbz49cDApJiYhKHAxPj1oaSknLCBcbiAgWydwMCcsICdwMSddKVxuXG52YXIgcGFydGl0aW9uU3RhcnRFcXVhbCA9IGdlblBhcnRpdGlvbihcbiAgJ2xvPT09cDAnLFxuICBbJ3AwJ10pXG5cbnZhciBwYXJ0aXRpb25TdGFydExlc3NUaGFuID0gZ2VuUGFydGl0aW9uKFxuICAnbG88cDAnLFxuICBbJ3AwJ10pXG5cbnZhciBwYXJ0aXRpb25FbmRMZXNzVGhhbkVxdWFsID0gZ2VuUGFydGl0aW9uKFxuICAnaGk8PXAwJyxcbiAgWydwMCddKVxuXG52YXIgcGFydGl0aW9uQ29udGFpbnNQb2ludCA9IGdlblBhcnRpdGlvbihcbiAgJ2xvPD1wMCYmcDA8PWhpJyxcbiAgWydwMCddKVxuXG52YXIgcGFydGl0aW9uQ29udGFpbnNQb2ludFByb3BlciA9IGdlblBhcnRpdGlvbihcbiAgJ2xvPHAwJiZwMDw9aGknLFxuICBbJ3AwJ10pXG5cbi8vRnJhbWUgc2l6ZSBmb3IgaXRlcmF0aXZlIGxvb3BcbnZhciBJRlJBTUVfU0laRSA9IDZcbnZhciBERlJBTUVfU0laRSA9IDJcblxuLy9EYXRhIGZvciBib3ggc3RhdGNrXG52YXIgSU5JVF9DQVBBQ0lUWSA9IDEwMjRcbnZhciBCT1hfSVNUQUNLICA9IHBvb2wubWFsbG9jSW50MzIoSU5JVF9DQVBBQ0lUWSlcbnZhciBCT1hfRFNUQUNLICA9IHBvb2wubWFsbG9jRG91YmxlKElOSVRfQ0FQQUNJVFkpXG5cbi8vSW5pdGlhbGl6ZSBpdGVyYXRpdmUgbG9vcCBxdWV1ZVxuZnVuY3Rpb24gaXRlckluaXQoZCwgY291bnQpIHtcbiAgdmFyIGxldmVscyA9ICg4ICogYml0cy5sb2cyKGNvdW50KzEpICogKGQrMSkpfDBcbiAgdmFyIG1heEludHMgPSBiaXRzLm5leHRQb3cyKElGUkFNRV9TSVpFKmxldmVscylcbiAgaWYoQk9YX0lTVEFDSy5sZW5ndGggPCBtYXhJbnRzKSB7XG4gICAgcG9vbC5mcmVlKEJPWF9JU1RBQ0spXG4gICAgQk9YX0lTVEFDSyA9IHBvb2wubWFsbG9jSW50MzIobWF4SW50cylcbiAgfVxuICB2YXIgbWF4RG91YmxlcyA9IGJpdHMubmV4dFBvdzIoREZSQU1FX1NJWkUqbGV2ZWxzKVxuICBpZihCT1hfRFNUQUNLIDwgbWF4RG91Ymxlcykge1xuICAgIHBvb2wuZnJlZShCT1hfRFNUQUNLKVxuICAgIEJPWF9EU1RBQ0sgPSBwb29sLm1hbGxvY0RvdWJsZShtYXhEb3VibGVzKVxuICB9XG59XG5cbi8vQXBwZW5kIGl0ZW0gdG8gcXVldWVcbmZ1bmN0aW9uIGl0ZXJQdXNoKHB0cixcbiAgYXhpcywgXG4gIHJlZFN0YXJ0LCByZWRFbmQsIFxuICBibHVlU3RhcnQsIGJsdWVFbmQsIFxuICBzdGF0ZSwgXG4gIGxvLCBoaSkge1xuXG4gIHZhciBpcHRyID0gSUZSQU1FX1NJWkUgKiBwdHJcbiAgQk9YX0lTVEFDS1tpcHRyXSAgID0gYXhpc1xuICBCT1hfSVNUQUNLW2lwdHIrMV0gPSByZWRTdGFydFxuICBCT1hfSVNUQUNLW2lwdHIrMl0gPSByZWRFbmRcbiAgQk9YX0lTVEFDS1tpcHRyKzNdID0gYmx1ZVN0YXJ0XG4gIEJPWF9JU1RBQ0tbaXB0cis0XSA9IGJsdWVFbmRcbiAgQk9YX0lTVEFDS1tpcHRyKzVdID0gc3RhdGVcblxuICB2YXIgZHB0ciA9IERGUkFNRV9TSVpFICogcHRyXG4gIEJPWF9EU1RBQ0tbZHB0cl0gICA9IGxvXG4gIEJPWF9EU1RBQ0tbZHB0cisxXSA9IGhpXG59XG5cbi8vU3BlY2lhbCBjYXNlOiAgSW50ZXJzZWN0IHNpbmdsZSBwb2ludCB3aXRoIGxpc3Qgb2YgaW50ZXJ2YWxzXG5mdW5jdGlvbiBvbmVQb2ludFBhcnRpYWwoXG4gIGQsIGF4aXMsIHZpc2l0LCBmbGlwLFxuICByZWRTdGFydCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICBibHVlT2Zmc2V0LCBibHVlLCBibHVlSWQpIHtcblxuICB2YXIgZWxlbVNpemUgPSAyICogZFxuICB2YXIgYmx1ZVB0ciAgPSBibHVlT2Zmc2V0ICogZWxlbVNpemVcbiAgdmFyIGJsdWVYICAgID0gYmx1ZVtibHVlUHRyICsgYXhpc11cblxucmVkX2xvb3A6XG4gIGZvcih2YXIgaT1yZWRTdGFydCwgcmVkUHRyPXJlZFN0YXJ0KmVsZW1TaXplOyBpPHJlZEVuZDsgKytpLCByZWRQdHIrPWVsZW1TaXplKSB7XG4gICAgdmFyIHIwID0gcmVkW3JlZFB0citheGlzXVxuICAgIHZhciByMSA9IHJlZFtyZWRQdHIrYXhpcytkXVxuICAgIGlmKGJsdWVYIDwgcjAgfHwgcjEgPCBibHVlWCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYoZmxpcCAmJiBibHVlWCA9PT0gcjApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIHZhciByZWRJZCA9IHJlZEluZGV4W2ldXG4gICAgZm9yKHZhciBqPWF4aXMrMTsgajxkOyArK2opIHtcbiAgICAgIHZhciByMCA9IHJlZFtyZWRQdHIral1cbiAgICAgIHZhciByMSA9IHJlZFtyZWRQdHIraitkXVxuICAgICAgdmFyIGIwID0gYmx1ZVtibHVlUHRyK2pdXG4gICAgICB2YXIgYjEgPSBibHVlW2JsdWVQdHIraitkXVxuICAgICAgaWYocjEgPCBiMCB8fCBiMSA8IHIwKSB7XG4gICAgICAgIGNvbnRpbnVlIHJlZF9sb29wXG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXR2YWxcbiAgICBpZihmbGlwKSB7XG4gICAgICByZXR2YWwgPSB2aXNpdChibHVlSWQsIHJlZElkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR2YWwgPSB2aXNpdChyZWRJZCwgYmx1ZUlkKVxuICAgIH1cbiAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHJldHZhbFxuICAgIH1cbiAgfVxufVxuXG4vL1NwZWNpYWwgY2FzZTogIEludGVyc2VjdCBvbmUgcG9pbnQgd2l0aCBsaXN0IG9mIGludGVydmFsc1xuZnVuY3Rpb24gb25lUG9pbnRGdWxsKFxuICBkLCBheGlzLCB2aXNpdCxcbiAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgYmx1ZU9mZnNldCwgYmx1ZSwgYmx1ZUlkKSB7XG5cbiAgdmFyIGVsZW1TaXplID0gMiAqIGRcbiAgdmFyIGJsdWVQdHIgID0gYmx1ZU9mZnNldCAqIGVsZW1TaXplXG4gIHZhciBibHVlWCAgICA9IGJsdWVbYmx1ZVB0ciArIGF4aXNdXG5cbnJlZF9sb29wOlxuICBmb3IodmFyIGk9cmVkU3RhcnQsIHJlZFB0cj1yZWRTdGFydCplbGVtU2l6ZTsgaTxyZWRFbmQ7ICsraSwgcmVkUHRyKz1lbGVtU2l6ZSkge1xuICAgIHZhciByZWRJZCA9IHJlZEluZGV4W2ldXG4gICAgaWYocmVkSWQgPT09IGJsdWVJZCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgdmFyIHIwID0gcmVkW3JlZFB0citheGlzXVxuICAgIHZhciByMSA9IHJlZFtyZWRQdHIrYXhpcytkXVxuICAgIGlmKGJsdWVYIDwgcjAgfHwgcjEgPCBibHVlWCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgZm9yKHZhciBqPWF4aXMrMTsgajxkOyArK2opIHtcbiAgICAgIHZhciByMCA9IHJlZFtyZWRQdHIral1cbiAgICAgIHZhciByMSA9IHJlZFtyZWRQdHIraitkXVxuICAgICAgdmFyIGIwID0gYmx1ZVtibHVlUHRyK2pdXG4gICAgICB2YXIgYjEgPSBibHVlW2JsdWVQdHIraitkXVxuICAgICAgaWYocjEgPCBiMCB8fCBiMSA8IHIwKSB7XG4gICAgICAgIGNvbnRpbnVlIHJlZF9sb29wXG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXR2YWwgPSB2aXNpdChyZWRJZCwgYmx1ZUlkKVxuICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmV0dmFsXG4gICAgfVxuICB9XG59XG5cbi8vVGhlIG1haW4gYm94IGludGVyc2VjdGlvbiByb3V0aW5lXG5mdW5jdGlvbiBib3hJbnRlcnNlY3RJdGVyKFxuICBkLCB2aXNpdCwgaW5pdEZ1bGwsXG4gIHhTaXplLCB4Qm94ZXMsIHhJbmRleCxcbiAgeVNpemUsIHlCb3hlcywgeUluZGV4KSB7XG5cbiAgLy9SZXNlcnZlIG1lbW9yeSBmb3Igc3RhY2tcbiAgaXRlckluaXQoZCwgeFNpemUgKyB5U2l6ZSlcblxuICB2YXIgdG9wICA9IDBcbiAgdmFyIGVsZW1TaXplID0gMiAqIGRcbiAgdmFyIHJldHZhbFxuXG4gIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgMCxcbiAgICAgIDAsIHhTaXplLFxuICAgICAgMCwgeVNpemUsXG4gICAgICBpbml0RnVsbCA/IDE2IDogMCwgXG4gICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICBpZighaW5pdEZ1bGwpIHtcbiAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgIDAsXG4gICAgICAwLCB5U2l6ZSxcbiAgICAgIDAsIHhTaXplLFxuICAgICAgMSwgXG4gICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICB9XG5cbiAgd2hpbGUodG9wID4gMCkge1xuICAgIHRvcCAgLT0gMVxuXG4gICAgdmFyIGlwdHIgPSB0b3AgKiBJRlJBTUVfU0laRVxuICAgIHZhciBheGlzICAgICAgPSBCT1hfSVNUQUNLW2lwdHJdXG4gICAgdmFyIHJlZFN0YXJ0ICA9IEJPWF9JU1RBQ0tbaXB0cisxXVxuICAgIHZhciByZWRFbmQgICAgPSBCT1hfSVNUQUNLW2lwdHIrMl1cbiAgICB2YXIgYmx1ZVN0YXJ0ID0gQk9YX0lTVEFDS1tpcHRyKzNdXG4gICAgdmFyIGJsdWVFbmQgICA9IEJPWF9JU1RBQ0tbaXB0cis0XVxuICAgIHZhciBzdGF0ZSAgICAgPSBCT1hfSVNUQUNLW2lwdHIrNV1cblxuICAgIHZhciBkcHRyID0gdG9wICogREZSQU1FX1NJWkVcbiAgICB2YXIgbG8gICAgICAgID0gQk9YX0RTVEFDS1tkcHRyXVxuICAgIHZhciBoaSAgICAgICAgPSBCT1hfRFNUQUNLW2RwdHIrMV1cblxuICAgIC8vVW5wYWNrIHN0YXRlIGluZm9cbiAgICB2YXIgZmxpcCAgICAgID0gKHN0YXRlICYgMSlcbiAgICB2YXIgZnVsbCAgICAgID0gISEoc3RhdGUgJiAxNilcblxuICAgIC8vVW5wYWNrIGluZGljZXNcbiAgICB2YXIgcmVkICAgICAgID0geEJveGVzXG4gICAgdmFyIHJlZEluZGV4ICA9IHhJbmRleFxuICAgIHZhciBibHVlICAgICAgPSB5Qm94ZXNcbiAgICB2YXIgYmx1ZUluZGV4ID0geUluZGV4XG4gICAgaWYoZmxpcCkge1xuICAgICAgcmVkICAgICAgICAgPSB5Qm94ZXNcbiAgICAgIHJlZEluZGV4ICAgID0geUluZGV4XG4gICAgICBibHVlICAgICAgICA9IHhCb3hlc1xuICAgICAgYmx1ZUluZGV4ICAgPSB4SW5kZXhcbiAgICB9XG5cbiAgICBpZihzdGF0ZSAmIDIpIHtcbiAgICAgIHJlZEVuZCA9IHBhcnRpdGlvblN0YXJ0TGVzc1RoYW4oXG4gICAgICAgIGQsIGF4aXMsXG4gICAgICAgIHJlZFN0YXJ0LCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgIGhpKVxuICAgICAgaWYocmVkU3RhcnQgPj0gcmVkRW5kKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuICAgIGlmKHN0YXRlICYgNCkge1xuICAgICAgcmVkU3RhcnQgPSBwYXJ0aXRpb25FbmRMZXNzVGhhbkVxdWFsKFxuICAgICAgICBkLCBheGlzLFxuICAgICAgICByZWRTdGFydCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICBsbylcbiAgICAgIGlmKHJlZFN0YXJ0ID49IHJlZEVuZCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB2YXIgcmVkQ291bnQgID0gcmVkRW5kICAtIHJlZFN0YXJ0XG4gICAgdmFyIGJsdWVDb3VudCA9IGJsdWVFbmQgLSBibHVlU3RhcnRcblxuICAgIGlmKGZ1bGwpIHtcbiAgICAgIGlmKGQgKiByZWRDb3VudCAqIChyZWRDb3VudCArIGJsdWVDb3VudCkgPCBTQ0FOX0NPTVBMRVRFX0NVVE9GRikge1xuICAgICAgICByZXR2YWwgPSBzd2VlcC5zY2FuQ29tcGxldGUoXG4gICAgICAgICAgZCwgYXhpcywgdmlzaXQsIFxuICAgICAgICAgIHJlZFN0YXJ0LCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGQgKiBNYXRoLm1pbihyZWRDb3VudCwgYmx1ZUNvdW50KSA8IEJSVVRFX0ZPUkNFX0NVVE9GRikge1xuICAgICAgICAvL0lmIGlucHV0IHNtYWxsLCB0aGVuIHVzZSBicnV0ZSBmb3JjZVxuICAgICAgICByZXR2YWwgPSBicnV0ZUZvcmNlUGFydGlhbChcbiAgICAgICAgICAgIGQsIGF4aXMsIHZpc2l0LCBmbGlwLFxuICAgICAgICAgICAgcmVkU3RhcnQsICByZWRFbmQsICByZWQsICByZWRJbmRleCxcbiAgICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmKGQgKiByZWRDb3VudCAqIGJsdWVDb3VudCA8IFNDQU5fQ1VUT0ZGKSB7XG4gICAgICAgIC8vSWYgaW5wdXQgbWVkaXVtIHNpemVkLCB0aGVuIHVzZSBzd2VlcCBhbmQgcHJ1bmVcbiAgICAgICAgcmV0dmFsID0gc3dlZXAuc2NhbkJpcGFydGl0ZShcbiAgICAgICAgICBkLCBheGlzLCB2aXNpdCwgZmxpcCwgXG4gICAgICAgICAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy9GaXJzdCwgZmluZCBhbGwgcmVkIGludGVydmFscyB3aG9zZSBpbnRlcmlvciBjb250YWlucyAobG8saGkpXG4gICAgdmFyIHJlZDAgPSBwYXJ0aXRpb25JbnRlcmlvckNvbnRhaW5zSW50ZXJ2YWwoXG4gICAgICBkLCBheGlzLCBcbiAgICAgIHJlZFN0YXJ0LCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICBsbywgaGkpXG5cbiAgICAvL0xvd2VyIGRpbWVuc2lvbmFsIGNhc2VcbiAgICBpZihyZWRTdGFydCA8IHJlZDApIHtcblxuICAgICAgaWYoZCAqIChyZWQwIC0gcmVkU3RhcnQpIDwgQlJVVEVfRk9SQ0VfQ1VUT0ZGKSB7XG4gICAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciBzbWFsbCBpbnB1dHM6IHVzZSBicnV0ZSBmb3JjZVxuICAgICAgICByZXR2YWwgPSBicnV0ZUZvcmNlRnVsbChcbiAgICAgICAgICBkLCBheGlzKzEsIHZpc2l0LFxuICAgICAgICAgIHJlZFN0YXJ0LCByZWQwLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KVxuICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKGF4aXMgPT09IGQtMikge1xuICAgICAgICBpZihmbGlwKSB7XG4gICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4LFxuICAgICAgICAgICAgcmVkU3RhcnQsIHJlZDAsIHJlZCwgcmVkSW5kZXgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgIHJlZFN0YXJ0LCByZWQwLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgICAgIGF4aXMrMSxcbiAgICAgICAgICByZWRTdGFydCwgcmVkMCxcbiAgICAgICAgICBibHVlU3RhcnQsIGJsdWVFbmQsXG4gICAgICAgICAgZmxpcCxcbiAgICAgICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgYmx1ZVN0YXJ0LCBibHVlRW5kLFxuICAgICAgICAgIHJlZFN0YXJ0LCByZWQwLFxuICAgICAgICAgIGZsaXBeMSxcbiAgICAgICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vRGl2aWRlIGFuZCBjb25xdWVyIHBoYXNlXG4gICAgaWYocmVkMCA8IHJlZEVuZCkge1xuXG4gICAgICAvL0N1dCBibHVlIGludG8gMyBwYXJ0czpcbiAgICAgIC8vXG4gICAgICAvLyAgUG9pbnRzIDwgbWlkIHBvaW50XG4gICAgICAvLyAgUG9pbnRzID0gbWlkIHBvaW50XG4gICAgICAvLyAgUG9pbnRzID4gbWlkIHBvaW50XG4gICAgICAvL1xuICAgICAgdmFyIGJsdWUwID0gZmluZE1lZGlhbihcbiAgICAgICAgZCwgYXhpcywgXG4gICAgICAgIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KVxuICAgICAgdmFyIG1pZCA9IGJsdWVbZWxlbVNpemUgKiBibHVlMCArIGF4aXNdXG4gICAgICB2YXIgYmx1ZTEgPSBwYXJ0aXRpb25TdGFydEVxdWFsKFxuICAgICAgICBkLCBheGlzLFxuICAgICAgICBibHVlMCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4LFxuICAgICAgICBtaWQpXG5cbiAgICAgIC8vUmlnaHQgY2FzZVxuICAgICAgaWYoYmx1ZTEgPCBibHVlRW5kKSB7XG4gICAgICAgIGl0ZXJQdXNoKHRvcCsrLFxuICAgICAgICAgIGF4aXMsXG4gICAgICAgICAgcmVkMCwgcmVkRW5kLFxuICAgICAgICAgIGJsdWUxLCBibHVlRW5kLFxuICAgICAgICAgIChmbGlwfDQpICsgKGZ1bGwgPyAxNiA6IDApLFxuICAgICAgICAgIG1pZCwgaGkpXG4gICAgICB9XG5cbiAgICAgIC8vTGVmdCBjYXNlXG4gICAgICBpZihibHVlU3RhcnQgPCBibHVlMCkge1xuICAgICAgICBpdGVyUHVzaCh0b3ArKyxcbiAgICAgICAgICBheGlzLFxuICAgICAgICAgIHJlZDAsIHJlZEVuZCxcbiAgICAgICAgICBibHVlU3RhcnQsIGJsdWUwLFxuICAgICAgICAgIChmbGlwfDIpICsgKGZ1bGwgPyAxNiA6IDApLFxuICAgICAgICAgIGxvLCBtaWQpXG4gICAgICB9XG5cbiAgICAgIC8vQ2VudGVyIGNhc2UgKHRoZSBoYXJkIHBhcnQpXG4gICAgICBpZihibHVlMCArIDEgPT09IGJsdWUxKSB7XG4gICAgICAgIC8vT3B0aW1pemF0aW9uOiBSYW5nZSB3aXRoIGV4YWN0bHkgMSBwb2ludCwgdXNlIGEgYnJ1dGUgZm9yY2Ugc2NhblxuICAgICAgICBpZihmdWxsKSB7XG4gICAgICAgICAgcmV0dmFsID0gb25lUG9pbnRGdWxsKFxuICAgICAgICAgICAgZCwgYXhpcywgdmlzaXQsXG4gICAgICAgICAgICByZWQwLCByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICBibHVlMCwgYmx1ZSwgYmx1ZUluZGV4W2JsdWUwXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR2YWwgPSBvbmVQb2ludFBhcnRpYWwoXG4gICAgICAgICAgICBkLCBheGlzLCB2aXNpdCwgZmxpcCxcbiAgICAgICAgICAgIHJlZDAsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICAgIGJsdWUwLCBibHVlLCBibHVlSW5kZXhbYmx1ZTBdKVxuICAgICAgICB9XG4gICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoYmx1ZTAgPCBibHVlMSkge1xuICAgICAgICB2YXIgcmVkMVxuICAgICAgICBpZihmdWxsKSB7XG4gICAgICAgICAgLy9JZiBmdWxsIGludGVyc2VjdGlvbiwgbmVlZCB0byBoYW5kbGUgc3BlY2lhbCBjYXNlXG4gICAgICAgICAgcmVkMSA9IHBhcnRpdGlvbkNvbnRhaW5zUG9pbnQoXG4gICAgICAgICAgICBkLCBheGlzLFxuICAgICAgICAgICAgcmVkMCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgbWlkKVxuICAgICAgICAgIGlmKHJlZDAgPCByZWQxKSB7XG4gICAgICAgICAgICB2YXIgcmVkWCA9IHBhcnRpdGlvblN0YXJ0RXF1YWwoXG4gICAgICAgICAgICAgIGQsIGF4aXMsXG4gICAgICAgICAgICAgIHJlZDAsIHJlZDEsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICAgIG1pZClcbiAgICAgICAgICAgIGlmKGF4aXMgPT09IGQtMikge1xuICAgICAgICAgICAgICAvL0RlZ2VuZXJhdGUgc3dlZXAgaW50ZXJzZWN0aW9uOlxuICAgICAgICAgICAgICAvLyAgW3JlZDAsIHJlZFhdIHdpdGggW2JsdWUwLCBibHVlMV1cbiAgICAgICAgICAgICAgaWYocmVkMCA8IHJlZFgpIHtcbiAgICAgICAgICAgICAgICByZXR2YWwgPSBzd2VlcC5zd2VlcENvbXBsZXRlKFxuICAgICAgICAgICAgICAgICAgZCwgdmlzaXQsXG4gICAgICAgICAgICAgICAgICByZWQwLCByZWRYLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgICAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvL05vcm1hbCBzd2VlcCBpbnRlcnNlY3Rpb246XG4gICAgICAgICAgICAgIC8vICBbcmVkWCwgcmVkMV0gd2l0aCBbYmx1ZTAsIGJsdWUxXVxuICAgICAgICAgICAgICBpZihyZWRYIDwgcmVkMSkge1xuICAgICAgICAgICAgICAgIHJldHZhbCA9IHN3ZWVwLnN3ZWVwQmlwYXJ0aXRlKFxuICAgICAgICAgICAgICAgICAgZCwgdmlzaXQsXG4gICAgICAgICAgICAgICAgICByZWRYLCByZWQxLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLCBibHVlLCBibHVlSW5kZXgpXG4gICAgICAgICAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmKHJlZDAgPCByZWRYKSB7XG4gICAgICAgICAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgICAgICAgICByZWQwLCByZWRYLFxuICAgICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLFxuICAgICAgICAgICAgICAgICAgMTYsXG4gICAgICAgICAgICAgICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmKHJlZFggPCByZWQxKSB7XG4gICAgICAgICAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgICAgICAgICByZWRYLCByZWQxLFxuICAgICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLFxuICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICAgICAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgICAgICAgICBheGlzKzEsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsXG4gICAgICAgICAgICAgICAgICByZWRYLCByZWQxLFxuICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoZmxpcCkge1xuICAgICAgICAgICAgcmVkMSA9IHBhcnRpdGlvbkNvbnRhaW5zUG9pbnRQcm9wZXIoXG4gICAgICAgICAgICAgIGQsIGF4aXMsXG4gICAgICAgICAgICAgIHJlZDAsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICAgICAgICAgICAgbWlkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWQxID0gcGFydGl0aW9uQ29udGFpbnNQb2ludChcbiAgICAgICAgICAgICAgZCwgYXhpcyxcbiAgICAgICAgICAgICAgcmVkMCwgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICAgICAgICAgICAgICBtaWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlZDAgPCByZWQxKSB7XG4gICAgICAgICAgICBpZihheGlzID09PSBkLTIpIHtcbiAgICAgICAgICAgICAgaWYoZmxpcCkge1xuICAgICAgICAgICAgICAgIHJldHZhbCA9IHN3ZWVwLnN3ZWVwQmlwYXJ0aXRlKFxuICAgICAgICAgICAgICAgICAgZCwgdmlzaXQsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsIGJsdWUsIGJsdWVJbmRleCxcbiAgICAgICAgICAgICAgICAgIHJlZDAsIHJlZDEsIHJlZCwgcmVkSW5kZXgpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dmFsID0gc3dlZXAuc3dlZXBCaXBhcnRpdGUoXG4gICAgICAgICAgICAgICAgICBkLCB2aXNpdCxcbiAgICAgICAgICAgICAgICAgIHJlZDAsIHJlZDEsIHJlZCwgcmVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICBibHVlMCwgYmx1ZTEsIGJsdWUsIGJsdWVJbmRleClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgICAgICAgYXhpcysxLFxuICAgICAgICAgICAgICAgIHJlZDAsIHJlZDEsXG4gICAgICAgICAgICAgICAgYmx1ZTAsIGJsdWUxLFxuICAgICAgICAgICAgICAgIGZsaXAsXG4gICAgICAgICAgICAgICAgLUluZmluaXR5LCBJbmZpbml0eSlcbiAgICAgICAgICAgICAgaXRlclB1c2godG9wKyssXG4gICAgICAgICAgICAgICAgYXhpcysxLFxuICAgICAgICAgICAgICAgIGJsdWUwLCBibHVlMSxcbiAgICAgICAgICAgICAgICByZWQwLCByZWQxLFxuICAgICAgICAgICAgICAgIGZsaXBeMSxcbiAgICAgICAgICAgICAgICAtSW5maW5pdHksIEluZmluaXR5KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRNZWRpYW5cblxudmFyIGdlblBhcnRpdGlvbiA9IHJlcXVpcmUoJy4vcGFydGl0aW9uJylcblxudmFyIHBhcnRpdGlvblN0YXJ0TGVzc1RoYW4gPSBnZW5QYXJ0aXRpb24oJ2xvPHAwJywgWydwMCddKVxuXG52YXIgUEFSVElUSU9OX1RIUkVTSE9MRCA9IDggICAvL0N1dCBvZmYgZm9yIHVzaW5nIGluc2VydGlvbiBzb3J0IGluIGZpbmRNZWRpYW5cblxuLy9CYXNlIGNhc2UgZm9yIG1lZGlhbiBmaW5kaW5nOiAgVXNlIGluc2VydGlvbiBzb3J0XG5mdW5jdGlvbiBpbnNlcnRpb25Tb3J0KGQsIGF4aXMsIHN0YXJ0LCBlbmQsIGJveGVzLCBpZHMpIHtcbiAgdmFyIGVsZW1TaXplID0gMiAqIGRcbiAgdmFyIGJveFB0ciA9IGVsZW1TaXplICogKHN0YXJ0KzEpICsgYXhpc1xuICBmb3IodmFyIGk9c3RhcnQrMTsgaTxlbmQ7ICsraSwgYm94UHRyKz1lbGVtU2l6ZSkge1xuICAgIHZhciB4ID0gYm94ZXNbYm94UHRyXVxuICAgIGZvcih2YXIgaj1pLCBwdHI9ZWxlbVNpemUqKGktMSk7IFxuICAgICAgICBqPnN0YXJ0ICYmIGJveGVzW3B0citheGlzXSA+IHg7IFxuICAgICAgICAtLWosIHB0ci09ZWxlbVNpemUpIHtcbiAgICAgIC8vU3dhcFxuICAgICAgdmFyIGFQdHIgPSBwdHJcbiAgICAgIHZhciBiUHRyID0gcHRyK2VsZW1TaXplXG4gICAgICBmb3IodmFyIGs9MDsgazxlbGVtU2l6ZTsgKytrLCArK2FQdHIsICsrYlB0cikge1xuICAgICAgICB2YXIgeSA9IGJveGVzW2FQdHJdXG4gICAgICAgIGJveGVzW2FQdHJdID0gYm94ZXNbYlB0cl1cbiAgICAgICAgYm94ZXNbYlB0cl0gPSB5XG4gICAgICB9XG4gICAgICB2YXIgdG1wID0gaWRzW2pdXG4gICAgICBpZHNbal0gPSBpZHNbai0xXVxuICAgICAgaWRzW2otMV0gPSB0bXBcbiAgICB9XG4gIH1cbn1cblxuLy9GaW5kIG1lZGlhbiB1c2luZyBxdWljayBzZWxlY3QgYWxnb3JpdGhtXG4vLyAgdGFrZXMgTyhuKSB0aW1lIHdpdGggaGlnaCBwcm9iYWJpbGl0eVxuZnVuY3Rpb24gZmluZE1lZGlhbihkLCBheGlzLCBzdGFydCwgZW5kLCBib3hlcywgaWRzKSB7XG4gIGlmKGVuZCA8PSBzdGFydCsxKSB7XG4gICAgcmV0dXJuIHN0YXJ0XG4gIH1cblxuICB2YXIgbG8gICAgICAgPSBzdGFydFxuICB2YXIgaGkgICAgICAgPSBlbmRcbiAgdmFyIG1pZCAgICAgID0gKChlbmQgKyBzdGFydCkgPj4+IDEpXG4gIHZhciBlbGVtU2l6ZSA9IDIqZFxuICB2YXIgcGl2b3QgICAgPSBtaWRcbiAgdmFyIHZhbHVlICAgID0gYm94ZXNbZWxlbVNpemUqbWlkK2F4aXNdXG4gIFxuICB3aGlsZShsbyA8IGhpKSB7XG4gICAgaWYoaGkgLSBsbyA8IFBBUlRJVElPTl9USFJFU0hPTEQpIHtcbiAgICAgIGluc2VydGlvblNvcnQoZCwgYXhpcywgbG8sIGhpLCBib3hlcywgaWRzKVxuICAgICAgdmFsdWUgPSBib3hlc1tlbGVtU2l6ZSptaWQrYXhpc11cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIFxuICAgIC8vU2VsZWN0IHBpdm90IHVzaW5nIG1lZGlhbi1vZi0zXG4gICAgdmFyIGNvdW50ICA9IGhpIC0gbG9cbiAgICB2YXIgcGl2b3QwID0gKE1hdGgucmFuZG9tKCkqY291bnQrbG8pfDBcbiAgICB2YXIgdmFsdWUwID0gYm94ZXNbZWxlbVNpemUqcGl2b3QwICsgYXhpc11cbiAgICB2YXIgcGl2b3QxID0gKE1hdGgucmFuZG9tKCkqY291bnQrbG8pfDBcbiAgICB2YXIgdmFsdWUxID0gYm94ZXNbZWxlbVNpemUqcGl2b3QxICsgYXhpc11cbiAgICB2YXIgcGl2b3QyID0gKE1hdGgucmFuZG9tKCkqY291bnQrbG8pfDBcbiAgICB2YXIgdmFsdWUyID0gYm94ZXNbZWxlbVNpemUqcGl2b3QyICsgYXhpc11cbiAgICBpZih2YWx1ZTAgPD0gdmFsdWUxKSB7XG4gICAgICBpZih2YWx1ZTIgPj0gdmFsdWUxKSB7XG4gICAgICAgIHBpdm90ID0gcGl2b3QxXG4gICAgICAgIHZhbHVlID0gdmFsdWUxXG4gICAgICB9IGVsc2UgaWYodmFsdWUwID49IHZhbHVlMikge1xuICAgICAgICBwaXZvdCA9IHBpdm90MFxuICAgICAgICB2YWx1ZSA9IHZhbHVlMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGl2b3QgPSBwaXZvdDJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYodmFsdWUxID49IHZhbHVlMikge1xuICAgICAgICBwaXZvdCA9IHBpdm90MVxuICAgICAgICB2YWx1ZSA9IHZhbHVlMVxuICAgICAgfSBlbHNlIGlmKHZhbHVlMiA+PSB2YWx1ZTApIHtcbiAgICAgICAgcGl2b3QgPSBwaXZvdDBcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpdm90ID0gcGl2b3QyXG4gICAgICAgIHZhbHVlID0gdmFsdWUyXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9Td2FwIHBpdm90IHRvIGVuZCBvZiBhcnJheVxuICAgIHZhciBhUHRyID0gZWxlbVNpemUgKiAoaGktMSlcbiAgICB2YXIgYlB0ciA9IGVsZW1TaXplICogcGl2b3RcbiAgICBmb3IodmFyIGk9MDsgaTxlbGVtU2l6ZTsgKytpLCArK2FQdHIsICsrYlB0cikge1xuICAgICAgdmFyIHggPSBib3hlc1thUHRyXVxuICAgICAgYm94ZXNbYVB0cl0gPSBib3hlc1tiUHRyXVxuICAgICAgYm94ZXNbYlB0cl0gPSB4XG4gICAgfVxuICAgIHZhciB5ID0gaWRzW2hpLTFdXG4gICAgaWRzW2hpLTFdID0gaWRzW3Bpdm90XVxuICAgIGlkc1twaXZvdF0gPSB5XG5cbiAgICAvL1BhcnRpdGlvbiB1c2luZyBwaXZvdFxuICAgIHBpdm90ID0gcGFydGl0aW9uU3RhcnRMZXNzVGhhbihcbiAgICAgIGQsIGF4aXMsIFxuICAgICAgbG8sIGhpLTEsIGJveGVzLCBpZHMsXG4gICAgICB2YWx1ZSlcblxuICAgIC8vU3dhcCBwaXZvdCBiYWNrXG4gICAgdmFyIGFQdHIgPSBlbGVtU2l6ZSAqIChoaS0xKVxuICAgIHZhciBiUHRyID0gZWxlbVNpemUgKiBwaXZvdFxuICAgIGZvcih2YXIgaT0wOyBpPGVsZW1TaXplOyArK2ksICsrYVB0ciwgKytiUHRyKSB7XG4gICAgICB2YXIgeCA9IGJveGVzW2FQdHJdXG4gICAgICBib3hlc1thUHRyXSA9IGJveGVzW2JQdHJdXG4gICAgICBib3hlc1tiUHRyXSA9IHhcbiAgICB9XG4gICAgdmFyIHkgPSBpZHNbaGktMV1cbiAgICBpZHNbaGktMV0gPSBpZHNbcGl2b3RdXG4gICAgaWRzW3Bpdm90XSA9IHlcblxuICAgIC8vU3dhcCBwaXZvdCB0byBsYXN0IHBpdm90XG4gICAgaWYobWlkIDwgcGl2b3QpIHtcbiAgICAgIGhpID0gcGl2b3QtMVxuICAgICAgd2hpbGUobG8gPCBoaSAmJiBcbiAgICAgICAgYm94ZXNbZWxlbVNpemUqKGhpLTEpK2F4aXNdID09PSB2YWx1ZSkge1xuICAgICAgICBoaSAtPSAxXG4gICAgICB9XG4gICAgICBoaSArPSAxXG4gICAgfSBlbHNlIGlmKHBpdm90IDwgbWlkKSB7XG4gICAgICBsbyA9IHBpdm90ICsgMVxuICAgICAgd2hpbGUobG8gPCBoaSAmJlxuICAgICAgICBib3hlc1tlbGVtU2l6ZSpsbytheGlzXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbG8gKz0gMVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vTWFrZSBzdXJlIHBpdm90IGlzIGF0IHN0YXJ0XG4gIHJldHVybiBwYXJ0aXRpb25TdGFydExlc3NUaGFuKFxuICAgIGQsIGF4aXMsIFxuICAgIHN0YXJ0LCBtaWQsIGJveGVzLCBpZHMsXG4gICAgYm94ZXNbZWxlbVNpemUqbWlkK2F4aXNdKVxufSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlblBhcnRpdGlvblxuXG52YXIgY29kZSA9ICdmb3IodmFyIGo9MiphLGs9aipjLGw9ayxtPWMsbj1iLG89YStiLHA9YztkPnA7KytwLGsrPWope3ZhciBfO2lmKCQpaWYobT09PXApbSs9MSxsKz1qO2Vsc2V7Zm9yKHZhciBzPTA7aj5zOysrcyl7dmFyIHQ9ZVtrK3NdO2VbaytzXT1lW2xdLGVbbCsrXT10fXZhciB1PWZbcF07ZltwXT1mW21dLGZbbSsrXT11fX1yZXR1cm4gbSdcblxuZnVuY3Rpb24gZ2VuUGFydGl0aW9uKHByZWRpY2F0ZSwgYXJncykge1xuICB2YXIgZmFyZ3MgPSdhYmNkZWYnLnNwbGl0KCcnKS5jb25jYXQoYXJncylcbiAgdmFyIHJlYWRzID0gW11cbiAgaWYocHJlZGljYXRlLmluZGV4T2YoJ2xvJykgPj0gMCkge1xuICAgIHJlYWRzLnB1c2goJ2xvPWVbaytuXScpXG4gIH1cbiAgaWYocHJlZGljYXRlLmluZGV4T2YoJ2hpJykgPj0gMCkge1xuICAgIHJlYWRzLnB1c2goJ2hpPWVbaytvXScpXG4gIH1cbiAgZmFyZ3MucHVzaChcbiAgICBjb2RlLnJlcGxhY2UoJ18nLCByZWFkcy5qb2luKCkpXG4gICAgICAgIC5yZXBsYWNlKCckJywgcHJlZGljYXRlKSlcbiAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHZvaWQgMCwgZmFyZ3MpXG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vL1RoaXMgY29kZSBpcyBleHRyYWN0ZWQgZnJvbSBuZGFycmF5LXNvcnRcbi8vSXQgaXMgaW5saW5lZCBoZXJlIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmRcblxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcGVyO1xuXG52YXIgSU5TRVJUX1NPUlRfQ1VUT0ZGID0gMzJcblxuZnVuY3Rpb24gd3JhcHBlcihkYXRhLCBuMCkge1xuICBpZiAobjAgPD0gNCpJTlNFUlRfU09SVF9DVVRPRkYpIHtcbiAgICBpbnNlcnRpb25Tb3J0KDAsIG4wIC0gMSwgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcXVpY2tTb3J0KDAsIG4wIC0gMSwgZGF0YSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0aW9uU29ydChsZWZ0LCByaWdodCwgZGF0YSkge1xuICB2YXIgcHRyID0gMioobGVmdCsxKVxuICBmb3IodmFyIGk9bGVmdCsxOyBpPD1yaWdodDsgKytpKSB7XG4gICAgdmFyIGEgPSBkYXRhW3B0cisrXVxuICAgIHZhciBiID0gZGF0YVtwdHIrK11cbiAgICB2YXIgaiA9IGlcbiAgICB2YXIganB0ciA9IHB0ci0yXG4gICAgd2hpbGUoai0tID4gbGVmdCkge1xuICAgICAgdmFyIHggPSBkYXRhW2pwdHItMl1cbiAgICAgIHZhciB5ID0gZGF0YVtqcHRyLTFdXG4gICAgICBpZih4IDwgYSkge1xuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmKHggPT09IGEgJiYgeSA8IGIpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRhdGFbanB0cl0gICA9IHhcbiAgICAgIGRhdGFbanB0cisxXSA9IHlcbiAgICAgIGpwdHIgLT0gMlxuICAgIH1cbiAgICBkYXRhW2pwdHJdICAgPSBhXG4gICAgZGF0YVtqcHRyKzFdID0gYlxuICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoaSwgaiwgZGF0YSkge1xuICBpICo9IDJcbiAgaiAqPSAyXG4gIHZhciB4ID0gZGF0YVtpXVxuICB2YXIgeSA9IGRhdGFbaSsxXVxuICBkYXRhW2ldID0gZGF0YVtqXVxuICBkYXRhW2krMV0gPSBkYXRhW2orMV1cbiAgZGF0YVtqXSA9IHhcbiAgZGF0YVtqKzFdID0geVxufVxuXG5mdW5jdGlvbiBtb3ZlKGksIGosIGRhdGEpIHtcbiAgaSAqPSAyXG4gIGogKj0gMlxuICBkYXRhW2ldID0gZGF0YVtqXVxuICBkYXRhW2krMV0gPSBkYXRhW2orMV1cbn1cblxuZnVuY3Rpb24gcm90YXRlKGksIGosIGssIGRhdGEpIHtcbiAgaSAqPSAyXG4gIGogKj0gMlxuICBrICo9IDJcbiAgdmFyIHggPSBkYXRhW2ldXG4gIHZhciB5ID0gZGF0YVtpKzFdXG4gIGRhdGFbaV0gPSBkYXRhW2pdXG4gIGRhdGFbaSsxXSA9IGRhdGFbaisxXVxuICBkYXRhW2pdID0gZGF0YVtrXVxuICBkYXRhW2orMV0gPSBkYXRhW2srMV1cbiAgZGF0YVtrXSA9IHhcbiAgZGF0YVtrKzFdID0geVxufVxuXG5mdW5jdGlvbiBzaHVmZmxlUGl2b3QoaSwgaiwgcHgsIHB5LCBkYXRhKSB7XG4gIGkgKj0gMlxuICBqICo9IDJcbiAgZGF0YVtpXSA9IGRhdGFbal1cbiAgZGF0YVtqXSA9IHB4XG4gIGRhdGFbaSsxXSA9IGRhdGFbaisxXVxuICBkYXRhW2orMV0gPSBweVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGksIGosIGRhdGEpIHtcbiAgaSAqPSAyXG4gIGogKj0gMlxuICB2YXIgeCA9IGRhdGFbaV0sXG4gICAgICB5ID0gZGF0YVtqXVxuICBpZih4IDwgeSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9IGVsc2UgaWYoeCA9PT0geSkge1xuICAgIHJldHVybiBkYXRhW2krMV0gPiBkYXRhW2orMV1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBjb21wYXJlUGl2b3QoaSwgeSwgYiwgZGF0YSkge1xuICBpICo9IDJcbiAgdmFyIHggPSBkYXRhW2ldXG4gIGlmKHggPCB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIGlmKHggPT09IHkpIHtcbiAgICByZXR1cm4gZGF0YVtpKzFdIDwgYlxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBxdWlja1NvcnQobGVmdCwgcmlnaHQsIGRhdGEpIHtcbiAgdmFyIHNpeHRoID0gKHJpZ2h0IC0gbGVmdCArIDEpIC8gNiB8IDAsIFxuICAgICAgaW5kZXgxID0gbGVmdCArIHNpeHRoLCBcbiAgICAgIGluZGV4NSA9IHJpZ2h0IC0gc2l4dGgsIFxuICAgICAgaW5kZXgzID0gbGVmdCArIHJpZ2h0ID4+IDEsIFxuICAgICAgaW5kZXgyID0gaW5kZXgzIC0gc2l4dGgsIFxuICAgICAgaW5kZXg0ID0gaW5kZXgzICsgc2l4dGgsIFxuICAgICAgZWwxID0gaW5kZXgxLCBcbiAgICAgIGVsMiA9IGluZGV4MiwgXG4gICAgICBlbDMgPSBpbmRleDMsIFxuICAgICAgZWw0ID0gaW5kZXg0LCBcbiAgICAgIGVsNSA9IGluZGV4NSwgXG4gICAgICBsZXNzID0gbGVmdCArIDEsIFxuICAgICAgZ3JlYXQgPSByaWdodCAtIDEsIFxuICAgICAgdG1wID0gMFxuICBpZihjb21wYXJlKGVsMSwgZWwyLCBkYXRhKSkge1xuICAgIHRtcCA9IGVsMVxuICAgIGVsMSA9IGVsMlxuICAgIGVsMiA9IHRtcFxuICB9XG4gIGlmKGNvbXBhcmUoZWw0LCBlbDUsIGRhdGEpKSB7XG4gICAgdG1wID0gZWw0XG4gICAgZWw0ID0gZWw1XG4gICAgZWw1ID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDEsIGVsMywgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDFcbiAgICBlbDEgPSBlbDNcbiAgICBlbDMgPSB0bXBcbiAgfVxuICBpZihjb21wYXJlKGVsMiwgZWwzLCBkYXRhKSkge1xuICAgIHRtcCA9IGVsMlxuICAgIGVsMiA9IGVsM1xuICAgIGVsMyA9IHRtcFxuICB9XG4gIGlmKGNvbXBhcmUoZWwxLCBlbDQsIGRhdGEpKSB7XG4gICAgdG1wID0gZWwxXG4gICAgZWwxID0gZWw0XG4gICAgZWw0ID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDMsIGVsNCwgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDNcbiAgICBlbDMgPSBlbDRcbiAgICBlbDQgPSB0bXBcbiAgfVxuICBpZihjb21wYXJlKGVsMiwgZWw1LCBkYXRhKSkge1xuICAgIHRtcCA9IGVsMlxuICAgIGVsMiA9IGVsNVxuICAgIGVsNSA9IHRtcFxuICB9XG4gIGlmKGNvbXBhcmUoZWwyLCBlbDMsIGRhdGEpKSB7XG4gICAgdG1wID0gZWwyXG4gICAgZWwyID0gZWwzXG4gICAgZWwzID0gdG1wXG4gIH1cbiAgaWYoY29tcGFyZShlbDQsIGVsNSwgZGF0YSkpIHtcbiAgICB0bXAgPSBlbDRcbiAgICBlbDQgPSBlbDVcbiAgICBlbDUgPSB0bXBcbiAgfVxuXG4gIHZhciBwaXZvdDFYID0gZGF0YVsyKmVsMl1cbiAgdmFyIHBpdm90MVkgPSBkYXRhWzIqZWwyKzFdXG4gIHZhciBwaXZvdDJYID0gZGF0YVsyKmVsNF1cbiAgdmFyIHBpdm90MlkgPSBkYXRhWzIqZWw0KzFdXG5cbiAgdmFyIHB0cjAgPSAyICogZWwxO1xuICB2YXIgcHRyMiA9IDIgKiBlbDM7XG4gIHZhciBwdHI0ID0gMiAqIGVsNTtcbiAgdmFyIHB0cjUgPSAyICogaW5kZXgxO1xuICB2YXIgcHRyNiA9IDIgKiBpbmRleDM7XG4gIHZhciBwdHI3ID0gMiAqIGluZGV4NTtcbiAgZm9yICh2YXIgaTEgPSAwOyBpMSA8IDI7ICsraTEpIHtcbiAgICB2YXIgeCA9IGRhdGFbcHRyMCtpMV07XG4gICAgdmFyIHkgPSBkYXRhW3B0cjIraTFdO1xuICAgIHZhciB6ID0gZGF0YVtwdHI0K2kxXTtcbiAgICBkYXRhW3B0cjUraTFdID0geDtcbiAgICBkYXRhW3B0cjYraTFdID0geTtcbiAgICBkYXRhW3B0cjcraTFdID0gejtcbiAgfVxuXG4gIG1vdmUoaW5kZXgyLCBsZWZ0LCBkYXRhKVxuICBtb3ZlKGluZGV4NCwgcmlnaHQsIGRhdGEpXG4gIGZvciAodmFyIGsgPSBsZXNzOyBrIDw9IGdyZWF0OyArK2spIHtcbiAgICBpZiAoY29tcGFyZVBpdm90KGssIHBpdm90MVgsIHBpdm90MVksIGRhdGEpKSB7XG4gICAgICBpZiAoayAhPT0gbGVzcykge1xuICAgICAgICBzd2FwKGssIGxlc3MsIGRhdGEpXG4gICAgICB9XG4gICAgICArK2xlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY29tcGFyZVBpdm90KGssIHBpdm90MlgsIHBpdm90MlksIGRhdGEpKSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgaWYgKCFjb21wYXJlUGl2b3QoZ3JlYXQsIHBpdm90MlgsIHBpdm90MlksIGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAoLS1ncmVhdCA8IGspIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVQaXZvdChncmVhdCwgcGl2b3QxWCwgcGl2b3QxWSwgZGF0YSkpIHtcbiAgICAgICAgICAgICAgcm90YXRlKGssIGxlc3MsIGdyZWF0LCBkYXRhKVxuICAgICAgICAgICAgICArK2xlc3M7XG4gICAgICAgICAgICAgIC0tZ3JlYXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzd2FwKGssIGdyZWF0LCBkYXRhKVxuICAgICAgICAgICAgICAtLWdyZWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNodWZmbGVQaXZvdChsZWZ0LCBsZXNzLTEsIHBpdm90MVgsIHBpdm90MVksIGRhdGEpXG4gIHNodWZmbGVQaXZvdChyaWdodCwgZ3JlYXQrMSwgcGl2b3QyWCwgcGl2b3QyWSwgZGF0YSlcbiAgaWYgKGxlc3MgLSAyIC0gbGVmdCA8PSBJTlNFUlRfU09SVF9DVVRPRkYpIHtcbiAgICBpbnNlcnRpb25Tb3J0KGxlZnQsIGxlc3MgLSAyLCBkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBxdWlja1NvcnQobGVmdCwgbGVzcyAtIDIsIGRhdGEpO1xuICB9XG4gIGlmIChyaWdodCAtIChncmVhdCArIDIpIDw9IElOU0VSVF9TT1JUX0NVVE9GRikge1xuICAgIGluc2VydGlvblNvcnQoZ3JlYXQgKyAyLCByaWdodCwgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcXVpY2tTb3J0KGdyZWF0ICsgMiwgcmlnaHQsIGRhdGEpO1xuICB9XG4gIGlmIChncmVhdCAtIGxlc3MgPD0gSU5TRVJUX1NPUlRfQ1VUT0ZGKSB7XG4gICAgaW5zZXJ0aW9uU29ydChsZXNzLCBncmVhdCwgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcXVpY2tTb3J0KGxlc3MsIGdyZWF0LCBkYXRhKTtcbiAgfVxufSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdDogICAgICAgICAgIHNxSW5pdCxcbiAgc3dlZXBCaXBhcnRpdGU6IHN3ZWVwQmlwYXJ0aXRlLFxuICBzd2VlcENvbXBsZXRlOiAgc3dlZXBDb21wbGV0ZSxcbiAgc2NhbkJpcGFydGl0ZTogIHNjYW5CaXBhcnRpdGUsXG4gIHNjYW5Db21wbGV0ZTogICBzY2FuQ29tcGxldGVcbn1cblxudmFyIHBvb2wgID0gcmVxdWlyZSgndHlwZWRhcnJheS1wb29sJylcbnZhciBiaXRzICA9IHJlcXVpcmUoJ2JpdC10d2lkZGxlJylcbnZhciBpc29ydCA9IHJlcXVpcmUoJy4vc29ydCcpXG5cbi8vRmxhZyBmb3IgYmx1ZVxudmFyIEJMVUVfRkxBRyA9ICgxPDwyOClcblxuLy8xRCBzd2VlcCBldmVudCBxdWV1ZSBzdHVmZiAodXNlIHBvb2wgdG8gc2F2ZSBzcGFjZSlcbnZhciBJTklUX0NBUEFDSVRZICAgICAgPSAxMDI0XG52YXIgUkVEX1NXRUVQX1FVRVVFICAgID0gcG9vbC5tYWxsb2NJbnQzMihJTklUX0NBUEFDSVRZKVxudmFyIFJFRF9TV0VFUF9JTkRFWCAgICA9IHBvb2wubWFsbG9jSW50MzIoSU5JVF9DQVBBQ0lUWSlcbnZhciBCTFVFX1NXRUVQX1FVRVVFICAgPSBwb29sLm1hbGxvY0ludDMyKElOSVRfQ0FQQUNJVFkpXG52YXIgQkxVRV9TV0VFUF9JTkRFWCAgID0gcG9vbC5tYWxsb2NJbnQzMihJTklUX0NBUEFDSVRZKVxudmFyIENPTU1PTl9TV0VFUF9RVUVVRSA9IHBvb2wubWFsbG9jSW50MzIoSU5JVF9DQVBBQ0lUWSlcbnZhciBDT01NT05fU1dFRVBfSU5ERVggPSBwb29sLm1hbGxvY0ludDMyKElOSVRfQ0FQQUNJVFkpXG52YXIgU1dFRVBfRVZFTlRTICAgICAgID0gcG9vbC5tYWxsb2NEb3VibGUoSU5JVF9DQVBBQ0lUWSAqIDgpXG5cbi8vUmVzZXJ2ZXMgbWVtb3J5IGZvciB0aGUgMUQgc3dlZXAgZGF0YSBzdHJ1Y3R1cmVzXG5mdW5jdGlvbiBzcUluaXQoY291bnQpIHtcbiAgdmFyIHJjb3VudCA9IGJpdHMubmV4dFBvdzIoY291bnQpXG4gIGlmKFJFRF9TV0VFUF9RVUVVRS5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoUkVEX1NXRUVQX1FVRVVFKVxuICAgIFJFRF9TV0VFUF9RVUVVRSA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIGlmKFJFRF9TV0VFUF9JTkRFWC5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoUkVEX1NXRUVQX0lOREVYKVxuICAgIFJFRF9TV0VFUF9JTkRFWCA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIGlmKEJMVUVfU1dFRVBfUVVFVUUubGVuZ3RoIDwgcmNvdW50KSB7XG4gICAgcG9vbC5mcmVlKEJMVUVfU1dFRVBfUVVFVUUpXG4gICAgQkxVRV9TV0VFUF9RVUVVRSA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIGlmKEJMVUVfU1dFRVBfSU5ERVgubGVuZ3RoIDwgcmNvdW50KSB7XG4gICAgcG9vbC5mcmVlKEJMVUVfU1dFRVBfSU5ERVgpXG4gICAgQkxVRV9TV0VFUF9JTkRFWCA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIGlmKENPTU1PTl9TV0VFUF9RVUVVRS5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoQ09NTU9OX1NXRUVQX1FVRVVFKVxuICAgIENPTU1PTl9TV0VFUF9RVUVVRSA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIGlmKENPTU1PTl9TV0VFUF9JTkRFWC5sZW5ndGggPCByY291bnQpIHtcbiAgICBwb29sLmZyZWUoQ09NTU9OX1NXRUVQX0lOREVYKVxuICAgIENPTU1PTl9TV0VFUF9JTkRFWCA9IHBvb2wubWFsbG9jSW50MzIocmNvdW50KVxuICB9XG4gIHZhciBldmVudExlbmd0aCA9IDggKiByY291bnRcbiAgaWYoU1dFRVBfRVZFTlRTLmxlbmd0aCA8IGV2ZW50TGVuZ3RoKSB7XG4gICAgcG9vbC5mcmVlKFNXRUVQX0VWRU5UUylcbiAgICBTV0VFUF9FVkVOVFMgPSBwb29sLm1hbGxvY0RvdWJsZShldmVudExlbmd0aClcbiAgfVxufVxuXG4vL1JlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGFjdGl2ZSBxdWV1ZSBpbiBPKDEpXG5mdW5jdGlvbiBzcVBvcChxdWV1ZSwgaW5kZXgsIGNvdW50LCBpdGVtKSB7XG4gIHZhciBpZHggPSBpbmRleFtpdGVtXVxuICB2YXIgdG9wID0gcXVldWVbY291bnQtMV1cbiAgcXVldWVbaWR4XSA9IHRvcFxuICBpbmRleFt0b3BdID0gaWR4XG59XG5cbi8vSW5zZXJ0IGFuIGl0ZW0gaW50byB0aGUgYWN0aXZlIHF1ZXVlIGluIE8oMSlcbmZ1bmN0aW9uIHNxUHVzaChxdWV1ZSwgaW5kZXgsIGNvdW50LCBpdGVtKSB7XG4gIHF1ZXVlW2NvdW50XSA9IGl0ZW1cbiAgaW5kZXhbaXRlbV0gID0gY291bnRcbn1cblxuLy9SZWN1cnNpb24gYmFzZSBjYXNlOiB1c2UgMUQgc3dlZXAgYWxnb3JpdGhtXG5mdW5jdGlvbiBzd2VlcEJpcGFydGl0ZShcbiAgICBkLCB2aXNpdCxcbiAgICByZWRTdGFydCwgIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleCkge1xuXG4gIC8vc3RvcmUgZXZlbnRzIGFzIHBhaXJzIFtjb29yZGluYXRlLCBpZHhdXG4gIC8vXG4gIC8vICByZWQgY3JlYXRlOiAgLShpZHgrMSlcbiAgLy8gIHJlZCBkZXN0cm95OiBpZHhcbiAgLy8gIGJsdWUgY3JlYXRlOiAtKGlkeCtCTFVFX0ZMQUcpXG4gIC8vICBibHVlIGRlc3Ryb3k6IGlkeCtCTFVFX0ZMQUdcbiAgLy9cbiAgdmFyIHB0ciAgICAgID0gMFxuICB2YXIgZWxlbVNpemUgPSAyKmRcbiAgdmFyIGlzdGFydCAgID0gZC0xXG4gIHZhciBpZW5kICAgICA9IGVsZW1TaXplLTFcblxuICBmb3IodmFyIGk9cmVkU3RhcnQ7IGk8cmVkRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gcmVkSW5kZXhbaV1cbiAgICB2YXIgcmVkT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLShpZHgrMSlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gcmVkW3JlZE9mZnNldCtpZW5kXVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBpZHhcbiAgfVxuXG4gIGZvcih2YXIgaT1ibHVlU3RhcnQ7IGk8Ymx1ZUVuZDsgKytpKSB7XG4gICAgdmFyIGlkeCA9IGJsdWVJbmRleFtpXStCTFVFX0ZMQUdcbiAgICB2YXIgYmx1ZU9mZnNldCA9IGVsZW1TaXplKmlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gYmx1ZVtibHVlT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLWlkeFxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBibHVlW2JsdWVPZmZzZXQraWVuZF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gaWR4XG4gIH1cblxuICAvL3Byb2Nlc3MgZXZlbnRzIGZyb20gbGVmdC0+cmlnaHRcbiAgdmFyIG4gPSBwdHIgPj4+IDFcbiAgaXNvcnQoU1dFRVBfRVZFTlRTLCBuKVxuICBcbiAgdmFyIHJlZEFjdGl2ZSAgPSAwXG4gIHZhciBibHVlQWN0aXZlID0gMFxuICBmb3IodmFyIGk9MDsgaTxuOyArK2kpIHtcbiAgICB2YXIgZSA9IFNXRUVQX0VWRU5UU1syKmkrMV18MFxuICAgIGlmKGUgPj0gQkxVRV9GTEFHKSB7XG4gICAgICAvL2JsdWUgZGVzdHJveSBldmVudFxuICAgICAgZSA9IChlLUJMVUVfRkxBRyl8MFxuICAgICAgc3FQb3AoQkxVRV9TV0VFUF9RVUVVRSwgQkxVRV9TV0VFUF9JTkRFWCwgYmx1ZUFjdGl2ZS0tLCBlKVxuICAgIH0gZWxzZSBpZihlID49IDApIHtcbiAgICAgIC8vcmVkIGRlc3Ryb3kgZXZlbnRcbiAgICAgIHNxUG9wKFJFRF9TV0VFUF9RVUVVRSwgUkVEX1NXRUVQX0lOREVYLCByZWRBY3RpdmUtLSwgZSlcbiAgICB9IGVsc2UgaWYoZSA8PSAtQkxVRV9GTEFHKSB7XG4gICAgICAvL2JsdWUgY3JlYXRlIGV2ZW50XG4gICAgICBlID0gKC1lLUJMVUVfRkxBRyl8MFxuICAgICAgZm9yKHZhciBqPTA7IGo8cmVkQWN0aXZlOyArK2opIHtcbiAgICAgICAgdmFyIHJldHZhbCA9IHZpc2l0KFJFRF9TV0VFUF9RVUVVRVtqXSwgZSlcbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNxUHVzaChCTFVFX1NXRUVQX1FVRVVFLCBCTFVFX1NXRUVQX0lOREVYLCBibHVlQWN0aXZlKyssIGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vcmVkIGNyZWF0ZSBldmVudFxuICAgICAgZSA9ICgtZS0xKXwwXG4gICAgICBmb3IodmFyIGo9MDsgajxibHVlQWN0aXZlOyArK2opIHtcbiAgICAgICAgdmFyIHJldHZhbCA9IHZpc2l0KGUsIEJMVUVfU1dFRVBfUVVFVUVbal0pXG4gICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzcVB1c2goUkVEX1NXRUVQX1FVRVVFLCBSRURfU1dFRVBfSU5ERVgsIHJlZEFjdGl2ZSsrLCBlKVxuICAgIH1cbiAgfVxufVxuXG4vL0NvbXBsZXRlIHN3ZWVwXG5mdW5jdGlvbiBzd2VlcENvbXBsZXRlKGQsIHZpc2l0LCBcbiAgcmVkU3RhcnQsIHJlZEVuZCwgcmVkLCByZWRJbmRleCxcbiAgYmx1ZVN0YXJ0LCBibHVlRW5kLCBibHVlLCBibHVlSW5kZXgpIHtcblxuICB2YXIgcHRyICAgICAgPSAwXG4gIHZhciBlbGVtU2l6ZSA9IDIqZFxuICB2YXIgaXN0YXJ0ICAgPSBkLTFcbiAgdmFyIGllbmQgICAgID0gZWxlbVNpemUtMVxuXG4gIGZvcih2YXIgaT1yZWRTdGFydDsgaTxyZWRFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSAocmVkSW5kZXhbaV0rMSk8PDFcbiAgICB2YXIgcmVkT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLWlkeFxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSByZWRbcmVkT2Zmc2V0K2llbmRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGlkeFxuICB9XG5cbiAgZm9yKHZhciBpPWJsdWVTdGFydDsgaTxibHVlRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gKGJsdWVJbmRleFtpXSsxKTw8MVxuICAgIHZhciBibHVlT2Zmc2V0ID0gZWxlbVNpemUqaVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBibHVlW2JsdWVPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAoLWlkeCl8MVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBibHVlW2JsdWVPZmZzZXQraWVuZF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gaWR4fDFcbiAgfVxuXG4gIC8vcHJvY2VzcyBldmVudHMgZnJvbSBsZWZ0LT5yaWdodFxuICB2YXIgbiA9IHB0ciA+Pj4gMVxuICBpc29ydChTV0VFUF9FVkVOVFMsIG4pXG4gIFxuICB2YXIgcmVkQWN0aXZlICAgID0gMFxuICB2YXIgYmx1ZUFjdGl2ZSAgID0gMFxuICB2YXIgY29tbW9uQWN0aXZlID0gMFxuICBmb3IodmFyIGk9MDsgaTxuOyArK2kpIHtcbiAgICB2YXIgZSAgICAgPSBTV0VFUF9FVkVOVFNbMippKzFdfDBcbiAgICB2YXIgY29sb3IgPSBlJjFcbiAgICBpZihpIDwgbi0xICYmIChlPj4xKSA9PT0gKFNXRUVQX0VWRU5UU1syKmkrM10+PjEpKSB7XG4gICAgICBjb2xvciA9IDJcbiAgICAgIGkgKz0gMVxuICAgIH1cbiAgICBcbiAgICBpZihlIDwgMCkge1xuICAgICAgLy9DcmVhdGUgZXZlbnRcbiAgICAgIHZhciBpZCA9IC0oZT4+MSkgLSAxXG5cbiAgICAgIC8vSW50ZXJzZWN0IHdpdGggY29tbW9uXG4gICAgICBmb3IodmFyIGo9MDsgajxjb21tb25BY3RpdmU7ICsraikge1xuICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQoQ09NTU9OX1NXRUVQX1FVRVVFW2pdLCBpZClcbiAgICAgICAgaWYocmV0dmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoY29sb3IgIT09IDApIHtcbiAgICAgICAgLy9JbnRlcnNlY3Qgd2l0aCByZWRcbiAgICAgICAgZm9yKHZhciBqPTA7IGo8cmVkQWN0aXZlOyArK2opIHtcbiAgICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQoUkVEX1NXRUVQX1FVRVVFW2pdLCBpZClcbiAgICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihjb2xvciAhPT0gMSkge1xuICAgICAgICAvL0ludGVyc2VjdCB3aXRoIGJsdWVcbiAgICAgICAgZm9yKHZhciBqPTA7IGo8Ymx1ZUFjdGl2ZTsgKytqKSB7XG4gICAgICAgICAgdmFyIHJldHZhbCA9IHZpc2l0KEJMVUVfU1dFRVBfUVVFVUVbal0sIGlkKVxuICAgICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dmFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNvbG9yID09PSAwKSB7XG4gICAgICAgIC8vUmVkXG4gICAgICAgIHNxUHVzaChSRURfU1dFRVBfUVVFVUUsIFJFRF9TV0VFUF9JTkRFWCwgcmVkQWN0aXZlKyssIGlkKVxuICAgICAgfSBlbHNlIGlmKGNvbG9yID09PSAxKSB7XG4gICAgICAgIC8vQmx1ZVxuICAgICAgICBzcVB1c2goQkxVRV9TV0VFUF9RVUVVRSwgQkxVRV9TV0VFUF9JTkRFWCwgYmx1ZUFjdGl2ZSsrLCBpZClcbiAgICAgIH0gZWxzZSBpZihjb2xvciA9PT0gMikge1xuICAgICAgICAvL0JvdGhcbiAgICAgICAgc3FQdXNoKENPTU1PTl9TV0VFUF9RVUVVRSwgQ09NTU9OX1NXRUVQX0lOREVYLCBjb21tb25BY3RpdmUrKywgaWQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vRGVzdHJveSBldmVudFxuICAgICAgdmFyIGlkID0gKGU+PjEpIC0gMVxuICAgICAgaWYoY29sb3IgPT09IDApIHtcbiAgICAgICAgLy9SZWRcbiAgICAgICAgc3FQb3AoUkVEX1NXRUVQX1FVRVVFLCBSRURfU1dFRVBfSU5ERVgsIHJlZEFjdGl2ZS0tLCBpZClcbiAgICAgIH0gZWxzZSBpZihjb2xvciA9PT0gMSkge1xuICAgICAgICAvL0JsdWVcbiAgICAgICAgc3FQb3AoQkxVRV9TV0VFUF9RVUVVRSwgQkxVRV9TV0VFUF9JTkRFWCwgYmx1ZUFjdGl2ZS0tLCBpZClcbiAgICAgIH0gZWxzZSBpZihjb2xvciA9PT0gMikge1xuICAgICAgICAvL0JvdGhcbiAgICAgICAgc3FQb3AoQ09NTU9OX1NXRUVQX1FVRVVFLCBDT01NT05fU1dFRVBfSU5ERVgsIGNvbW1vbkFjdGl2ZS0tLCBpZClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy9Td2VlcCBhbmQgcHJ1bmUvc2NhbmxpbmUgYWxnb3JpdGhtOlxuLy8gIFNjYW4gYWxvbmcgYXhpcywgZGV0ZWN0IGludGVyc2VjdGlvbnNcbi8vICBCcnV0ZSBmb3JjZSBhbGwgYm94ZXMgYWxvbmcgYXhpc1xuZnVuY3Rpb24gc2NhbkJpcGFydGl0ZShcbiAgZCwgYXhpcywgdmlzaXQsIGZsaXAsXG4gIHJlZFN0YXJ0LCAgcmVkRW5kLCByZWQsIHJlZEluZGV4LFxuICBibHVlU3RhcnQsIGJsdWVFbmQsIGJsdWUsIGJsdWVJbmRleCkge1xuICBcbiAgdmFyIHB0ciAgICAgID0gMFxuICB2YXIgZWxlbVNpemUgPSAyKmRcbiAgdmFyIGlzdGFydCAgID0gYXhpc1xuICB2YXIgaWVuZCAgICAgPSBheGlzK2RcblxuICB2YXIgcmVkU2hpZnQgID0gMVxuICB2YXIgYmx1ZVNoaWZ0ID0gMVxuICBpZihmbGlwKSB7XG4gICAgYmx1ZVNoaWZ0ID0gQkxVRV9GTEFHXG4gIH0gZWxzZSB7XG4gICAgcmVkU2hpZnQgID0gQkxVRV9GTEFHXG4gIH1cblxuICBmb3IodmFyIGk9cmVkU3RhcnQ7IGk8cmVkRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gaSArIHJlZFNoaWZ0XG4gICAgdmFyIHJlZE9mZnNldCA9IGVsZW1TaXplKmlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gcmVkW3JlZE9mZnNldCtpc3RhcnRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IC1pZHhcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gcmVkW3JlZE9mZnNldCtpZW5kXVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSBpZHhcbiAgfVxuICBmb3IodmFyIGk9Ymx1ZVN0YXJ0OyBpPGJsdWVFbmQ7ICsraSkge1xuICAgIHZhciBpZHggPSBpICsgYmx1ZVNoaWZ0XG4gICAgdmFyIGJsdWVPZmZzZXQgPSBlbGVtU2l6ZSppXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IGJsdWVbYmx1ZU9mZnNldCtpc3RhcnRdXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IC1pZHhcbiAgfVxuXG4gIC8vcHJvY2VzcyBldmVudHMgZnJvbSBsZWZ0LT5yaWdodFxuICB2YXIgbiA9IHB0ciA+Pj4gMVxuICBpc29ydChTV0VFUF9FVkVOVFMsIG4pXG4gIFxuICB2YXIgcmVkQWN0aXZlICAgID0gMFxuICBmb3IodmFyIGk9MDsgaTxuOyArK2kpIHtcbiAgICB2YXIgZSA9IFNXRUVQX0VWRU5UU1syKmkrMV18MFxuICAgIGlmKGUgPCAwKSB7XG4gICAgICB2YXIgaWR4ICAgPSAtZVxuICAgICAgdmFyIGlzUmVkID0gZmFsc2VcbiAgICAgIGlmKGlkeCA+PSBCTFVFX0ZMQUcpIHtcbiAgICAgICAgaXNSZWQgPSAhZmxpcFxuICAgICAgICBpZHggLT0gQkxVRV9GTEFHIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNSZWQgPSAhIWZsaXBcbiAgICAgICAgaWR4IC09IDFcbiAgICAgIH1cbiAgICAgIGlmKGlzUmVkKSB7XG4gICAgICAgIHNxUHVzaChSRURfU1dFRVBfUVVFVUUsIFJFRF9TV0VFUF9JTkRFWCwgcmVkQWN0aXZlKyssIGlkeClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBibHVlSWQgID0gYmx1ZUluZGV4W2lkeF1cbiAgICAgICAgdmFyIGJsdWVQdHIgPSBlbGVtU2l6ZSAqIGlkeFxuICAgICAgICBcbiAgICAgICAgdmFyIGIwID0gYmx1ZVtibHVlUHRyK2F4aXMrMV1cbiAgICAgICAgdmFyIGIxID0gYmx1ZVtibHVlUHRyK2F4aXMrMStkXVxuXG5yZWRfbG9vcDpcbiAgICAgICAgZm9yKHZhciBqPTA7IGo8cmVkQWN0aXZlOyArK2opIHtcbiAgICAgICAgICB2YXIgb2lkeCAgID0gUkVEX1NXRUVQX1FVRVVFW2pdXG4gICAgICAgICAgdmFyIHJlZFB0ciA9IGVsZW1TaXplICogb2lkeFxuXG4gICAgICAgICAgaWYoYjEgPCByZWRbcmVkUHRyK2F4aXMrMV0gfHwgXG4gICAgICAgICAgICAgcmVkW3JlZFB0citheGlzKzErZF0gPCBiMCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IodmFyIGs9YXhpcysyOyBrPGQ7ICsraykge1xuICAgICAgICAgICAgaWYoYmx1ZVtibHVlUHRyICsgayArIGRdIDwgcmVkW3JlZFB0ciArIGtdIHx8IFxuICAgICAgICAgICAgICAgcmVkW3JlZFB0ciArIGsgKyBkXSA8IGJsdWVbYmx1ZVB0ciArIGtdKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIHJlZF9sb29wXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlZElkICA9IHJlZEluZGV4W29pZHhdXG4gICAgICAgICAgdmFyIHJldHZhbFxuICAgICAgICAgIGlmKGZsaXApIHtcbiAgICAgICAgICAgIHJldHZhbCA9IHZpc2l0KGJsdWVJZCwgcmVkSWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHZhbCA9IHZpc2l0KHJlZElkLCBibHVlSWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJldHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dmFsIFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcVBvcChSRURfU1dFRVBfUVVFVUUsIFJFRF9TV0VFUF9JTkRFWCwgcmVkQWN0aXZlLS0sIGUgLSByZWRTaGlmdClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NhbkNvbXBsZXRlKFxuICBkLCBheGlzLCB2aXNpdCxcbiAgcmVkU3RhcnQsICByZWRFbmQsIHJlZCwgcmVkSW5kZXgsXG4gIGJsdWVTdGFydCwgYmx1ZUVuZCwgYmx1ZSwgYmx1ZUluZGV4KSB7XG5cbiAgdmFyIHB0ciAgICAgID0gMFxuICB2YXIgZWxlbVNpemUgPSAyKmRcbiAgdmFyIGlzdGFydCAgID0gYXhpc1xuICB2YXIgaWVuZCAgICAgPSBheGlzK2RcblxuICBmb3IodmFyIGk9cmVkU3RhcnQ7IGk8cmVkRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gaSArIEJMVUVfRkxBR1xuICAgIHZhciByZWRPZmZzZXQgPSBlbGVtU2l6ZSppXG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IHJlZFtyZWRPZmZzZXQraXN0YXJ0XVxuICAgIFNXRUVQX0VWRU5UU1twdHIrK10gPSAtaWR4XG4gICAgU1dFRVBfRVZFTlRTW3B0cisrXSA9IHJlZFtyZWRPZmZzZXQraWVuZF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gaWR4XG4gIH1cbiAgZm9yKHZhciBpPWJsdWVTdGFydDsgaTxibHVlRW5kOyArK2kpIHtcbiAgICB2YXIgaWR4ID0gaSArIDFcbiAgICB2YXIgYmx1ZU9mZnNldCA9IGVsZW1TaXplKmlcbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gYmx1ZVtibHVlT2Zmc2V0K2lzdGFydF1cbiAgICBTV0VFUF9FVkVOVFNbcHRyKytdID0gLWlkeFxuICB9XG5cbiAgLy9wcm9jZXNzIGV2ZW50cyBmcm9tIGxlZnQtPnJpZ2h0XG4gIHZhciBuID0gcHRyID4+PiAxXG4gIGlzb3J0KFNXRUVQX0VWRU5UUywgbilcbiAgXG4gIHZhciByZWRBY3RpdmUgICAgPSAwXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHZhciBlID0gU1dFRVBfRVZFTlRTWzIqaSsxXXwwXG4gICAgaWYoZSA8IDApIHtcbiAgICAgIHZhciBpZHggICA9IC1lXG4gICAgICBpZihpZHggPj0gQkxVRV9GTEFHKSB7XG4gICAgICAgIFJFRF9TV0VFUF9RVUVVRVtyZWRBY3RpdmUrK10gPSBpZHggLSBCTFVFX0ZMQUdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkeCAtPSAxXG4gICAgICAgIHZhciBibHVlSWQgID0gYmx1ZUluZGV4W2lkeF1cbiAgICAgICAgdmFyIGJsdWVQdHIgPSBlbGVtU2l6ZSAqIGlkeFxuXG4gICAgICAgIHZhciBiMCA9IGJsdWVbYmx1ZVB0citheGlzKzFdXG4gICAgICAgIHZhciBiMSA9IGJsdWVbYmx1ZVB0citheGlzKzErZF1cblxucmVkX2xvb3A6XG4gICAgICAgIGZvcih2YXIgaj0wOyBqPHJlZEFjdGl2ZTsgKytqKSB7XG4gICAgICAgICAgdmFyIG9pZHggICA9IFJFRF9TV0VFUF9RVUVVRVtqXVxuICAgICAgICAgIHZhciByZWRJZCAgPSByZWRJbmRleFtvaWR4XVxuXG4gICAgICAgICAgaWYocmVkSWQgPT09IGJsdWVJZCkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVkUHRyID0gZWxlbVNpemUgKiBvaWR4XG4gICAgICAgICAgaWYoYjEgPCByZWRbcmVkUHRyK2F4aXMrMV0gfHwgXG4gICAgICAgICAgICByZWRbcmVkUHRyK2F4aXMrMStkXSA8IGIwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IodmFyIGs9YXhpcysyOyBrPGQ7ICsraykge1xuICAgICAgICAgICAgaWYoYmx1ZVtibHVlUHRyICsgayArIGRdIDwgcmVkW3JlZFB0ciArIGtdIHx8IFxuICAgICAgICAgICAgICAgcmVkW3JlZFB0ciArIGsgKyBkXSAgIDwgYmx1ZVtibHVlUHRyICsga10pIHtcbiAgICAgICAgICAgICAgY29udGludWUgcmVkX2xvb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmV0dmFsID0gdmlzaXQocmVkSWQsIGJsdWVJZClcbiAgICAgICAgICBpZihyZXR2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldHZhbCBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlkeCA9IGUgLSBCTFVFX0ZMQUdcbiAgICAgIGZvcih2YXIgaj1yZWRBY3RpdmUtMTsgaj49MDsgLS1qKSB7XG4gICAgICAgIGlmKFJFRF9TV0VFUF9RVUVVRVtqXSA9PT0gaWR4KSB7XG4gICAgICAgICAgZm9yKHZhciBrPWorMTsgazxyZWRBY3RpdmU7ICsraykge1xuICAgICAgICAgICAgUkVEX1NXRUVQX1FVRVVFW2stMV0gPSBSRURfU1dFRVBfUVVFVUVba11cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLS1yZWRBY3RpdmVcbiAgICB9XG4gIH1cbn0iLCIiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmZyb207IiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZScpOyIsInZhciBjb3JlICA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKVxuICAsICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7c3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeX0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59OyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5NYXA7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5NYXRoLmxvZzI7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKXtcbiAgcmV0dXJuICRPYmplY3QuY3JlYXRlKFAsIEQpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmZyZWV6ZTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmdldFByb3RvdHlwZU9mOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5czsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LnNldFByb3RvdHlwZU9mOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5TZXQ7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5TeW1ib2w7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fd2tzLWV4dCcpLmYoJ2l0ZXJhdG9yJyk7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwidmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlciwgSVRFUkFUT1Ipe1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsIi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gMSAtPiBBcnJheSNtYXBcbi8vIDIgLT4gQXJyYXkjZmlsdGVyXG4vLyAzIC0+IEFycmF5I3NvbWVcbi8vIDQgLT4gQXJyYXkjZXZlcnlcbi8vIDUgLT4gQXJyYXkjZmluZFxuLy8gNiAtPiBBcnJheSNmaW5kSW5kZXhcbnZhciBjdHggICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGFzYyAgICAgID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVFlQRSwgJGNyZWF0ZSl7XG4gIHZhciBJU19NQVAgICAgICAgID0gVFlQRSA9PSAxXG4gICAgLCBJU19GSUxURVIgICAgID0gVFlQRSA9PSAyXG4gICAgLCBJU19TT01FICAgICAgID0gVFlQRSA9PSAzXG4gICAgLCBJU19FVkVSWSAgICAgID0gVFlQRSA9PSA0XG4gICAgLCBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2XG4gICAgLCBOT19IT0xFUyAgICAgID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVhcbiAgICAsIGNyZWF0ZSAgICAgICAgPSAkY3JlYXRlIHx8IGFzYztcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KXtcbiAgICB2YXIgTyAgICAgID0gdG9PYmplY3QoJHRoaXMpXG4gICAgICAsIHNlbGYgICA9IElPYmplY3QoTylcbiAgICAgICwgZiAgICAgID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSAwXG4gICAgICAsIHJlc3VsdCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWRcbiAgICAgICwgdmFsLCByZXM7XG4gICAgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKXtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmKFRZUEUpe1xuICAgICAgICBpZihJU19NQVApcmVzdWx0W2luZGV4XSA9IHJlczsgICAgICAgICAgICAvLyBtYXBcbiAgICAgICAgZWxzZSBpZihyZXMpc3dpdGNoKFRZUEUpe1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsOyAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgICAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2UgaWYoSVNfRVZFUlkpcmV0dXJuIGZhbHNlOyAgICAgICAgICAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGlzQXJyYXkgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxuICAsIFNQRUNJRVMgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCl7XG4gIHZhciBDO1xuICBpZihpc0FycmF5KG9yaWdpbmFsKSl7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKUMgPSB1bmRlZmluZWQ7XG4gICAgaWYoaXNPYmplY3QoQykpe1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZihDID09PSBudWxsKUMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59OyIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3JpZ2luYWwsIGxlbmd0aCl7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgY3JlYXRlICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGFuSW5zdGFuY2UgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGRlZmluZWQgICAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgZm9yT2YgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKVxuICAsIHN0ZXAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBzZXRTcGVjaWVzICA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBmYXN0S2V5ICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5XG4gICwgU0laRSAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uKHRoYXQsIGtleSl7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSksIGVudHJ5O1xuICBpZihpbmRleCAhPT0gJ0YnKXJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvcihlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgIGlmKGVudHJ5LmsgPT0ga2V5KXJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKXtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgaXRlcmFibGUpe1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpe1xuICAgICAgICBmb3IodmFyIHRoYXQgPSB0aGlzLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihlbnRyeS5wKWVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgICAsIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYoZW50cnkpe1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkublxuICAgICAgICAgICAgLCBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihwcmV2KXByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYobmV4dCluZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmKHRoYXQuX2YgPT0gZW50cnkpdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYodGhhdC5fbCA9PSBlbnRyeSl0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgJ2ZvckVhY2gnKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpXG4gICAgICAgICAgLCBlbnRyeTtcbiAgICAgICAgd2hpbGUoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKXtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKERFU0NSSVBUT1JTKWRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIGRlZmluZWQodGhpc1tTSVpFXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KVxuICAgICAgLCBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZihlbnRyeSl7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZighdGhhdC5fZil0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZihwcmV2KXByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZihpbmRleCAhPT0gJ0YnKXRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uKEMsIE5BTUUsIElTX01BUCl7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgICAgIHRoaXMuX3QgPSBpdGVyYXRlZDsgIC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbigpe1xuICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAsIGtpbmQgID0gdGhhdC5fa1xuICAgICAgICAsIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUoZW50cnkgJiYgZW50cnkucillbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSl7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gc3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnICwgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBmcm9tICAgID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBtZXRhICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKVxuICAsIGZhaWxzICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmVBbGwgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIGZvck9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBhbkluc3RhbmNlICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZFAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgZWFjaCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMClcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspe1xuICB2YXIgQmFzZSAgPSBnbG9iYWxbTkFNRV1cbiAgICAsIEMgICAgID0gQmFzZVxuICAgICwgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnXG4gICAgLCBwcm90byA9IEMgJiYgQy5wcm90b3R5cGVcbiAgICAsIE8gICAgID0ge307XG4gIGlmKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKXtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGFyZ2V0LCBpdGVyYWJsZSl7XG4gICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSwgJ19jJyk7XG4gICAgICB0YXJnZXQuX2MgPSBuZXcgQmFzZTtcbiAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSxmdW5jdGlvbihLRVkpe1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmKEtFWSBpbiBwcm90byAmJiAhKElTX1dFQUsgJiYgS0VZID09ICdjbGVhcicpKWhpZGUoQy5wcm90b3R5cGUsIEtFWSwgZnVuY3Rpb24oYSwgYil7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgS0VZKTtcbiAgICAgICAgaWYoIUlTX0FEREVSICYmIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpKXJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoJ3NpemUnIGluIHByb3RvKWRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYoIUlTX1dFQUspY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyAgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgaW5kZXgsIHZhbHVlKXtcbiAgaWYoaW5kZXggaW4gb2JqZWN0KSRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59OyIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9IHBJRS5mXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBrZXksIG93biwgb3V0O1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgICBpZih0aGlzIGluc3RhbmNlb2YgQyl7XG4gICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmKElTX1BST1RPKXtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJylcbiAgLCBCUkVBSyAgICAgICA9IHt9XG4gICwgUkVUVVJOICAgICAgPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKXtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKVxuICAgICwgZiAgICAgID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICl7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyAgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07IiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTsiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTsiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsICRpdGVyQ3JlYXRlICAgID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG4gICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuICAgICwgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkYW55TmF0aXZlKXtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSkpO1xuICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyByZXR1cm4ge2RvbmU6IHNhZmUgPSB0cnVlfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwidmFyIGdldEtleXMgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGtleXMgICA9IGdldEtleXMoTylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTsiLCJ2YXIgTUVUQSAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGhhcyAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBzZXREZXNjICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBpZCAgICAgICA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG4gIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH19KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuICBpZihGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6ICAgICAgTUVUQSxcbiAgTkVFRDogICAgIGZhbHNlLFxuICBmYXN0S2V5OiAgZmFzdEtleSxcbiAgZ2V0V2VhazogIGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgT2JzZXJ2ZXIgID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXJcbiAgLCBwcm9jZXNzICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIFByb21pc2UgICA9IGdsb2JhbC5Qcm9taXNlXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlKGhlYWQpe1xuICAgICAgZm4gICA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIGlmKGhlYWQpbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYocGFyZW50KXBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoaXNOb2RlKXtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZihPYnNlcnZlcil7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWVcbiAgICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHZhciB0YXNrID0ge2ZuOiBmbiwgbmV4dDogdW5kZWZpbmVkfTtcbiAgICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYoIWhlYWQpe1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgcElFICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCAkYXNzaWduICA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBBID0ge31cbiAgICAsIEIgPSB7fVxuICAgICwgUyA9IFN5bWJvbCgpXG4gICAgLCBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oayl7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgICAgID0gdG9PYmplY3QodGFyZ2V0KVxuICAgICwgYUxlbiAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBpbmRleCA9IDFcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmZcbiAgICAsIGlzRW51bSAgICAgPSBwSUUuZjtcbiAgd2hpbGUoYUxlbiA+IGluZGV4KXtcbiAgICB2YXIgUyAgICAgID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pXG4gICAgICAsIGtleXMgICA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaiAgICAgID0gMFxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gailpZihpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKVRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduOyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwidmFyIGRQICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGkgPSAwXG4gICAgLCBQO1xuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTsiLCJ2YXIgcElFICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApe1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoaGFzKE8sIFApKXJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGdPUE4gICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07IiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTsiLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsiLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb3JlICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpe1xuICAgIGlmKHNhZmUgJiYgdGFyZ2V0W2tleV0pdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90byl7XG4gIGFuT2JqZWN0KE8pO1xuICBpZighaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKXRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uKHRlc3QsIGJ1Z2d5LCBzZXQpe1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyIGlkID0gMFxuICAsIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07IiwidmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgd2tzRXh0ICAgICAgICAgPSByZXF1aXJlKCcuL193a3MtZXh0JylcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZihuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKWRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHt2YWx1ZTogd2tzRXh0LmYobmFtZSl9KTtcbn07IiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXQgICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGl0ZXJGbiA9IGdldChpdCk7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgfHwgSXRlcmF0b3JzLmhhc093blByb3BlcnR5KGNsYXNzb2YoTykpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5JylcbiAgLCBnZXRJdGVyRm4gICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpbmRleCAgID0gMFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihtYXBwaW5nKW1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvcihyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7IiwiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTsiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7YXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyl9KTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2NyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpfSk7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0Jywge2RlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mfSk7IiwiLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBtZXRhICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbigkZnJlZXplKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCl7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbigpe1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCl7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7IiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0fSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjbGFzc29mICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uICAgICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGZvck9mICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgdGFzayAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIG1pY3JvdGFzayAgICAgICAgICA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKClcbiAgLCBQUk9NSVNFICAgICAgICAgICAgPSAnUHJvbWlzZSdcbiAgLCBUeXBlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCAkUHJvbWlzZSAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgICAgICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgZW1wdHkgICAgICAgICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIEludGVybmFsLCBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlICAgICA9ICRQcm9taXNlLnJlc29sdmUoMSlcbiAgICAgICwgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uKGV4ZWMpeyBleGVjKGVtcHR5LCBlbXB0eSk7IH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gd2l0aCBsaWJyYXJ5IHdyYXBwZXIgc3BlY2lhbCBjYXNlXG4gIHJldHVybiBhID09PSBiIHx8IGEgPT09ICRQcm9taXNlICYmIGIgPT09IFdyYXBwZXI7XG59O1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgPyBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICA6IG5ldyBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uKCQkcmVzb2x2ZSwgJCRyZWplY3Qpe1xuICAgIGlmKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ICA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHByb21pc2UsIGlzUmVqZWN0KXtcbiAgaWYocHJvbWlzZS5fbilyZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIG9rICAgID0gcHJvbWlzZS5fcyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIGRvbWFpbiAgPSByZWFjdGlvbi5kb21haW5cbiAgICAgICAgLCByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihoYW5kbGVyKXtcbiAgICAgICAgICBpZighb2spe1xuICAgICAgICAgICAgaWYocHJvbWlzZS5faCA9PSAyKW9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGhhbmRsZXIgPT09IHRydWUpcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdCAmJiAhcHJvbWlzZS5faClvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBhYnJ1cHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmKGFicnVwdCl0aHJvdyBhYnJ1cHQuZXJyb3I7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICBpZihwcm9taXNlLl9oID09IDEpcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2NcbiAgICAsIGkgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpe1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZihyZWFjdGlvbi5mYWlsIHx8ICFpc1VuaGFuZGxlZChyZWFjdGlvbi5wcm9taXNlKSlyZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYoaXNOb2RlKXtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCl7XG4gICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3Z9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmKCFwcm9taXNlLl9hKXByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihwcm9taXNlID09PSB2YWx1ZSl0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge193OiBwcm9taXNlLCBfZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaChlcnIpe1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCl7XG4gICAgICB2YXIgcmVhY3Rpb24gICAgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rICAgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCAgID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fYSl0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fcylub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpe1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcHJvbWlzZSAgPSBuZXcgSW50ZXJuYWw7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ICA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6ICRQcm9taXNlfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZWplY3QgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiAkUHJvbWlzZSAmJiBzYW1lQ29uc3RydWN0b3IoeC5jb25zdHJ1Y3RvciwgdGhpcykpcmV0dXJuIHg7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdmFsdWVzICAgID0gW11cbiAgICAgICAgLCBpbmRleCAgICAgPSAwXG4gICAgICAgICwgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIHZhciAkaW5kZXggICAgICAgID0gaW5kZXgrK1xuICAgICAgICAgICwgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdTZXQnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBNRVRBICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVlcbiAgLCAkZmFpbHMgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBzaGFyZWQgICAgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIHdrcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgLCB3a3NFeHQgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcy1leHQnKVxuICAsIHdrc0RlZmluZSAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpXG4gICwga2V5T2YgICAgICAgICAgPSByZXF1aXJlKCcuL19rZXlvZicpXG4gICwgZW51bUtleXMgICAgICAgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKVxuICAsIGlzQXJyYXkgICAgICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIF9jcmVhdGUgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZ09QTkV4dCAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKVxuICAsICRHT1BEICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsICREUCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCAka2V5cyAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcbiAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG4gICwgZ09QTiAgICAgICAgICAgPSBnT1BORXh0LmZcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIFRPX1BSSU1JVElWRSAgID0gd2tzKCd0b1ByaW1pdGl2ZScpXG4gICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuICAsIEFsbFN5bWJvbHMgICAgID0gc2hhcmVkKCdzeW1ib2xzJylcbiAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuICAsIFVTRV9OQVRJVkUgICAgID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJ1xuICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZihwcm90b0Rlc2MpZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGlmKGl0ID09PSBPYmplY3RQcm90bykkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG4gICAgaWYoIUQuZW51bWVyYWJsZSl7XG4gICAgICBpZighaGFzKGl0LCBISURERU4pKWRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0paXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG4gICAgLCBpICAgID0gMFxuICAgICwgbCA9IGtleXMubGVuZ3RoXG4gICAgLCBrZXk7XG4gIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSlELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpe1xuICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG4gICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmKCFVU0VfTkFUSVZFKXtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmKERFU0NSSVBUT1JTICYmIHNldHRlcilzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHtjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiAgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSl7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uKG5hbWUpe1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH1cbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApd2tzRGVmaW5lKHN5bWJvbHNbaSsrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG4gICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG4gICAgdGhyb3cgVHlwZUVycm9yKGtleSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24oKXsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuICAgIGlmKGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKXJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIHZhciBhcmdzID0gW2l0XVxuICAgICAgLCBpICAgID0gMVxuICAgICAgLCByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmKHR5cGVvZiByZXBsYWNlciA9PSAnZnVuY3Rpb24nKSRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYoIWlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ01hcCcsIHt0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKX0pOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1NldCcsIHt0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKX0pOyIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnYXN5bmNJdGVyYXRvcicpOyIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpOyIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIFRPX1NUUklOR19UQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCJcInVzZSBzdHJpY3RcIlxuXG5mdW5jdGlvbiBkdXBlX2FycmF5KGNvdW50LCB2YWx1ZSwgaSkge1xuICB2YXIgYyA9IGNvdW50W2ldfDBcbiAgaWYoYyA8PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShjKSwgalxuICBpZihpID09PSBjb3VudC5sZW5ndGgtMSkge1xuICAgIGZvcihqPTA7IGo8YzsgKytqKSB7XG4gICAgICByZXN1bHRbal0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3Ioaj0wOyBqPGM7ICsraikge1xuICAgICAgcmVzdWx0W2pdID0gZHVwZV9hcnJheShjb3VudCwgdmFsdWUsIGkrMSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBkdXBlX251bWJlcihjb3VudCwgdmFsdWUpIHtcbiAgdmFyIHJlc3VsdCwgaVxuICByZXN1bHQgPSBuZXcgQXJyYXkoY291bnQpXG4gIGZvcihpPTA7IGk8Y291bnQ7ICsraSkge1xuICAgIHJlc3VsdFtpXSA9IHZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBkdXBlKGNvdW50LCB2YWx1ZSkge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YWx1ZSA9IDBcbiAgfVxuICBzd2l0Y2godHlwZW9mIGNvdW50KSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgaWYoY291bnQgPiAwKSB7XG4gICAgICAgIHJldHVybiBkdXBlX251bWJlcihjb3VudHwwLCB2YWx1ZSlcbiAgICAgIH1cbiAgICBicmVha1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIGlmKHR5cGVvZiAoY291bnQubGVuZ3RoKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gZHVwZV9hcnJheShjb3VudCwgdmFsdWUsIDApXG4gICAgICB9XG4gICAgYnJlYWtcbiAgfVxuICByZXR1cm4gW11cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkdXBlIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCIoZnVuY3Rpb24oKXt2YXIgaz0hIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7ZnVuY3Rpb24gbChhLGIpe2s/YS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsYiwhMSk6YS5hdHRhY2hFdmVudChcInNjcm9sbFwiLGIpfWZ1bmN0aW9uIHYoYSl7ZG9jdW1lbnQuYm9keT9hKCk6az9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGEpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25yZWFkeXN0YXRlY2hhbmdlXCIsZnVuY3Rpb24oKXtcImludGVyYWN0aXZlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGUmJlwiY29tcGxldGVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZXx8YSgpfSl9O2Z1bmN0aW9uIHcoYSl7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dGhpcy5hLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpO3RoaXMuYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7dGhpcy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZz0tMTt0aGlzLmIuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuYy5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7XG50aGlzLmYuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuaC5zdHlsZS5jc3NUZXh0PVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAwJTtoZWlnaHQ6MjAwJTtmb250LXNpemU6MTZweDttYXgtd2lkdGg6bm9uZTtcIjt0aGlzLmIuYXBwZW5kQ2hpbGQodGhpcy5oKTt0aGlzLmMuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5iKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5jKX1cbmZ1bmN0aW9uIHkoYSxiKXthLmEuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO21pbi13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bzttYXJnaW46MDtwYWRkaW5nOjA7dG9wOi05OTlweDtsZWZ0Oi05OTlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udDpcIitiK1wiO1wifWZ1bmN0aW9uIHooYSl7dmFyIGI9YS5hLm9mZnNldFdpZHRoLGM9YisxMDA7YS5mLnN0eWxlLndpZHRoPWMrXCJweFwiO2EuYy5zY3JvbGxMZWZ0PWM7YS5iLnNjcm9sbExlZnQ9YS5iLnNjcm9sbFdpZHRoKzEwMDtyZXR1cm4gYS5nIT09Yj8oYS5nPWIsITApOiExfWZ1bmN0aW9uIEEoYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9bTt6KGEpJiZudWxsIT09YS5hLnBhcmVudE5vZGUmJmIoYS5nKX12YXIgbT1hO2woYS5iLGMpO2woYS5jLGMpO3ooYSl9O2Z1bmN0aW9uIEIoYSxiKXt2YXIgYz1ifHx7fTt0aGlzLmZhbWlseT1hO3RoaXMuc3R5bGU9Yy5zdHlsZXx8XCJub3JtYWxcIjt0aGlzLndlaWdodD1jLndlaWdodHx8XCJub3JtYWxcIjt0aGlzLnN0cmV0Y2g9Yy5zdHJldGNofHxcIm5vcm1hbFwifXZhciBDPW51bGwsRD1udWxsLEg9ISF3aW5kb3cuRm9udEZhY2U7ZnVuY3Rpb24gSSgpe2lmKG51bGw9PT1EKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXthLnN0eWxlLmZvbnQ9XCJjb25kZW5zZWQgMTAwcHggc2Fucy1zZXJpZlwifWNhdGNoKGIpe31EPVwiXCIhPT1hLnN0eWxlLmZvbnR9cmV0dXJuIER9ZnVuY3Rpb24gSihhLGIpe3JldHVyblthLnN0eWxlLGEud2VpZ2h0LEkoKT9hLnN0cmV0Y2g6XCJcIixcIjEwMHB4XCIsYl0uam9pbihcIiBcIil9XG5CLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxtPWF8fFwiQkVTYnN3eVwiLHg9Ynx8M0UzLEU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7aWYoSCl7dmFyIEs9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKCl7KG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eD9iKCk6ZG9jdW1lbnQuZm9udHMubG9hZChKKGMsYy5mYW1pbHkpLG0pLnRoZW4oZnVuY3Rpb24oYyl7MTw9Yy5sZW5ndGg/YSgpOnNldFRpbWVvdXQoZSwyNSl9LGZ1bmN0aW9uKCl7YigpfSl9ZSgpfSksTD1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3NldFRpbWVvdXQoYyx4KX0pO1Byb21pc2UucmFjZShbTCxLXSkudGhlbihmdW5jdGlvbigpe2EoYyl9LGZ1bmN0aW9uKCl7YihjKX0pfWVsc2UgdihmdW5jdGlvbigpe2Z1bmN0aW9uIHEoKXt2YXIgYjtpZihiPS0xIT1mJiYtMSE9Z3x8LTEhPWYmJi0xIT1ofHwtMSE9ZyYmLTEhPVxuaCkoYj1mIT1nJiZmIT1oJiZnIT1oKXx8KG51bGw9PT1DJiYoYj0vQXBwbGVXZWJLaXRcXC8oWzAtOV0rKSg/OlxcLihbMC05XSspKS8uZXhlYyh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksQz0hIWImJig1MzY+cGFyc2VJbnQoYlsxXSwxMCl8fDUzNj09PXBhcnNlSW50KGJbMV0sMTApJiYxMT49cGFyc2VJbnQoYlsyXSwxMCkpKSxiPUMmJihmPT1yJiZnPT1yJiZoPT1yfHxmPT10JiZnPT10JiZoPT10fHxmPT11JiZnPT11JiZoPT11KSksYj0hYjtiJiYobnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGNsZWFyVGltZW91dChHKSxhKGMpKX1mdW5jdGlvbiBGKCl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eCludWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksYihjKTtlbHNle3ZhciBhPWRvY3VtZW50LmhpZGRlbjtpZighMD09PWF8fHZvaWQgMD09PWEpZj1lLmEub2Zmc2V0V2lkdGgsZz1uLmEub2Zmc2V0V2lkdGgsXG5oPXAuYS5vZmZzZXRXaWR0aCxxKCk7Rz1zZXRUaW1lb3V0KEYsNTApfX12YXIgZT1uZXcgdyhtKSxuPW5ldyB3KG0pLHA9bmV3IHcobSksZj0tMSxnPS0xLGg9LTEscj0tMSx0PS0xLHU9LTEsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEc9MDtkLmRpcj1cImx0clwiO3koZSxKKGMsXCJzYW5zLXNlcmlmXCIpKTt5KG4sSihjLFwic2VyaWZcIikpO3kocCxKKGMsXCJtb25vc3BhY2VcIikpO2QuYXBwZW5kQ2hpbGQoZS5hKTtkLmFwcGVuZENoaWxkKG4uYSk7ZC5hcHBlbmRDaGlsZChwLmEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7cj1lLmEub2Zmc2V0V2lkdGg7dD1uLmEub2Zmc2V0V2lkdGg7dT1wLmEub2Zmc2V0V2lkdGg7RigpO0EoZSxmdW5jdGlvbihhKXtmPWE7cSgpfSk7eShlLEooYywnXCInK2MuZmFtaWx5KydcIixzYW5zLXNlcmlmJykpO0EobixmdW5jdGlvbihhKXtnPWE7cSgpfSk7eShuLEooYywnXCInK2MuZmFtaWx5KydcIixzZXJpZicpKTtBKHAsZnVuY3Rpb24oYSl7aD1cbmE7cSgpfSk7eShwLEooYywnXCInK2MuZmFtaWx5KydcIixtb25vc3BhY2UnKSl9KX0pfTt3aW5kb3cuRm9udEZhY2VPYnNlcnZlcj1CO3dpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5jaGVjaz13aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUubG9hZD1CLnByb3RvdHlwZS5sb2FkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIpO30oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgc29saWRDaGlsZHJlbjogZmFsc2UsICAgLy8gd2hldGhlciB0byB0aWxlIHNvbGlkIHNxdWFyZSB0aWxlcyBmdXJ0aGVyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHRoZSB0aWxlIGlzIHNvbGlkIGNsaXBwZWQgc3F1YXJlXG4gICAgICAgIGlmICghb3B0aW9ucy5zb2xpZENoaWxkcmVuICYmIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgaWYgKHRsKSBzdGFjay5wdXNoKHRsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIGlmIChibCkgc3RhY2sucHVzaChibCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgaWYgKHRyKSBzdGFjay5wdXNoKHRyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIGlmIChicikgc3RhY2sucHVzaChiciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKHBhcmVudC5zb3VyY2UpIHtcbiAgICAgICAgaWYgKGlzQ2xpcHBlZFNxdWFyZShwYXJlbnQsIGV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gdHJhbnNmb3JtVGlsZShwYXJlbnQsIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGlsZXNbaWRdKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSB0aWxlLnoyLFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSBnZW9tW2pdID0gdHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGdlb21bal07XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHJpbmdba10gPSB0cmFuc2Zvcm1Qb2ludChyaW5nW2tdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQocCwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgdmFyIHggPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzBdICogejIgLSB0eCkpLFxuICAgICAgICB5ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFsxXSAqIHoyIC0gdHkpKTtcbiAgICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgoYSwgYiwgeCkge1xuICAgIHJldHVybiBbeCwgKHggLSBhWzBdKSAqIChiWzFdIC0gYVsxXSkgLyAoYlswXSAtIGFbMF0pICsgYVsxXSwgMV07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RZKGEsIGIsIHkpIHtcbiAgICByZXR1cm4gWyh5IC0gYVsxXSkgKiAoYlswXSAtIGFbMF0pIC8gKGJbMV0gLSBhWzFdKSArIGFbMF0sIHksIDFdO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgZXh0ZW50LCBidWZmZXIpIHtcblxuICAgIHZhciBmZWF0dXJlcyA9IHRpbGUuc291cmNlO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbMF07XG4gICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMyB8fCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW4gPSBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSA1KSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gdHJhbnNmb3JtUG9pbnQoZmVhdHVyZS5nZW9tZXRyeVswXVtpXSwgZXh0ZW50LCB0aWxlLnoyLCB0aWxlLngsIHRpbGUueSk7XG4gICAgICAgIGlmICgocFswXSAhPT0gLWJ1ZmZlciAmJiBwWzBdICE9PSBleHRlbnQgKyBidWZmZXIpIHx8XG4gICAgICAgICAgICAocFsxXSAhPT0gLWJ1ZmZlciAmJiBwWzFdICE9PSBleHRlbnQgKyBidWZmZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2ltcGxpZnk7XG5cbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmZ1bmN0aW9uIHNpbXBsaWZ5KHBvaW50cywgdG9sZXJhbmNlKSB7XG5cbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgIGZpcnN0ID0gMCxcbiAgICAgICAgbGFzdCA9IGxlbiAtIDEsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGksIG1heFNxRGlzdCwgc3FEaXN0LCBpbmRleDtcblxuICAgIC8vIGFsd2F5cyByZXRhaW4gdGhlIGVuZHBvaW50cyAoMSBpcyB0aGUgbWF4IHZhbHVlKVxuICAgIHBvaW50c1tmaXJzdF1bMl0gPSAxO1xuICAgIHBvaW50c1tsYXN0XVsyXSA9IDE7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBzdGFja1xuICAgIHdoaWxlIChsYXN0KSB7XG5cbiAgICAgICAgbWF4U3FEaXN0ID0gMDtcblxuICAgICAgICBmb3IgKGkgPSBmaXJzdCArIDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIHNxRGlzdCA9IGdldFNxU2VnRGlzdChwb2ludHNbaV0sIHBvaW50c1tmaXJzdF0sIHBvaW50c1tsYXN0XSk7XG5cbiAgICAgICAgICAgIGlmIChzcURpc3QgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWF4U3FEaXN0ID0gc3FEaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBwb2ludHNbaW5kZXhdWzJdID0gbWF4U3FEaXN0OyAvLyBzYXZlIHRoZSBwb2ludCBpbXBvcnRhbmNlIGluIHNxdWFyZWQgcGl4ZWxzIGFzIGEgeiBjb29yZGluYXRlXG4gICAgICAgICAgICBzdGFjay5wdXNoKGZpcnN0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBpbmRleDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZmlyc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChwLCBhLCBiKSB7XG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSxcbiAgICAgICAgcHggPSBwWzBdLCBweSA9IHBbMV0sXG4gICAgICAgIGR4ID0gYnggLSB4LFxuICAgICAgICBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6MjogejIsXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluOiBbMiwgMV0sXG4gICAgICAgIG1heDogWy0xLCAwXVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pbiA9IGZlYXR1cmVzW2ldLm1pbixcbiAgICAgICAgICAgIG1heCA9IGZlYXR1cmVzW2ldLm1heDtcblxuICAgICAgICBpZiAobWluWzBdIDwgdGlsZS5taW5bMF0pIHRpbGUubWluWzBdID0gbWluWzBdO1xuICAgICAgICBpZiAobWluWzFdIDwgdGlsZS5taW5bMV0pIHRpbGUubWluWzFdID0gbWluWzFdO1xuICAgICAgICBpZiAobWF4WzBdID4gdGlsZS5tYXhbMF0pIHRpbGUubWF4WzBdID0gbWF4WzBdO1xuICAgICAgICBpZiAobWF4WzFdID4gdGlsZS5tYXhbMV0pIHRpbGUubWF4WzFdID0gbWF4WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdLFxuICAgICAgICBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgaSwgaiwgcmluZywgcDtcblxuICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGlmaWVkUmluZyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHAgPSByaW5nW2pdO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgcG9pbnRzIHdpdGggaW1wb3J0YW5jZSA+IHRvbGVyYW5jZVxuICAgICAgICAgICAgICAgIGlmIChub1NpbXBsaWZ5IHx8IHBbMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkUmluZy5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbmZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIGJ1ZmZlciwgaW50ZXJzZWN0WCkge1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcyxcbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgaW50ZXJzZWN0WCwgLTEsIDIpLCAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXdHZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MsXG4gICAgICAgICAgICBtaW46IFtmZWF0dXJlLm1pblswXSArIG9mZnNldCwgZmVhdHVyZS5taW5bMV1dLFxuICAgICAgICAgICAgbWF4OiBbZmVhdHVyZS5tYXhbMF0gKyBvZmZzZXQsIGZlYXR1cmUubWF4WzFdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5hcmVhID0gcG9pbnRzLmFyZWE7XG4gICAgbmV3UG9pbnRzLmRpc3QgPSBwb2ludHMuZGlzdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKFtwb2ludHNbaV1bMF0gKyBvZmZzZXQsIHBvaW50c1tpXVsxXSwgcG9pbnRzW2ldWzJdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGludmVydFxuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQGFsaWFzIG1hdDMuaW52ZXJ0XG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl1cbiAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV1cbiAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF1cblxuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxXG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwXG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjBcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjFcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gYjAxICogZGV0XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldFxuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldFxuICBvdXRbM10gPSBiMTEgKiBkZXRcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXRcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0XG4gIG91dFs2XSA9IGIyMSAqIGRldFxuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXRcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbEZyb21NYXQ0XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBhbGlhcyBtYXQzLm5vcm1hbEZyb21NYXQ0XG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbmZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXVxuICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XVxuICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdXG4gIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XVxuXG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTBcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMFxuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwXG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTFcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMVxuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyXG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzBcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMFxuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwXG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzFcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMVxuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYjAwICogYjExXG4gICAgICAgICAgLSBiMDEgKiBiMTBcbiAgICAgICAgICArIGIwMiAqIGIwOVxuICAgICAgICAgICsgYjAzICogYjA4XG4gICAgICAgICAgLSBiMDQgKiBiMDdcbiAgICAgICAgICArIGIwNSAqIGIwNlxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldFxuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldFxuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldFxuXG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXRcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXRcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG5cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9va0F0O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCAwLjAwMDAwMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwZXJzcGVjdGl2ZTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHNjYWxlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zbGF0ZTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGFyc2VFcnJvcnNcblxuZnVuY3Rpb24gcGFyc2VFcnJvcnMobG9nKSB7XG4gIGxvZyA9IFN0cmluZyhsb2cpXG5cbiAgdmFyIGxvZ3MgPSBbXVxuICB2YXIgcmVzdWx0XG5cbiAgd2hpbGUgKHJlc3VsdCA9IGxvZy5tYXRjaCgvRVJST1JcXDooW15cXG5dKykvKSkge1xuICAgIGxvZyA9IGxvZy5zbGljZShyZXN1bHQuaW5kZXggKyAxKVxuXG4gICAgdmFyIGxpbmUgPSByZXN1bHRbMV0udHJpbSgpXG4gICAgdmFyIHNlcHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIgZW1zZyA9IHNlcHMuc2xpY2UoMikuam9pbignOicpLnRyaW0oKVxuICAgIHZhciBmaWxlID0gcGFyc2VJbnQoc2Vwc1swXSwgMTApXG4gICAgdmFyIGxpbmUgPSBwYXJzZUludChzZXBzWzFdLCAxMClcblxuICAgIGxvZ3MucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGVtc2dcbiAgICAgICwgZmlsZTogZmlsZVxuICAgICAgLCBsaW5lOiBsaW5lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG4vLyB2YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG4vLyBtb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG4vLyBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDMwLyogMCAqLykgPyAnXFx4MDAnIDpcbiAgICAgICAgKGMgPT09IDB4NjEvKiBhICovKSA/ICdcXHgwNycgOlxuICAgICAgICAoYyA9PT0gMHg2Mi8qIGIgKi8pID8gJ1xceDA4JyA6XG4gICAgICAgIChjID09PSAweDc0LyogdCAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4MDkvKiBUYWIgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDZFLyogbiAqLykgPyAnXFx4MEEnIDpcbiAgICAgICAgKGMgPT09IDB4NzYvKiB2ICovKSA/ICdcXHgwQicgOlxuICAgICAgICAoYyA9PT0gMHg2Ni8qIGYgKi8pID8gJ1xceDBDJyA6XG4gICAgICAgIChjID09PSAweDcyLyogciAqLykgPyAnXFx4MEQnIDpcbiAgICAgICAgKGMgPT09IDB4NjUvKiBlICovKSA/ICdcXHgxQicgOlxuICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSA/ICcgJyA6XG4gICAgICAgIChjID09PSAweDIyLyogXCIgKi8pID8gJ1xceDIyJyA6XG4gICAgICAgIChjID09PSAweDJGLyogLyAqLykgPyAnLycgOlxuICAgICAgICAoYyA9PT0gMHg1Qy8qIFxcICovKSA/ICdcXHg1QycgOlxuICAgICAgICAoYyA9PT0gMHg0RS8qIE4gKi8pID8gJ1xceDg1JyA6XG4gICAgICAgIChjID09PSAweDVGLyogXyAqLykgPyAnXFx4QTAnIDpcbiAgICAgICAgKGMgPT09IDB4NEMvKiBMICovKSA/ICdcXHUyMDI4JyA6XG4gICAgICAgIChjID09PSAweDUwLyogUCAqLykgPyAnXFx1MjAyOScgOiAnJztcbn1cblxuZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQoYykge1xuICBpZiAoYyA8PSAweEZGRkYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgfVxuICAvLyBFbmNvZGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNDb2RlX3BvaW50c19VLjJCMDEwMDAwX3RvX1UuMkIxMEZGRkZcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKChjIC0gMHgwMTAwMDApID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMCk7XG59XG5cbnZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOyAvLyBpbnRlZ2VyLCBmb3IgZmFzdCBhY2Nlc3NcbnZhciBzaW1wbGVFc2NhcGVNYXAgPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgc2ltcGxlRXNjYXBlQ2hlY2tbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKSA/IDEgOiAwO1xuICBzaW1wbGVFc2NhcGVNYXBbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKTtcbn1cblxuXG5mdW5jdGlvbiBTdGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgdGhpcy5maWxlbmFtZSAgPSBvcHRpb25zWydmaWxlbmFtZSddICB8fCBudWxsO1xuICB0aGlzLnNjaGVtYSAgICA9IG9wdGlvbnNbJ3NjaGVtYSddICAgIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7XG4gIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1snb25XYXJuaW5nJ10gfHwgbnVsbDtcbiAgdGhpcy5sZWdhY3kgICAgPSBvcHRpb25zWydsZWdhY3knXSAgICB8fCBmYWxzZTtcbiAgdGhpcy5qc29uICAgICAgPSBvcHRpb25zWydqc29uJ10gICAgICB8fCBmYWxzZTtcbiAgdGhpcy5saXN0ZW5lciAgPSBvcHRpb25zWydsaXN0ZW5lciddICB8fCBudWxsO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMudHlwZU1hcCAgICAgICA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcDtcblxuICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gIHRoaXMucG9zaXRpb24gICA9IDA7XG4gIHRoaXMubGluZSAgICAgICA9IDA7XG4gIHRoaXMubGluZVN0YXJ0ICA9IDA7XG4gIHRoaXMubGluZUluZGVudCA9IDA7XG5cbiAgdGhpcy5kb2N1bWVudHMgPSBbXTtcblxuICAvKlxuICB0aGlzLnZlcnNpb247XG4gIHRoaXMuY2hlY2tMaW5lQnJlYWtzO1xuICB0aGlzLnRhZ01hcDtcbiAgdGhpcy5hbmNob3JNYXA7XG4gIHRoaXMudGFnO1xuICB0aGlzLmFuY2hvcjtcbiAgdGhpcy5raW5kO1xuICB0aGlzLnJlc3VsdDsqL1xuXG59XG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFlBTUxFeGNlcHRpb24oXG4gICAgbWVzc2FnZSxcbiAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCAoc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQpKSk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZSkge1xuICBpZiAoc3RhdGUub25XYXJuaW5nKSB7XG4gICAgc3RhdGUub25XYXJuaW5nLmNhbGwobnVsbCwgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkpO1xuICB9XG59XG5cblxudmFyIGRpcmVjdGl2ZUhhbmRsZXJzID0ge1xuXG4gIFlBTUw6IGZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBtYXRjaCwgbWFqb3IsIG1pbm9yO1xuXG4gICAgaWYgKHN0YXRlLnZlcnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgbWF0Y2ggPSAvXihbMC05XSspXFwuKFswLTldKykkLy5leGVjKGFyZ3NbMF0pO1xuXG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuXG4gICAgaWYgKG1ham9yICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS52ZXJzaW9uID0gYXJnc1swXTtcbiAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSAobWlub3IgPCAyKTtcblxuICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cbiAgfSxcblxuICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIGhhbmRsZSwgcHJlZml4O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGhhbmRsZSA9IGFyZ3NbMF07XG4gICAgcHJlZml4ID0gYXJnc1sxXTtcblxuICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QoaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yIFwiJyArIGhhbmRsZSArICdcIiB0YWcgaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXgpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgcHJlZml4IChzZWNvbmQgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFnTWFwW2hhbmRsZV0gPSBwcmVmaXg7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQoc3RhdGUsIHN0YXJ0LCBlbmQsIGNoZWNrSnNvbikge1xuICB2YXIgX3Bvc2l0aW9uLCBfbGVuZ3RoLCBfY2hhcmFjdGVyLCBfcmVzdWx0O1xuXG4gIGlmIChzdGFydCA8IGVuZCkge1xuICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChjaGVja0pzb24pIHtcbiAgICAgIGZvciAoX3Bvc2l0aW9uID0gMCwgX2xlbmd0aCA9IF9yZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gPCBfbGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gKz0gMSkge1xuICAgICAgICBfY2hhcmFjdGVyID0gX3Jlc3VsdC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG4gICAgICAgIGlmICghKF9jaGFyYWN0ZXIgPT09IDB4MDkgfHxcbiAgICAgICAgICAgICAgKDB4MjAgPD0gX2NoYXJhY3RlciAmJiBfY2hhcmFjdGVyIDw9IDB4MTBGRkZGKSkpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHN0YXRlLnJlc3VsdCArPSBfcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWFwcGluZ3Moc3RhdGUsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykge1xuICB2YXIgc291cmNlS2V5cywga2V5LCBpbmRleCwgcXVhbnRpdHk7XG5cbiAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZScpO1xuICB9XG5cbiAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcblxuICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoZGVzdGluYXRpb24sIGtleSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIG92ZXJyaWRhYmxlS2V5c1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkge1xuICB2YXIgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGtleU5vZGUgPSBTdHJpbmcoa2V5Tm9kZSk7XG5cbiAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHtcbiAgICBfcmVzdWx0ID0ge307XG4gIH1cblxuICBpZiAoa2V5VGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVOb2RlKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gdmFsdWVOb2RlLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXhdLCBvdmVycmlkYWJsZUtleXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghc3RhdGUuanNvbiAmJlxuICAgICAgICAhX2hhc093blByb3BlcnR5LmNhbGwob3ZlcnJpZGFibGVLZXlzLCBrZXlOb2RlKSAmJlxuICAgICAgICBfaGFzT3duUHJvcGVydHkuY2FsbChfcmVzdWx0LCBrZXlOb2RlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsXG4gICAgICB0ZXh0SW5kZW50ICAgICA9IG5vZGVJbmRlbnQsXG4gICAgICBlbXB0eUxpbmVzICAgICA9IDAsXG4gICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4N0MvKiB8ICovKSB7XG4gICAgZm9sZGluZyA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDNFLyogPiAqLykge1xuICAgIGZvbGRpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJCLyogKyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGlmIChDSE9NUElOR19DTElQID09PSBjaG9tcGluZykge1xuICAgICAgICBjaG9tcGluZyA9IChjaCA9PT0gMHgyQi8qICsgKi8pID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhIGNob21waW5nIG1vZGUgaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgaWYgKHRtcCA9PT0gMCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZScpO1xuICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxO1xuICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKTtcblxuICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG4gICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmXG4gICAgICAgICAgIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSkge1xuICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUubGluZUluZGVudCA+IHRleHRJbmRlbnQpIHtcbiAgICAgIHRleHRJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBlbXB0eUxpbmVzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBFbmQgb2YgdGhlIHNjYWxhci5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgY2hvbXBpbmcuXG4gICAgICBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0tFRVApIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgIC8vIElmIGN1cnJlbnQgbGluZSBpc24ndCB0aGUgZmlyc3Qgb25lIC0gY291bnQgbGluZSBicmVhayBmcm9tIHRoZSBsYXN0IGNvbnRlbnQgbGluZS5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSAtIGNvdW50IG9ubHkgZW1wdHkgbGluZXMuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICAgICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgICAgID0ge30sXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleVRhZyAgICAgICAgPSBudWxsLFxuICAgICAga2V5Tm9kZSAgICAgICA9IG51bGwsXG4gICAgICB2YWx1ZU5vZGUgICAgID0gbnVsbCxcbiAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZSxcbiAgICAgIGRldGVjdGVkICAgICAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7IC8vIFNhdmUgdGhlIGN1cnJlbnQgbGluZS5cblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBFcGlsb2d1ZS5cbiAgLy9cblxuICAvLyBTcGVjaWFsIGNhc2U6IGxhc3QgbWFwcGluZydzIG5vZGUgY29udGFpbnMgb25seSB0aGUga2V5IGluIGV4cGxpY2l0IG5vdGF0aW9uLlxuICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ21hcHBpbmcnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgaXNWZXJiYXRpbSA9IGZhbHNlLFxuICAgICAgaXNOYW1lZCAgICA9IGZhbHNlLFxuICAgICAgdGFnSGFuZGxlLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIxLyogISAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4M0MvKiA8ICovKSB7XG4gICAgaXNWZXJiYXRpbSA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNOYW1lZCA9IHRydWU7XG4gICAgdGFnSGFuZGxlID0gJyEhJztcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIHtcbiAgICB0YWdIYW5kbGUgPSAnISc7XG4gIH1cblxuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGNoICE9PSAwICYmIGNoICE9PSAweDNFLyogPiAqLyk7XG5cbiAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgdmVyYmF0aW0gdGFnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgICAgIGlmICghaXNOYW1lZCkge1xuICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiAtIDEsIHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lZCB0YWcgaGFuZGxlIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVycycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YWdOYW1lICYmICFQQVRURVJOX1RBR19VUkkudGVzdCh0YWdOYW1lKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICcgKyB0YWdOYW1lKTtcbiAgfVxuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgc3RhdGUudGFnID0gdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgdGFnSGFuZGxlKSkge1xuICAgIHN0YXRlLnRhZyA9IHN0YXRlLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEnKSB7XG4gICAgc3RhdGUudGFnID0gJyEnICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEhJykge1xuICAgIHN0YXRlLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjonICsgdGFnTmFtZTtcblxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgXCInICsgdGFnSGFuZGxlICsgJ1wiJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYW5jaG9yIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIHN0YXRlLmFuY2hvciA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sIGFsaWFzLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MkEvKiAqICovKSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYWxpYXMgbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoIXN0YXRlLmFuY2hvck1hcC5oYXNPd25Qcm9wZXJ0eShhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5O1xuICAgICAgICAgICB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIC8vIEltcGxpY2l0IHJlc29sdmluZyBpcyBub3QgYWxsb3dlZCBmb3Igbm9uLXNjYWxhciB0eXBlcywgYW5kICc/J1xuICAgICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXNzaWduZWQgdG8gcGxhaW4gc2NhbGFycy4gU28sIGl0IGlzbid0XG4gICAgICAgIC8vIG5lZWRlZCB0byBjaGVjayBmb3IgJ2tpbmQnIGNvbmZvcm1pdHkuXG5cbiAgICAgICAgaWYgKHR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgICAgc3RhdGUudGFnID0gdHlwZS50YWc7XG4gICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpLCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gIGxvYWRBbGwoaW5wdXQsIG91dHB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuKi9cblxudmFyIGNvbW1vbiAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIFR5cGUgICAgICAgICAgPSByZXF1aXJlKCcuL3R5cGUnKTtcblxuXG5mdW5jdGlvbiBjb21waWxlTGlzdChzY2hlbWEsIG5hbWUsIHJlc3VsdCkge1xuICB2YXIgZXhjbHVkZSA9IFtdO1xuXG4gIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24gKGluY2x1ZGVkU2NoZW1hKSB7XG4gICAgcmVzdWx0ID0gY29tcGlsZUxpc3QoaW5jbHVkZWRTY2hlbWEsIG5hbWUsIHJlc3VsdCk7XG4gIH0pO1xuXG4gIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50VHlwZSkge1xuICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2aW91c1R5cGUsIHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChwcmV2aW91c1R5cGUudGFnID09PSBjdXJyZW50VHlwZS50YWcpIHtcbiAgICAgICAgZXhjbHVkZS5wdXNoKHByZXZpb3VzSW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnB1c2goY3VycmVudFR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZXhjbHVkZS5pbmRleE9mKGluZGV4KSA9PT0gLTE7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVNYXAoLyogbGlzdHMuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9LCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGUpIHtcbiAgICByZXN1bHRbdHlwZS50YWddID0gdHlwZTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGFyZ3VtZW50c1tpbmRleF0uZm9yRWFjaChjb2xsZWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYGxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIEpTLVlBTUwncyBkZWZhdWx0IHNhZmUgc2NoZW1hIGFuZCBpbmNsdWRlc1xuLy8gSmF2YVNjcmlwdC1zcGVjaWZpYyB0eXBlczogISFqcy91bmRlZmluZWQsICEhanMvcmVnZXhwIGFuZCAhIWpzL2Z1bmN0aW9uLlxuLy9cbi8vIEFsc28gdGhpcyBzY2hlbWEgaXMgdXNlZCBhcyBkZWZhdWx0IGJhc2Ugc2NoZW1hIGF0IGBTY2hlbWEuY3JlYXRlYCBmdW5jdGlvbi5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hLkRFRkFVTFQgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZGVmYXVsdF9zYWZlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3VuZGVmaW5lZCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvcmVnZXhwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9mdW5jdGlvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxuLy8gQSB0cmljayBmb3IgYnJvd3NlcmlmaWVkIHZlcnNpb24uXG4vLyBTaW5jZSB3ZSBtYWtlIGJyb3dzZXJpZmllciB0byBpZ25vcmUgYGJ1ZmZlcmAgbW9kdWxlLCBOb2RlQnVmZmVyIHdpbGwgYmUgdW5kZWZpbmVkXG52YXIgTm9kZUJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSByZXR1cm4gbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQm9vbGVhbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSA0ICYmIChkYXRhID09PSAndHJ1ZScgfHwgZGF0YSA9PT0gJ1RydWUnIHx8IGRhdGEgPT09ICdUUlVFJykpIHx8XG4gICAgICAgICAobWF4ID09PSA1ICYmIChkYXRhID09PSAnZmFsc2UnIHx8IGRhdGEgPT09ICdGYWxzZScgfHwgZGF0YSA9PT0gJ0ZBTFNFJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAndHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUcnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RSVUUnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCb29sZWFuLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCb29sZWFuLFxuICBwcmVkaWNhdGU6IGlzQm9vbGVhbixcbiAgcmVwcmVzZW50OiB7XG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAndHJ1ZScgOiAnZmFsc2UnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RSVUUnIDogJ0ZBTFNFJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUcnVlJyA6ICdGYWxzZSc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAnXig/OlstK10/KD86WzAtOV1bMC05X10qKVxcXFwuWzAtOV9dKig/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcXFwuWzAtOV9dKicgK1xuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG5cbiAgICBpZiAoY2ggPT09ICd4Jykge1xuICAgICAgLy8gYmFzZSAxNlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHM7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgIGlmIChjaCA9PT0gJzonKSBicmVhaztcbiAgICBpZiAoIWlzRGVjQ29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFoYXNEaWdpdHMpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwYicgKyBvYmplY3QudG9TdHJpbmcoMik7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwJyAgKyBvYmplY3QudG9TdHJpbmcoOCk7IH0sXG4gICAgZGVjaW1hbDogICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICAgICAgICBvYmplY3QudG9TdHJpbmcoMTApOyB9LFxuICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMHgnICsgb2JqZWN0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJpbWE7XG5cbi8vIEJyb3dzZXJpZmllZCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgZXNwcmltYVxuLy9cbi8vIDEuIEZvciBub2RlLmpzIGp1c3QgcmVxdWlyZSBtb2R1bGUgYXMgZGVwc1xuLy8gMi4gRm9yIGJyb3dzZXIgdHJ5IHRvIHJlcXVpcmUgbXVkdWxlIHZpYSBleHRlcm5hbCBBTUQgc3lzdGVtLlxuLy8gICAgSWYgbm90IGZvdW5kIC0gdHJ5IHRvIGZhbGxiYWNrIHRvIHdpbmRvdy5lc3ByaW1hLiBJZiBub3Rcbi8vICAgIGZvdW5kIHRvbyAtIHRoZW4gZmFpbCB0byBwYXJzZS5cbi8vXG50cnkge1xuICAvLyB3b3JrYXJvdW5kIHRvIGV4Y2x1ZGUgcGFja2FnZSBmcm9tIGJyb3dzZXJpZnkgbGlzdC5cbiAgdmFyIF9yZXF1aXJlID0gcmVxdWlyZTtcbiAgZXNwcmltYSA9IF9yZXF1aXJlKCdlc3ByaW1hJyk7XG59IGNhdGNoIChfKSB7XG4gIC8qZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHlbMF0gKyAxLCBib2R5WzFdIC0gMSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gaWYgcmVnZXhwIHN0YXJ0cyB3aXRoICcvJyBpdCBjYW4gaGF2ZSBtb2RpZmllcnMgYW5kIG11c3QgYmUgcHJvcGVybHkgY2xvc2VkXG4gIC8vIGAvZm9vL2dpbWAgLSBtb2RpZmllcnMgdGFpbCBjYW4gYmUgbWF4aW11bSAzIGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuXG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAvLCBpcyBzaG91bGQgYmUgcHJvcGVybHkgdGVybWluYXRlZFxuICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGAvZm9vL2dpbWAgLSB0YWlsIGNhbiBiZSBtYXhpbXVtIDQgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG4gICAgcmVnZXhwID0gcmVnZXhwLnNsaWNlKDEsIHJlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnLycgKyBvYmplY3Quc291cmNlICsgJy8nO1xuXG4gIGlmIChvYmplY3QuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAob2JqZWN0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKG9iamVjdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLFxuICBwcmVkaWNhdGU6IGlzUmVnRXhwLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gMSAmJiBkYXRhID09PSAnficpIHx8XG4gICAgICAgICAobWF4ID09PSA0ICYmIChkYXRhID09PSAnbnVsbCcgfHwgZGF0YSA9PT0gJ051bGwnIHx8IGRhdGEgPT09ICdOVUxMJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCxcbiAgcHJlZGljYXRlOiBpc051bGwsXG4gIHJlcHJlc2VudDoge1xuICAgIGNhbm9uaWNhbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ34nOyAgICB9LFxuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ251bGwnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ05VTEwnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ051bGwnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4LCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuICAgIHBhaXJIYXNLZXkgPSBmYWxzZTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7XG4gICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHtcbiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sT21hcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sT21hcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/Oig/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/KT8kJyk7ICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG4vLyBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4vLyAgICAgdmFyIG91dHB1dCA9IFtdO1xuLy8gICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuLy8gICAgIHZhciBpID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoLCByZW1haW5pbmdCeXRlcyA9IGxlbjtcblxuLy8gICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcbi8vICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuLy8gICAgICAgICByZW1haW5pbmdCeXRlcyA9IGxlbiAtIGk7XG5cbi8vICAgICAgICAgaWYgKCFpc0FycmF5KSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4vLyAgICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuLy8gICAgICAgICBlbmMzID0gcmVtYWluaW5nQnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0O1xuLy8gICAgICAgICBlbmM0ID0gcmVtYWluaW5nQnl0ZXMgPiAyID8gKGNocjMgJiA2MykgOiA2NDtcblxuLy8gICAgICAgICBvdXRwdXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7XG5cbi8vICAgICB9XG5cbi8vICAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XG4vLyB9O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMCwgcmVzdWx0SW5kZXggPSAwO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICB2YXIgdG90YWxMZW5ndGggPSBpbnB1dC5sZW5ndGggKiAzIC8gNDtcbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0O1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBjb21wcmVzc2VkIG9iamVjdCwgd2l0aCBldmVyeXRoaW5nIG5lZWRlZCB0byBkZWNvbXByZXNzIGl0LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFmdGVyIGRlY29tcHJlc3Npb24uXG4gKiBAcGFyYW0ge251bWJlcn0gY3JjMzIgdGhlIGNyYzMyIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgY29tcHJlc3NlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLmNyYzMyID0gY3JjMzI7XG4gICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBkYXRhO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSB1bmNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbnRlbnRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKVxuICAgICAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiZGF0YV9sZW5ndGhcIikpO1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgd29ya2VyLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2VkU2l6ZVwiLCB0aGlzLmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY3JjMzJcIiwgdGhpcy5jcmMzMilcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgdGhpcy5jb21wcmVzc2lvbilcbiAgICAgICAgO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2hhaW4gdGhlIGdpdmVuIHdvcmtlciB3aXRoIG90aGVyIHdvcmtlcnMgdG8gY29tcHJlc3MgdGhlIGNvbnRlbnQgd2l0aCB0aGVcbiAqIGdpdmVuIGNvbXByZXNpb24uXG4gKiBAcGFyYW0ge0dlbmVyaWNXb3JrZXJ9IHVuY29tcHJlc3NlZFdvcmtlciB0aGUgd29ya2VyIHRvIHBpcGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgbmV3IHdvcmtlciBjb21wcmVzc2luZyB0aGUgY29udGVudC5cbiAqL1xuQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tID0gZnVuY3Rpb24gKHVuY29tcHJlc3NlZFdvcmtlciwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiB1bmNvbXByZXNzZWRXb3JrZXJcbiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJ1bmNvbXByZXNzZWRTaXplXCIpKVxuICAgIC5waXBlKGNvbXByZXNzaW9uLmNvbXByZXNzV29ya2VyKGNvbXByZXNzaW9uT3B0aW9ucykpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImNvbXByZXNzZWRTaXplXCIpKVxuICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIGNvbXByZXNzaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcHJlc3NlZE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgLy8gY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGNvbXByZXNzaW9uXCIpO1xuICAgIC8vIH0sXG4gICAgdW5jb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgZGVjb21wcmVzc2lvblwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5ERUZMQVRFID0gcmVxdWlyZSgnLi9mbGF0ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvemxpYi9jcmMzMi5qc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgICB2YXIgYywgdGFibGUgPSBbXTtcblxuICAgIGZvcih2YXIgbiA9MDsgbiA8IDI1NjsgbisrKXtcbiAgICAgICAgYyA9IG47XG4gICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICAgICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZVtuXSA9IGM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBjcmMzMiBvZiBhIHN0cmluZy5cbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbiBjcmMzMiwgYnV0IGZvciBzdHJpbmdzLiBVc2luZyB0aGVcbiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxlIHBlcmZvcm1hbmNlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjcmMuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGNyYzMyIGNvbXB1dGF0aW9uLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgY29tcHV0ZWQgY3JjMzIuXG4gKi9cbmZ1bmN0aW9uIGNyYzMyc3RyKGNyYywgc3RyLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JjMzJ3cmFwcGVyKGlucHV0LCBjcmMpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gY3JjMzIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfVxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5iYXNlNjQgPSBmYWxzZTtcbmV4cG9ydHMuYmluYXJ5ID0gZmFsc2U7XG5leHBvcnRzLmRpciA9IGZhbHNlO1xuZXhwb3J0cy5jcmVhdGVGb2xkZXJzID0gdHJ1ZTtcbmV4cG9ydHMuZGF0ZSA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb25PcHRpb25zID0gbnVsbDtcbmV4cG9ydHMuY29tbWVudCA9IG51bGw7XG5leHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG5leHBvcnRzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIEVTNlByb21pc2UgPSByZXF1aXJlKFwiZXM2LXByb21pc2VcIikuUHJvbWlzZTtcblxuLyoqXG4gKiBMZXQgdGhlIHVzZXIgdXNlL2NoYW5nZSBzb21lIGltcGxlbWVudGF0aW9ucy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvbWlzZTogd2luZG93LlByb21pc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVVNFX1RZUEVEQVJSQVkgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgcGFrbyA9IHJlcXVpcmUoXCJwYWtvXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG52YXIgQVJSQVlfVFlQRSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5cbmV4cG9ydHMubWFnaWMgPSBcIlxceDA4XFx4MDBcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB3b3JrZXIgdGhhdCB1c2VzIHBha28gdG8gaW5mbGF0ZS9kZWZsYXRlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIHRoZSBuYW1lIG9mIHRoZSBwYWtvIGZ1bmN0aW9uIHRvIGNhbGwgOiBlaXRoZXIgXCJEZWZsYXRlXCIgb3IgXCJJbmZsYXRlXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIEZsYXRlV29ya2VyKGFjdGlvbiwgb3B0aW9ucykge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkZsYXRlV29ya2VyL1wiICsgYWN0aW9uKTtcblxuICAgIHRoaXMuX3Bha28gPSBuZXcgcGFrb1thY3Rpb25dKHtcbiAgICAgICAgcmF3OnRydWUsXG4gICAgICAgIGxldmVsIDogb3B0aW9ucy5sZXZlbCB8fCAtMSAvLyBkZWZhdWx0IGNvbXByZXNzaW9uXG4gICAgfSk7XG4gICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZFxuICAgIC8vIHRoaXMgYWxsb3cgdGhpcyB3b3JrZXIgdG8gcGFzcyBhcm91bmQgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG51dGlscy5pbmhlcml0cyhGbGF0ZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5tZXRhID0gY2h1bmsubWV0YTtcbiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7XG59O1xuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrbyA9IG51bGw7XG59O1xuXG5leHBvcnRzLmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJEZWZsYXRlXCIsIGNvbXByZXNzaW9uT3B0aW9ucyk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJJbmZsYXRlXCIsIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gYSBvZiB6aXAgZmlsZSBpbiBqc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEpTWmlwKCkge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH1cblxuICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6XG4gICAgLy8ge1xuICAgIC8vICAgXCJmb2xkZXIvXCIgOiB7Li4ufSxcbiAgICAvLyAgIFwiZm9sZGVyL2RhdGEudHh0XCIgOiB7Li4ufVxuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0ge307XG5cbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG4gICAgLy8gV2hlcmUgd2UgYXJlIGluIHRoZSBoaWVyYXJjaHlcbiAgICB0aGlzLnJvb3QgPSBcIlwiO1xuICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1tpXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gdGhpc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH07XG59XG5KU1ppcC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL29iamVjdCcpO1xuSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpO1xuSlNaaXAuc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuSlNaaXAuZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbkpTWmlwLmxvYWRBc3luYyA9IGZ1bmN0aW9uIChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5tb2R1bGUuZXhwb3J0cyA9IEpTWmlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIFppcEVudHJpZXMgPSByZXF1aXJlKCcuL3ppcEVudHJpZXMnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG5cbi8qKlxuICogQ2hlY2sgdGhlIENSQzMyIG9mIGFuIGVudHJ5LlxuICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IENyYzMyUHJvYmUoKSk7XG4gICAgICAgIHdvcmtlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0cmVhbUluZm8uY3JjMzIgIT09IHppcEVudHJ5LmRlY29tcHJlc3NlZC5jcmMzMikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIHppcCA9IHRoaXM7XG4gICAgb3B0aW9ucyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAgIGNoZWNrQ1JDMzI6IGZhbHNlLFxuICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IGZhbHNlLFxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcbiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRlY29kZVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSlNaaXAgY2FuJ3QgYWNjZXB0IGEgc3RyZWFtIHdoZW4gbG9hZGluZyBhIHppcCBmaWxlLlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KFwidGhlIGxvYWRlZCB6aXAgZmlsZVwiLCBkYXRhLCB0cnVlLCBvcHRpb25zLm9wdGltaXplZEJpbmFyeVN0cmluZywgb3B0aW9ucy5iYXNlNjQpXG4gICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IG5ldyBaaXBFbnRyaWVzKG9wdGlvbnMpO1xuICAgICAgICB6aXBFbnRyaWVzLmxvYWQoZGF0YSk7XG4gICAgICAgIHJldHVybiB6aXBFbnRyaWVzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gY2hlY2tDUkMzMih6aXBFbnRyaWVzKSB7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwRW50cmllcyldO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmlsZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gYWRkRmlsZXMocmVzdWx0cykge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IHJlc3VsdHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gZmlsZXNbaV07XG4gICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7XG4gICAgICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLFxuICAgICAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgOiBpbnB1dC5maWxlQ29tbWVudFN0ci5sZW5ndGggPyBpbnB1dC5maWxlQ29tbWVudFN0ciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGRvc1Blcm1pc3Npb25zIDogaW5wdXQuZG9zUGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogb3B0aW9ucy5jcmVhdGVGb2xkZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoemlwRW50cmllcy56aXBDb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRyaWVzLnppcENvbW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gemlwO1xuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbnRyeSBmb3IgdGhpcyBzdHJlYW0uXG4gKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihmaWxlbmFtZSwgc3RyZWFtKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIiArIGZpbGVuYW1lKTtcbiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYmluZFN0cmVhbShzdHJlYW0pO1xufVxuXG51dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHN0cmVhbSBhbmQgYmluZCB0aGUgY2FsbGJhY2tzIG9uIGl0LlxuICogRG8gdGhpcyBBU0FQIG9uIG5vZGUgMC4xMCAhIEEgbGF6eSBiaW5kaW5nIGRvZXNuJ3QgYWx3YXlzIHdvcmsuXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS5cbiAqL1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5fYmluZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIHN0cmVhbVxuICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zdHJlYW0ucGF1c2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudXRpbC5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBSZWFkYWJsZSk7XG5cbi8qKlxuKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLlxuKiBAc2VlIHRoZSBTb3VyY2VXcmFwcGVyIGluIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbFxuKiBAY29uc3RydWN0b3JcbiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXJcbiogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG5vZGVqcyBzdHJlYW0gb3B0aW9uc1xuKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIoaGVscGVyLCBvcHRpb25zLCB1cGRhdGVDYikge1xuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGhlbHBlci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgIHNlbGYuX2hlbHBlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHVwZGF0ZUNiKSB7XG4gICAgICAgICAgICB1cGRhdGVDYihtZXRhKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSk7XG59XG5cblxuTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlci5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVzdW1lKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBydW5uaW5nIGluIE5vZGVqcywgd2lsbCBiZSB1bmRlZmluZWQgaW4gYSBicm93c2VyLlxuICAgICAqIEluIGEgYnJvd3NlciwgYnJvd3NlcmlmeSB3b24ndCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgdGhlIHdob2xlIG1vZHVsZVxuICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQgYW4gZW1wdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIGlzTm9kZSA6IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuXG4gICAgICogQHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuXG4gICAgICovXG4gICAgbmV3QnVmZmVyIDogZnVuY3Rpb24oZGF0YSwgZW5jb2Rpbmcpe1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihkYXRhLCBlbmNvZGluZyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIG91dCBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7XG4gICAgICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYik7XG4gICAgfSxcblxuICAgIGlzU3RyZWFtIDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuLy8gdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpO1xuLy8gdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIi4vZ2VuZXJhdGVcIik7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcbnZhciBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIgPSByZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyXCIpO1xuXG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuXG4gICAgLypcbiAgICAgKiBDb3JyZWN0IG9wdGlvbnMuXG4gICAgICovXG5cbiAgICBvID0gdXRpbHMuZXh0ZW5kKG8gfHwge30sIGRlZmF1bHRzKTtcbiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBpZiAoby5jb21wcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gby5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygby51bml4UGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgby51bml4UGVybWlzc2lvbnMgPSBwYXJzZUludChvLnVuaXhQZXJtaXNzaW9ucywgOCk7XG4gICAgfVxuXG4gICAgLy8gVU5YX0lGRElSICAwMDQwMDAwIHNlZSB6aXBpbmZvLmNcbiAgICBpZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeVxuICAgIGlmIChvLmRvc1Blcm1pc3Npb25zICYmIChvLmRvc1Blcm1pc3Npb25zICYgMHgwMDEwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG8uZGlyKSB7XG4gICAgICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG4gICAgfVxuICAgIGlmIChvLmNyZWF0ZUZvbGRlcnMgJiYgKHBhcmVudCA9IHBhcmVudEZvbGRlcihuYW1lKSkpIHtcbiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgJiYgby5iaW5hcnkgPT09IGZhbHNlICYmIG8uYmFzZTY0ID09PSBmYWxzZTtcbiAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7XG5cblxuICAgIHZhciBpc0NvbXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwO1xuXG4gICAgaWYgKGlzQ29tcHJlc3NlZEVtcHR5IHx8IG8uZGlyIHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBcIlNUT1JFXCI7XG4gICAgICAgIGRhdGFUeXBlID0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIENvbnZlcnQgY29udGVudCB0byBmaXQuXG4gICAgICovXG5cbiAgICB2YXIgemlwT2JqZWN0Q29udGVudCA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKG5hbWUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSB1dGlscy5wcmVwYXJlQ29udGVudChuYW1lLCBkYXRhLCBvLmJpbmFyeSwgby5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG8uYmFzZTY0KTtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCB6aXBPYmplY3RDb250ZW50LCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIC8qXG4gICAgVE9ETzogd2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBhc3luYyBwcm9taXNlc1xuICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUpIGJ1dCByZXR1cm5pbmcgYVxuICAgIHByb21pc2UgaXMgdXNlbGVzcyBiZWNhdXNlIGZpbGUobmFtZSwgZGF0YSkgcmV0dXJucyB0aGUgSlNaaXBcbiAgICBvYmplY3QgZm9yIGNoYWluaW5nLiBTaG91bGQgd2UgYnJlYWsgdGhhdCB0byBhbGxvdyB0aGUgdXNlclxuICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/XG5cbiAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcE9iamVjdENvbnRlbnQpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuICAgICovXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgIHJldHVybiAobGFzdFNsYXNoID4gMCkgPyBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpIDogXCJcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCB3aXRoIGEgc2xhc2ggYXQgdGhlIGVuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICovXG52YXIgZm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAocGF0aC5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgICAgIHBhdGggKz0gXCIvXCI7IC8vIElFIGRvZXNuJ3QgbGlrZSBzdWJzdHIoLTEpXG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzO1xuXG4gICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcblxuICAgIC8vIERvZXMgdGhpcyBmb2xkZXIgYWxyZWFkeSBleGlzdD9cbiAgICBpZiAoIXRoaXMuZmlsZXNbbmFtZV0pIHtcbiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIG51bGwsIHtcbiAgICAgICAgICAgIGRpcjogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IGNyZWF0ZUZvbGRlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVzW25hbWVdO1xufTtcblxuLyoqXG4qIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb25cbiogQHBhcmFtICB7T2JqZWN0fSAgb2JqZWN0IEFueXRoaW5nXG4qIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sXG4qIGZhbHNlIG90aGVyd2lzZVxuKi9cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuLy8gcmV0dXJuIHRoZSBhY3R1YWwgcHJvdG90eXBlIG9mIEpTWmlwXG52YXIgb3V0ID0ge1xuICAgIC8qKlxuICAgICAqIEBzZWUgbG9hZEFzeW5jXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoOiBmdW5jdGlvbihjYikge1xuICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTtcbiAgICAgICAgZm9yIChmaWxlbmFtZSBpbiB0aGlzLmZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aCAmJiBmaWxlbmFtZS5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoKSA9PT0gdGhpcy5yb290KSB7IC8vIHRoZSBmaWxlIGlzIGluIHRoZSBjdXJyZW50IHJvb3RcbiAgICAgICAgICAgICAgICBjYihyZWxhdGl2ZVBhdGgsIGZpbGUpOyAvLyBUT0RPIHJldmVyc2UgdGhlIHBhcmFtZXRlcnMgPyBuZWVkIHRvIGJlIGNsZWFuIEFORCBjb25zaXN0ZW50IHdpdGggdGhlIGZpbHRlciBzZWFyY2ggZm4uLi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgbmVzdGVkIGZpbGVzL2ZvbGRlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuXG4gICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihzZWFyY2gpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2gocmVsYXRpdmVQYXRoLCBlbnRyeSkpIHsgLy8gdGhlIGZpbGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2ggYSBmaWxlLlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSxcbiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIChpZiBubyBkYXRhKSBvciBhIHJlZ2V4IHRvIG1hdGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgIFRoZSBmaWxlIGRhdGEsIGVpdGhlciByYXcgb3IgYmFzZTY0IGVuY29kZWRcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuICB7SlNaaXB8T2JqZWN0fEFycmF5fSB0aGlzIEpTWmlwIG9iamVjdCAod2hlbiBhZGRpbmcgYSBmaWxlKSxcbiAgICAgKiBhIGZpbGUgKHdoZW4gc2VhcmNoaW5nIGJ5IHN0cmluZykgb3IgYW4gYXJyYXkgb2YgZmlsZXMgKHdoZW4gc2VhcmNoaW5nIGJ5IHJlZ2V4KS5cbiAgICAgKi9cbiAgICBmaWxlOiBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnZXhwID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhwLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHRoaXMuZmlsZXNbdGhpcy5yb290ICsgbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmRpcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUgZGF0YSAhXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAgICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBkYXRhLCBvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuXG4gICAgICogQHJldHVybiAge0pTWmlwfSBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBhcyB0aGUgcm9vdCwgb3IgYW4gYXJyYXkgY29udGFpbmluZyBtYXRjaGluZyBmb2xkZXJzLlxuICAgICAqL1xuICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlZ0V4cChhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZGlyICYmIGFyZy50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UsIG5hbWUgaXMgYSBuZXcgZm9sZGVyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5yb290ICsgYXJnO1xuICAgICAgICB2YXIgbmV3Rm9sZGVyID0gZm9sZGVyQWRkLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290XG4gICAgICAgIHZhciByZXQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldC5yb290ID0gbmV3Rm9sZGVyLm5hbWU7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfS8vLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge0pTWmlwfSB0aGlzIEpTWmlwIG9iamVjdFxuICAgICAqL1xuICAgIC8vIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIC8vICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAvLyAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICBpZiAoIWZpbGUpIHtcbiAgICAvLyAgICAgICAgIC8vIExvb2sgZm9yIGFueSBmb2xkZXJzXG4gICAgLy8gICAgICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgLy8gICAgICAgICAgICAgbmFtZSArPSBcIi9cIjtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGZpbGUgJiYgIWZpbGUuZGlyKSB7XG4gICAgLy8gICAgICAgICAvLyBmaWxlXG4gICAgLy8gICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIC8vIG1heWJlIGEgZm9sZGVyLCBkZWxldGUgcmVjdXJzaXZlbHlcbiAgICAvLyAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIGZpbGUubmFtZS5zbGljZSgwLCBuYW1lLmxlbmd0aCkgPT09IG5hbWU7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2tpZHNbaV0ubmFtZV07XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gdGhpcztcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhcyBhbiBpbnRlcm5hbCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBzdHJlYW1lZCB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICB2YXIgd29ya2VyLCBvcHRzID0ge307XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgIC8vICAgICAgICAgICBzdHJlYW1GaWxlczogZmFsc2UsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uOiBcIlNUT1JFXCIsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG51bGwsXG4gICAgLy8gICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgLy8gICAgICAgICAgIHBsYXRmb3JtOiBcIkRPU1wiLFxuICAgIC8vICAgICAgICAgICBjb21tZW50OiBudWxsLFxuICAgIC8vICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgLy8gICAgICAgICAgIGVuY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhlbmNvZGVcbiAgICAvLyAgICAgICB9KTtcblxuICAgIC8vICAgICAgIG9wdHMudHlwZSA9IG9wdHMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyAgICAgICAvLyBcImJpbmFyeXN0cmluZ1wiIGlzIHByZWZlcmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSBcInN0cmluZ1wiLlxuICAgIC8vICAgICAgIGlmKG9wdHMudHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIikge1xuICAgIC8vICAgICAgICAgb3B0cy50eXBlID0gXCJzdHJpbmdcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICBpZiAoIW9wdHMudHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLlwiKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB1dGlscy5jaGVja1N1cHBvcnQob3B0cy50eXBlKTtcblxuICAgIC8vICAgICAgIC8vIGFjY2VwdCBub2RlanMgYHByb2Nlc3MucGxhdGZvcm1gXG4gICAgLy8gICAgICAgaWYoXG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdmcmVlYnNkJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnbGludXgnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdzdW5vcydcbiAgICAvLyAgICAgICApIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiVU5JWFwiO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJET1NcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAvLyAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21tZW50KTtcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgICAgd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAvLyAgICAgd29ya2VyLmVycm9yKGUpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIod29ya2VyLCBvcHRzLnR5cGUgfHwgXCJzdHJpbmdcIiwgb3B0cy5taW1lVHlwZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZU5vZGVTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vICAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIC8vICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJub2RlYnVmZmVyXCI7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgLy8gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7XG5cdH1cbn1cbnV0aWxzLmluaGVyaXRzKEFycmF5UmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvICsgaV07XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSA0OyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09PSBzaWcwICYmIHRoaXMuZGF0YVtpICsgMV0gPT09IHNpZzEgJiYgdGhpcy5kYXRhW2kgKyAyXSA9PT0gc2lnMiAmJiB0aGlzLmRhdGFbaSArIDNdID09PSBzaWczKSB7XG4gICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpLFxuICAgICAgICBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIgPT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIERhdGFSZWFkZXIoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuemVybyA9IDA7XG59XG5EYXRhUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmZWQgaW5kZXggd2lsbCBub3QgYmUgdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnplcm8gKyBuZXdJbmRleCB8fCBuZXdJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gXCIgKyB0aGlzLmxlbmd0aCArIFwiLCBhc2tlZCBpbmRleCA9IFwiICsgKG5ld0luZGV4KSArIFwiKS4gQ29ycnVwdGVkIHppcCA/XCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleCBUaGUgbmV3IGluZGV4LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBzZXRJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2tpcDogZnVuY3Rpb24obikge1xuICAgICAgICB0aGlzLnNldEluZGV4KHRoaXMuaW5kZXggKyBuKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBhIGJ5dGUuXG4gICAgICovXG4gICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBudW1iZXIgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuXG4gICAgICovXG4gICAgcmVhZEludDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlzLmluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyB0aGlzLmJ5dGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgc3RyaW5nIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMucmVhZERhdGEoc2l6ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSByYXcgZGF0YSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuXG4gICAgICovXG4gICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB6aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBzaWduYXR1cmUgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cmVuY2UsIC0xIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIHNpZ25hdHVyZSAoNCBieXRlcykgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNvbXBhcmUgaXQgd2l0aCBzaWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZWFkQW5kQ2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKSk7IC8vIHNlY29uZFxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihkYXRhKSB7XG4gICAgVWludDhBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7XG5cbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBOb2RlQnVmZmVyUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvICsgaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKSAtIHRoaXMuemVybztcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcgPT09IGRhdGE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIC8vIHRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdGhlIFwiJiAweGZmXCIgbWFzay5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1JlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFVpbnQ4QXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgLy8gaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTtcbnZhciBOb2RlQnVmZmVyUmVhZGVyID0gcmVxdWlyZSgnLi9Ob2RlQnVmZmVyUmVhZGVyJyk7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWRlciBhZGFwdGVkIHRvIHRoZSBkYXRhLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC5cbiAqIEByZXR1cm4ge0RhdGFSZWFkZXJ9IHRoZSBkYXRhIHJlYWRlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgIHV0aWxzLmNoZWNrU3VwcG9ydCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAhc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlcIiwgZGF0YSkpO1xufTtcblxuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLkxPQ0FMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAzXFx4MDRcIjtcbmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwMVxceDAyXCI7XG5leHBvcnRzLkNFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNVxceDA2XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSBcIlBLXFx4MDZcXHgwN1wiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDZcXHgwNlwiO1xuZXhwb3J0cy5EQVRBX0RFU0NSSVBUT1IgPSBcIlBLXFx4MDdcXHgwOFwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjb252ZXJ0IGNodW5rcyB0byBhIHNwZWNpZmllZCB0eXBlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIENvbnZlcnRXb3JrZXIoZGVzdFR5cGUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDb252ZXJ0V29ya2VyIHRvIFwiICsgZGVzdFR5cGUpO1xuICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTtcbn1cbnV0aWxzLmluaGVyaXRzKENvbnZlcnRXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ29udmVydFdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ29udmVydFdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgY3JjMzIgb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENyYzMyUHJvYmUoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ3JjMzJQcm9iZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ3JjMzJQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5zdHJlYW1JbmZvLmNyYzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApO1xuICAgIHRoaXMucHVzaChjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgbmFtZSB1c2VkIHRvIGV4cG9zZSB0aGUgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9iZShwcm9wTmFtZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIgKyBwcm9wTmFtZSk7XG4gICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgIHRoaXMud2l0aFN0cmVhbUluZm8ocHJvcE5hbWUsIDApO1xufVxudXRpbHMuaW5oZXJpdHMoRGF0YUxlbmd0aFByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYoY2h1bmspIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSB8fCAwO1xuICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcywgY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YUxlbmd0aFByb2JlO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vLyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNodW5rc1xuLy8gVE9ETyBleHBvc2UgdGhpcyBhcyBhIHB1YmxpYyB2YXJpYWJsZVxudmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Byb21pc2V9IGRhdGFQIHRoZSBwcm9taXNlIG9mIHRoZSBkYXRhIHRvIHNwbGl0XG4gKi9cbmZ1bmN0aW9uIERhdGFXb3JrZXIoZGF0YVApIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhV29ya2VyXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFJc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy5tYXggPSAwO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcblxuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIGRhdGFQLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi5kYXRhSXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7XG4gICAgICAgIHNlbGYubWF4ID0gZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwO1xuICAgICAgICBzZWxmLnR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl90aWNrQW5kUmVwZWF0KCk7XG4gICAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgIH0pO1xufVxuXG51dGlscy5pbmhlcml0cyhEYXRhV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGlja1NjaGVkdWxlZCAmJiB0aGlzLmRhdGFJc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgdGljayBhIHNjaGVkdWxlIGFuIG90aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aWNrKCk7XG4gICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVhZCBhbmQgcHVzaCBhIGNodW5rLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFO1xuICAgIHZhciBkYXRhID0gbnVsbCwgbmV4dEluZGV4ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLm1heCkge1xuICAgICAgICAvLyBFT0ZcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlXG4gKiBhIG5vZGVqcyBzdHJlYW0gYnV0IHdpdGggc29tZSBkaWZmZXJlbmNlcy4gT24gdGhlIGdvb2Qgc2lkZSA6XG4gKiAtIGl0IHdvcmtzIG9uIElFIDYtOSB3aXRob3V0IGFueSBpc3N1ZSAvIHBvbHlmaWxsXG4gKiAtIGl0IHdlaWdodHMgbGVzcyB0aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeVxuICogLSBpdCBmb3J3YXJkcyBlcnJvcnMgKG5vIG5lZWQgdG8gZGVjbGFyZSBhbiBlcnJvciBoYW5kbGVyIEVWRVJZV0hFUkUpXG4gKlxuICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhblxuICogb2JqZWN0IGNvbnRhaW5pbmcgYW55dGhpbmcgKGBwZXJjZW50YCBmb3IgZXhhbXBsZSksIHNlZSBlYWNoIHdvcmtlciBmb3IgbW9yZVxuICogZGV0YWlscy4gVGhlIGxhdHRlciBpcyB0aGUgcmVhbCBkYXRhIChTdHJpbmcsIFVpbnQ4QXJyYXksIGV0YykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyZWFtIChtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5mdW5jdGlvbiBHZW5lcmljV29ya2VyKG5hbWUpIHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgd29ya2VycyBjaGFpblxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIGFuIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlIHdvcmtlciB3YXMgcGF1c2VkXG4gICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IG51bGw7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgdG8gYmUgbWVyZ2VkIGJ5IHRoaXMgd29ya2VyIGludG8gdGhlIGdlbmVyYWwgbWV0YWRhdGFcbiAgICB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBsb2NrZWQgdG8gcHJldmVudCBmdXJ0aGVyIHN0cnVjdHVyZSB1cGRhdGVzIChwaXBlKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XG4gICAgICAgICdkYXRhJzpbXSxcbiAgICAgICAgJ2VuZCc6W10sXG4gICAgICAgICdlcnJvcic6W11cbiAgICB9O1xuICAgIC8vIHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueVxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xufVxuXG5HZW5lcmljV29ya2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhlIG5leHQgd29ya2Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKi9cbiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImRhdGFcIiwgY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVuZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtIHdpdGggYW4gZXJyb3IuXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIgd2l0aCBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcblxuICAgICAgICAgICAgLy8gaW4gdGhlIHdvcmtlcnMgY2hhaW4gZXhwbG9kZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2hhaW4sXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeVxuICAgICAgICAgICAgLy8gd29ya2VycyB1cHdhcmQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci5cbiAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIG9uIGFuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgY3VycmVudCBvYmplY3QgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbGVhbiBhbnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBjbGVhblVwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9yID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQuIFRoaXMgd2lsbCBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgcHJvdmlkZWQgYXJnLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLlxuICAgICAqL1xuICAgIGVtaXQgOiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV1baV0uY2FsbCh0aGlzLCBhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFpbiBhIHdvcmtlciB3aXRoIGFuIG90aGVyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBuZXh0IHRoZSB3b3JrZXIgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcGlwZSA6IGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqIFVzaW5nIGFuIEFQSSB3aXRoIGBwaXBlKG5leHQpYCBpcyB2ZXJ5IGVhc3kuXG4gICAgICogSW1wbGVtZW50aW5nIHRoZSBBUEkgd2l0aCB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbmV4dCBvbmUgcmVnaXN0ZXJpbmdcbiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gcHJldmlvdXMgdGhlIHByZXZpb3VzIHdvcmtlciwgc2VuZGluZyBldmVudHMgdG8gdGhpcyBvbmVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJQcmV2aW91cyA6IGZ1bmN0aW9uIChwcmV2aW91cykge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFyaW5nIHRoZSBzdHJlYW1JbmZvLi4uXG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHByZXZpb3VzLnN0cmVhbUluZm87XG4gICAgICAgIC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0c1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gIHByZXZpb3VzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByZXZpb3VzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NDaHVuayhjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtIHNvIGl0IGRvZXNuJ3Qgc2VuZCBldmVudHMgYW55bW9yZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBwYXVzZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSBhIHBhdXNlZCBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcmVzdW1lZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlIHdvcmtlciB0cmllZCB0byByZXN1bWUgYnV0IGZhaWxlZFxuICAgICAgICB2YXIgd2l0aEVycm9yID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcik7XG4gICAgICAgICAgICB3aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXdpdGhFcnJvcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZsdXNoIGFueSByZW1haW5pbmcgYnl0ZXMgYXMgdGhlIHN0cmVhbSBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgZmx1c2ggOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRkZW4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXkvdmFsdWUgdG8gYmUgYWRkZWQgaW4gdGhlIHdvcmtlcnMgY2hhaW4gc3RyZWFtSW5mbyBvbmNlIGFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gdXNlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVhbUluZm8uXG4gICAgICovXG4gICAgbWVyZ2VTdHJlYW1JbmZvIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dHJhU3RyZWFtSW5mby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUluZm9ba2V5XSA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGFsbCBjYWxscyB0byBwaXBlIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubG9jaygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUHJldHR5IHByaW50IHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqL1xuICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWUgPSBcIldvcmtlciBcIiArIHRoaXMubmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzICsgXCIgLT4gXCIgKyBtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2VuZXJpY1dvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xudmFyIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIgPSByZXF1aXJlKCcuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcicpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4uL2V4dGVybmFsXCIpO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZGF0YS4gSWYgdGhlIHVzZXIgd2FudHMgYSBCbG9iIGZvclxuICogZXhhbXBsZSwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlXG4gKiBBcnJheUJ1ZmZlci9CbG9iIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmFtZSBvZiB0aGUgZmluYWwgdHlwZVxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgY29udGVudCBpbiB0aGUgcmlnaHQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1aaXBPdXRwdXQodHlwZSwgY29udGVudCwgbWltZVR5cGUpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgY29udGVudCksIG1pbWVUeXBlKTtcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiIDpcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGNvbnRlbnQpO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1Ubyh0eXBlLCBjb250ZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYW4gYXJyYXkgb2YgZGF0YSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRlZCBkYXRhXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhc2tlZCB0eXBlIGlzIHVuc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdCAodHlwZSwgZGF0YUFycmF5KSB7XG4gICAgdmFyIGksIGluZGV4ID0gMCwgcmVzID0gbnVsbCwgdG90YWxMZW5ndGggPSAwO1xuICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZGF0YUFycmF5LmpvaW4oXCJcIik7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF0YUFycmF5KTtcbiAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgIHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5zZXQoZGF0YUFycmF5W2ldLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChkYXRhQXJyYXkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnXCIgICsgdHlwZSArIFwiJ1wiKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAqIGNvbXBsZXRlIGJsb2NrLlxuICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNhbGxiYWNrIGEgY2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLiBDYWxsZWRcbiAqIHdpdGggb25lIGFyZyA6XG4gKiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC5cbiAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICB2YXIgZGF0YUFycmF5ID0gW107XG4gICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSxcbiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBoZWxwZXIuX291dHB1dFR5cGUsXG4gICAgICAgICAgICBtaW1lVHlwZSA9IGhlbHBlci5fbWltZVR5cGU7XG4gICAgICAgIGhlbHBlclxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZih1cGRhdGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtWmlwT3V0cHV0KHJlc3VsdFR5cGUsIGNvbmNhdChjaHVua1R5cGUsIGRhdGFBcnJheSksIG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgdG8gZWFzaWx5IHVzZSB3b3JrZXJzIG91dHNpZGUgb2YgSlNaaXAuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIgdGhlIHdvcmtlciB0byB3cmFwXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGJ5IHRoZSB1c2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBTdHJlYW1IZWxwZXIod29ya2VyLCBvdXRwdXRUeXBlLCBtaW1lVHlwZSkge1xuICAgIHZhciBpbnRlcm5hbFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJ1aW50OGFycmF5XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxUeXBlID0gaW50ZXJuYWxUeXBlO1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIHRvIG91dHB1dCByZXN1bHRzXG4gICAgICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICAvLyB0aGUgbWltZSB0eXBlXG4gICAgICAgIHRoaXMuX21pbWVUeXBlID0gbWltZVR5cGU7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChpbnRlcm5hbFR5cGUpO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB3b3JrZXIucGlwZShuZXcgQ29udmVydFdvcmtlcihpbnRlcm5hbFR5cGUpKTtcbiAgICAgICAgLy8gdGhlIGxhc3Qgd29ya2VycyBjYW4gYmUgcmV3aXJlZCB3aXRob3V0IGlzc3VlcyBidXQgd2UgbmVlZCB0b1xuICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuXG4gICAgICAgIHdvcmtlci5sb2NrKCk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTtcbiAgICB9XG59XG5cblN0cmVhbUhlbHBlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAgICAgKiBjb21wbGV0ZSBibG9jay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAgICAgKi9cbiAgICBhY2N1bXVsYXRlIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxpc3RlbmVyIG9uIGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZ0IHRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKGV2dCwgZm4pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKGV2dCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwgY2h1bmsubWV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dGlscy5kZWxheShmbiwgYXJndW1lbnRzLCBzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsIFtdLCB0aGlzLl93b3JrZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLnBhdXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbm9kZWpzIHN0cmVhbSBmb3IgdGhpcyBoZWxwZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyfSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAgICAgKi9cbiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpO1xuICAgICAgICBpZiAodGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCBzdHJlYW0gY29udGFpbmluZyBibG9iL2FycmF5YnVmZmVyL3VpbnQ4YXJyYXkvc3RyaW5nXG4gICAgICAgICAgICAvLyBpcyBzdHJhbmdlIGFuZCBJIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUgdXNlZnVsLlxuICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGFcbiAgICAgICAgICAgIC8vIGJ1ZyByZXBvcnQgIVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKHRoaXMsIHtcbiAgICAgICAgICAgIG9iamVjdE1vZGUgOiB0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIlxuICAgICAgICB9LCB1cGRhdGVDYik7XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUhlbHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iYXNlNjQgPSB0cnVlO1xuZXhwb3J0cy5hcnJheSA9IHRydWU7XG5leHBvcnRzLnN0cmluZyA9IHRydWU7XG5leHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuZXhwb3J0cy5ub2RlYnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbi8vIGNvbnRhaW5zIHRydWUgaWYgSlNaaXAgY2FuIHJlYWQvZ2VuZXJhdGUgVWludDhBcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5cbmlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbn1cbmVsc2Uge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbGljYXRpb24vemlwXCJcbiAgICAgICAgfSkuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gYnVpbGRlci5nZXRCbG9iKCdhcHBsaWNhdGlvbi96aXAnKS5zaXplID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0cy5ub2Rlc3RyZWFtID0gISFyZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlclwiKS5wcm90b3R5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihzdHIsIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTtcbn07XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBieXRlcyBhcnJheSAob3IgYSByZXByZXNlbnRhdGlvbikgcmVwcmVzZW50aW5nIGFuIFVURi04IGVuY29kZWRcbiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSBidWYgdGhlIGRhdGEgZGUgZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZGVjb2RlID0gZnVuY3Rpb24gdXRmOGRlY29kZShidWYpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgYnVmKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGJ1ZiA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBidWYpO1xuXG4gICAgcmV0dXJuIGJ1ZjJzdHJpbmcoYnVmKTtcbn07XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZGVjb2RlIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzIGludG8gc3RyaW5nIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RGVjb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGRlY29kZVwiKTtcbiAgICAvLyB0aGUgbGFzdCBieXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC5cbiAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG5cbiAgICB2YXIgZGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBjaHVuay5kYXRhKTtcblxuICAgIC8vIDFzdCBzdGVwLCByZS11c2Ugd2hhdCdzIGxlZnQgb2YgdGhlIHByZXZpb3VzIGNodW5rXG4gICAgaWYgKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShwcmV2aW91c0RhdGEubGVuZ3RoICsgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7XG4gICAgICAgICAgICBkYXRhLnNldChwcmV2aW91c0RhdGEsIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEJvdW5kYXJ5ID0gdXRmOGJvcmRlcihkYXRhKTtcbiAgICB2YXIgdXNhYmxlRGF0YSA9IGRhdGE7XG4gICAgaWYgKG5leHRCb3VuZGFyeSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnN1YmFycmF5KG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnNsaWNlKG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksXG4gICAgICAgICAgICBtZXRhIDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cbn07XG5leHBvcnRzLlV0ZjhEZWNvZGVXb3JrZXIgPSBVdGY4RGVjb2RlV29ya2VyO1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGVuZGNvZGUgc3RyaW5nIGNodW5rcyBpbnRvIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhFbmNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZW5jb2RlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOEVuY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RW5jb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZW5jb2RlKGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRoYXQgcGFzcyBhcyBhIFwiYmluYXJ5IHN0cmluZ1wiOiBpdCBzaG91bGQgcmVwcmVzZW50IGEgYnl0ZVxuICogYXJyYXkgYnV0IG1heSBoYXZlID4gMjU1IGNoYXIgY29kZXMuIEJlIHN1cmUgdG8gdGFrZSBvbmx5IHRoZSBmaXJzdCBieXRlXG4gKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fSB0aGUgc3RyaW5nIGluIGEgYmluYXJ5IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCByZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9iLiBETyBOT1QgdXNlXG4gKiBhbiBVaW50OEFycmF5IGJlY2F1c2UgdGhlIHN0b2NrIGJyb3dzZXIgb2YgYW5kcm9pZCA0IHdvbid0IGFjY2VwdCBpdCAoaXRcbiAqIHdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGEgc3RyaW5nLCBcIltvYmplY3QgVWludDhBcnJheV1cIikuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBibG9iLlxuICogQHJldHVybiB7QmxvYn0gdGhlIGNyZWF0ZWQgYmxvYi5cbiAqL1xuZXhwb3J0cy5uZXdCbG9iID0gZnVuY3Rpb24ocGFydCwgdHlwZSkge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtwYXJ0XSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJvd3NlciBvbmx5LCBvbGQgd2F5XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydCk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIC8vIHdlbGwsIGZ1Y2sgPyFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxufTtcbi8qKlxuICogVGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIHNhbWUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYW4gYXJyYXkgd2l0aCBhIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gZmlsbCBpbiAod2lsbCBiZSBtdXRhdGVkKS5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCBhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gKiBUaGlzIGNvbnRhaW5zIHN0YXRpYyBpbmZvcm1hdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0XG4gKiBjYW4gYmUgb3B0aW1pemVkIGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci5cbiAqL1xudmFyIGFycmF5VG9TdHJpbmdIZWxwZXIgPSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGludCBpbnRvIGEgc3RyaW5nLCBjaHVuayBieSBjaHVuay5cbiAgICAgKiBTZWUgdGhlIHBlcmZvcm1hbmNlcyBub3RlcyBvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGNodW5rIHRoZSBjaHVuayBzaXplLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gICAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY2h1bmsgaXMgdG9vIGJpZyBmb3IgdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIC8vIHNob3J0Y3V0XG4gICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGlzIGlzIHRoZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZ2VuZXJhdGUgQSBMT1Qgb2YgaW50ZXJtZWRpYXRlIHN0cmluZy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWwuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7XG4gICAgICAgIHZhciByZXN1bHRTdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH0sXG4gICAgYXBwbHlDYW5CZVVzZWQgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gVWludDhBcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgdWludDhhcnJheSA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgbm9kZWJ1ZmZlciA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0Lm5vZGVidWZmZXIgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBub2RlanNVdGlscy5uZXdCdWZmZXIoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICB9XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7XG4gICAgLy8gUGVyZm9ybWFuY2VzIG5vdGVzIDpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWVcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vY29udmVydGluZy1hLXVpbnQ4YXJyYXktdG8tYS1zdHJpbmcvMlxuICAgIC8vIGJ1dCB0aGUgc3RhY2sgaXMgbGltaXRlZCAoYW5kIHdlIGNhbiBnZXQgaHVnZSBhcnJheXMgISkuXG4gICAgLy9cbiAgICAvLyByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7IGdlbmVyYXRlIHRvbyBtYW55IHN0cmluZ3MgIVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yXG4gICAgLy8gVE9ETyA6IHdlIG5vdyBoYXZlIHdvcmtlcnMgdGhhdCBzcGxpdCB0aGUgd29yay4gRG8gd2Ugc3RpbGwgbmVlZCB0aGF0ID9cbiAgICB2YXIgY2h1bmsgPSA2NTUzNixcbiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgIGlmICh0eXBlID09PSBcInVpbnQ4YXJyYXlcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQudWludDhhcnJheTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyO1xuICAgIH1cblxuICAgIGlmIChjYW5Vc2VBcHBseSkge1xuICAgICAgICB3aGlsZSAoY2h1bmsgPiAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGFwcGx5IG9yIGNodW5rIGVycm9yIDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAvLyBkZWZhdWx0IGJyb3dzZXIgb24gYW5kcm9pZCA0LipcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNoYXIoYXJyYXkpO1xufVxuXG5leHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7XG5cblxuLyoqXG4gKiBDb3B5IHRoZSBkYXRhIGZyb20gYW4gYXJyYXktbGlrZSB0byBhbiBvdGhlciBhcnJheS1saWtlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlGcm9tIHRoZSBvcmlnaW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5VG9baV0gPSBhcnJheUZyb21baV07XG4gICAgfVxuICAgIHJldHVybiBhcnJheVRvO1xufVxuXG4vLyBhIG1hdHJpeCBjb250YWluaW5nIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gZXZlcnl0aGluZyBpbnRvIGV2ZXJ5dGhpbmcuXG52YXIgdHJhbnNmb3JtID0ge307XG5cbi8vIHN0cmluZyB0byA/XG50cmFuc2Zvcm1bXCJzdHJpbmdcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcInN0cmluZ1wiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gYXJyYXlidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShuZXcgVWludDhBcnJheShpbnB1dCksIG5ldyBBcnJheShpbnB1dC5ieXRlTGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGlkZW50aXR5LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9XG59O1xuXG4vLyB1aW50OGFycmF5IHRvID9cbnRyYW5zZm9ybVtcInVpbnQ4YXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFwibm9kZWJ1ZmZlclwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5ICYmIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJ1aW50OGFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LmFycmF5YnVmZmVyICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlidWZmZXJcIjtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZS5cbiAqL1xuZXhwb3J0cy5jaGVja1N1cHBvcnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdmFyIHN1cHBvcnRlZCA9IHN1cHBvcnRbdHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IC0xOyAvLyB3ZWxsLCBcIlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcIiBpcyBwYXJzZWQgYXMgLTFcblxuLyoqXG4gKiBQcmV0dGlmeSBhIHN0cmluZyByZWFkIGFzIGJpbmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBwcmV0dGlmeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gYSBwcmV0dHkgc3RyaW5nLlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZXMgPSAnJyxcbiAgICAgICAgY29kZSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgKHN0ciB8fCBcIlwiKS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJlcyArPSAnXFxcXHgnICsgKGNvZGUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBEZWZlciB0aGUgY2FsbCBvZiBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gZ2l2ZSB0byB0aGUgY2FsbGJhY2suXG4gKi9cbmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikge1xuICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGEgcHJvdG90eXBlIHdpdGggYW4gb3RoZXIsIHdpdGhvdXQgY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhcbiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdG9yIHRoZSBjb25zdHJ1Y3RvciB0byBhdWdtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckN0b3IgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB0byB1c2VcbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICB2YXIgT2JqID0gZnVuY3Rpb24oKSB7fTtcbiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBPYmooKTtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaSwgYXR0cjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzXG4gICAgICAgIGZvciAoYXR0ciBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikgJiYgdHlwZW9mIHJlc3VsdFthdHRyXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFthdHRyXSA9IGFyZ3VtZW50c1tpXVthdHRyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYXJiaXRyYXJ5IGNvbnRlbnQgaW50byBhIFByb21pc2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBhIG5hbWUgZm9yIHRoZSBjb250ZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBub3QgYW4gdW5pY29kZSBzdHJpbmdcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgb25seSBoYXMgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBpbiBhIGZvcm1hdCB1c2FibGUgYnkgSlNaaXAuXG4gKi9cbmV4cG9ydHMucHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHtcblxuICAgIHZhciBwcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC5ibG9iICYmIGlucHV0RGF0YSBpbnN0YW5jZW9mIEJsb2IgJiYgdHlwZW9mIEZpbGVSZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBkYXRhIGlzIGFscmVhZHkgYSBwcm9taXNlLCB0aGlzIGZsYXR0ZW4gaXQuXG4gICAgICAgIHByb21pc2UgPSBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoaW5wdXREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoZGF0YSk7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcIlRoZSBkYXRhIG9mICdcIiArIG5hbWUgKyBcIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICFcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFycmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IGV4cG9ydHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNCYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQmluYXJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkQmluYXJ5U3RyaW5nID09PSB0cnVlIG1lYW5zIHRoYXQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBmaWx0ZXJlZCB3aXRoIGEgMHhGRiBtYXNrXG4gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcsIG5vdCBpbiBhIGJhc2U2NCBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGlzIGlzIGEgY29ycmVjdCBcImJpbmFyeSBzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHNpZyA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJpZXMucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlZmljaWVkIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgaXQgaXMgYW4gb3RoZXIgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGNoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShleHBlY3RlZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmluZGV4IC09IDQ7XG4gICAgICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnIDogdW5leHBlY3RlZCBzaWduYXR1cmUgXCIgKyBcIihcIiArIHV0aWxzLnByZXR0eShzaWduYXR1cmUpICsgXCIsIGV4cGVjdGVkIFwiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFza2VkSW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIGV4cGVjdC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzU2lnbmF0dXJlOiBmdW5jdGlvbihhc2tlZEluZGV4LCBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGFza2VkSW5kZXgpO1xuICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHZhciB6aXBDb21tZW50ID0gdGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICAvLyBUbyBnZXQgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHRoZSBnZW5lcmF0aW9uIHBhcnQsIHdlIHdpbGwgYXNzdW1lIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyB1dGY4IGVuY29kZWQgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTtcbiAgICAgICAgdGhpcy56aXBDb21tZW50ID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShkZWNvZGVDb250ZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnJlYWRlci5za2lwKDQpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci5cbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmRpc2tzQ291bnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICBpZiAodGhpcy5kaXNrc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIGZpbGVzLCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHJlYWQgaW4gdGhlIGNlbnRyYWwgcGFydC5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLCBmaWxlO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChmaWxlLmxvY2FsSGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICBmaWxlLmhhbmRsZVVURjgoKTtcbiAgICAgICAgICAgIGZpbGUucHJvY2Vzc0F0dHJpYnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlsZTtcblxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkIFwiICsgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyArIFwiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCBcIiArIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBidXQgd2UgZ290IHNvbWV0aGluZyBmb3IgdGhlIHVzZXI6IG5vIGVycm9yIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiZXhwZWN0ZWRcIiwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcywgXCJyZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3RcIiwgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50IGlzIGEgdHJ1bmNhdGVkIHppcCBvciBjb21wbGV0ZSBnYXJiYWdlLlxuICAgICAgICAgICAgLy8gQSBcIkxPQ0FMX0ZJTEVfSEVBREVSXCIgaXMgbm90IHJlcXVpcmVkIGF0IHRoZSBiZWdpbm5pbmcgKGF1dG9cbiAgICAgICAgICAgIC8vIGV4dHJhY3RpYmxlIHppcCBmb3IgZXhhbXBsZSkgYnV0IGl0IGNhbiBnaXZlIGEgZ29vZCBoaW50LlxuICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc29cbiAgICAgICAgICAgIC8vIGdldCB1bnJlYWRhYmxlIGRhdGEuXG4gICAgICAgICAgICB2YXIgaXNHYXJiYWdlID0gIXRoaXMuaXNTaWduYXR1cmUoMCwgc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcblxuICAgICAgICAgICAgaWYgKGlzR2FyYmFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIGl0IGlzLCBzZWUgaHR0cDovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgdmFyIGVuZE9mQ2VudHJhbERpck9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKTtcblxuXG4gICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOlxuICAgICAgICAgICAgNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkXG4gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgICAgICAgICAgNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdFxuICAgICAgICAgICAgICAgIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nXG4gICAgICAgICAgICAgICAgYW4gYXJjaGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXIgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnppcDY0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIFdhcm5pbmcgOiB0aGUgemlwNjQgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgYnV0IE9OTFkgaWYgdGhlIDY0Yml0cyBpbnRlZ2VyIHJlYWQgZnJvbVxuICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRlZ2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhc2NyaXB0IHJlcHJlc2VudHNcbiAgICAgICAgICAgIGFsbCBudW1iZXJzIGFzIDY0LWJpdCBkb3VibGUgcHJlY2lzaW9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICAgICAgICBTbywgd2UgaGF2ZSA1M2JpdHMgZm9yIGludGVnZXJzIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgdHJlYXQgZXZlcnl0aGluZyBhcyAzMmJpdHMuXG4gICAgICAgICAgICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnNcbiAgICAgICAgICAgIGFuZCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmIHNlY3Rpb24gOC41XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBzaG91bGQgbG9vayBmb3IgYSB6aXA2NCBFT0NEIGxvY2F0b3JcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKTtcblxuICAgICAgICAgICAgLy8gbm93IHRoZSB6aXA2NCBFT0NEIHJlY29yZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciwgc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgbm90IHdoZXJlIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5jZW50cmFsRGlyT2Zmc2V0ICsgdGhpcy5jZW50cmFsRGlyU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuemlwNjQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvclxuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMTIgLyogc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIDEyIGJ5dGVzICovICsgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXh0cmFCeXRlcyA9IGVuZE9mQ2VudHJhbERpck9mZnNldCAtIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0O1xuXG4gICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGV4dHJhQnl0ZXMsIFwiZXh0cmEgYnl0ZXMgYXQgYmVnaW5uaW5nIG9yIHdpdGhpbiB6aXBmaWxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmUoZW5kT2ZDZW50cmFsRGlyT2Zmc2V0LCBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0cyBzZWVtIHdyb25nLCBidXQgd2UgaGF2ZSBzb21ldGhpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICAgICAgICAgICAgLy8gU2/igKYgd2Uga2VlcCBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBpcyB3cm9uZywgdXBkYXRlIHRoZSBcInplcm9cIiBvZiB0aGUgcmVhZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGRhdGEgaGFzIGJlZW4gcHJlcGVuZGVkIChjcnggZmlsZXMgZm9yIGV4YW1wbGUpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIuemVybyA9IGV4dHJhQnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgXCIgKyBNYXRoLmFicyhleHRyYUJ5dGVzKSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlckZvcihkYXRhKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB6aXAgZmlsZSBhbmQgY3JlYXRlIFppcEVudHJpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgemlwIGZpbGUuXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZWFkZXIoZGF0YSk7XG4gICAgICAgIHRoaXMucmVhZEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB0aGlzLnJlYWRDZW50cmFsRGlyKCk7XG4gICAgICAgIHRoaXMucmVhZExvY2FsRmlsZXMoKTtcbiAgICB9XG59O1xuLy8gfX19IGVuZCBvZiBaaXBFbnRyaWVzXG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIGNyYzMyZm4gPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IHJlcXVpcmUoJy4vY29tcHJlc3Npb25zJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuXG52YXIgTUFERV9CWV9ET1MgPSAweDAwO1xudmFyIE1BREVfQllfVU5JWCA9IDB4MDM7XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xudmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgZm9yICh2YXIgbWV0aG9kIGluIGNvbXByZXNzaW9ucykge1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9ucy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHJlc3Npb25zW21ldGhvZF0ubWFnaWMgPT09IGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Npb25zW21ldGhvZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgLy8gdGhlIGZpbGVOYW1lIGlzIHN0b3JlZCBhcyBiaW5hcnkgZGF0YSwgdGhlIGhhbmRsZVVURjggbWV0aG9kIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBlbmNvZGluZy5cbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgcmVhZGVyLnNraXAobG9jYWxFeHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpO1xuICAgICAgICBpZiAoY29tcHJlc3Npb24gPT09IG51bGwpIHsgLy8gbm8gY29tcHJlc3Npb24gZm91bmRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIiArIHV0aWxzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSArIFwiIHVua25vd24gKGlubmVyIGZpbGUgOiBcIiArIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZmlsZU5hbWUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhpcy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgcmVhZGVyLnNraXAoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmJpdEZsYWcgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLmRhdGUgPSByZWFkZXIucmVhZERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmMzMiA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aWxsIGJlIHJlYWQgaW4gdGhlIGxvY2FsIHBhcnQsIHNlZSB0aGUgY29tbWVudHMgdGhlcmVcbiAgICAgICAgcmVhZGVyLnNraXAoZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpO1xuICAgICAgICB0aGlzLnBhcnNlWklQNjRFeHRyYUZpZWxkKHJlYWRlcik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnQgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuXG4gICAgICovXG4gICAgcHJvY2Vzc0F0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdmFyIG1hZGVCeSA9IHRoaXMudmVyc2lvbk1hZGVCeSA+PiA4O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIERPUyBkaXJlY3RvcnkgZmxhZyBzZXQuXG4gICAgICAgIC8vIFdlIGxvb2sgZm9yIGl0IGluIHRoZSBET1MgYW5kIFVOSVggcGVybWlzc2lvbnNcbiAgICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IDYgYml0cyAoMCB0byA1KVxuICAgICAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4M0Y7XG4gICAgICAgIH1cblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfVU5JWCkge1xuICAgICAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjtcbiAgICAgICAgICAgIC8vIHRoZSBvY3RhbCBwZXJtaXNzaW9ucyBhcmUgaW4gKHRoaXMudW5peFBlcm1pc3Npb25zICYgMHgwMUZGKS50b1N0cmluZyg4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhaWwgc2FmZSA6IGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC8gaXQgcHJvYmFibHkgbWVhbnMgYSBmb2xkZXJcbiAgICAgICAgaWYgKCF0aGlzLmRpciAmJiB0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIFpJUDY0IGV4dHJhIGZpZWxkIGFuZCBtZXJnZSB0aGUgaW5mbyBpbiB0aGUgY3VycmVudCBaaXBFbnRyeS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICBwYXJzZVpJUDY0RXh0cmFGaWVsZDogZnVuY3Rpb24ocmVhZGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3VsZCBiZSBzb21ldGhpbmcsIHByZXBhcmluZyB0aGUgZXh0cmEgcmVhZGVyXG4gICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0udmFsdWUpO1xuXG4gICAgICAgIC8vIEkgcmVhbGx5IGhvcGUgdGhhdCB0aGVzZSA2NGJpdHMgaW50ZWdlciBjYW4gZml0IGluIDMyIGJpdHMgaW50ZWdlciwgYmVjYXVzZSBqc1xuICAgICAgICAvLyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLlxuICAgICAgICBpZiAodGhpcy51bmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbEhlYWRlck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZEV4dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRlci5pbmRleCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlYWRlci5pbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICBpZiAodGhpcy51c2VVVEY4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoKCk7XG4gICAgICAgICAgICBpZiAodXBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXBhdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lQnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh1Y29tbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1Y29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudEJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIHBhdGgsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdXBhdGhGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg3MDc1XTtcbiAgICAgICAgaWYgKHVwYXRoRmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIGNvbW1lbnQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdWNvbW1lbnRGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg2Mzc1XTtcbiAgICAgICAgaWYgKHVjb21tZW50RmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gb3B0aW9ucy51bml4UGVybWlzc2lvbnM7XG4gICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7XG4gICAgLy8ga2VlcCBvbmx5IHRoZSBjb21wcmVzc2lvblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLFxuICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBvcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc1xuICAgIH07XG59O1xuXG5aaXBPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlcm5hbCBzdHJlYW0gZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhc2tVbmljb2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIjtcbiAgICAgICAgaWYgKG91dHB1dFR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG5cbiAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5O1xuXG4gICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcgJiYgIWFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuaWNvZGVTdHJpbmcgJiYgYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOERlY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHJlc3VsdCwgb3V0cHV0VHlwZSwgXCJcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGFza2VkIHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIG9mIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBhcyBhIG5vZGVqcyBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBTdHJlYW0gdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBub2RlU3RyZWFtOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSB8fCBcIm5vZGVidWZmZXJcIikudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB0byB1c2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIC8vIF9jb21wcmVzc1dvcmtlcjogZnVuY3Rpb24gKGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgaWYgKFxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEuY29tcHJlc3Npb24ubWFnaWMgPT09IGNvbXByZXNzaW9uLm1hZ2ljXG4gICAgLy8gICAgICkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcbiAgICAvLyAgICAgICAgIGlmKCF0aGlzLl9kYXRhQmluYXJ5KSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIHJldHVybiBDb21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20ocmVzdWx0LCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIF9kZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlZE1ldGhvZHMgPSBbXCJhc1RleHRcIiwgXCJhc0JpbmFyeVwiLCBcImFzTm9kZUJ1ZmZlclwiLCBcImFzVWludDhBcnJheVwiLCBcImFzQXJyYXlCdWZmZXJcIl07XG52YXIgcmVtb3ZlZEZuID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xufTtcblxuZm9yKHZhciBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgWmlwT2JqZWN0LnByb3RvdHlwZVtyZW1vdmVkTWV0aG9kc1tpXV0gPSByZW1vdmVkRm47XG59XG5tb2R1bGUuZXhwb3J0cyA9IFppcE9iamVjdDtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gbm90TnVsbCh4KSAgeyByZXR1cm4geCAhPSBudWxsOyB9XG5mdW5jdGlvbiB3cmFwKHgpICAgICB7IHJldHVybiAnKCcgKyB4ICsgJyknO31cblxuZnVuY3Rpb24gbWF5YmVRdW90ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxvb2tVcChrZXkpIHtcbiAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250ZXh0LicgKyBrZXkuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gJ2NvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzLicgKyBrZXk7XG59XG5cbmZ1bmN0aW9uIG51bGxWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuICcgdHJ1ZSAnO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChtYXliZVF1b3RlKHZhbHVlKSArICcgPT09ICcgKyBsb29rVXAoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5T3Ioa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gd3JhcCh2YWx1ZXMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiBwcm9wZXJ0eUVxdWFsKGtleSwgeCk7IH0pLmpvaW4oJyB8fCAnKSk7XG59XG5cbmZ1bmN0aW9uIHByaW50TmVzdGVkKHZhbHVlcywgam9pbmVyKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLmZpbHRlcihub3ROdWxsKS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoeC5qb2luKCcgJiYgJykpO1xuICAgIH0pLmpvaW4oJyAnICsgam9pbmVyICsgJyAnKSk7XG59XG5cbmZ1bmN0aW9uIGFueShfLCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgPyBwcmludE5lc3RlZCh2YWx1ZXMubWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHBhcnNlRmlsdGVyKHYsIG9wdGlvbnMpIH0pLCAnfHwnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gYWxsKF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucykgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBtYXRjaChmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoZmlsdGVyID09IG51bGwpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07IH1cbiAgICAvLyBqc2hpbnQgZXZpbDogdHJ1ZVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAncmV0dXJuICcgKyBmaWx0ZXJUb1N0cmluZyhwYXJzZUZpbHRlcihmaWx0ZXIsIG9wdGlvbnMpKSArICc7Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBmaWx0ZXJUb1N0cmluZzogZmlsdGVyVG9TdHJpbmcsXG4gICAgcGFyc2VGaWx0ZXI6IHBhcnNlRmlsdGVyXG59O1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuICB2YXIgZGljdDtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgICBpZiAodHlwZW9mIGRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdCA9IGRpY3Rpb25hcnk7XG4gICAgICB9XG5cbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3VwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2c7IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyeVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7ICAgICB9LFxuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyAgICAgfSxcbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7ICAgIH0sXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7ICAgICB9LFxuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyAgfSxcbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcC54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IHAueTtcbiAgICB9LFxuXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLy8gRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLy8gY29uc3RydWN0cyBQb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG5leHRUaWNrO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLm5leHRUaWNrO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID1cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9tYXN0ZXIvTElDRU5TRSBmaWxlLiBBblxuICogYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluXG4gKiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUoKG91dGVyRm4gfHwgR2VuZXJhdG9yKS5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9IEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYHZhbHVlIGluc3RhbmNlb2YgQXdhaXRBcmd1bWVudGAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuIFNvbWUgbWF5IGNvbnNpZGVyIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHRvb1xuICAvLyBjdXRlc3ksIGJ1dCB0aGV5IGFyZSBjdXJtdWRnZW9ucy5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBuZXcgQXdhaXRBcmd1bWVudChhcmcpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEF3YWl0QXJndW1lbnQoYXJnKSB7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gIH1cblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLmFyZykudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzLmRvbWFpbikge1xuICAgICAgaW52b2tlID0gcHJvY2Vzcy5kb21haW4uYmluZChpbnZva2UpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICBpZiAobWV0aG9kID09PSBcInJldHVyblwiIHx8XG4gICAgICAgICAgICAgIChtZXRob2QgPT09IFwidGhyb3dcIiAmJiBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2RdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAvLyBBIHJldHVybiBvciB0aHJvdyAod2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIHRocm93XG4gICAgICAgICAgICAvLyBtZXRob2QpIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgICB2YXIgcmV0dXJuTWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl07XG4gICAgICAgICAgICBpZiAocmV0dXJuTWV0aG9kKSB7XG4gICAgICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChyZXR1cm5NZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBhcmcpO1xuICAgICAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXR1cm4gbWV0aG9kIHRocmV3IGFuIGV4Y2VwdGlvbiwgbGV0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gcHJldmFpbCBvdmVyIHRoZSBvcmlnaW5hbCByZXR1cm4gb3IgdGhyb3cuXG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIHRoZSBvdXRlciByZXR1cm4sIG5vdyB0aGF0IHRoZSBkZWxlZ2F0ZVxuICAgICAgICAgICAgICAvLyBpdGVyYXRvciBoYXMgYmVlbiB0ZXJtaW5hdGVkLlxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goXG4gICAgICAgICAgICBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2RdLFxuICAgICAgICAgICAgZGVsZWdhdGUuaXRlcmF0b3IsXG4gICAgICAgICAgICBhcmdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBMaWtlIHJldHVybmluZyBnZW5lcmF0b3IudGhyb3codW5jYXVnaHQpLCBidXQgd2l0aG91dCB0aGVcbiAgICAgICAgICAgIC8vIG92ZXJoZWFkIG9mIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwuXG4gICAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVsZWdhdGUgZ2VuZXJhdG9yIHJhbiBhbmQgaGFuZGxlZCBpdHMgb3duIGV4Y2VwdGlvbnMgc29cbiAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIG1ldGhvZCB3YXMsIHdlIGNvbnRpbnVlIGFzIGlmIGl0IGlzXG4gICAgICAgICAgLy8gXCJuZXh0XCIgd2l0aCBhbiB1bmRlZmluZWQgYXJnLlxuICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcbiAgICAgICAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcbiAgICAgICAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcbiAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBhcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihhcmcpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZWdhdGUgJiYgbWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcbiAgICAgICAgcmV0dXJuICEhY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBBbW9uZyB0aGUgdmFyaW91cyB0cmlja3MgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsXG4gIC8vIG9iamVjdCwgdGhpcyBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSB0ZWNobmlxdWUgdGhhdCBkb2VzIG5vdFxuICAvLyB1c2UgaW5kaXJlY3QgZXZhbCAod2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kpLlxuICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6XG4gIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHRoaXNcbik7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzQnVmZmVyRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZ1xuICB8fCBmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgY2FzZSAnaGV4JzogY2FzZSAndXRmOCc6IGNhc2UgJ3V0Zi04JzogY2FzZSAnYXNjaWknOiBjYXNlICdiaW5hcnknOiBjYXNlICdiYXNlNjQnOiBjYXNlICd1Y3MyJzogY2FzZSAndWNzLTInOiBjYXNlICd1dGYxNmxlJzogY2FzZSAndXRmLTE2bGUnOiBjYXNlICdyYXcnOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICB9XG4gICAgIH1cblxuXG5mdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4vL1xuLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4vLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbi8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbi8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cbnZhciBTdHJpbmdEZWNvZGVyID0gZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59O1xuXG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cbiIsIi8qIVxuICogc3RyaXAtY29tbWVudHMgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3N0cmlwLWNvbW1lbnRzPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBKb24gU2NobGlua2VydCwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWMnO1xuXG52YXIgcmVCbG9jayA9ICdcXFxcL1xcXFwqJztcbnZhciByZUJsb2NrSWdub3JlID0gJ1xcXFwvXFxcXCooPyFcXFxcKj9cXFxcISknO1xudmFyIHJlQmxvY2tFbmQgPSAnKC58W1xcXFxyXFxcXG5dfFxcXFxuKSo/XFxcXCpcXFxcL1xcXFxuP1xcXFxuPyc7XG52YXIgcmVMaW5lID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC8pKFtcXHNcXFNdKz8pJC9nbTtcbnZhciByZUxpbmVJZ25vcmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcL1teIV0pKFtcXHNcXFNdKz8pJC9nbTtcblxuXG4vKipcbiAqIFN0cmlwIGFsbCBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwic3RyaXBcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50cyBvciBzdHJpbmcgdG8gc3RyaXAuXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIG9wdGlvbnMgYXJlIHBhc3NlZCB0byBgLmJsb2NrYCwgYW5kIGAubGluZWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG52YXIgc3RyaXAgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICByZXR1cm4gc3RyID8gc3RyaXAuYmxvY2soc3RyaXAubGluZShzdHIsIG9wdHMpLCBvcHRzKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgYmxvY2sgY29tbWVudHMsIG9wdGlvbmFsbHkgbGVhdmluZyBwcm90ZWN0ZWQgY29tbWVudHNcbiAqIChlLmcuIGAvKiFgKSBpbnRhY3QuXG4gKlxuICogeyU9IGRvY3MoXCJibG9ja1wiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBvbmx5IGNvbW1lbnRzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggYC8qIWAgb3IgYC8qKiFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBibG9jayBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuc3RyaXAuYmxvY2sgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IG5ldyBSZWdFeHAocmVCbG9jayArIHJlQmxvY2tFbmQsICdnbScpO1xuICBpZihvcHRzLnNhZmUpIHtcbiAgICByZSA9IG5ldyBSZWdFeHAocmVCbG9ja0lnbm9yZSArIHJlQmxvY2tFbmQsICdnbScpO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBsaW5lIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJsaW5lXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIGFsbCB0aGF0IG5vdCBzdGFydHMgd2l0aCBgLy8hYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgbGluZSBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuc3RyaXAubGluZSA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gcmVMaW5lO1xuICBpZihvcHRzLnNhZmUpIHtcbiAgICByZSA9IHJlTGluZUlnbm9yZTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcbiIsIiFmdW5jdGlvbigpIHtcbiAgdmFyIHRvcG9qc29uID0ge1xuICAgIHZlcnNpb246IFwiMS42LjE5XCIsXG4gICAgbWVzaDogZnVuY3Rpb24odG9wb2xvZ3kpIHsgcmV0dXJuIG9iamVjdCh0b3BvbG9neSwgbWVzaEFyY3MuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7IH0sXG4gICAgbWVzaEFyY3M6IG1lc2hBcmNzLFxuICAgIG1lcmdlOiBmdW5jdGlvbih0b3BvbG9neSkgeyByZXR1cm4gb2JqZWN0KHRvcG9sb2d5LCBtZXJnZUFyY3MuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7IH0sXG4gICAgbWVyZ2VBcmNzOiBtZXJnZUFyY3MsXG4gICAgZmVhdHVyZTogZmVhdHVyZU9yQ29sbGVjdGlvbixcbiAgICBuZWlnaGJvcnM6IG5laWdoYm9ycyxcbiAgICBwcmVzaW1wbGlmeTogcHJlc2ltcGxpZnlcbiAgfTtcblxuICBmdW5jdGlvbiBzdGl0Y2hBcmNzKHRvcG9sb2d5LCBhcmNzKSB7XG4gICAgdmFyIHN0aXRjaGVkQXJjcyA9IHt9LFxuICAgICAgICBmcmFnbWVudEJ5U3RhcnQgPSB7fSxcbiAgICAgICAgZnJhZ21lbnRCeUVuZCA9IHt9LFxuICAgICAgICBmcmFnbWVudHMgPSBbXSxcbiAgICAgICAgZW1wdHlJbmRleCA9IC0xO1xuXG4gICAgLy8gU3RpdGNoIGVtcHR5IGFyY3MgZmlyc3QsIHNpbmNlIHRoZXkgbWF5IGJlIHN1YnN1bWVkIGJ5IG90aGVyIGFyY3MuXG4gICAgYXJjcy5mb3JFYWNoKGZ1bmN0aW9uKGksIGopIHtcbiAgICAgIHZhciBhcmMgPSB0b3BvbG9neS5hcmNzW2kgPCAwID8gfmkgOiBpXSwgdDtcbiAgICAgIGlmIChhcmMubGVuZ3RoIDwgMyAmJiAhYXJjWzFdWzBdICYmICFhcmNbMV1bMV0pIHtcbiAgICAgICAgdCA9IGFyY3NbKytlbXB0eUluZGV4XSwgYXJjc1tlbXB0eUluZGV4XSA9IGksIGFyY3Nbal0gPSB0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXJjcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciBlID0gZW5kcyhpKSxcbiAgICAgICAgICBzdGFydCA9IGVbMF0sXG4gICAgICAgICAgZW5kID0gZVsxXSxcbiAgICAgICAgICBmLCBnO1xuXG4gICAgICBpZiAoZiA9IGZyYWdtZW50QnlFbmRbc3RhcnRdKSB7XG4gICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2YuZW5kXTtcbiAgICAgICAgZi5wdXNoKGkpO1xuICAgICAgICBmLmVuZCA9IGVuZDtcbiAgICAgICAgaWYgKGcgPSBmcmFnbWVudEJ5U3RhcnRbZW5kXSkge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5U3RhcnRbZy5zdGFydF07XG4gICAgICAgICAgdmFyIGZnID0gZyA9PT0gZiA/IGYgOiBmLmNvbmNhdChnKTtcbiAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZmcuc3RhcnQgPSBmLnN0YXJ0XSA9IGZyYWdtZW50QnlFbmRbZmcuZW5kID0gZy5lbmRdID0gZmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2Yuc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtmLmVuZF0gPSBmO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGYgPSBmcmFnbWVudEJ5U3RhcnRbZW5kXSkge1xuICAgICAgICBkZWxldGUgZnJhZ21lbnRCeVN0YXJ0W2Yuc3RhcnRdO1xuICAgICAgICBmLnVuc2hpZnQoaSk7XG4gICAgICAgIGYuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgaWYgKGcgPSBmcmFnbWVudEJ5RW5kW3N0YXJ0XSkge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2cuZW5kXTtcbiAgICAgICAgICB2YXIgZ2YgPSBnID09PSBmID8gZiA6IGcuY29uY2F0KGYpO1xuICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtnZi5zdGFydCA9IGcuc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtnZi5lbmQgPSBmLmVuZF0gPSBnZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2YuZW5kXSA9IGY7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGYgPSBbaV07XG4gICAgICAgIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0ID0gc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtmLmVuZCA9IGVuZF0gPSBmO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZW5kcyhpKSB7XG4gICAgICB2YXIgYXJjID0gdG9wb2xvZ3kuYXJjc1tpIDwgMCA/IH5pIDogaV0sIHAwID0gYXJjWzBdLCBwMTtcbiAgICAgIGlmICh0b3BvbG9neS50cmFuc2Zvcm0pIHAxID0gWzAsIDBdLCBhcmMuZm9yRWFjaChmdW5jdGlvbihkcCkgeyBwMVswXSArPSBkcFswXSwgcDFbMV0gKz0gZHBbMV07IH0pO1xuICAgICAgZWxzZSBwMSA9IGFyY1thcmMubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gaSA8IDAgPyBbcDEsIHAwXSA6IFtwMCwgcDFdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsdXNoKGZyYWdtZW50QnlFbmQsIGZyYWdtZW50QnlTdGFydCkge1xuICAgICAgZm9yICh2YXIgayBpbiBmcmFnbWVudEJ5RW5kKSB7XG4gICAgICAgIHZhciBmID0gZnJhZ21lbnRCeUVuZFtrXTtcbiAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTtcbiAgICAgICAgZGVsZXRlIGYuc3RhcnQ7XG4gICAgICAgIGRlbGV0ZSBmLmVuZDtcbiAgICAgICAgZi5mb3JFYWNoKGZ1bmN0aW9uKGkpIHsgc3RpdGNoZWRBcmNzW2kgPCAwID8gfmkgOiBpXSA9IDE7IH0pO1xuICAgICAgICBmcmFnbWVudHMucHVzaChmKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaChmcmFnbWVudEJ5RW5kLCBmcmFnbWVudEJ5U3RhcnQpO1xuICAgIGZsdXNoKGZyYWdtZW50QnlTdGFydCwgZnJhZ21lbnRCeUVuZCk7XG4gICAgYXJjcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHsgaWYgKCFzdGl0Y2hlZEFyY3NbaSA8IDAgPyB+aSA6IGldKSBmcmFnbWVudHMucHVzaChbaV0pOyB9KTtcblxuICAgIHJldHVybiBmcmFnbWVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBtZXNoQXJjcyh0b3BvbG9neSwgbywgZmlsdGVyKSB7XG4gICAgdmFyIGFyY3MgPSBbXTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGdlb21zQnlBcmMgPSBbXSxcbiAgICAgICAgICBnZW9tO1xuXG4gICAgICBmdW5jdGlvbiBhcmMoaSkge1xuICAgICAgICB2YXIgaiA9IGkgPCAwID8gfmkgOiBpO1xuICAgICAgICAoZ2VvbXNCeUFyY1tqXSB8fCAoZ2VvbXNCeUFyY1tqXSA9IFtdKSkucHVzaCh7aTogaSwgZzogZ2VvbX0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsaW5lKGFyY3MpIHtcbiAgICAgICAgYXJjcy5mb3JFYWNoKGFyYyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBvbHlnb24oYXJjcykge1xuICAgICAgICBhcmNzLmZvckVhY2gobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdlb21ldHJ5KG8pIHtcbiAgICAgICAgaWYgKG8udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIikgby5nZW9tZXRyaWVzLmZvckVhY2goZ2VvbWV0cnkpO1xuICAgICAgICBlbHNlIGlmIChvLnR5cGUgaW4gZ2VvbWV0cnlUeXBlKSBnZW9tID0gbywgZ2VvbWV0cnlUeXBlW28udHlwZV0oby5hcmNzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGdlb21ldHJ5VHlwZSA9IHtcbiAgICAgICAgTGluZVN0cmluZzogbGluZSxcbiAgICAgICAgTXVsdGlMaW5lU3RyaW5nOiBwb2x5Z29uLFxuICAgICAgICBQb2x5Z29uOiBwb2x5Z29uLFxuICAgICAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKGFyY3MpIHsgYXJjcy5mb3JFYWNoKHBvbHlnb24pOyB9XG4gICAgICB9O1xuXG4gICAgICBnZW9tZXRyeShvKTtcblxuICAgICAgZ2VvbXNCeUFyYy5mb3JFYWNoKGFyZ3VtZW50cy5sZW5ndGggPCAzXG4gICAgICAgICAgPyBmdW5jdGlvbihnZW9tcykgeyBhcmNzLnB1c2goZ2VvbXNbMF0uaSk7IH1cbiAgICAgICAgICA6IGZ1bmN0aW9uKGdlb21zKSB7IGlmIChmaWx0ZXIoZ2VvbXNbMF0uZywgZ2VvbXNbZ2VvbXMubGVuZ3RoIC0gMV0uZykpIGFyY3MucHVzaChnZW9tc1swXS5pKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdG9wb2xvZ3kuYXJjcy5sZW5ndGg7IGkgPCBuOyArK2kpIGFyY3MucHVzaChpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge3R5cGU6IFwiTXVsdGlMaW5lU3RyaW5nXCIsIGFyY3M6IHN0aXRjaEFyY3ModG9wb2xvZ3ksIGFyY3MpfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlQXJjcyh0b3BvbG9neSwgb2JqZWN0cykge1xuICAgIHZhciBwb2x5Z29uc0J5QXJjID0ge30sXG4gICAgICAgIHBvbHlnb25zID0gW10sXG4gICAgICAgIGNvbXBvbmVudHMgPSBbXTtcblxuICAgIG9iamVjdHMuZm9yRWFjaChmdW5jdGlvbihvKSB7XG4gICAgICBpZiAoby50eXBlID09PSBcIlBvbHlnb25cIikgcmVnaXN0ZXIoby5hcmNzKTtcbiAgICAgIGVsc2UgaWYgKG8udHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikgby5hcmNzLmZvckVhY2gocmVnaXN0ZXIpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXIocG9seWdvbikge1xuICAgICAgcG9seWdvbi5mb3JFYWNoKGZ1bmN0aW9uKHJpbmcpIHtcbiAgICAgICAgcmluZy5mb3JFYWNoKGZ1bmN0aW9uKGFyYykge1xuICAgICAgICAgIChwb2x5Z29uc0J5QXJjW2FyYyA9IGFyYyA8IDAgPyB+YXJjIDogYXJjXSB8fCAocG9seWdvbnNCeUFyY1thcmNdID0gW10pKS5wdXNoKHBvbHlnb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlcmlvcihyaW5nKSB7XG4gICAgICByZXR1cm4gY2FydGVzaWFuUmluZ0FyZWEob2JqZWN0KHRvcG9sb2d5LCB7dHlwZTogXCJQb2x5Z29uXCIsIGFyY3M6IFtyaW5nXX0pLmNvb3JkaW5hdGVzWzBdKSA+IDA7IC8vIFRPRE8gYWxsb3cgc3BoZXJpY2FsP1xuICAgIH1cblxuICAgIHBvbHlnb25zLmZvckVhY2goZnVuY3Rpb24ocG9seWdvbikge1xuICAgICAgaWYgKCFwb2x5Z29uLl8pIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IFtdLFxuICAgICAgICAgICAgbmVpZ2hib3JzID0gW3BvbHlnb25dO1xuICAgICAgICBwb2x5Z29uLl8gPSAxO1xuICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgd2hpbGUgKHBvbHlnb24gPSBuZWlnaGJvcnMucG9wKCkpIHtcbiAgICAgICAgICBjb21wb25lbnQucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICBwb2x5Z29uLmZvckVhY2goZnVuY3Rpb24ocmluZykge1xuICAgICAgICAgICAgcmluZy5mb3JFYWNoKGZ1bmN0aW9uKGFyYykge1xuICAgICAgICAgICAgICBwb2x5Z29uc0J5QXJjW2FyYyA8IDAgPyB+YXJjIDogYXJjXS5mb3JFYWNoKGZ1bmN0aW9uKHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBvbHlnb24uXykge1xuICAgICAgICAgICAgICAgICAgcG9seWdvbi5fID0gMTtcbiAgICAgICAgICAgICAgICAgIG5laWdoYm9ycy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcG9seWdvbnMuZm9yRWFjaChmdW5jdGlvbihwb2x5Z29uKSB7XG4gICAgICBkZWxldGUgcG9seWdvbi5fO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiTXVsdGlQb2x5Z29uXCIsXG4gICAgICBhcmNzOiBjb21wb25lbnRzLm1hcChmdW5jdGlvbihwb2x5Z29ucykge1xuICAgICAgICB2YXIgYXJjcyA9IFtdO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGV4dGVyaW9yICh1bmlxdWUpIGFyY3MuXG4gICAgICAgIHBvbHlnb25zLmZvckVhY2goZnVuY3Rpb24ocG9seWdvbikge1xuICAgICAgICAgIHBvbHlnb24uZm9yRWFjaChmdW5jdGlvbihyaW5nKSB7XG4gICAgICAgICAgICByaW5nLmZvckVhY2goZnVuY3Rpb24oYXJjKSB7XG4gICAgICAgICAgICAgIGlmIChwb2x5Z29uc0J5QXJjW2FyYyA8IDAgPyB+YXJjIDogYXJjXS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgYXJjcy5wdXNoKGFyYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGl0Y2ggdGhlIGFyY3MgaW50byBvbmUgb3IgbW9yZSByaW5ncy5cbiAgICAgICAgYXJjcyA9IHN0aXRjaEFyY3ModG9wb2xvZ3ksIGFyY3MpO1xuXG4gICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgcmluZyBpcyByZXR1cm5lZCxcbiAgICAgICAgLy8gYXQgbW9zdCBvbmUgb2YgdGhlc2UgcmluZ3MgY2FuIGJlIHRoZSBleHRlcmlvcjtcbiAgICAgICAgLy8gdGhpcyBleHRlcmlvciByaW5nIGhhcyB0aGUgc2FtZSB3aW5kaW5nIG9yZGVyXG4gICAgICAgIC8vIGFzIGFueSBleHRlcmlvciByaW5nIGluIHRoZSBvcmlnaW5hbCBwb2x5Z29ucy5cbiAgICAgICAgaWYgKChuID0gYXJjcy5sZW5ndGgpID4gMSkge1xuICAgICAgICAgIHZhciBzZ24gPSBleHRlcmlvcihwb2x5Z29uc1swXVswXSk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChzZ24gPT09IGV4dGVyaW9yKGFyY3NbaV0pKSB7XG4gICAgICAgICAgICAgIHQgPSBhcmNzWzBdLCBhcmNzWzBdID0gYXJjc1tpXSwgYXJjc1tpXSA9IHQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcmNzO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZU9yQ29sbGVjdGlvbih0b3BvbG9neSwgbykge1xuICAgIHJldHVybiBvLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIgPyB7XG4gICAgICB0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICBmZWF0dXJlczogby5nZW9tZXRyaWVzLm1hcChmdW5jdGlvbihvKSB7IHJldHVybiBmZWF0dXJlKHRvcG9sb2d5LCBvKTsgfSlcbiAgICB9IDogZmVhdHVyZSh0b3BvbG9neSwgbyk7XG4gIH1cblxuICBmdW5jdGlvbiBmZWF0dXJlKHRvcG9sb2d5LCBvKSB7XG4gICAgdmFyIGYgPSB7XG4gICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgIGlkOiBvLmlkLFxuICAgICAgcHJvcGVydGllczogby5wcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgZ2VvbWV0cnk6IG9iamVjdCh0b3BvbG9neSwgbylcbiAgICB9O1xuICAgIGlmIChvLmlkID09IG51bGwpIGRlbGV0ZSBmLmlkO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgZnVuY3Rpb24gb2JqZWN0KHRvcG9sb2d5LCBvKSB7XG4gICAgdmFyIGFic29sdXRlID0gdHJhbnNmb3JtQWJzb2x1dGUodG9wb2xvZ3kudHJhbnNmb3JtKSxcbiAgICAgICAgYXJjcyA9IHRvcG9sb2d5LmFyY3M7XG5cbiAgICBmdW5jdGlvbiBhcmMoaSwgcG9pbnRzKSB7XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCkgcG9pbnRzLnBvcCgpO1xuICAgICAgZm9yICh2YXIgYSA9IGFyY3NbaSA8IDAgPyB+aSA6IGldLCBrID0gMCwgbiA9IGEubGVuZ3RoLCBwOyBrIDwgbjsgKytrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKHAgPSBhW2tdLnNsaWNlKCkpO1xuICAgICAgICBhYnNvbHV0ZShwLCBrKTtcbiAgICAgIH1cbiAgICAgIGlmIChpIDwgMCkgcmV2ZXJzZShwb2ludHMsIG4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvaW50KHApIHtcbiAgICAgIHAgPSBwLnNsaWNlKCk7XG4gICAgICBhYnNvbHV0ZShwLCAwKTtcbiAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmUoYXJjcykge1xuICAgICAgdmFyIHBvaW50cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmNzLmxlbmd0aDsgaSA8IG47ICsraSkgYXJjKGFyY3NbaV0sIHBvaW50cyk7XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZyhhcmNzKSB7XG4gICAgICB2YXIgcG9pbnRzID0gbGluZShhcmNzKTtcbiAgICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgNCkgcG9pbnRzLnB1c2gocG9pbnRzWzBdLnNsaWNlKCkpO1xuICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2x5Z29uKGFyY3MpIHtcbiAgICAgIHJldHVybiBhcmNzLm1hcChyaW5nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW9tZXRyeShvKSB7XG4gICAgICB2YXIgdCA9IG8udHlwZTtcbiAgICAgIHJldHVybiB0ID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiID8ge3R5cGU6IHQsIGdlb21ldHJpZXM6IG8uZ2VvbWV0cmllcy5tYXAoZ2VvbWV0cnkpfVxuICAgICAgICAgIDogdCBpbiBnZW9tZXRyeVR5cGUgPyB7dHlwZTogdCwgY29vcmRpbmF0ZXM6IGdlb21ldHJ5VHlwZVt0XShvKX1cbiAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGdlb21ldHJ5VHlwZSA9IHtcbiAgICAgIFBvaW50OiBmdW5jdGlvbihvKSB7IHJldHVybiBwb2ludChvLmNvb3JkaW5hdGVzKTsgfSxcbiAgICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uY29vcmRpbmF0ZXMubWFwKHBvaW50KTsgfSxcbiAgICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsgcmV0dXJuIGxpbmUoby5hcmNzKTsgfSxcbiAgICAgIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24obykgeyByZXR1cm4gby5hcmNzLm1hcChsaW5lKTsgfSxcbiAgICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsgcmV0dXJuIHBvbHlnb24oby5hcmNzKTsgfSxcbiAgICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgeyByZXR1cm4gby5hcmNzLm1hcChwb2x5Z29uKTsgfVxuICAgIH07XG5cbiAgICByZXR1cm4gZ2VvbWV0cnkobyk7XG4gIH1cblxuICBmdW5jdGlvbiByZXZlcnNlKGFycmF5LCBuKSB7XG4gICAgdmFyIHQsIGogPSBhcnJheS5sZW5ndGgsIGkgPSBqIC0gbjsgd2hpbGUgKGkgPCAtLWopIHQgPSBhcnJheVtpXSwgYXJyYXlbaSsrXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHQ7XG4gIH1cblxuICBmdW5jdGlvbiBiaXNlY3QoYSwgeCkge1xuICAgIHZhciBsbyA9IDAsIGhpID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxO1xuICAgICAgaWYgKGFbbWlkXSA8IHgpIGxvID0gbWlkICsgMTtcbiAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIG5laWdoYm9ycyhvYmplY3RzKSB7XG4gICAgdmFyIGluZGV4ZXNCeUFyYyA9IHt9LCAvLyBhcmMgaW5kZXggLT4gYXJyYXkgb2Ygb2JqZWN0IGluZGV4ZXNcbiAgICAgICAgbmVpZ2hib3JzID0gb2JqZWN0cy5tYXAoZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgICBmdW5jdGlvbiBsaW5lKGFyY3MsIGkpIHtcbiAgICAgIGFyY3MuZm9yRWFjaChmdW5jdGlvbihhKSB7XG4gICAgICAgIGlmIChhIDwgMCkgYSA9IH5hO1xuICAgICAgICB2YXIgbyA9IGluZGV4ZXNCeUFyY1thXTtcbiAgICAgICAgaWYgKG8pIG8ucHVzaChpKTtcbiAgICAgICAgZWxzZSBpbmRleGVzQnlBcmNbYV0gPSBbaV07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2x5Z29uKGFyY3MsIGkpIHtcbiAgICAgIGFyY3MuZm9yRWFjaChmdW5jdGlvbihhcmMpIHsgbGluZShhcmMsIGkpOyB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW9tZXRyeShvLCBpKSB7XG4gICAgICBpZiAoby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiKSBvLmdlb21ldHJpZXMuZm9yRWFjaChmdW5jdGlvbihvKSB7IGdlb21ldHJ5KG8sIGkpOyB9KTtcbiAgICAgIGVsc2UgaWYgKG8udHlwZSBpbiBnZW9tZXRyeVR5cGUpIGdlb21ldHJ5VHlwZVtvLnR5cGVdKG8uYXJjcywgaSk7XG4gICAgfVxuXG4gICAgdmFyIGdlb21ldHJ5VHlwZSA9IHtcbiAgICAgIExpbmVTdHJpbmc6IGxpbmUsXG4gICAgICBNdWx0aUxpbmVTdHJpbmc6IHBvbHlnb24sXG4gICAgICBQb2x5Z29uOiBwb2x5Z29uLFxuICAgICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihhcmNzLCBpKSB7IGFyY3MuZm9yRWFjaChmdW5jdGlvbihhcmMpIHsgcG9seWdvbihhcmMsIGkpOyB9KTsgfVxuICAgIH07XG5cbiAgICBvYmplY3RzLmZvckVhY2goZ2VvbWV0cnkpO1xuXG4gICAgZm9yICh2YXIgaSBpbiBpbmRleGVzQnlBcmMpIHtcbiAgICAgIGZvciAodmFyIGluZGV4ZXMgPSBpbmRleGVzQnlBcmNbaV0sIG0gPSBpbmRleGVzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgbTsgKytrKSB7XG4gICAgICAgICAgdmFyIGlqID0gaW5kZXhlc1tqXSwgaWsgPSBpbmRleGVzW2tdLCBuO1xuICAgICAgICAgIGlmICgobiA9IG5laWdoYm9yc1tpal0pW2kgPSBiaXNlY3QobiwgaWspXSAhPT0gaWspIG4uc3BsaWNlKGksIDAsIGlrKTtcbiAgICAgICAgICBpZiAoKG4gPSBuZWlnaGJvcnNbaWtdKVtpID0gYmlzZWN0KG4sIGlqKV0gIT09IGlqKSBuLnNwbGljZShpLCAwLCBpaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmVpZ2hib3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlc2ltcGxpZnkodG9wb2xvZ3ksIHRyaWFuZ2xlQXJlYSkge1xuICAgIHZhciBhYnNvbHV0ZSA9IHRyYW5zZm9ybUFic29sdXRlKHRvcG9sb2d5LnRyYW5zZm9ybSksXG4gICAgICAgIHJlbGF0aXZlID0gdHJhbnNmb3JtUmVsYXRpdmUodG9wb2xvZ3kudHJhbnNmb3JtKSxcbiAgICAgICAgaGVhcCA9IG1pbkFyZWFIZWFwKCk7XG5cbiAgICBpZiAoIXRyaWFuZ2xlQXJlYSkgdHJpYW5nbGVBcmVhID0gY2FydGVzaWFuVHJpYW5nbGVBcmVhO1xuXG4gICAgdG9wb2xvZ3kuYXJjcy5mb3JFYWNoKGZ1bmN0aW9uKGFyYykge1xuICAgICAgdmFyIHRyaWFuZ2xlcyA9IFtdLFxuICAgICAgICAgIG1heEFyZWEgPSAwLFxuICAgICAgICAgIHRyaWFuZ2xlO1xuXG4gICAgICAvLyBUbyBzdG9yZSBlYWNoIHBvaW504oCZcyBlZmZlY3RpdmUgYXJlYSwgd2UgY3JlYXRlIGEgbmV3IGFycmF5IHJhdGhlciB0aGFuXG4gICAgICAvLyBleHRlbmRpbmcgdGhlIHBhc3NlZC1pbiBwb2ludCB0byB3b3JrYXJvdW5kIGEgQ2hyb21lL1Y4IGJ1ZyAoZ2V0dGluZ1xuICAgICAgLy8gc3R1Y2sgaW4gc21pIG1vZGUpLiBGb3IgbWlkcG9pbnRzLCB0aGUgaW5pdGlhbCBlZmZlY3RpdmUgYXJlYSBvZlxuICAgICAgLy8gSW5maW5pdHkgd2lsbCBiZSBjb21wdXRlZCBpbiB0aGUgbmV4dCBzdGVwLlxuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmMubGVuZ3RoLCBwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHAgPSBhcmNbaV07XG4gICAgICAgIGFic29sdXRlKGFyY1tpXSA9IFtwWzBdLCBwWzFdLCBJbmZpbml0eV0sIGkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMSwgbiA9IGFyYy5sZW5ndGggLSAxOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHRyaWFuZ2xlID0gYXJjLnNsaWNlKGkgLSAxLCBpICsgMik7XG4gICAgICAgIHRyaWFuZ2xlWzFdWzJdID0gdHJpYW5nbGVBcmVhKHRyaWFuZ2xlKTtcbiAgICAgICAgdHJpYW5nbGVzLnB1c2godHJpYW5nbGUpO1xuICAgICAgICBoZWFwLnB1c2godHJpYW5nbGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRyaWFuZ2xlcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgdHJpYW5nbGUgPSB0cmlhbmdsZXNbaV07XG4gICAgICAgIHRyaWFuZ2xlLnByZXZpb3VzID0gdHJpYW5nbGVzW2kgLSAxXTtcbiAgICAgICAgdHJpYW5nbGUubmV4dCA9IHRyaWFuZ2xlc1tpICsgMV07XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0cmlhbmdsZSA9IGhlYXAucG9wKCkpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzID0gdHJpYW5nbGUucHJldmlvdXMsXG4gICAgICAgICAgICBuZXh0ID0gdHJpYW5nbGUubmV4dDtcblxuICAgICAgICAvLyBJZiB0aGUgYXJlYSBvZiB0aGUgY3VycmVudCBwb2ludCBpcyBsZXNzIHRoYW4gdGhhdCBvZiB0aGUgcHJldmlvdXMgcG9pbnRcbiAgICAgICAgLy8gdG8gYmUgZWxpbWluYXRlZCwgdXNlIHRoZSBsYXR0ZXIncyBhcmVhIGluc3RlYWQuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZVxuICAgICAgICAvLyBjdXJyZW50IHBvaW50IGNhbm5vdCBiZSBlbGltaW5hdGVkIHdpdGhvdXQgZWxpbWluYXRpbmcgcHJldmlvdXNseS1cbiAgICAgICAgLy8gZWxpbWluYXRlZCBwb2ludHMuXG4gICAgICAgIGlmICh0cmlhbmdsZVsxXVsyXSA8IG1heEFyZWEpIHRyaWFuZ2xlWzFdWzJdID0gbWF4QXJlYTtcbiAgICAgICAgZWxzZSBtYXhBcmVhID0gdHJpYW5nbGVbMV1bMl07XG5cbiAgICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgICAgcHJldmlvdXMubmV4dCA9IG5leHQ7XG4gICAgICAgICAgcHJldmlvdXNbMl0gPSB0cmlhbmdsZVsyXTtcbiAgICAgICAgICB1cGRhdGUocHJldmlvdXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgbmV4dFswXSA9IHRyaWFuZ2xlWzBdO1xuICAgICAgICAgIHVwZGF0ZShuZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhcmMuZm9yRWFjaChyZWxhdGl2ZSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB1cGRhdGUodHJpYW5nbGUpIHtcbiAgICAgIGhlYXAucmVtb3ZlKHRyaWFuZ2xlKTtcbiAgICAgIHRyaWFuZ2xlWzFdWzJdID0gdHJpYW5nbGVBcmVhKHRyaWFuZ2xlKTtcbiAgICAgIGhlYXAucHVzaCh0cmlhbmdsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvcG9sb2d5O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNhcnRlc2lhblJpbmdBcmVhKHJpbmcpIHtcbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gcmluZy5sZW5ndGgsXG4gICAgICAgIGEsXG4gICAgICAgIGIgPSByaW5nW24gLSAxXSxcbiAgICAgICAgYXJlYSA9IDA7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgYSA9IGI7XG4gICAgICBiID0gcmluZ1tpXTtcbiAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYSAqIC41O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FydGVzaWFuVHJpYW5nbGVBcmVhKHRyaWFuZ2xlKSB7XG4gICAgdmFyIGEgPSB0cmlhbmdsZVswXSwgYiA9IHRyaWFuZ2xlWzFdLCBjID0gdHJpYW5nbGVbMl07XG4gICAgcmV0dXJuIE1hdGguYWJzKChhWzBdIC0gY1swXSkgKiAoYlsxXSAtIGFbMV0pIC0gKGFbMF0gLSBiWzBdKSAqIChjWzFdIC0gYVsxXSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZUFyZWEoYSwgYikge1xuICAgIHJldHVybiBhWzFdWzJdIC0gYlsxXVsyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1pbkFyZWFIZWFwKCkge1xuICAgIHZhciBoZWFwID0ge30sXG4gICAgICAgIGFycmF5ID0gW10sXG4gICAgICAgIHNpemUgPSAwO1xuXG4gICAgaGVhcC5wdXNoID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB1cChhcnJheVtvYmplY3QuXyA9IHNpemVdID0gb2JqZWN0LCBzaXplKyspO1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcblxuICAgIGhlYXAucG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2l6ZSA8PSAwKSByZXR1cm47XG4gICAgICB2YXIgcmVtb3ZlZCA9IGFycmF5WzBdLCBvYmplY3Q7XG4gICAgICBpZiAoLS1zaXplID4gMCkgb2JqZWN0ID0gYXJyYXlbc2l6ZV0sIGRvd24oYXJyYXlbb2JqZWN0Ll8gPSAwXSA9IG9iamVjdCwgMCk7XG4gICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICB9O1xuXG4gICAgaGVhcC5yZW1vdmUgPSBmdW5jdGlvbihyZW1vdmVkKSB7XG4gICAgICB2YXIgaSA9IHJlbW92ZWQuXywgb2JqZWN0O1xuICAgICAgaWYgKGFycmF5W2ldICE9PSByZW1vdmVkKSByZXR1cm47IC8vIGludmFsaWQgcmVxdWVzdFxuICAgICAgaWYgKGkgIT09IC0tc2l6ZSkgb2JqZWN0ID0gYXJyYXlbc2l6ZV0sIChjb21wYXJlQXJlYShvYmplY3QsIHJlbW92ZWQpIDwgMCA/IHVwIDogZG93bikoYXJyYXlbb2JqZWN0Ll8gPSBpXSA9IG9iamVjdCwgaSk7XG4gICAgICByZXR1cm4gaTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXAob2JqZWN0LCBpKSB7XG4gICAgICB3aGlsZSAoaSA+IDApIHtcbiAgICAgICAgdmFyIGogPSAoKGkgKyAxKSA+PiAxKSAtIDEsXG4gICAgICAgICAgICBwYXJlbnQgPSBhcnJheVtqXTtcbiAgICAgICAgaWYgKGNvbXBhcmVBcmVhKG9iamVjdCwgcGFyZW50KSA+PSAwKSBicmVhaztcbiAgICAgICAgYXJyYXlbcGFyZW50Ll8gPSBpXSA9IHBhcmVudDtcbiAgICAgICAgYXJyYXlbb2JqZWN0Ll8gPSBpID0gal0gPSBvYmplY3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG93bihvYmplY3QsIGkpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciByID0gKGkgKyAxKSA8PCAxLFxuICAgICAgICAgICAgbCA9IHIgLSAxLFxuICAgICAgICAgICAgaiA9IGksXG4gICAgICAgICAgICBjaGlsZCA9IGFycmF5W2pdO1xuICAgICAgICBpZiAobCA8IHNpemUgJiYgY29tcGFyZUFyZWEoYXJyYXlbbF0sIGNoaWxkKSA8IDApIGNoaWxkID0gYXJyYXlbaiA9IGxdO1xuICAgICAgICBpZiAociA8IHNpemUgJiYgY29tcGFyZUFyZWEoYXJyYXlbcl0sIGNoaWxkKSA8IDApIGNoaWxkID0gYXJyYXlbaiA9IHJdO1xuICAgICAgICBpZiAoaiA9PT0gaSkgYnJlYWs7XG4gICAgICAgIGFycmF5W2NoaWxkLl8gPSBpXSA9IGNoaWxkO1xuICAgICAgICBhcnJheVtvYmplY3QuXyA9IGkgPSBqXSA9IG9iamVjdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUFic29sdXRlKHRyYW5zZm9ybSkge1xuICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gbm9vcDtcbiAgICB2YXIgeDAsXG4gICAgICAgIHkwLFxuICAgICAgICBreCA9IHRyYW5zZm9ybS5zY2FsZVswXSxcbiAgICAgICAga3kgPSB0cmFuc2Zvcm0uc2NhbGVbMV0sXG4gICAgICAgIGR4ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVswXSxcbiAgICAgICAgZHkgPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdO1xuICAgIHJldHVybiBmdW5jdGlvbihwb2ludCwgaSkge1xuICAgICAgaWYgKCFpKSB4MCA9IHkwID0gMDtcbiAgICAgIHBvaW50WzBdID0gKHgwICs9IHBvaW50WzBdKSAqIGt4ICsgZHg7XG4gICAgICBwb2ludFsxXSA9ICh5MCArPSBwb2ludFsxXSkgKiBreSArIGR5O1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1SZWxhdGl2ZSh0cmFuc2Zvcm0pIHtcbiAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIG5vb3A7XG4gICAgdmFyIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICAgIGt5ID0gdHJhbnNmb3JtLnNjYWxlWzFdLFxuICAgICAgICBkeCA9IHRyYW5zZm9ybS50cmFuc2xhdGVbMF0sXG4gICAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocG9pbnQsIGkpIHtcbiAgICAgIGlmICghaSkgeDAgPSB5MCA9IDA7XG4gICAgICB2YXIgeDEgPSAocG9pbnRbMF0gLSBkeCkgLyBreCB8IDAsXG4gICAgICAgICAgeTEgPSAocG9pbnRbMV0gLSBkeSkgLyBreSB8IDA7XG4gICAgICBwb2ludFswXSA9IHgxIC0geDA7XG4gICAgICBwb2ludFsxXSA9IHkxIC0geTA7XG4gICAgICB4MCA9IHgxO1xuICAgICAgeTAgPSB5MTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbm9vcCgpIHt9XG5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSBkZWZpbmUodG9wb2pzb24pO1xuICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IHRvcG9qc29uO1xuICBlbHNlIHRoaXMudG9wb2pzb24gPSB0b3BvanNvbjtcbn0oKTtcbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgYml0cyA9IHJlcXVpcmUoJ2JpdC10d2lkZGxlJylcbnZhciBkdXAgPSByZXF1aXJlKCdkdXAnKVxuXG4vL0xlZ2FjeSBwb29sIHN1cHBvcnRcbmlmKCFnbG9iYWwuX19UWVBFREFSUkFZX1BPT0wpIHtcbiAgZ2xvYmFsLl9fVFlQRURBUlJBWV9QT09MID0ge1xuICAgICAgVUlOVDggICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDE2ICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDMyICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UOCAgICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UMTYgICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UMzIgICA6IGR1cChbMzIsIDBdKVxuICAgICwgRkxPQVQgICA6IGR1cChbMzIsIDBdKVxuICAgICwgRE9VQkxFICA6IGR1cChbMzIsIDBdKVxuICAgICwgREFUQSAgICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDhDICA6IGR1cChbMzIsIDBdKVxuICAgICwgQlVGRkVSICA6IGR1cChbMzIsIDBdKVxuICB9XG59XG5cbnZhciBoYXNVaW50OEMgPSAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSAhPT0gJ3VuZGVmaW5lZCdcbnZhciBQT09MID0gZ2xvYmFsLl9fVFlQRURBUlJBWV9QT09MXG5cbi8vVXBncmFkZSBwb29sXG5pZighUE9PTC5VSU5UOEMpIHtcbiAgUE9PTC5VSU5UOEMgPSBkdXAoWzMyLCAwXSlcbn1cbmlmKCFQT09MLkJVRkZFUikge1xuICBQT09MLkJVRkZFUiA9IGR1cChbMzIsIDBdKVxufVxuXG4vL05ldyB0ZWNobmlxdWU6IE9ubHkgYWxsb2NhdGUgZnJvbSBBcnJheUJ1ZmZlclZpZXcgYW5kIEJ1ZmZlclxudmFyIERBVEEgICAgPSBQT09MLkRBVEFcbiAgLCBCVUZGRVIgID0gUE9PTC5CVUZGRVJcblxuZXhwb3J0cy5mcmVlID0gZnVuY3Rpb24gZnJlZShhcnJheSkge1xuICBpZihCdWZmZXIuaXNCdWZmZXIoYXJyYXkpKSB7XG4gICAgQlVGRkVSW2JpdHMubG9nMihhcnJheS5sZW5ndGgpXS5wdXNoKGFycmF5KVxuICB9IGVsc2Uge1xuICAgIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnJheSkgIT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGFycmF5ID0gYXJyYXkuYnVmZmVyXG4gICAgfVxuICAgIGlmKCFhcnJheSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHZhciBuID0gYXJyYXkubGVuZ3RoIHx8IGFycmF5LmJ5dGVMZW5ndGhcbiAgICB2YXIgbG9nX24gPSBiaXRzLmxvZzIobil8MFxuICAgIERBVEFbbG9nX25dLnB1c2goYXJyYXkpXG4gIH1cbn1cblxuZnVuY3Rpb24gZnJlZUFycmF5QnVmZmVyKGJ1ZmZlcikge1xuICBpZighYnVmZmVyKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG4gPSBidWZmZXIubGVuZ3RoIHx8IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gIHZhciBsb2dfbiA9IGJpdHMubG9nMihuKVxuICBEQVRBW2xvZ19uXS5wdXNoKGJ1ZmZlcilcbn1cblxuZnVuY3Rpb24gZnJlZVR5cGVkQXJyYXkoYXJyYXkpIHtcbiAgZnJlZUFycmF5QnVmZmVyKGFycmF5LmJ1ZmZlcilcbn1cblxuZXhwb3J0cy5mcmVlVWludDggPVxuZXhwb3J0cy5mcmVlVWludDE2ID1cbmV4cG9ydHMuZnJlZVVpbnQzMiA9XG5leHBvcnRzLmZyZWVJbnQ4ID1cbmV4cG9ydHMuZnJlZUludDE2ID1cbmV4cG9ydHMuZnJlZUludDMyID1cbmV4cG9ydHMuZnJlZUZsb2F0MzIgPSBcbmV4cG9ydHMuZnJlZUZsb2F0ID1cbmV4cG9ydHMuZnJlZUZsb2F0NjQgPSBcbmV4cG9ydHMuZnJlZURvdWJsZSA9IFxuZXhwb3J0cy5mcmVlVWludDhDbGFtcGVkID0gXG5leHBvcnRzLmZyZWVEYXRhVmlldyA9IGZyZWVUeXBlZEFycmF5XG5cbmV4cG9ydHMuZnJlZUFycmF5QnVmZmVyID0gZnJlZUFycmF5QnVmZmVyXG5cbmV4cG9ydHMuZnJlZUJ1ZmZlciA9IGZ1bmN0aW9uIGZyZWVCdWZmZXIoYXJyYXkpIHtcbiAgQlVGRkVSW2JpdHMubG9nMihhcnJheS5sZW5ndGgpXS5wdXNoKGFycmF5KVxufVxuXG5leHBvcnRzLm1hbGxvYyA9IGZ1bmN0aW9uIG1hbGxvYyhuLCBkdHlwZSkge1xuICBpZihkdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGR0eXBlID09PSAnYXJyYXlidWZmZXInKSB7XG4gICAgcmV0dXJuIG1hbGxvY0FycmF5QnVmZmVyKG4pXG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoKGR0eXBlKSB7XG4gICAgICBjYXNlICd1aW50OCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50OChuKVxuICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY1VpbnQxNihuKVxuICAgICAgY2FzZSAndWludDMyJzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY1VpbnQzMihuKVxuICAgICAgY2FzZSAnaW50OCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NJbnQ4KG4pXG4gICAgICBjYXNlICdpbnQxNic6XG4gICAgICAgIHJldHVybiBtYWxsb2NJbnQxNihuKVxuICAgICAgY2FzZSAnaW50MzInOlxuICAgICAgICByZXR1cm4gbWFsbG9jSW50MzIobilcbiAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgIGNhc2UgJ2Zsb2F0MzInOlxuICAgICAgICByZXR1cm4gbWFsbG9jRmxvYXQobilcbiAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICBjYXNlICdmbG9hdDY0JzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY0RvdWJsZShuKVxuICAgICAgY2FzZSAndWludDhfY2xhbXBlZCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50OENsYW1wZWQobilcbiAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgIHJldHVybiBtYWxsb2NCdWZmZXIobilcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgY2FzZSAnZGF0YXZpZXcnOlxuICAgICAgICByZXR1cm4gbWFsbG9jRGF0YVZpZXcobilcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbWFsbG9jQXJyYXlCdWZmZXIobikge1xuICB2YXIgbiA9IGJpdHMubmV4dFBvdzIobilcbiAgdmFyIGxvZ19uID0gYml0cy5sb2cyKG4pXG4gIHZhciBkID0gREFUQVtsb2dfbl1cbiAgaWYoZC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGQucG9wKClcbiAgfVxuICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKG4pXG59XG5leHBvcnRzLm1hbGxvY0FycmF5QnVmZmVyID0gbWFsbG9jQXJyYXlCdWZmZXJcblxuZnVuY3Rpb24gbWFsbG9jVWludDgobikge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobWFsbG9jQXJyYXlCdWZmZXIobiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY1VpbnQ4ID0gbWFsbG9jVWludDhcblxuZnVuY3Rpb24gbWFsbG9jVWludDE2KG4pIHtcbiAgcmV0dXJuIG5ldyBVaW50MTZBcnJheShtYWxsb2NBcnJheUJ1ZmZlcigyKm4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NVaW50MTYgPSBtYWxsb2NVaW50MTZcblxuZnVuY3Rpb24gbWFsbG9jVWludDMyKG4pIHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig0Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NVaW50MzIgPSBtYWxsb2NVaW50MzJcblxuZnVuY3Rpb24gbWFsbG9jSW50OChuKSB7XG4gIHJldHVybiBuZXcgSW50OEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NJbnQ4ID0gbWFsbG9jSW50OFxuXG5mdW5jdGlvbiBtYWxsb2NJbnQxNihuKSB7XG4gIHJldHVybiBuZXcgSW50MTZBcnJheShtYWxsb2NBcnJheUJ1ZmZlcigyKm4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NJbnQxNiA9IG1hbGxvY0ludDE2XG5cbmZ1bmN0aW9uIG1hbGxvY0ludDMyKG4pIHtcbiAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KG1hbGxvY0FycmF5QnVmZmVyKDQqbiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0ludDMyID0gbWFsbG9jSW50MzJcblxuZnVuY3Rpb24gbWFsbG9jRmxvYXQobikge1xuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig0Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NGbG9hdDMyID0gZXhwb3J0cy5tYWxsb2NGbG9hdCA9IG1hbGxvY0Zsb2F0XG5cbmZ1bmN0aW9uIG1hbGxvY0RvdWJsZShuKSB7XG4gIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKDgqbiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0Zsb2F0NjQgPSBleHBvcnRzLm1hbGxvY0RvdWJsZSA9IG1hbGxvY0RvdWJsZVxuXG5mdW5jdGlvbiBtYWxsb2NVaW50OENsYW1wZWQobikge1xuICBpZihoYXNVaW50OEMpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYWxsb2NVaW50OChuKVxuICB9XG59XG5leHBvcnRzLm1hbGxvY1VpbnQ4Q2xhbXBlZCA9IG1hbGxvY1VpbnQ4Q2xhbXBlZFxuXG5mdW5jdGlvbiBtYWxsb2NEYXRhVmlldyhuKSB7XG4gIHJldHVybiBuZXcgRGF0YVZpZXcobWFsbG9jQXJyYXlCdWZmZXIobiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0RhdGFWaWV3ID0gbWFsbG9jRGF0YVZpZXdcblxuZnVuY3Rpb24gbWFsbG9jQnVmZmVyKG4pIHtcbiAgbiA9IGJpdHMubmV4dFBvdzIobilcbiAgdmFyIGxvZ19uID0gYml0cy5sb2cyKG4pXG4gIHZhciBjYWNoZSA9IEJVRkZFUltsb2dfbl1cbiAgaWYoY2FjaGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBjYWNoZS5wb3AoKVxuICB9XG4gIHJldHVybiBuZXcgQnVmZmVyKG4pXG59XG5leHBvcnRzLm1hbGxvY0J1ZmZlciA9IG1hbGxvY0J1ZmZlclxuXG5leHBvcnRzLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiBjbGVhckNhY2hlKCkge1xuICBmb3IodmFyIGk9MDsgaTwzMjsgKytpKSB7XG4gICAgUE9PTC5VSU5UOFtpXS5sZW5ndGggPSAwXG4gICAgUE9PTC5VSU5UMTZbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuVUlOVDMyW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLklOVDhbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuSU5UMTZbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuSU5UMzJbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuRkxPQVRbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuRE9VQkxFW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLlVJTlQ4Q1tpXS5sZW5ndGggPSAwXG4gICAgREFUQVtpXS5sZW5ndGggPSAwXG4gICAgQlVGRkVSW2ldLmxlbmd0aCA9IDBcbiAgfVxufSIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVsYXllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGUocGJmLCBlbmQpIHtcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKTtcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XG4gICAgfVxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLl9pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG4gICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgaWYgKHggPCB4MSkgeDEgPSB4O1xuICAgICAgICAgICAgaWYgKHggPiB4MikgeDIgPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCB5MSkgeTEgPSB5O1xuICAgICAgICAgICAgaWYgKHkgPiB5MikgeTIgPSB5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kICE9PSA3KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTiA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZXh0ZW50ICogTWF0aC5wb3coMiwgeiksXG4gICAgICAgIHgwID0gdGhpcy5leHRlbnQgKiB4LFxuICAgICAgICB5MCA9IHRoaXMuZXh0ZW50ICogeSxcbiAgICAgICAgY29vcmRzID0gdGhpcy5sb2FkR2VvbWV0cnkoKSxcbiAgICAgICAgdHlwZSA9IFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3RoaXMudHlwZV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGluZSA9IGNvb3Jkc1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IGxpbmVbal0sIHkyID0gMTgwIC0gKHAueSArIHkwKSAqIDM2MCAvIHNpemU7XG4gICAgICAgICAgICBsaW5lW2pdID0gW1xuICAgICAgICAgICAgICAgIChwLnggKyB4MCkgKiAzNjAgLyBzaXplIC0gMTgwLFxuICAgICAgICAgICAgICAgIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgICAgIHR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlTGF5ZXI7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllcihwYmYsIGVuZCkge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMudmVyc2lvbiA9IDE7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRMYXllciwgdGhpcywgZW5kKTtcblxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXIodGFnLCBsYXllciwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMTUpIGxheWVyLnZlcnNpb24gPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBsYXllci5leHRlbnQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgbGF5ZXIuX2ZlYXR1cmVzLnB1c2gocGJmLnBvcyk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSB7XG4gICAgdmFyIHZhbHVlID0gbnVsbCxcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xuXG4gICAgICAgIHZhbHVlID0gdGFnID09PSAxID8gcGJmLnJlYWRTdHJpbmcoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxuICAgICAgICAgICAgdGFnID09PSAzID8gcGJmLnJlYWREb3VibGUoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDQgPyBwYmYucmVhZFZhcmludDY0KCkgOlxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDYgPyBwYmYucmVhZFNWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDcgPyBwYmYucmVhZEJvb2xlYW4oKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZXR1cm4gZmVhdHVyZSBgaWAgZnJvbSB0aGlzIGxheWVyIGFzIGEgYFZlY3RvclRpbGVGZWF0dXJlYFxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcblxuICAgIHZhciBlbmQgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcbn07XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGNvbnN0IHRpbGVfYm91bmRzID0gW1xuICAgIHsgeDogMCwgeTogMH0sXG4gICAgeyB4OiBHZW8udGlsZV9zY2FsZSwgeTogLUdlby50aWxlX3NjYWxlIH0gLy8gVE9ETzogY29ycmVjdCBmb3IgZmxpcHBlZCB5LWF4aXM/XG5dO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF91dnMgPSBbMCwgMCwgMSwgMV07XG5cbi8vIFRlc3RzIGlmIGEgbGluZSBzZWdtZW50IChmcm9tIHBvaW50IEEgdG8gQikgaXMgb3V0c2lkZSB0aGUgdGlsZSBib3VuZHNcbi8vICh3aXRoaW4gYSBjZXJ0YWluIHRvbGVyYW5jZSB0byBhY2NvdW50IGZvciBnZW9tZXRyeSBuZWFybHkgb24gdGlsZSBlZGdlcylcbmV4cG9ydCBmdW5jdGlvbiBvdXRzaWRlVGlsZSAoX2EsIF9iLCB0b2xlcmFuY2UpIHtcbiAgICBsZXQgdGlsZV9taW4gPSB0aWxlX2JvdW5kc1swXTtcbiAgICBsZXQgdGlsZV9tYXggPSB0aWxlX2JvdW5kc1sxXTtcblxuICAgIC8vIFRPRE86IGZpeCBmbGlwcGVkIFkgY29vcmRzIGhlcmUsIGNvbmZ1c2luZyB3aXRoICdtYXgnIHJlZmVyZW5jZVxuICAgIGlmICgoX2FbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSAmJiBfYlswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSAmJiBfYlswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSAmJiBfYlsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSAmJiBfYlsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvb3JkT3V0c2lkZVRpbGUgKGNvb3JkLCB0b2xlcmFuY2UpIHtcbiAgICB0b2xlcmFuY2UgPSB0b2xlcmFuY2UgfHwgMDtcbiAgICBsZXQgdGlsZV9taW4gPSB0aWxlX2JvdW5kc1swXTtcbiAgICBsZXQgdGlsZV9tYXggPSB0aWxlX2JvdW5kc1sxXTtcblxuICAgIHJldHVybiBjb29yZFswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlO1xufVxuIiwiLy8gUG9pbnQgYnVpbGRlcnNcbmltcG9ydCB7IGRlZmF1bHRfdXZzIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vLyBCdWlsZCBhIGJpbGxib2FyZCBzcHJpdGUgcXVhZCBjZW50ZXJlZCBvbiBhIHBvaW50LiBTcHJpdGVzIGFyZSBpbnRlbmRlZCB0byBiZSBkcmF3biBpbiBzY3JlZW5zcGFjZSwgYW5kIGhhdmVcbi8vIHByb3BlcnRpZXMgZm9yIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBhbmQgYSBzY2FsZSBmYWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSB0aGUgc2NyZWVuc3BhY2Ugc2l6ZVxuLy8gb2YgYSBzcHJpdGUgYmV0d2VlbiB0d28gem9vbSBsZXZlbHMuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRRdWFkc0ZvclBvaW50cyAocG9pbnRzLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHsgdGV4Y29vcmRfaW5kZXgsIHBvc2l0aW9uX2luZGV4LCBzaGFwZV9pbmRleCwgb2Zmc2V0X2luZGV4IH0sXG4gICAgeyBxdWFkLCBxdWFkX25vcm1hbGl6ZSwgb2Zmc2V0LCBhbmdsZSwgc2hhcGVfdywgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG4gICAgcXVhZF9ub3JtYWxpemUgPSBxdWFkX25vcm1hbGl6ZSB8fCAxO1xuICAgIGxldCB3MiA9IHF1YWRbMF0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IGgyID0gcXVhZFsxXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgc2NhbGluZyA9IFtcbiAgICAgICAgWy13MiwgLWgyXSxcbiAgICAgICAgW3cyLCAtaDJdLFxuICAgICAgICBbdzIsIGgyXSxcbiAgICAgICAgWy13MiwgaDJdXG4gICAgXTtcblxuICAgIGxldCB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgbGV0IGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgbGV0IHRleGNvb3JkcztcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG5cbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdGV4Y29vcmRzID0gW1xuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtYXhfdl1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBsZXQgbnVtX3BvaW50cyA9IHBvaW50cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgcD0wOyBwIDwgbnVtX3BvaW50czsgcCsrKSB7XG4gICAgICAgIGxldCBwb2ludCA9IHBvaW50c1twXTtcblxuICAgICAgICBmb3IgKGxldCBwb3M9MDsgcG9zIDwgNDsgcG9zKyspIHtcbiAgICAgICAgICAgIC8vIEFkZCB0ZXhjb29yZHNcbiAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gdGV4Y29vcmRzW3Bvc11bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbcG9zXVsxXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMF0gPSBwb2ludFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDFdID0gcG9pbnRbMV07XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDBdID0gc2NhbGluZ1twb3NdWzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMV0gPSBzY2FsaW5nW3Bvc11bMV07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAyXSA9IGFuZ2xlO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgM10gPSBzaGFwZV93O1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbb2Zmc2V0X2luZGV4ICsgMF0gPSBvZmZzZXRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbb2Zmc2V0X2luZGV4ICsgMV0gPSBvZmZzZXRbMV07XG5cbiAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAzKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgIH1cbn1cbiIsIi8vIFBvbHlnb24gYnVpbGRlcnNcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCB7IGRlZmF1bHRfdXZzLCBvdXRzaWRlVGlsZSB9IGZyb20gJy4vY29tbW9uJztcblxuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuXG5jb25zdCB1cF92ZWMzID0gWzAsIDAsIDFdO1xuXG4vLyBUZXNzZWxhdGUgYSBmbGF0IDJEIHBvbHlnb25cbi8vIHggJiB5IGNvb3JkaW5hdGVzIHdpbGwgYmUgc2V0IGFzIGZpcnN0IHR3byBlbGVtZW50cyBvZiBwcm92aWRlZCB2ZXJ0ZXhfdGVtcGxhdGVcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICB9XG5cbiAgICB2YXIgbnVtX3BvbHlnb25zID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGZvciAodmFyIHA9MDsgcCA8IG51bV9wb2x5Z29uczsgcCsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIC8vIEZpbmQgcG9seWdvbiBleHRlbnRzIHRvIGNhbGN1bGF0ZSBVVnMsIGZpdCB0aGVtIHRvIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94XG4gICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgdmFyIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV0gPSBHZW8uZmluZEJvdW5kaW5nQm94KHBvbHlnb24pO1xuICAgICAgICAgICAgdmFyIHNwYW5feCA9IG1heF94IC0gbWluX3g7XG4gICAgICAgICAgICB2YXIgc3Bhbl95ID0gbWF4X3kgLSBtaW5feTtcbiAgICAgICAgICAgIHZhciBzY2FsZV91ID0gKG1heF91IC0gbWluX3UpIC8gc3Bhbl94O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3YgPSAobWF4X3YgLSBtaW5fdikgLyBzcGFuX3k7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciByaW5nX2luZGV4ID0gMDsgcmluZ19pbmRleCA8IHBvbHlnb24ubGVuZ3RoOyByaW5nX2luZGV4Kyspe1xuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBkYXRhXG4gICAgICAgICAgICB2YXIgcG9seWdvbl9yaW5nID0gcG9seWdvbltyaW5nX2luZGV4XTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbl9yaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZlcnRleCA9IHBvbHlnb25fcmluZ1tpXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB2ZXJ0ZXhbMF07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gdmVydGV4WzFdO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIFVWc1xuICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9ICgodmVydGV4WzBdIC0gbWluX3gpICogc2NhbGVfdSArIG1pbl91KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSAoKHZlcnRleFsxXSAtIG1pbl95KSAqIHNjYWxlX3YgKyBtaW5fdikgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZWxlbWVudCBpbmRpY2VzXG4gICAgICAgIHZhciBpbmRpY2VzID0gdHJpYW5ndWxhdGVQb2x5Z29uKGVhcmN1dC5mbGF0dGVuKHBvbHlnb24pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgaW5kaWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRlc3NlbGF0ZSBhbmQgZXh0cnVkZSBhIGZsYXQgMkQgcG9seWdvbiBpbnRvIGEgc2ltcGxlIDNEIG1vZGVsIHdpdGggZml4ZWQgaGVpZ2h0IGFuZCBhZGQgdG8gR0wgdmVydGV4IGJ1ZmZlclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgeiwgaGVpZ2h0LCBtaW5faGVpZ2h0LFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgbm9ybWFsX2luZGV4LFxuICAgIG5vcm1hbF9ub3JtYWxpemUsXG4gICAge1xuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHdpbmRpbmdcbiAgICB9KSB7XG5cbiAgICAvLyBUb3BcbiAgICB2YXIgbWluX3ogPSB6ICsgKG1pbl9oZWlnaHQgfHwgMCk7XG4gICAgdmFyIG1heF96ID0geiArIGhlaWdodDtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMl0gPSBtYXhfejtcbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLCB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAvLyBXYWxsc1xuICAgIC8vIEZpdCBVVnMgdG8gd2FsbCBxdWFkXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB2YXIgdGV4Y29vcmRzID0gW1xuICAgICAgICAgICAgW21pbl91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICB2YXIgbnVtX3BvbHlnb25zID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGZvciAodmFyIHA9MDsgcCA8IG51bV9wb2x5Z29uczsgcCsrKSB7XG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgZm9yICh2YXIgcT0wOyBxIDwgcG9seWdvbi5sZW5ndGg7IHErKykge1xuICAgICAgICAgICAgdmFyIGNvbnRvdXIgPSBwb2x5Z29uW3FdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciB3PTA7IHcgPCBjb250b3VyLmxlbmd0aCAtIDE7IHcrKykge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb250b3VyW3ddLCBjb250b3VyW3crMV0sIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkb24ndCBleHRydWRlIHRpbGUgZWRnZXNcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXYWxsIG9yZGVyIGlzIGRlcGVuZGVudCBvbiB3aW5kaW5nIG9yZGVyLCBzbyB0aGF0IG5vcm1hbHMgZmFjZSBvdXR3YXJkXG4gICAgICAgICAgICAgICAgbGV0IHcwLCB3MTtcbiAgICAgICAgICAgICAgICBpZiAod2luZGluZyA9PT0gJ0NDVycpIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3O1xuICAgICAgICAgICAgICAgICAgICB3MSA9IHcrMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdysxO1xuICAgICAgICAgICAgICAgICAgICB3MSA9IHc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVHdvIHRyaWFuZ2xlcyBmb3IgdGhlIHF1YWQgZm9ybWVkIGJ5IGVhY2ggdmVydGV4IHBhaXIsIGdvaW5nIGZyb20gYm90dG9tIHRvIHRvcCBoZWlnaHRcbiAgICAgICAgICAgICAgICB2YXIgd2FsbF92ZXJ0aWNlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWF4X3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWF4X3pdXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIC8vIENhbGMgdGhlIG5vcm1hbCBvZiB0aGUgd2FsbCBmcm9tIHVwIHZlY3RvciBhbmQgb25lIHNlZ21lbnQgb2YgdGhlIHdhbGwgdHJpYW5nbGVzXG4gICAgICAgICAgICAgICAgbGV0IHdhbGxfdmVjID0gVmVjdG9yLm5vcm1hbGl6ZShbY29udG91clt3MV1bMF0gLSBjb250b3VyW3cwXVswXSwgY29udG91clt3MV1bMV0gLSBjb250b3VyW3cwXVsxXSwgMF0pO1xuICAgICAgICAgICAgICAgIGxldCBub3JtYWwgPSBWZWN0b3IuY3Jvc3ModXBfdmVjMywgd2FsbF92ZWMpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZlcnRleCB0ZW1wbGF0ZSB3aXRoIGN1cnJlbnQgc3VyZmFjZSBub3JtYWxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMF0gPSBub3JtYWxbMF0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAxXSA9IG5vcm1hbFsxXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDJdID0gbm9ybWFsWzJdICogbm9ybWFsX25vcm1hbGl6ZTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHd2PTA7IHd2IDwgd2FsbF92ZXJ0aWNlcy5sZW5ndGg7IHd2KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMF07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHdhbGxfdmVydGljZXNbd3ZdWzFdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMl0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsyXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gdGV4Y29vcmRzW3d2XVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3d2XVsxXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAxKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAzKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVHJpYW5ndWxhdGlvbiB1c2luZyBlYXJjdXRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0XG5leHBvcnQgZnVuY3Rpb24gdHJpYW5ndWxhdGVQb2x5Z29uIChkYXRhKSB7XG4gICAgcmV0dXJuIGVhcmN1dChkYXRhLnZlcnRpY2VzLCBkYXRhLmhvbGVzLCBkYXRhLmRpbWVuc2lvbnMpO1xufVxuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5cbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7b3V0c2lkZVRpbGUsIGlzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi9jb21tb24nO1xuXG5jb25zdCB6ZXJvX3ZlYzIgPSBbMCwgMF07XG5cbi8vIEJ1aWxkIHRlc3NlbGxhdGVkIHRyaWFuZ2xlcyBmb3IgYSBwb2x5bGluZVxuY29uc3QgQ0FQX1RZUEUgPSB7XG4gICAgYnV0dDogMCxcbiAgICBzcXVhcmU6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IEpPSU5fVFlQRSA9IHtcbiAgICBtaXRlcjogMCxcbiAgICBiZXZlbDogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgREVGQVVMVCA9IHtcbiAgICBNSVRFUl9MSU1JVDogMyxcbiAgICBURVhDT09SRF9OT1JNQUxJWkU6IDEsXG4gICAgVEVYQ09PUkRfUkFUSU86IDEsXG4gICAgTUlOX0ZBTl9XSURUSDogNSAgICAgICAgLy8gV2lkdGggb2YgbGluZSBpbiB0aWxlIHVuaXRzIHRvIHBsYWNlIDEgdHJpYW5nbGUgcGVyIGZhblxufTtcblxuLy8gU2NhbGluZyBmYWN0b3IgdG8gYWRkIHByZWNpc2lvbiB0byBsaW5lIHRleHR1cmUgViBjb29yZGluYXRlIHBhY2tlZCBhcyBub3JtYWxpemVkIHNob3J0XG5jb25zdCB2X3NjYWxlX2FkanVzdCA9IEdlby50aWxlX3NjYWxlO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5bGluZXMgKGxpbmVzLCB3aWR0aCwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8sXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIGpvaW4sIGNhcCxcbiAgICAgICAgbWl0ZXJfbGltaXRcbiAgICB9KSB7XG5cbiAgICB2YXIgY2FwX3R5cGUgPSBjYXAgPyBDQVBfVFlQRVtjYXBdIDogQ0FQX1RZUEUuYnV0dDtcbiAgICB2YXIgam9pbl90eXBlID0gam9pbiA/IEpPSU5fVFlQRVtqb2luXSA6IEpPSU5fVFlQRS5taXRlcjtcblxuICAgIC8vIENvbmZpZ3VyZSBtaXRlciBsaW1pdFxuICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICBtaXRlcl9saW1pdCA9IG1pdGVyX2xpbWl0IHx8IERFRkFVTFQuTUlURVJfTElNSVQ7IC8vIGRlZmF1bHQgbWl0ZXIgbGltaXRcbiAgICAgICAgdmFyIG1pdGVyX2xlbl9zcSA9IG1pdGVyX2xpbWl0ICogbWl0ZXJfbGltaXQ7XG4gICAgfVxuXG4gICAgLy8gVGV4dHVyZSBWYXJpYWJsZXNcbiAgICB2YXIgdl9zY2FsZTtcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IERFRkFVTFQuVEVYQ09PUkRfTk9STUFMSVpFO1xuICAgICAgICB0ZXhjb29yZF9yYXRpbyA9IHRleGNvb3JkX3JhdGlvIHx8IERFRkFVTFQuVEVYQ09PUkRfUkFUSU87XG4gICAgICAgIHZfc2NhbGUgPSAxIC8gKHRleGNvb3JkX3dpZHRoICogdGV4Y29vcmRfcmF0aW8gKiB2X3NjYWxlX2FkanVzdCk7IC8vIHNjYWxlcyBsaW5lIHRleHR1cmUgYXMgYSByYXRpbyBvZiB0aGUgbGluZSdzIHdpZHRoXG4gICAgfVxuXG4gICAgLy8gVmFsdWVzIHRoYXQgYXJlIGNvbnN0YW50IGZvciBlYWNoIGxpbmUgYW5kIGFyZSBwYXNzZWQgdG8gaGVscGVyIGZ1bmN0aW9uc1xuICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIG1pdGVyX2xlbl9zcSxcbiAgICAgICAgam9pbl90eXBlLFxuICAgICAgICBjYXBfdHlwZSxcbiAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgaGFsZl93aWR0aDogd2lkdGggLyAyLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgdl9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemVcbiAgICB9O1xuXG4gICAgLy8gQnVmZmVyIGZvciBleHRyYSBsaW5lcyB0byBwcm9jZXNzXG4gICAgdmFyIGV4dHJhX2xpbmVzID0gW107XG5cbiAgICAvLyBQcm9jZXNzIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGxpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZXh0cmEgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXh0cmFfbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUoZXh0cmFfbGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBvbHlsaW5lKGxpbmUsIGNvbnRleHQsIGV4dHJhX2xpbmVzKXtcbiAgICAvLyBTa2lwIGlmIGxpbmUgaXMgbm90IHZhbGlkXG4gICAgaWYgKGxpbmUubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvb3JkQ3VyciwgY29vcmROZXh0LCBub3JtUHJldiwgbm9ybU5leHQ7XG4gICAgdmFyIHtqb2luX3R5cGUsIGNhcF90eXBlLCBjbG9zZWRfcG9seWdvbiwgcmVtb3ZlX3RpbGVfZWRnZXMsIHRpbGVfZWRnZV90b2xlcmFuY2UsIHZfc2NhbGUsIG1pdGVyX2xlbl9zcX0gPSBjb250ZXh0O1xuICAgIHZhciB2ID0gMDsgLy8gVGV4dHVyZSB2LWNvb3JkaW5hdGVcblxuICAgIC8vIExvb3AgYmFja3dhcmRzIHRocm91Z2ggbGluZSB0byBhIHRpbGUgYm91bmRhcnkgaWYgZm91bmRcbiAgICBpZiAoY2xvc2VkX3BvbHlnb24gJiYgam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgdmFyIGJvdW5kYXJ5SW5kZXggPSBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgbGluZSB0aGF0IGlzIGEgY3ljbGljIHBlcm11dGF0aW9uIG9mIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgdmFyIHBlcm11dGVkTGluZSA9IHBlcm11dGVMaW5lKGxpbmUsIGJvdW5kYXJ5SW5kZXgpO1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChwZXJtdXRlZExpbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRklSU1QgUE9JTlRcbiAgICBjb29yZEN1cnIgPSBsaW5lWzBdO1xuICAgIGNvb3JkTmV4dCA9IGxpbmVbMV07XG5cbiAgICAvLyBJZiBmaXJzdCBwYWlyIG9mIHBvaW50cyBpcyByZWR1bmRhbnQsIHNsaWNlIGFuZCBwdXNoIHRvIHRoZSBsaW5lcyBhcnJheVxuICAgIGlmIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChsaW5lLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgY29vcmROZXh0KSk7XG5cbiAgICAvLyBTa2lwIHRpbGUgYm91bmRhcnkgbGluZXMgYW5kIGFwcGVuZCBhIG5ldyBsaW5lIGlmIG5lZWRlZFxuICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgdmFyIG5vbkJvdW5kYXJ5U2VnbWVudCA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgMCwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgIGlmIChub25Cb3VuZGFyeVNlZ21lbnQpIHtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlTZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKXtcbiAgICAgICAgLy8gQmVnaW4gdGhlIHBvbHlnb24gd2l0aCBhIGpvaW4gKGNvbm5lY3RpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzKVxuICAgICAgICBub3JtUHJldiA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAobGluZVtsaW5lLmxlbmd0aCAtIDJdLCBjb29yZEN1cnIpKTtcbiAgICAgICAgc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbGluZSBiZWdpbnMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1OZXh0LCBjYXBfdHlwZSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoY2FwX3R5cGUgIT09IENBUF9UWVBFLmJ1dHQpIHtcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIHZfc2NhbGUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZpcnN0IHBhaXIgb2YgcG9pbnRzIGZvciB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gSU5URVJNRURJQVJZIFBPSU5UU1xuICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJJbmRleCA9IGk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBpICsgMTtcbiAgICAgICAgY29vcmRDdXJyID0gbGluZVtjdXJySW5kZXhdO1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW25leHRJbmRleF07XG5cbiAgICAgICAgLy8gU2tpcCByZWR1bmRhbnQgdmVydGljZXNcbiAgICAgICAgaWYgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZSBib3VuZGFyaWVzXG4gICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICB2YXIgbm9uQm91bmRhcnlMaW5lcyA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgY3VyckluZGV4ICsgMSwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgICAgICBpZiAobm9uQm91bmRhcnlMaW5lcykge1xuICAgICAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlMaW5lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgICAgICAvLyBBZGQgam9pblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgfVxuXG4gICAgLy8gTEFTVCBQT0lOVFxuICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwb2x5Z29uIHdpdGggYSBtaXRlciBqb2ludCBvciBidXR0IGNhcCBpZiBvbiBhIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgbGluZVsxXSkpO1xuICAgICAgICBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRmluaXNoIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBJZiBsaW5lIGVuZHMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1QcmV2LCBjYXBfdHlwZSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKXtcbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGxpbmVbMF0pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGJhY2tJbmRleCA9IDA7IGJhY2tJbmRleCA8IGxpbmUubGVuZ3RoOyBiYWNrSW5kZXgrKykge1xuICAgICAgICB2YXIgY29vcmRDdXJyID0gbGluZVtsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXhdO1xuICAgICAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuLy8gSXRlcmF0ZSB0aHJvdWdoIGxpbmUgZnJvbSBzdGFydEluZGV4IHRvIGZpbmQgYSBzZWdtZW50IG5vdCBvbiBhIHRpbGUgYm91bmRhcnksIGlmIGFueS5cbmZ1bmN0aW9uIGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQgKGxpbmUsIHN0YXJ0SW5kZXgsIHRvbGVyYW5jZSkge1xuICAgIHZhciBlbmRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgd2hpbGUgKGxpbmVbZW5kSW5kZXggKyAxXSAmJiBvdXRzaWRlVGlsZShsaW5lW2VuZEluZGV4XSwgbGluZVtlbmRJbmRleCArIDFdLCB0b2xlcmFuY2UpKSB7XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBsaW5lIHNlZ21lbnQgcmVtYWluaW5nIHRoYXQgaXMgd2l0aGluIHRoZSB0aWxlLCBwdXNoIGl0IHRvIHRoZSBsaW5lcyBhcnJheVxuICAgIHJldHVybiAobGluZS5sZW5ndGggLSBlbmRJbmRleCA+PSAyKSA/IGxpbmUuc2xpY2UoZW5kSW5kZXgpIDogZmFsc2U7XG59XG5cbi8vIEJlZ2luIGEgcG9seWdvbiB3aXRoIGEgam9pbiBjb25uZWN0aW5nIHRvIHRoZSBsYXN0IHNlZ21lbnQgKGlmIHZhbGlkIGpvaW4tdHlwZSBzcGVjaWZpZWQpXG5mdW5jdGlvbiBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCl7XG4gICAgLy8gSWYgcG9seWdvbiBzdGFydHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgMF0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIDBdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIHdpdGhpbiBhIHRpbGUsIGFkZCBhIGpvaW5cbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBjb250ZXh0Lm1pdGVyX2xlbl9zcSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBFbmQgYSBwb2x5Z29uIGFwcHJvcHJpYXRlbHlcbmZ1bmN0aW9uIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCkge1xuICAgIC8vIElmIHBvbHlnb24gZW5kcyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBlbmRzIHdpdGhpbiBhIHRpbGUsIGFkZCBNaXRlciBvciBubyBqb2ludCAoam9pbiBhZGRlZCBvbiBzdGFydFBvbHlnb24pXG4gICAgICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyICYmIFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBjb250ZXh0Lm1pdGVyX2xlbl9zcSkge1xuICAgICAgICAgICAgam9pbl90eXBlID0gSk9JTl9UWVBFLmJldmVsOyAvLyBzd2l0Y2ggdG8gYmV2ZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IuYWRkKG5vcm1QcmV2LCBub3JtTmV4dCkpO1xuICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguYWJzKFZlY3Rvci5kb3Qobm9ybVByZXYsIG1pdGVyVmVjKSkpO1xuICAgIHJldHVybiBWZWN0b3IubXVsdChtaXRlclZlYywgc2NhbGUgKiBzY2FsZSk7XG59XG5cbi8vIEFkZCBhIG1pdGVyIHZlY3RvciBvciBhIGpvaW4gaWYgdGhlIG1pdGVyIGlzIHRvbyBzaGFycFxuZnVuY3Rpb24gYWRkTWl0ZXIgKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgIC8vICBNaXRlciBsaW1pdDogaWYgbWl0ZXIgam9pbiBpcyB0b28gc2hhcnAsIGNvbnZlcnQgdG8gYmV2ZWwgaW5zdGVhZFxuICAgIGlmIChWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gbWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgIGFkZEpvaW4oSk9JTl9UWVBFLm1pdGVyLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBZGQgYSBiZXZlbCBvciByb3VuZCBqb2luXG5mdW5jdGlvbiBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcbiAgICB2YXIgaXNDbG9ja3dpc2UgPSAobm9ybU5leHRbMF0gKiBub3JtUHJldlsxXSAtIG5vcm1OZXh0WzFdICogbm9ybVByZXZbMF0gPiAwKTtcblxuICAgIGlmIChpc0Nsb2Nrd2lzZSl7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxufVxuXG4vLyBBZGQgaW5kaWNlcyB0byB2ZXJ0ZXhfZWxlbWVudHNcbmZ1bmN0aW9uIGluZGV4UGFpcnMobnVtX3BhaXJzLCBjb250ZXh0KXtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIG51bV92ZXJ0aWNlcyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciBvZmZzZXQgPSBudW1fdmVydGljZXMgLSAyICogbnVtX3BhaXJzIC0gMjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX3BhaXJzOyBpKyspe1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkVmVydGV4KGNvb3JkaW5hdGUsIG5vcm1hbCwgdXYsIGNvbnRleHQpIHtcbiAgICB2YXIgdmVydGV4X3RlbXBsYXRlID0gY29udGV4dC52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgdmFyIHZlcnRleF9kYXRhID0gY29udGV4dC52ZXJ0ZXhfZGF0YTtcblxuICAgIGJ1aWxkVmVydGV4VGVtcGxhdGUodmVydGV4X3RlbXBsYXRlLCBjb29yZGluYXRlLCB1diwgbm9ybWFsLCBjb250ZXh0KTtcbiAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZXJ0ZXhUZW1wbGF0ZSAodmVydGV4X3RlbXBsYXRlLCB2ZXJ0ZXgsIHRleHR1cmVfY29vcmQsIHNjYWxlLCBjb250ZXh0KSB7XG4gICAgLy8gc2V0IHZlcnRleCBwb3NpdGlvblxuICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAvLyBzZXQgVVZzXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggJiYgdGV4dHVyZV9jb29yZCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDBdID0gdGV4dHVyZV9jb29yZFswXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDFdID0gdGV4dHVyZV9jb29yZFsxXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgIH1cblxuICAgIC8vIHNldCBTY2FsaW5nIHZlcnRleCAoWCwgWSBub3JtYWwgZGlyZWN0aW9uICsgWiBoYWxmX3dpZHRoIGFzIGF0dHJpYnV0ZSlcbiAgICBpZiAoY29udGV4dC5zY2FsaW5nX2luZGV4KSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAwXSA9IHNjYWxlWzBdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDFdID0gc2NhbGVbMV0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMl0gPSBjb250ZXh0LmhhbGZfd2lkdGg7XG4gICAgfVxufVxuXG4vLyAgVGVzc2FsYXRlIGEgRkFOIGdlb21ldHJ5IGJldHdlZW4gcG9pbnRzIEEgICAgICAgQlxuLy8gIHVzaW5nIHRoZWlyIG5vcm1hbHMgZnJvbSBhIGNlbnRlciAgICAgICAgXFwgLiAuIC9cbi8vICBhbmQgaW50ZXJwb2xhdGluZyB0aGVpciBVVnMgICAgICAgICAgICAgICBcXCBwIC9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwuL1xuZnVuY3Rpb24gYWRkRmFuIChjb29yZCwgbkEsIG5DLCBuQiwgdXZBLCB1dkMsIHV2QiwgaXNDYXAsIGNvbnRleHQpIHtcbiAgICB2YXIgY3Jvc3MgPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXTtcbiAgICB2YXIgZG90ID0gVmVjdG9yLmRvdChuQSwgbkIpO1xuXG4gICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihjcm9zcywgZG90KTtcbiAgICB3aGlsZSAoYW5nbGUgPj0gTWF0aC5QSSkge1xuICAgICAgICBhbmdsZSAtPSAyKk1hdGguUEk7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9IHRyaWFuZ2xlc1BlckFyYyhhbmdsZSwgY29udGV4dC5oYWxmX3dpZHRoKTtcbiAgICBpZiAobnVtVHJpYW5nbGVzIDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1dkMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHV2QSwgY29udGV4dCk7XG5cbiAgICB2YXIgYmxhZGUgPSBuQTtcblxuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHV2Q3VycjtcbiAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgIHV2Q3VyciA9IFtdO1xuICAgICAgICAgICAgdmFyIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iuc3ViKHV2QSwgdXZDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5zZXQodXZBKTtcbiAgICAgICAgICAgIHZhciB1dl9kZWx0YSA9IFZlY3Rvci5kaXYoVmVjdG9yLnN1Yih1dkIsIHV2QSksIG51bVRyaWFuZ2xlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYW5nbGVfc3RlcCA9IGFuZ2xlIC8gbnVtVHJpYW5nbGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVHJpYW5nbGVzOyBpKyspIHtcbiAgICAgICAgYmxhZGUgPSBWZWN0b3Iucm90KGJsYWRlLCBhbmdsZV9zdGVwKTtcblxuICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwidGhyb3VnaFwiIHRoZSBjYXBcbiAgICAgICAgICAgICAgICBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnJvdChhZmZpbmVfdXZDdXJyLCBhbmdsZV9zdGVwKTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMF0gPSBhZmZpbmVfdXZDdXJyWzBdICsgdXZDWzBdO1xuICAgICAgICAgICAgICAgIHV2Q3VyclsxXSA9IGFmZmluZV91dkN1cnJbMV0gKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlICsgdXZDWzFdOyAvLyBzY2FsZSB0aGUgdi1jb29yZGluYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcImFyb3VuZFwiIHRoZSBqb2luXG4gICAgICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLmFkZCh1dkN1cnIsIHV2X2RlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZCwgYmxhZGUsIHV2Q3VyciwgY29udGV4dCk7XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAyIDogMSkpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4KTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAxIDogMikpO1xuICAgIH1cbn1cblxuLy8gIGFkZEJldmVsICAgIEEgLS0tLS0gQlxuLy8gICAgICAgICAgICAgLyBcXCAgICAgLyBcXFxuLy8gICAgICAgICAgIC8gICAvXFwgICAvXFwgIFxcXG4vLyAgICAgICAgICAgICAgLyAgXFwgLyAgXFwgIFxcXG4vLyAgICAgICAgICAgICAgICAvIEMgXFxcbmZ1bmN0aW9uIGFkZEJldmVsIChjb29yZCwgbkEsIG5DLCBuQiwgdUEsIHVDLCB1QiwgY29udGV4dCkge1xuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdUEsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkIsIHVCLCBjb250ZXh0KTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdID4gMDtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmIChvcmllbnRhdGlvbikge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgfVxufVxuXG4vLyAgRnVuY3Rpb24gdG8gYWRkIHRoZSB2ZXJ0ZXggbmVlZCBmb3IgbGluZSBjYXBzLFxuLy8gIGJlY2F1c2UgcmUtdXNlIHRoZSBidWZmZXJzIG5lZWRzIHRvIGJlIGF0IHRoZSBlbmRcbmZ1bmN0aW9uIGFkZENhcCAoY29vcmQsIHYsIG5vcm1hbCwgdHlwZSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbmVnX25vcm1hbCA9IFZlY3Rvci5uZWcobm9ybWFsKTtcblxuICAgIHN3aXRjaCAodHlwZSl7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuc3F1YXJlOlxuICAgICAgICAgICAgdmFyIHRhbmdlbnQ7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpe1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbbm9ybWFsWzFdLCAtbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gWy1ub3JtYWxbMV0sIG5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUucm91bmQ6XG4gICAgICAgICAgICB2YXIgbkEsIG5CLCB1dkEsIHV2QiwgdXZDO1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgbkEgPSBub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBuZWdfbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5BID0gbmVnX25vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRGYW4oY29vcmQsXG4gICAgICAgICAgICAgICAgbkEsIHplcm9fdmVjMiwgbkIsXG4gICAgICAgICAgICAgICAgdXZBLCB1dkMsIHV2QixcbiAgICAgICAgICAgICAgICB0cnVlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5idXR0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxuLy8gQ2FsY3VsYXRlIG51bWJlciBvZiB0cmlhbmdsZXMgZm9yIGEgZmFuIGdpdmVuIGFuIGFuZ2xlIGFuZCBsaW5lIHdpZHRoXG5mdW5jdGlvbiB0cmlhbmdsZXNQZXJBcmMgKGFuZ2xlLCB3aWR0aCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgICAgYW5nbGUgPSAtYW5nbGU7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9ICh3aWR0aCA+IDIgKiBERUZBVUxULk1JTl9GQU5fV0lEVEgpID8gTWF0aC5sb2cyKHdpZHRoIC8gREVGQVVMVC5NSU5fRkFOX1dJRFRIKSA6IDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChhbmdsZSAvIE1hdGguUEkgKiBudW1UcmlhbmdsZXMpO1xufVxuXG4vLyBDeWNsaWNhbGx5IHBlcm11dGUgY2xvc2VkIGxpbmUgc3RhcnRpbmcgYXQgYW4gaW5kZXhcbmZ1bmN0aW9uIHBlcm11dGVMaW5lKGxpbmUsIHN0YXJ0SW5kZXgpe1xuICAgIHZhciBuZXdMaW5lID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIGluZGV4ID0gKGkgKyBzdGFydEluZGV4KSAlIGxpbmUubGVuZ3RoO1xuICAgICAgICAvLyBza2lwIHRoZSBmaXJzdCAocmVwZWF0ZWQpIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgbmV3TGluZS5wdXNoKGxpbmVbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXdMaW5lLnB1c2gobmV3TGluZVswXSk7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59IiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQge21hdDQsIG1hdDMsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuLy8gQWJzdHJhY3QgYmFzZSBjbGFzc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNhbWVyYSBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICBzdGF0aWMgY3JlYXRlKG5hbWUsIHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpc29tZXRyaWMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXNvbWV0cmljQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdmbGF0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsYXRDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ3BlcnNwZWN0aXZlJzpcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUoKSB7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uY2UgcGVyIGZyYW1lIHBlciBwcm9ncmFtIChlLmcuIGZvciBtYWluIHJlbmRlciBwYXNzLCB0aGVuIGZvciBlYWNoIGFkZGl0aW9uYWwgcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICB9XG5cbiAgICAvLyBTeW5jIGNhbWVyYSBwb3NpdGlvbi96b29tIHRvIHNjZW5lIHZpZXdcbiAgICB1cGRhdGVWaWV3ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gfHwgdGhpcy56b29tKSB7XG4gICAgICAgICAgICB2YXIgdmlldyA9IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2aWV3ID0geyBsbmc6IHRoaXMucG9zaXRpb25bMF0sIGxhdDogdGhpcy5wb3NpdGlvblsxXSwgem9vbTogdGhpcy5wb3NpdGlvblsyXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuem9vbSkge1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IG1vZGVsLXZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlc1xuICAgIHNldHVwTWF0cmljZXMgKG1hdHJpY2VzLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIE1vZGVsIHZpZXcgbWF0cml4IC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB2aWV3IHNwYWNlIChtZXRlcnMsIHJlbGF0aXZlIHRvIGNhbWVyYSlcbiAgICAgICAgbWF0NC5tdWx0aXBseShtYXRyaWNlcy5tb2RlbF92aWV3MzIsIHRoaXMudmlld19tYXRyaXgsIG1hdHJpY2VzLm1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbFZpZXcnLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuXG4gICAgICAgIC8vIE5vcm1hbCBtYXRyaWNlcyAtIHRyYW5zZm9ybXMgc3VyZmFjZSBub3JtYWxzIGludG8gdmlldyBzcGFjZVxuICAgICAgICBtYXQzLm5vcm1hbEZyb21NYXQ0KG1hdHJpY2VzLm5vcm1hbDMyLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuICAgICAgICBtYXQzLmludmVydChtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3Vfbm9ybWFsTWF0cml4JywgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X2ludmVyc2VOb3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gICAgUGVyc3BlY3RpdmUgbWF0cml4IHByb2plY3Rpb25cblxuICAgIFRoaXMgaXMgYSBzcGVjaWFsaXplZCBwZXJzcGVjdGl2ZSBjYW1lcmEgdGhhdCwgZ2l2ZW4gYSBkZXNpcmVkIGNhbWVyYSBmb2NhbCBsZW5ndGggKHdoaWNoIGNhbiBhbHNvIHZhcnkgYnkgem9vbSBsZXZlbCksXG4gICAgY29uc3RyYWlucyB0aGUgY2FtZXJhIGhlaWdodCBhYm92ZSB0aGUgZ3JvdW5kIHBsYW5lIHN1Y2ggdGhhdCB0aGUgZGlzcGxheWVkIGdyb3VuZCBhcmVhIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IG9mXG4gICAgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwLiBUaGlzIG1lYW5zIHlvdSBjYW4gc2V0IHRoZSBjYW1lcmEgbG9jYXRpb24gYnkgW2xhdCwgbG5nLCB6b29tXSBhcyB5b3Ugd291bGQgYSB0eXBpY2FsXG4gICAgd2ViIG1lcmNhdG9yIG1hcCwgdGhlbiBhZGp1c3QgdGhlIGZvY2FsIGxlbmd0aCBhcyBuZWVkZWQuXG5cbiAgICBWYW5pc2hpbmcgcG9pbnQgY2FuIGFsc28gYmUgYWRqdXN0ZWQgdG8gYWNoaWV2ZSBkaWZmZXJlbnQgXCJ2aWV3aW5nIGFuZ2xlc1wiLCBlLmcuIGluc3RlYWQgb2YgbG9va2luZyBzdHJhaWdodCBkb3duIGludG9cbiAgICB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydCwgdGhlIGNhbWVyYSBhcHBlYXJzIHRvIGJlIHRpbHRlZCBhdCBhbiBhbmdsZS4gRm9yIGV4YW1wbGU6XG5cbiAgICBbMCwgMF0gPSBsb29raW5nIHRvd2FyZHMgY2VudGVyIG9mIHZpZXdwb3J0XG4gICAgWy0yNTAsIC0yNTBdID0gbG9va2luZyAyNTAgcGl4ZWxzIGZyb20gdGhlIHZpZXdwb3J0IGNlbnRlciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXJcbiAgICBbNDAwLCAwXSA9IGxvb2tpbmcgNDAwIHBpeGVscyB0byB0aGUgcmlnaHQgb2YgdGhlIHZpZXdwb3J0IGNlbnRlclxuKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3BlcnNwZWN0aXZlJztcblxuICAgICAgICAvLyBhIHNpbmdsZSBzY2FsYXIsIG9yIHBhaXJzIG9mIHN0b3BzIG1hcHBpbmcgem9vbSBsZXZlbHMsIGUuZy4gW3pvb20sIGZvY2FsIGxlbmd0aF1cbiAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBvcHRpb25zLmZvY2FsX2xlbmd0aDtcbiAgICAgICAgdGhpcy5mb3YgPSBvcHRpb25zLmZvdjtcbiAgICAgICAgaWYgKCF0aGlzLmZvY2FsX2xlbmd0aCAmJiAhdGhpcy5mb3YpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZm9jYWwgbGVuZ3RoIHJhbmdlcyBieSB6b29tXG4gICAgICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IFtbMTYsIDJdLCBbMTcsIDIuNV0sIFsxOCwgM10sIFsxOSwgNF0sIFsyMCwgNl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSBvcHRpb25zLnZhbmlzaGluZ19wb2ludCB8fCBbMCwgMF07IC8vIFt4LCB5XVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IHRoaXMudmFuaXNoaW5nX3BvaW50Lm1hcChwYXJzZUZsb2F0KTsgLy8gd2UgaW1wbGljaXRseSBvbmx5IHN1cHBvcnQgcHggdW5pdHMgaGVyZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3ID0gW107XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbnN0cmFpbnMgdGhlIGNhbWVyYSBzbyB0aGF0IHRoZSB2aWV3YWJsZSBhcmVhIG1hdGNoZXMgZ2l2ZW4gdGhlIHZpZXdwb3J0IGhlaWdodFxuICAgIC8vIChpbiB3b3JsZCBzcGFjZSwgZS5nLiBtZXRlcnMpLCBnaXZlbiBlaXRoZXIgYSBjYW1lcmEgZm9jYWwgbGVuZ3RoIG9yIGZpZWxkLW9mLXZpZXdcbiAgICAvLyAoZm9jYWwgbGVuZ3RoIGlzIHVzZWQgaWYgYm90aCBhcmUgcGFzc2VkKS5cbiAgICBjb25zdHJhaW5DYW1lcmEoeyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9KSB7XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgaGVpZ2h0XG4gICAgICAgIGlmICghaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGZvY2FsIGxlbmd0aCwgY2FsY3VsYXRlIEZPVlxuICAgICAgICAgICAgaWYgKGZvY2FsX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBoYXZlIEZPViwgY2FsY3VsYXRlIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgZWxzZSBpZiAoZm92KSB7XG4gICAgICAgICAgICAgICAgZm92ID0gZm92ICogTWF0aC5QSSAvIDE4MDsgLy8gY29udmVydCBGT1YgZGVncmVlcyB0byByYWRpYW5zXG4gICAgICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMSAvIE1hdGgudGFuKGZvdiAvIDIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSB0aGF0IGNhbWVyYSBzaG91bGQgYmUgZnJvbSBncm91bmQgc3VjaCB0aGF0IGl0IGZpdHMgdGhlIGZpZWxkIG9mIHZpZXcgZXhwZWN0ZWRcbiAgICAgICAgICAgIC8vIGZvciBhIGNvbnZlbnRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgYW5kIGNhbWVyYSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGhlaWdodCA9IHZpZXdfaGVpZ2h0IC8gMiAqIGZvY2FsX2xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGZvY2FsIGxlbmd0aCAvIGZpZWxkLW9mLXZpZXdcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAyICogaGVpZ2h0IC8gdmlld19oZWlnaHQ7XG4gICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfTtcbiAgICB9XG5cbiAgICB1cGRhdGVNYXRyaWNlcygpIHtcbiAgICAgICAgLy8gVE9ETzogb25seSByZS1jYWxjdWxhdGUgdGhlc2UgdmFycyB3aGVuIG5lY2Vzc2FyeVxuXG4gICAgICAgIC8vIEhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gbWV0ZXJzIGF0IGN1cnJlbnQgem9vbVxuICAgICAgICB2YXIgdmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY2FtZXJhIHByb3BlcnRpZXMgdG8gZml0IGRlc2lyZWQgdmlld1xuICAgICAgICB2YXIgeyBoZWlnaHQsIGZvdiB9ID0gdGhpcy5jb25zdHJhaW5DYW1lcmEoe1xuICAgICAgICAgICAgdmlld19oZWlnaHQ6IHZpZXdwb3J0X2hlaWdodCxcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aDogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm9jYWxfbGVuZ3RoKSxcbiAgICAgICAgICAgIGZvdjogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm92KVxuICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVmlldyBtYXRyaXhcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIGhlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyguLi5wb3NpdGlvbiksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCBoZWlnaHQgLSAxKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG4gICAgICAgIC8vIEV4Y2x1ZGUgY2FtZXJhIGhlaWdodCBmcm9tIHZpZXcgbWF0cml4XG4gICAgICAgIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAwKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIC0xKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC5wZXJzcGVjdGl2ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCBmb3YsIHRoaXMudmlldy5hc3BlY3QsIDEsIGhlaWdodCAqIDIpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdmFuaXNoaW5nIHBvaW50IGZyb20gcGl4ZWxzIHRvIHZpZXdwb3J0IHNwYWNlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFswXSAvIHRoaXMudmlldy5zaXplLmNzcy53aWR0aDtcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzFdIC8gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodDtcblxuICAgICAgICAvLyBBZGp1c3QgcHJvamVjdGlvbiBtYXRyaXggdG8gaW5jbHVkZSB2YW5pc2hpbmcgcG9pbnQgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyOyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDI7IC8vIHogY29sdW1uIG9mIHkgcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBUcmFuc2xhdGUgZ2VvbWV0cnkgaW50byB0aGUgZGlzdGFuY2Ugc28gdGhhdCBjYW1lcmEgaXMgYXBwcm9wcmlhdGUgaGVpZ2h0IGFib3ZlIGdyb3VuZFxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGFkanVzdCB4eSB0byBjb21wZW5zYXRlIGZvciBhbnkgdmFuaXNoaW5nIHBvaW50IHNrZXcsIGUuZy4gbW92ZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBkaXNwbGF5ZWQgZ1xuICAgICAgICAvLyBwbGFuZSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBleHBlY3RlZCBieSBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhpcyBbbGF0LCBsbmcsIHpvb21dLlxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogdGhpcy52aWV3LmFzcGVjdCAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDIpLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMiksXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluY2x1ZGUgY2FtZXJhIGhlaWdodCBpbiBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgLWhlaWdodCkpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnBvc2l0aW9uX21ldGVyc1syXV0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcpO1xuICAgIH1cblxufVxuXG4vLyBJc29tZXRyaWMtc3R5bGUgcHJvamVjdGlvblxuLy8gTm90ZTogdGhpcyBpcyBhY3R1YWxseSBhbiBcImF4b25vbWV0cmljXCIgcHJvamVjdGlvbiwgYnV0IEknbSB1c2luZyB0aGUgY29sbG9xdWlhbCB0ZXJtIGlzb21ldHJpYyBiZWNhdXNlIGl0IGlzIG1vcmUgcmVjb2duaXphYmxlLlxuLy8gQW4gaXNvbWV0cmljIHByb2plY3Rpb24gaXMgYSBzcGVjaWZpYyBzdWJzZXQgb2YgYXhvbm9tZXRyaWMgcHJvamVjdGlvbnMuXG4vLyAnYXhpcycgZGV0ZXJtaW5lcyB0aGUgeHkgc2tldyBhcHBsaWVkIHRvIGEgdmVydGV4IGJhc2VkIG9uIGl0cyB6IGNvb3JkaW5hdGUsIGUuZy4gWzAsIDFdIGF4aXMgY2F1c2VzIGJ1aWxkaW5ncyB0byBiZSBkcmF3blxuLy8gc3RyYWlnaHQgdXB3YXJkcyBvbiBzY3JlZW4gYXQgdGhlaXIgdHJ1ZSBoZWlnaHQsIFswLCAuNV0gd291bGQgZHJhdyB0aGVtIHVwIGF0IGhhbGYtaGVpZ2h0LCBbMSwgMF0gd291bGQgYmUgc2lkZXdheXMsIGV0Yy5cbmNsYXNzIElzb21ldHJpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdpc29tZXRyaWMnO1xuICAgICAgICB0aGlzLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgeyB4OiAwLCB5OiAxIH07XG4gICAgICAgIGlmICh0aGlzLmF4aXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmF4aXMgPSB7IHg6IHRoaXMuYXhpc1swXSwgeTogdGhpcy5heGlzWzFdIH07IC8vIGFsbG93IGF4aXMgdG8gYWxzbyBiZSBwYXNzZWQgYXMgMi1lbGVtIGFycmF5XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICAgICAgLy8gcG9zaXRpb24ueHkgKz0gcG9zaXRpb24ueiAqIHVfaXNvbWV0cmljX2F4aXM7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIHogZm9yIGRlcHRoIGJ1ZmZlciBzbyB1cCBpcyBuZWdhdGl2ZSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgc2NhbGUgZG93biB2YWx1ZXMgc28gb2JqZWN0cyBoaWdoZXIgdGhhbiBvbmUgc2NyZWVuIGhlaWdodCB3aWxsIG5vdCBnZXQgY2xpcHBlZFxuICAgICAgICAgICAgICAgIC8vIHB1bGwgZm9yd2FyZCBzbGlnaHRseSB0byBhdm9pZCBnb2luZyBwYXN0IGZhciBjbGlwcGluZyBwbGFuZVxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnogPSAtcG9zaXRpb24ueiAvIDEwMC4gKyAxLiAtIDAuMDAxO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFZpZXdcbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnZpZXdfbWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy52aWV3X21hdHJpeCwgdGhpcy52aWV3X21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKC1wb3NpdGlvblswXSwgLXBvc2l0aW9uWzFdLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvblxuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIC8vIGFwcGx5IGlzb21ldHJpYyBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSB0aGlzLmF4aXMueCAvIHRoaXMudmlldy5hc3BlY3Q7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IHRoaXMuYXhpcy55OyAgICAgICAgICAgICAgICAgICAgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIGNvbnZlcnQgbWV0ZXJzIHRvIHZpZXdwb3J0XG4gICAgICAgIG1hdDQuc2NhbGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLngsXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfZXllJywgWzAsIDAsIHRoaXMudmlld3BvcnRfaGVpZ2h0XSk7XG4gICAgICAgIC8vIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy54LCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgWzAsIDBdKTtcbiAgICB9XG5cbn1cblxuLy8gRmxhdCBwcm9qZWN0aW9uIChlLmcuIGp1c3QgdG9wLWRvd24sIG5vIHBlcnNwZWN0aXZlKSAtIGEgZGVnZW5lcmF0ZSBpc29tZXRyaWMgY2FtZXJhXG5jbGFzcyBGbGF0Q2FtZXJhIGV4dGVuZHMgSXNvbWV0cmljQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2ZsYXQnO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gQXhpcyBpcyBmaXhlZCB0byAoMCwgMCkgZm9yIGZsYXQgY2FtZXJhXG4gICAgICAgIHRoaXMuYXhpcy54ID0gMDtcbiAgICAgICAgdGhpcy5heGlzLnkgPSAwO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgIH1cblxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyBnZW8gZnVuY3Rpb25zXG5cbnZhciBHZW87XG5leHBvcnQgZGVmYXVsdCBHZW8gPSB7fTtcblxuLy8gUHJvamVjdGlvbiBjb25zdGFudHNcbkdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbSA9IDE4O1xuR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSA9IDIwO1xuR2VvLnRpbGVfc2l6ZSA9IDI1Njtcbkdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzID0gMjAwMzc1MDguMzQyNzg5MjQ0O1xuR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzID0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgKiAyO1xuR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgPSBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBHZW8udGlsZV9zaXplOyAvLyBtaW4gem9vbSBkcmF3cyB3b3JsZCBhcyAyIHRpbGVzIHdpZGVcblxubGV0IG1ldGVyc19wZXJfcGl4ZWwgPSBbXTtcbkdlby5tZXRlcnNQZXJQaXhlbCA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl9waXhlbFt6XSA9IG1ldGVyc19wZXJfcGl4ZWxbel0gfHwgR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl9waXhlbFt6XTtcbn07XG5cbmxldCBtZXRlcnNfcGVyX3RpbGUgPSBbXTtcbkdlby5tZXRlcnNQZXJUaWxlID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3RpbGVbel0gPSBtZXRlcnNfcGVyX3RpbGVbel0gfHwgR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfdGlsZVt6XTtcbn07XG5cbi8vIENvbnZlcnNpb24gZnVuY3Rpb25zIGJhc2VkIG9uIGFuIGRlZmluZWQgdGlsZSBzY2FsZVxuR2VvLnRpbGVfc2NhbGUgPSA0MDk2OyAvLyBjb29yZGluYXRlcyBhcmUgbG9jYWxseSBzY2FsZWQgdG8gdGhlIHJhbmdlIFswLCB0aWxlX3NjYWxlXVxuR2VvLnVuaXRzX3Blcl9waXhlbCA9IEdlby50aWxlX3NjYWxlIC8gR2VvLnRpbGVfc2l6ZTtcbkdlby5oZWlnaHRfc2NhbGUgPSAxNjsgIC8vIHByb3ZpZGVzIHN1Yi1tZXRlciBwcmVjaXNpb24gZm9yIGhlaWdodCB2YWx1ZXMgKDE2dGhzIG9mIGEgbWV0ZXJzKVxuXG5sZXQgdW5pdHNfcGVyX21ldGVyID0gW107XG5HZW8udW5pdHNQZXJNZXRlciA9IGZ1bmN0aW9uICh6KSB7XG4gICAgdW5pdHNfcGVyX21ldGVyW3pdID0gdW5pdHNfcGVyX21ldGVyW3pdIHx8IEdlby50aWxlX3NjYWxlIC8gKEdlby50aWxlX3NpemUgKiBHZW8ubWV0ZXJzUGVyUGl4ZWwoeikpO1xuICAgIHJldHVybiB1bml0c19wZXJfbWV0ZXJbel07XG59O1xuXG4vLyBDb252ZXJ0IHRpbGUgbG9jYXRpb24gdG8gbWVyY2F0b3IgbWV0ZXJzIC0gbXVsdGlwbHkgYnkgcGl4ZWxzIHBlciB0aWxlLCB0aGVuIGJ5IG1ldGVycyBwZXIgcGl4ZWwsIGFkanVzdCBmb3IgbWFwIG9yaWdpblxuR2VvLm1ldGVyc0ZvclRpbGUgPSBmdW5jdGlvbiAodGlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRpbGUueCAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyxcbiAgICAgICAgeTogLSh0aWxlLnkgKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpXG4gICAgfTtcbn07XG5cbi8qKlxuICAgR2l2ZW4gYSBwb2ludCBpbiBtZXJjYXRvciBtZXRlcnMgYW5kIGEgem9vbSBsZXZlbCwgcmV0dXJuIHRoZSB0aWxlIFgvWS9aIHRoYXQgdGhlIHBvaW50IGxpZXMgaW5cbiovXG5HZW8udGlsZUZvck1ldGVycyA9IGZ1bmN0aW9uIChbeCwgeV0sIHpvb20pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBNYXRoLmZsb29yKCh4ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHk6IE1hdGguZmxvb3IoKC15ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHo6IHpvb21cbiAgICB9O1xufTtcblxuLy8gV3JhcCBhIHRpbGUgdG8gcG9zaXRpdmUgI3MgZm9yIHpvb21cbi8vIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYXhlcyB0byB3cmFwXG5HZW8ud3JhcFRpbGUgPSBmdW5jdGlvbih7IHgsIHksIHogfSwgbWFzayA9IHsgeDogdHJ1ZSwgeTogZmFsc2UgfSkge1xuICAgIHZhciBtID0gKDEgPDwgeikgLSAxO1xuICAgIGlmIChtYXNrLngpIHtcbiAgICAgICAgeCA9IHggJiBtO1xuICAgIH1cbiAgICBpZiAobWFzay55KSB7XG4gICAgICAgIHkgPSB5ICYgbTtcbiAgICB9XG4gICAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufTtcblxuLyoqXG4gICBDb252ZXJ0IG1lcmNhdG9yIG1ldGVycyB0byBsYXQtbG5nXG4qL1xuR2VvLm1ldGVyc1RvTGF0TG5nID0gZnVuY3Rpb24gKFt4LCB5XSkge1xuXG4gICAgeCAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcbiAgICB5IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgeSA9ICgyICogTWF0aC5hdGFuKE1hdGguZXhwKHkgKiBNYXRoLlBJKSkgLSAoTWF0aC5QSSAvIDIpKSAvIE1hdGguUEk7XG5cbiAgICB4ICo9IDE4MDtcbiAgICB5ICo9IDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG4vKipcbiAgQ29udmVydCBsYXQtbG5nIHRvIG1lcmNhdG9yIG1ldGVyc1xuKi9cbkdlby5sYXRMbmdUb01ldGVycyA9IGZ1bmN0aW9uKFt4LCB5XSkge1xuXG4gICAgLy8gTGF0aXR1ZGVcbiAgICB5ID0gTWF0aC5sb2coTWF0aC50YW4oeSpNYXRoLlBJLzM2MCArIE1hdGguUEkvNCkpIC8gTWF0aC5QSTtcbiAgICB5ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgLy8gTG9uZ2l0dWRlXG4gICAgeCAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAvIDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG5HZW8ud3JhcExuZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA+IDE4MCB8fCB4IDwgLTE4MCkge1xuICAgICAgICB4ID0gKCh4ICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgfVxuICAgIHJldHVybiB4O1xufTtcblxuLy8gUnVuIGFuIGluLXBsYWNlIHRyYW5zZm9ybSBmdW5jdGlvbiBvbiBlYWNoIGNvb29yZGluYXRlIGluIGEgR2VvSlNPTiBnZW9tZXRyeVxuR2VvLnRyYW5zZm9ybUdlb21ldHJ5ID0gZnVuY3Rpb24gKGdlb21ldHJ5LCB0cmFuc2Zvcm0pIHtcbiAgICBpZiAoZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47IC8vIHNraXAgaWYgbWlzc2luZyBnZW9tZXRyeSAodmFsaWQgR2VvSlNPTilcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICB0cmFuc2Zvcm0oZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChwb2x5Z29uID0+IHtcbiAgICAgICAgICAgIHBvbHlnb24uZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogc3VwcG9ydCBHZW9tZXRyeUNvbGxlY3Rpb25cbn07XG5cbkdlby5ib3hJbnRlcnNlY3QgPSBmdW5jdGlvbiAoYjEsIGIyKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICAgIGIyLnN3LnggPiBiMS5uZS54IHx8XG4gICAgICAgIGIyLm5lLnggPCBiMS5zdy54IHx8XG4gICAgICAgIGIyLnN3LnkgPiBiMS5uZS55IHx8XG4gICAgICAgIGIyLm5lLnkgPCBiMS5zdy55XG4gICAgKTtcbn07XG5cbi8vIEZpbmRzIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGZvciBhIHBvbHlnb25cbkdlby5maW5kQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHZhciBtaW5feCA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWluX3kgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3kgPSAtSW5maW5pdHk7XG5cbiAgICAvLyBPbmx5IG5lZWQgdG8gZXhhbWluZSBvdXRlciByaW5nIChwb2x5Z29uWzBdKVxuICAgIHZhciBudW1fY29vcmRzID0gcG9seWdvblswXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgYz0wOyBjIDwgbnVtX2Nvb3JkczsgYysrKSB7XG4gICAgICAgIHZhciBjb29yZCA9IHBvbHlnb25bMF1bY107XG5cbiAgICAgICAgaWYgKGNvb3JkWzBdIDwgbWluX3gpIHtcbiAgICAgICAgICAgIG1pbl94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdIDwgbWluX3kpIHtcbiAgICAgICAgICAgIG1pbl95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzBdID4gbWF4X3gpIHtcbiAgICAgICAgICAgIG1heF94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdID4gbWF4X3kpIHtcbiAgICAgICAgICAgIG1heF95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XTtcbn07XG5cbi8vIENvbnZlcnQgZ2VvbWV0cnkgdHlwZSB0byBvbmUgb2Y6ICdwb2ludCcsICdsaW5lJywgJ3BvbHlnb24nXG5HZW8uZ2VvbWV0cnlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmV0dXJuICdwb2x5Z29uJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnbGluZSc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICByZXR1cm4gJ3BvaW50JztcbiAgICB9XG59O1xuXG5HZW8uY2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2Jsb2IvYzEwZjQwNWExMTIxNDJiMTk3ODU5NjdjZTBlMTQyMTMyYTYwOTVhZC9zcmMvbGF5ZXIvdmVjdG9yL1BvbHlnb24uanMjTDU3XG4gICAgbGV0IHggPSAwLCB5ID0gMCwgYXJlYSA9IDA7XG4gICAgbGV0IHJpbmcgPSBwb2x5Z29uWzBdOyAvLyBvbmx5IHVzZSBmaXJzdCByaW5nIGZvciBub3dcbiAgICBsZXQgbGVuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpLCBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tqXTtcbiAgICAgICAgbGV0IGYgPSBwMFsxXSAqIHAxWzBdIC0gcDFbMV0gKiBwMFswXTtcblxuICAgICAgICB4ICs9IChwMFswXSArIHAxWzBdKSAqIGY7XG4gICAgICAgIHkgKz0gKHAwWzFdICsgcDFbMV0pICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG5cbiAgICByZXR1cm4gW3ggLyBhcmVhLCB5IC8gYXJlYV07XG59O1xuXG5HZW8ubXVsdGlDZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBuID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGxldCBjZW50cm9pZCA9IFswLCAwXTtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGxldCBjID0gR2VvLmNlbnRyb2lkKHBvbHlnb25zW3BdKTtcbiAgICAgICAgY2VudHJvaWRbMF0gKz0gY1swXTtcbiAgICAgICAgY2VudHJvaWRbMV0gKz0gY1sxXTtcbiAgICB9XG5cbiAgICBjZW50cm9pZFswXSAvPSBuO1xuICAgIGNlbnRyb2lkWzFdIC89IG47XG5cbiAgICByZXR1cm4gY2VudHJvaWQ7XG59O1xuXG5HZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2krMV07XG5cbiAgICAgICAgYXJlYSArPSBwMFswXSAqIHAxWzFdIC0gcDFbMF0gKiBwMFsxXTtcbiAgICB9XG5cbiAgICBhcmVhICs9IHJpbmdbbiAtIDFdWzBdICogcmluZ1swXVsxXSAtIHJpbmdbMF1bMF0gKiByaW5nW24gLSAxXVsxXTtcbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5wb2x5Z29uUmluZ0FyZWEgPSBmdW5jdGlvbiAocmluZykge1xuICAgIHJldHVybiBNYXRoLmFicyhHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpKSAvIDI7XG59O1xuXG4vLyBUT0RPOiBzdWJ0cmFjdCBpbm5lciByaW5nc1xuR2VvLnBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICByZXR1cm4gR2VvLnBvbHlnb25SaW5nQXJlYShwb2x5Z29uWzBdKTtcbn07XG5cbkdlby5tdWx0aVBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgYXJlYSArPSBHZW8ucG9seWdvbkFyZWEocG9seWdvbnNbcF0pO1xuICAgIH1cblxuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnJpbmdXaW5kaW5nID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZyk7XG4gICAgaWYgKGFyZWEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnQ1cnO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmVhIDwgMCkge1xuICAgICAgICByZXR1cm4gJ0NDVyc7XG4gICAgfVxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgb24gemVybyBhcmVhIHBvbHlnb25cbn07XG5cbi8vIEVuZm9yY2Ugd2luZGluZyBvcmRlciBvbiBvdXRlci9pbm5lciByaW5nc1xuLy8gd2luZGluZzogJ0NXJyBvciAnQ0NXJ1xuR2VvLmVuZm9yY2VXaW5kaW5nID0gZnVuY3Rpb24gKGdlb20sIHdpbmRpbmcpIHtcbiAgICBsZXQgcG9seXM7XG4gICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHBvbHlzID0gW2dlb20uY29vcmRpbmF0ZXNdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHBvbHlzID0gZ2VvbS5jb29yZGluYXRlcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBnZW9tO1xuICAgIH1cblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGxldCBwb2x5ID0gcG9seXNbcF07XG5cbiAgICAgICAgLy8gSWYgZmlyc3QgcmluZyB3aW5kaW5nIGRvZXNuJ3QgbWF0Y2gsIHJldmVyc2UgYWxsIHJpbmdzXG4gICAgICAgIC8vIE5PVEU6IGFzc3VtZXMgcmluZyB3aW5kaW5nIG9yZGVycyBhbHJlYWR5IGFsdGVybmF0ZSBhcyBleHBlY3RlZFxuICAgICAgICBpZiAoR2VvLnJpbmdXaW5kaW5nKHBvbHlbMF0pICE9PSB3aW5kaW5nKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByaW5nIG9mIHBvbHkpIHtcbiAgICAgICAgICAgICAgICByaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2VvbTtcbn07XG4iLCIvLyBXZWJHTCBjb25zdGFudHMgLSBuZWVkIHRvIGltcG9ydCB0aGVzZSBzZXBhcmF0ZWx5IHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgaW4gdGhlIHdlYiB3b3JrZXJcblxudmFyIGdsO1xuZXhwb3J0IGRlZmF1bHQgZ2wgPSB7fTtcblxuLyogRGF0YVR5cGUgKi9cbmdsLkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDtcbmdsLlVOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICA9IDB4MTQwMTtcbmdsLlNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMjtcbmdsLlVOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICA9IDB4MTQwMztcbmdsLklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNDtcbmdsLlVOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICA9IDB4MTQwNTtcbmdsLkZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjtcbiIsIi8vIFdlYkdMIGNvbnRleHQgd3JhcHBlclxuXG52YXIgQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IENvbnRleHQgPSB7fTtcblxuLy8gU2V0dXAgYSBXZWJHTCBjb250ZXh0XG4vLyBJZiBubyBjYW52YXMgZWxlbWVudCBpcyBwcm92aWRlZCwgb25lIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5XG5Db250ZXh0LmdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0IChjYW52YXMsIG9wdGlvbnMpXG57XG4gICAgdmFyIGZ1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICBpZiAoY2FudmFzID09IG51bGwpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSAtMTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRpb25zKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgb3B0aW9ucyk7XG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFmdWxsc2NyZWVuKSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS53aWR0aCksIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLmhlaWdodCksIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2w7XG59O1xuXG5Db250ZXh0LnJlc2l6ZSA9IGZ1bmN0aW9uIChnbCwgd2lkdGgsIGhlaWdodCwgZGV2aWNlX3BpeGVsX3JhdGlvKVxue1xuICAgIGRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbyB8fCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgIGdsLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBnbC5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICBnbC5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbn07XG4iLCIvLyBXZWJHTCBleHRlbnNpb24gd3JhcHBlclxuLy8gU3RvcmVzIGV4dGVuc2lvbnMgYnkgbmFtZSBhbmQgR0wgY29udGV4dFxuXG5sZXQgZXh0ZW5zaW9ucyA9IG5ldyBNYXAoKTsgLy8gbWFwIG9mIGV4dGVuc2lvbnMgYnkgR0wgY29udGV4dFxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFeHRlbnNpb24gKGdsLCBuYW1lKSB7XG4gICAgbGV0IGV4dHMgPSBleHRlbnNpb25zLmdldChnbCk7XG4gICAgaWYgKCFleHRzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMuc2V0KGdsLCBuZXcgTWFwKCkpO1xuICAgICAgICBleHRzID0gZXh0ZW5zaW9ucy5nZXQoZ2wpO1xuICAgIH1cblxuICAgIGlmICghZXh0cy5nZXQobmFtZSkpIHtcbiAgICAgICAgZXh0cy5zZXQobmFtZSwgZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHMuZ2V0KG5hbWUpO1xufVxuIiwidmFyIEdMU0wgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IEdMU0w7XG5cbi8qKlxuICAgIFBhcnNlIHVuaWZvcm1zIGZyb20gYSBKUyBvYmplY3QsIGluZmVycyB0eXBlcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggdGhlXG4gICAgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIHNldCB1bmlmb3JtIHZhbHVlcyBvbiBhIEdMIHByb2dyYW0uIEVhY2ggb2JqZWN0IGluIHRoZSByZXR1cm5lZFxuICAgIGFycmF5IGhhcyB0aGUgZm9ybTpcbiAgICB7IHR5cGUsIG1ldGhvZCwgbmFtZSwgdmFsdWUgfVxuXG4gICAgdHlwZTogdGhlIEdMIHVuaWZvcm0gdHlwZSwgc3VjaCBhcyAndmVjMycsICdmbG9hdCcsIGV0Yy5cbiAgICBtZXRob2Q6IHRoZSBHTCB1bmlmb3JtIHNldHRlciBtZXRob2QgdG8gdXNlLCBzdWNoIGFzICcxZicsICczZnYnLCBldGMuXG4gICAgbmFtZTogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBHTCB1bmlmb3JtIGxvY2F0aW9uLCBlLmcuICdhcnJheVswXS5maWVsZCcsIGV0Yy5cbiAgICB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgZm9yIHRoYXQgdHlwZSwgZS5nLiBbMSwgMiwgM10gZm9yIGEgdmVjM1xuXG4gICAgVGV4dHVyZXMgaGF2ZSBzcGVjaWFsIGJlaGF2aW9yOiB1bmlmb3JtcyB3aXRoIHN0cmluZyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgdGV4dHVyZXMsIGFuZFxuICAgIHRoZSBzdHJpbmcgaXMgdXNlZCBhcyBhIHVuaXF1ZSB0ZXh0dXJlICdrZXknIHRvIGJlIGludGVycHJldGVkIGJ5IHRoZSBjYWxsZXIgKHdoaWNoIGlzIHJlc3BvbnNpYmxlXG4gICAgZm9yIGFjdHVhbGx5IHNldHRpbmcgdGhlIHVuaWZvcm1zKS4gRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCBhcyBhIGtleSBpbnRvIGEgZGljdGlvbmFyeSBvZlxuICAgIGtub3duIHRleHR1cmUgbmFtZXMsIG9yIGl0IGNvdWxkIHNpbXBseSBiZSB1c2VkIGFzIGEgVVJMIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIHRleHR1cmUgZnJvbS5cbiovXG5HTFNMLnBhcnNlVW5pZm9ybXMgPSBmdW5jdGlvbiAodW5pZm9ybXMpIHtcbiAgICB2YXIgcGFyc2VkID0gW107XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgIHZhciBrZXkgPSBuYW1lOyAvLyBzYXZlIHRoZSBvcmlnaW5hbCBuYW1lXG4gICAgICAgIHZhciB1bmlmb3JtID0gdW5pZm9ybXNbbmFtZV07XG4gICAgICAgIHZhciB1O1xuXG4gICAgICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZicsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5OiB2ZWN0b3IsIGFycmF5IG9mIGZsb2F0cywgYXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtKSkge1xuICAgICAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtLmxlbmd0aCA+PSAyICYmIHVuaWZvcm0ubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZlYycgKyB1bmlmb3JtLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodW5pZm9ybS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdFtdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1swXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhc3N1bWUgbWF0cml4IGZvciAodHlwZW9mID09IEZsb2F0MzJBcnJheSAmJiBsZW5ndGggPT0gMTYpP1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2FtcGxlcjJEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMgLSBidXQgb25seSBhcnJheXMgb2YgdmVjdG9ycyBhcmUgYWxsb3dlZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybVswXSkgJiYgdHlwZW9mIHVuaWZvcm1bMF1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybVswXS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtWzBdLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgZm9yICh1PTA7IHUgPCB1bmlmb3JtLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZlYycgKyB1bmlmb3JtWzBdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm1bdV0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVt1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogZWxzZSB3YXJuaW5nXG4gICAgICAgIH1cbiAgICAgICAgLy8gQm9vbGVhblxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2wnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGV4dHVyZVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2FtcGxlcjJEJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8qKlxuICAgIEdlbmVyYXRlIGEgR0xTTCB2YXJpYWJsZSBkZWZpbml0aW9uIGZyb20gYSBKUyBvYmplY3RcbiovXG5HTFNMLmRlZmluZVZhcmlhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHR5cGUsIGFycmF5O1xuXG4gICAgLy8gU2luZ2xlIGZsb2F0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdHlwZSA9ICdmbG9hdCc7XG4gICAgfVxuICAgIC8vIE11bHRpcGxlIGZsb2F0cyAtIHZlY3RvciBvciBhcnJheVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyICYmIHZhbHVlLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICd2ZWMnICsgdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmxvYXQgYXJyYXlcbiAgICAgICAgICAgIGVsc2UgeyAvL2lmICh2YWx1ZS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdmbG9hdCc7XG4gICAgICAgICAgICAgICAgYXJyYXkgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBhc3N1bWUgbWF0cml4IGZvciAodHlwZW9mID09IEZsb2F0MzJBcnJheSAmJiBsZW5ndGggPT0gMTYpP1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJztcbiAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJvb2xlYW5cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0eXBlID0gJ2Jvb2wnO1xuICAgIH1cbiAgICAvLyBUZXh0dXJlXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHZhcmlhYmxlIGRlZmluaXRpb25cbiAgICB2YXIgdmFyaWFibGUgPSAnJztcbiAgICB2YXJpYWJsZSArPSBgJHt0eXBlfSAke25hbWV9YDtcbiAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgdmFyaWFibGUgKz0gYFske2FycmF5fV1gO1xuICAgIH1cbiAgICB2YXJpYWJsZSArPSAnO1xcbic7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdW5pZm9ybSBkZWZpbml0aW9uIGZyb20gYSBKUyBvYmplY3RcbiovXG5HTFNMLmRlZmluZVVuaWZvcm0gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gJ3VuaWZvcm0gJyArIEdMU0wuZGVmaW5lVmFyaWFibGUobmFtZSwgdmFsdWUpO1xufTtcblxuLyoqXG4gICAgQ2hlY2sgZm9yIGEgdW5pZm9ybSBkZWZpbml0aW9uIG9mICduYW1lJyBpbiB0aGUgcHJvdmlkZWQgR0xTTCBzb3VyY2VcbiAgICBTaW1wbGUgcmVnZXggY2hlY2sgZm9yICd1bmlmb3JtJyBrZXl3b3JkIGFuZCB2YXIgbmFtZSwgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZS9leHRyYWN0IEdMU0xcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNVbmlmb3JtRGVmaW5lZCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICAvLyBNYXRjaCwgaW4gb3JkZXI6XG4gICAgLy8gLSB0aGUga2V5d29yZCAndW5pZm9ybSdcbiAgICAvLyAtIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgdGhhdCBpcyBhbnl0aGluZyBleGNlcHQgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueXRoaW5nIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcywgeyAuLi4gfSAoYW4gaW5saW5lIHN0cnVjdHVyZSBkZWZpbml0aW9uIGNhbiBnbyBoZXJlKVxuICAgIC8vIC0gb3B0aW9uYWxseSwgYW55ICMgb2YgY2hhcmFjdGVycyB0aGF0IGlzIG5vdCBhIHNlbWljb2xvbiwgO1xuICAgIC8vIC0gdGhlIG5hbWUgb2YgdGhlIHVuaWZvcm1cblxuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ3VuaWZvcm1bXjtdKyg/OntbXFxcXHNcXFxcU10qfSk/W147XSpcXFxcYicgKyBuYW1lICsgJ1xcXFxiJywgJ2cnKTtcbiAgICBpZiAoc291cmNlLm1hdGNoKHJlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gICAgQ2hlY2sgdGhhdCBhIHN5bWJvbCBpcyByZWZlcmVuY2VkIGluIHRoZSBHTFNMIHNvdXJjZVxuICAgIE5PVEU6IGFzc3VtZXMgY29tbWVudHMgaGF2ZSBiZWVuIHN0cmlwcGVkIGZyb20gc291cmNlXG4qL1xuR0xTTC5pc1N5bWJvbFJlZmVyZW5jZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5zZWFyY2gocmUpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAyLWVsZW1lbnQgYXJyYXkgaW50byBhIDMtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoIHogKVxuICAgIGNvb3JkaW5hdGUgZGVmYXVsdGluZyB0byAxICh3aXRoIG9wdGlvbiB0byBzcGVjaWZ5KS4gQWxzbyBydW5zIHBhcnNlRmxvYXQgdG8gdHJ5IHRvIG1haW50YWluXG4gICAgZGF0YSBpbnRlZ3JpdHkuIFJldHVybnMgbnVsbCBpZiBpbnB1dCBjb3VsZG4ndCBiZSBwYXJzZWQuXG4qL1xuR0xTTC5leHBhbmRWZWMzID0gZnVuY3Rpb24gKHYsIHogPSAxKSB7XG4gICAgbGV0IHg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB4ID0gWy4uLnYsIHpdLm1hcChwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB4ID0gW3YsIHYsIHZdLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBpZiAoeCAmJiB4LmV2ZXJ5KG4gPT4gdHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxufTtcblxuLyoqXG4gICAgRXhwYW5kIGEgc2luZ2xlIHZhbHVlIG9yIDMtZWxlbWVudCBhcnJheSBpbnRvIGEgNC1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBsYXN0IChlLmcuIHcgb3IgYSlcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjNCA9IGZ1bmN0aW9uICh2LCB3ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB3XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2LCB3XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cblxuIiwiXG5leHBvcnQgY2xhc3MgUmVuZGVyU3RhdGUge1xuXHRjb25zdHJ1Y3RvciAodmFsdWUsIHNldHVwKSB7XG4gICAgICAgIHNldHVwKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7XG4gICAgfVxuXG4gICAgc2V0ICh2YWx1ZSkge1xuICAgIFx0Ly8gaWYgdGhlIHN0YXRlcyBhcmUgZGlmZmVyZW50LCBjYWxsIHRoZSBHTCBjb250ZXh0IGZvciBhIHN0YXRlIGNoYW5nZVxuICAgIFx0aWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHtcbiAgICBcdFx0dGhpcy5zZXR1cCh2YWx1ZSk7XG4gICAgXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBcdH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlclN0YXRlTWFuYWdlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZ2wpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHt9O1xuXG4gICAgICAgIC8vIEN1bGxpbmdcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5jdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgPSBnbC5CQUNLO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmMgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdCA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjX2FscGhhID0gZ2wuT05FO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYSA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG5cbiAgICAgICAgLy8gRGVwdGggdGVzdC93cml0ZVxuICAgICAgICB0aGlzLmRlZmF1bHRzLmRlcHRoX3dyaXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0ID0gdHJ1ZTtcbiAgICAgICAgZ2wuZGVwdGhGdW5jKGdsLkxFU1MpOyAvLyBkZXB0aCBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvIGJlIHNldCBvbmNlXG5cbiAgICBcdC8vIEN1bGxpbmdcbiAgICAgICAgdGhpcy5jdWxsaW5nID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBjdWxsOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmcsIGZhY2U6IHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlIH0sXG4gICAgXHRcdCh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5jdWxsKSB7XG4gICAgXHRcdFx0XHRnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgICAgIFx0XHRnbC5jdWxsRmFjZSh2YWx1ZS5mYWNlKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgIFx0XHRcdFx0Z2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gQmxlbmRpbmcgbW9kZVxuICAgICAgICB0aGlzLmJsZW5kaW5nID0gbmV3IFJlbmRlclN0YXRlKHtcbiAgICAgICAgICAgICAgICBibGVuZDogdGhpcy5kZWZhdWx0cy5ibGVuZGluZyxcbiAgICAgICAgICAgICAgICBzcmM6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjLFxuICAgICAgICAgICAgICAgIGRzdDogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QsXG4gICAgICAgICAgICAgICAgc3JjX2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSxcbiAgICAgICAgICAgICAgICBkc3RfYWxwaGE6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0X2FscGhhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmJsZW5kKSB7XG4gICAgICAgICAgICBcdFx0Z2wuZW5hYmxlKGdsLkJMRU5EKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3JjX2FscGhhICYmIHZhbHVlLmRzdF9hbHBoYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUodmFsdWUuc3JjLCB2YWx1ZS5kc3QsIHZhbHVlLnNyY19hbHBoYSwgdmFsdWUuZHN0X2FscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuYyh2YWx1ZS5zcmMsIHZhbHVlLmRzdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgIFx0XHRcdFx0Z2wuZGlzYWJsZShnbC5CTEVORCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB3cml0ZVxuICAgICAgICB0aGlzLmRlcHRoX3dyaXRlID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBkZXB0aF93cml0ZTogdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICAgICAgXHRcdGdsLmRlcHRoTWFzayh2YWx1ZS5kZXB0aF93cml0ZSk7XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIERlcHRoIHRlc3RcbiAgICAgICAgdGhpcy5kZXB0aF90ZXN0ID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBkZXB0aF90ZXN0OiB0aGlzLmRlZmF1bHRzLmRlcHRoX3Rlc3QgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5kZXB0aF90ZXN0KSB7XG4gICAgICAgICAgICBcdFx0Z2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgICAgICAgICBcdFx0Z2wuZGlzYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICB9XG5cbn1cbiIsIi8vIEdMIHByb2dyYW0gd3JhcHBlciB0byBjYWNoZSB1bmlmb3JtIGxvY2F0aW9ucy92YWx1ZXMsIGRvIGNvbXBpbGUtdGltZSBwcmUtcHJvY2Vzc2luZ1xuLy8gKGluamVjdGluZyAjZGVmaW5lcyBhbmQgI3ByYWdtYSBibG9ja3MgaW50byBzaGFkZXJzKSwgZXRjLlxuXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsc2wnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCBnZXRFeHRlbnNpb24gZnJvbSAnLi9leHRlbnNpb25zJztcblxuaW1wb3J0IHN0cmlwIGZyb20gJ3N0cmlwLWNvbW1lbnRzJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgcGFyc2VTaGFkZXJFcnJvcnMgfSBmcm9tICdnbC1zaGFkZXItZXJyb3JzJztcblxuLy8gUmVnZXggcGF0dGVybnNcbmNvbnN0IHJlX3ByYWdtYSA9IC9eXFxzKiNwcmFnbWEuKiQvZ207ICAgLy8gZm9yIHJlbW92aW5nIHVudXNlZCBwcmFnbWFzIGFmdGVyIHNoYWRlciBibG9jayBpbmplY3Rpb25cbmNvbnN0IHJlX2NvbnRpbnVlX2xpbmUgPSAvXFxcXFxccypcXG4vbWc7ICAgLy8gZm9yIHJlbW92aW5nIGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hhZGVyUHJvZ3JhbSB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgdmVydGV4X3NvdXJjZSwgZnJhZ21lbnRfc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgICAgICAvLyBrZXkvdmFsdWVzIGluc2VydGVkIGFzICNkZWZpbmVzIGludG8gc2hhZGVycyBhdCBjb21waWxlLXRpbWVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5kZWZpbmVzfHx7fSk7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBmb3IgYmxvY2tzIHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gc2hhZGVycyBhdCBjb21waWxlLXRpbWVcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2Nrc3x8e30pO1xuICAgICAgICB0aGlzLmJsb2NrX3Njb3BlcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuYmxvY2tfc2NvcGVzfHx7fSk7XG5cbiAgICAgICAgLy8gbGlzdCBvZiBleHRlbnNpb25zIHRvIGFjdGl2YXRlXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCBbXTtcblxuICAgICAgICAvLyBKUy1vYmplY3QgdW5pZm9ybXMgdGhhdCBhcmUgZXhwZWN0ZWQgYnkgdGhpcyBwcm9ncmFtXG4gICAgICAgIC8vIElmIHRoZXkgYXJlIG5vdCBmb3VuZCBpbiB0aGUgZXhpc3Rpbmcgc2hhZGVyIHNvdXJjZSwgdGhlaXIgdHlwZXMgd2lsbCBiZSBpbmZlcnJlZCBhbmQgZGVmaW5pdGlvbnNcbiAgICAgICAgLy8gZm9yIGVhY2ggd2lsbCBiZSBpbmplY3RlZC5cbiAgICAgICAgdGhpcy5kZXBlbmRlbnRfdW5pZm9ybXMgPSBvcHRpb25zLnVuaWZvcm1zO1xuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdW5pZm9ybXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIHVuaWZvcm0gaXMgc2V0XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9OyAvLyBwcm9ncmFtIGxvY2F0aW9ucyBvZiB2ZXJ0ZXggYXR0cmlidXRlcywgbGF6aWx5IGFkZGVkIGFzIGVhY2ggYXR0cmlidXRlIGlzIGFjY2Vzc2VkXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfc291cmNlID0gdmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zb3VyY2UgPSBmcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNoYWRlclByb2dyYW0uaWQrKztcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc1t0aGlzLmlkXSA9IHRoaXM7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTsgLy8gY2FuIHByb3ZpZGUgYSBwcm9ncmFtIG5hbWUgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgICAgIGRlbGV0ZSBTaGFkZXJQcm9ncmFtLnByb2dyYW1zW3RoaXMuaWRdO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2dyYW0gd3JhcHBlciB3aXRoIHNpbXBsZSBzdGF0ZSBjYWNoZVxuICAgIHVzZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU2hhZGVyUHJvZ3JhbS5jdXJyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSB0aGlzO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGluZykge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgYmVjYXVzZSBhbHJlYWR5IGNvbXBpbGluZ2ApKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8gQ29weSBzb3VyY2VzIGZyb20gcHJlLW1vZGlmaWVkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMudmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXh0ZW5zaW9uIGF2YWlsYWJpbGl0eVxuICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHRoaXMuY2hlY2tFeHRlbnNpb25zKCk7XG5cbiAgICAgICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgdG8gYmUgaW5qZWN0ZWQgbGF0ZXJcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuXG4gICAgICAgIC8vIEluamVjdCB1c2VyLWRlZmluZWQgYmxvY2tzIChhcmJpdHJhcnkgY29kZSBwb2ludHMgbWF0Y2hpbmcgbmFtZWQgI3ByYWdtYXMpXG4gICAgICAgIC8vIFJlcGxhY2UgYWNjb3JkaW5nIHRvIHRoaXMgcGF0dGVybjpcbiAgICAgICAgLy8gI3ByYWdtYSB0YW5ncmFtOiBba2V5XVxuICAgICAgICAvLyBlLmcuICNwcmFnbWEgdGFuZ3JhbTogZ2xvYmFsXG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBibG9jayBjb2RlIHNuaXBwZXRzXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmJ1aWxkU2hhZGVyQmxvY2tMaXN0KCk7XG4gICAgICAgIHZhciByZWdleHA7XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGJsb2Nrcykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gYmxvY2tzW2tleV07XG4gICAgICAgICAgICBpZiAoIWJsb2NrIHx8IChBcnJheS5pc0FycmF5KGJsb2NrKSAmJiBibG9jay5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZpbmQgY29kZSByZXBsYWNlIHBvaW50cyBpbiBzaGFkZXJzXG4gICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKCdeXFxcXHMqI3ByYWdtYVxcXFxzK3RhbmdyYW06XFxcXHMrJyArIGtleSArICdcXFxccyokJywgJ20nKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfdmVydGV4ID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X2ZyYWdtZW50ID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcblxuICAgICAgICAgICAgLy8gQXZvaWQgbmV0d29yayByZXF1ZXN0IGlmIG5vdGhpbmcgdG8gcmVwbGFjZVxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggPT0gbnVsbCAmJiBpbmplY3RfZnJhZ21lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBibG9ja3MgaW50byBvbmUgc3RyaW5nXG4gICAgICAgICAgICB2YXIgc291cmNlID0gJyc7XG4gICAgICAgICAgICBibG9jay5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayBzdGFydCBhbmQgZW5kIG9mIGVhY2ggYmxvY2sgd2l0aCBtZXRhZGF0YSAod2hpY2ggY2FuIGJlIGV4dHJhY3RlZCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gZmluYWwgc291cmNlIGZvciBlcnJvciBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuKVxuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gYCR7dmFsLnNjb3BlfSwgJHt2YWwua2V5fSwgJHt2YWwubnVtfWA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gdmFsLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stZW5kOiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJbmplY3RcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5qZWN0X2ZyYWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgYSAjZGVmaW5lIGZvciB0aGlzIGluamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9CTE9DS18nICsga2V5LnJlcGxhY2UoL1tcXHMtXSsvZywgJ18nKS50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbi11cCBhbnkgI3ByYWdtYXMgdGhhdCB3ZXJlbid0IHJlcGxhY2VkICh0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzKVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuXG4gICAgICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgICAgICB0aGlzLmVuc3VyZVVuaWZvcm1zKHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zKTtcblxuICAgICAgICAvLyBCdWlsZCAmIGluamVjdCBleHRlbnNpb25zICYgZGVmaW5lc1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgKmFmdGVyKiBjb2RlIGluamVjdGlvbiBzbyB0aGF0IHdlIGNhbiBhZGQgZGVmaW5lcyBmb3Igd2hpY2ggY29kZSBwb2ludHMgd2VyZSBpbmplY3RlZFxuICAgICAgICBsZXQgaW5mbyA9ICh0aGlzLm5hbWUgPyAodGhpcy5uYW1lICsgJyAvIGlkICcgKyB0aGlzLmlkKSA6ICgnaWQgJyArIHRoaXMuaWQpKTtcbiAgICAgICAgbGV0IGhlYWRlciA9IGAvLyBQcm9ncmFtOiAke2luZm99XFxuYDtcbiAgICAgICAgbGV0IHByZWNpc2lvbiA9ICcnO1xuICAgICAgICBsZXQgaGlnaCA9IHRoaXMuZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSLCB0aGlzLmdsLkhJR0hfRkxPQVQpO1xuICAgICAgICBpZiAoaGlnaCAmJiBoaWdoLnByZWNpc2lvbiA+IDApIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9ICdwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9ICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9WRVJURVhfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9XG4gICAgICAgICAgICBoZWFkZXIgK1xuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuXG4gICAgICAgIC8vIFByZWNpc2lvbiBxdWFsaWZpZXIgb25seSB2YWxpZCBpbiBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgLy8gTkI6ICcjZXh0ZW5zaW9uJyBzdGF0ZW1lbnRzIGFkZGVkIHRvIGZyYWdtZW50IHNoYWRlciBvbmx5LCBhcyBJRTExIHRocm93cyBlcnJvciB3aGVuIHRoZXkgYXBwZWFyIGluXG4gICAgICAgIC8vIHZlcnRleCBzaGFkZXIgKGV2ZW4gd2hlbiBndWFyZGVkIGJ5ICNpZmRlZiksIGFuZCBubyBXZWJHTCBleHRlbnNpb25zIHJlcXVpcmUgJyNleHRlbnNpb24nIGluIHZlcnRleCBzaGFkZXJzXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9XG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nKGV4dGVuc2lvbnMpICtcbiAgICAgICAgICAgIGhlYWRlciArXG4gICAgICAgICAgICBwcmVjaXNpb24gK1xuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyhkZWZpbmVzKSArXG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBSZXBsYWNlIG11bHRpLWxpbmUgYmFja3NsYXNoZXNcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuXG4gICAgICAgIC8vIENvbXBpbGUgJiBzZXQgdW5pZm9ybXMgdG8gY2FjaGVkIHZhbHVlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLCB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgICAvLyBzaGFkZXIgZXJyb3IgaW5mb1xuICAgICAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICd2ZXJ0ZXgnIHx8IGVycm9yLnR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMgPSBlcnJvci5lcnJvcnM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZSBvZiB0aGlzLnNoYWRlcl9lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gZXJyb3IudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZS5ibG9jayA9IHRoaXMuYmxvY2soZXJyb3IudHlwZSwgZS5saW5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHByb2dyYW0gJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBlcnJvcjpgLCBlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0cmlidXRlcygpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZERlZmluZUxpc3QoKSB7XG4gICAgICAgIHZhciBkLCBkZWZpbmVzID0ge307XG4gICAgICAgIGZvciAoZCBpbiBTaGFkZXJQcm9ncmFtLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSBTaGFkZXJQcm9ncmFtLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChkIGluIHRoaXMuZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lcztcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2Ygc2hhZGVyIGJsb2NrcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGRTaGFkZXJCbG9ja0xpc3QoKSB7XG4gICAgICAgIGxldCBrZXksIGJsb2NrcyA9IHt9O1xuXG4gICAgICAgIC8vIEdsb2JhbCBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gU2hhZGVyUHJvZ3JhbS5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4uU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5tYXAoKHNvdXJjZSwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHNvdXJjZSwgbnVtLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW3sga2V5LCBzb3VyY2U6IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2dyYW0tc3BlY2lmaWMgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIHRoaXMuYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IGJsb2Nrc1trZXldIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGxldCBzY29wZXMgPSAodGhpcy5ibG9ja19zY29wZXMgJiYgdGhpcy5ibG9ja19zY29wZXNba2V5XSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGV0IGN1cl9zY29wZSA9IG51bGwsIG51bSA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCB0aGlzLmJsb2Nrc1trZXldLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWxhdGl2ZSB0byBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZXNbYl0gIT09IGN1cl9zY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3Njb3BlID0gc2NvcGVzW2JdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldW2JdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IGN1cl9zY29wZSB8fCB0aGlzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkcmVzcyBkaXNjcmVwYW5jeSBpbiBhcnJheSB2cy4gc2luZ2xlLXZhbHVlIGJsb2Nrc1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBhc3N1bWUgYXJyYXkgd2hlbiB0cmFja2luZyBibG9jayBzY29wZXNcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHsga2V5LCBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgIGVuc3VyZVVuaWZvcm1zKHVuaWZvcm1zKSB7XG4gICAgICAgIGlmICghdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2cyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSk7XG4gICAgICAgIHZhciBmcyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgdmFyIGluamVjdCwgdnNfaW5qZWN0aW9ucyA9IFtdLCBmc19pbmplY3Rpb25zID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgdW5pZm9ybSBkZWZpbml0aW9uc1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBpbmplY3QgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB2ZXJ0ZXggc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCB2cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIHZlcnRleCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICB2c19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCBmcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIGZyYWdtZW50IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIGZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5qZWN0IG1pc3NpbmcgdW5pZm9ybXNcbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGluamVjdGVkIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgc2hhZGVycywgZXZlbiBiZWZvcmUgYW55ICNkZWZpbmVzIG9yICNwcmFnbWFzIGFyZSBhZGRlZFxuICAgICAgICAvLyB0aGlzIGNvdWxkIGNhdXNlIHNvbWUgaXNzdWVzIHdpdGggY2VydGFpbiAjcHJhZ21hcywgb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQgbWlnaHQgZXhwZWN0ICNkZWZpbmVzXG4gICAgICAgIGlmICh2c19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IGZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCB3aXRoIGluZmVycmVkIHR5cGVzXG4gICAgc2V0VW5pZm9ybXModW5pZm9ybXMsIHJlc2V0X3RleHR1cmVfdW5pdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcblxuICAgICAgICAvLyBUZXh0dXJlIHVuaXRzIG11c3QgYmUgdHJhY2tlZCBhbmQgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgdGV4dHVyZSBzYW1wbGVyIHVuaWZvcm0gaXMgc2V0LlxuICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgdGV4dHVyZSB1bml0IGlzIHJlc2V0IHRvIDAgZWFjaCB0aW1lIHNldFVuaWZvcm1zIGlzIGNhbGxlZCwgYnV0IHRoZXkgY2FuXG4gICAgICAgIC8vIGFsc28gYmUgcHJlc2VydmVkLCBmb3IgZXhhbXBsZSBpbiBjYXNlcyB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBzZXRVbmlmb3JtcyBhcmUgZXhwZWN0ZWRcbiAgICAgICAgLy8gKGUuZy4gcHJvZ3JhbS1zcGVjaWZpYyB1bmlmb3JtcyBmb2xsb3dlZCBieSBtZXNoLXNwZWNpZmljIG9uZXMpLlxuICAgICAgICBpZiAocmVzZXRfdGV4dHVyZV91bml0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB1bmlmb3JtIHR5cGVzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgSlMgb2JqZWN0XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEdMU0wucGFyc2VVbmlmb3Jtcyh1bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gU2V0IGVhY2ggdW5pZm9ybVxuICAgICAgICBmb3IgKGxldCB1PTA7IHUgPCBwYXJzZWQubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm0gPSBwYXJzZWRbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAgICAgICAgIC8vIEZvciB0ZXh0dXJlcywgd2UgbmVlZCB0byB0cmFjayB0ZXh0dXJlIHVuaXRzLCBzbyB3ZSBoYXZlIGEgc3BlY2lhbCBzZXR0ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm0odW5pZm9ybS5tZXRob2QsIHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWNoZSBzb21lIG9yIGFsbCB1bmlmb3JtIHZhbHVlcyBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZFxuICAgIHNhdmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS5zYXZlZF92YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgPSB0aGlzLnRleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc29tZSBvciBhbGwgdW5pZm9ybXMgdG8gc2F2ZWQgdmFsdWVzXG4gICAgcmVzdG9yZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0gJiYgdW5pZm9ybS5zYXZlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSB1bmlmb3JtLnNhdmVkX3ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgdGV4dHVyZSB1bmlmb3JtLCBmaW5kcyB0ZXh0dXJlIGJ5IG5hbWUgb3IgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICBzZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtX25hbWUsIHRleHR1cmVfbmFtZSkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4dHVyZV9uYW1lXTtcbiAgICAgICAgaWYgKHRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYENhbm5vdCBmaW5kIHRleHR1cmUgJyR7dGV4dHVyZV9uYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHR1cmUuYmluZCh0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudW5pZm9ybSgnMWknLCB1bmlmb3JtX25hbWUsIHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQrKzsgLy8gVE9ETzogdHJhY2sgbWF4IHRleHR1cmUgdW5pdHMgYW5kIGxvZy90aHJvdyBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBleDogcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAncG9zaXRpb24nLCBbeCwgeSwgel0pO1xuICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuICAgIHVuaWZvcm0obWV0aG9kLCBuYW1lLCB2YWx1ZSkgeyAvLyAndmFsdWUnIGlzIGEgbWV0aG9kLWFwcHJvcHJpYXRlIGFyZ3VtZW50cyBsaXN0XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3Jtc1tuYW1lXSA9IHRoaXMudW5pZm9ybXNbbmFtZV0gfHwge307XG4gICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdW5pZm9ybS5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKHVuaWZvcm0ubG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pZm9ybS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHVuaWZvcm0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHNpbmdsZSB1bmlmb3JtXG4gICAgdXBkYXRlVW5pZm9ybSh1bmlmb3JtKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmlmb3JtIHx8IHVuaWZvcm0ubG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5jb21taXRVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIENvbW1pdHMgdGhlIHVuaWZvcm0gdG8gdGhlIEdQVVxuICAgIGNvbW1pdFVuaWZvcm0odW5pZm9ybSl7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHVuaWZvcm0ubG9jYXRpb247XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cbiAgICAgICAgc3dpdGNoICh1bmlmb3JtLm1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0Zic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00ZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4NGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHVuaWZvcm0gbG9jYXRpb25zIGFuZCBzZXQgdG8gbGFzdCBjYWNoZWQgdmFsdWVzXG4gICAgcmVmcmVzaFVuaWZvcm1zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHUgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoQXR0cmlidXRlcygpIHtcbiAgICAgICAgLy8gdmFyIGxlbiA9IHRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuICAgICAgICAvLyBmb3IgKHZhciBpPTA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyAgICAgdmFyIGEgPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgYSB2ZXJ0ZXggYXR0cmlidXRlXG4gICAgYXR0cmlidXRlKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmliID0gKHRoaXMuYXR0cmlic1tuYW1lXSA9IHRoaXMuYXR0cmlic1tuYW1lXSB8fCB7fSk7XG4gICAgICAgIGlmIChhdHRyaWIubG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYi5uYW1lID0gbmFtZTtcbiAgICAgICAgYXR0cmliLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuXG4gICAgICAgIC8vIHZhciBpbmZvID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBhdHRyaWIubG9jYXRpb24pO1xuICAgICAgICAvLyBhdHRyaWIudHlwZSA9IGluZm8udHlwZTtcbiAgICAgICAgLy8gYXR0cmliLnNpemUgPSBpbmZvLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBzdHJpbmdcbiAgICBzb3VyY2UodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgYXJyYXkgb2YgbGluZSBzdHJpbmdzXG4gICAgbGluZXModHlwZSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2UodHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYSBzcGVjaWZpYyBsaW5lIGZyb20gc2hhZGVyIHNvdXJjZVxuICAgIGxpbmUodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlW251bV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgaW5mbyBvbiB3aGljaCBzaGFkZXIgYmxvY2sgKGlmIGFueSkgYSBwYXJ0aWN1bGFyIGxpbmUgbnVtYmVyIGluIGEgc2hhZGVyIGlzIGluXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGluZm8gaWYgYSBibG9jayBpcyBmb3VuZDogeyBuYW1lLCBsaW5lLCBzb3VyY2UgfVxuICAgIC8vICBzY29wZTogd2hlcmUgdGhlIHNoYWRlciBibG9jayBvcmlnaW5hdGVkLCBlaXRoZXIgYSBzdHlsZSBuYW1lLCBvciBnbG9iYWwgc3VjaCBhcyBTaGFkZXJQcm9ncmFtXG4gICAgLy8gIG5hbWU6IHNoYWRlciBibG9jayBuYW1lIChlLmcuICdjb2xvcicsICdwb3NpdGlvbicsICdnbG9iYWwnKVxuICAgIC8vICBudW06IHRoZSBibG9jayBudW1iZXIgKndpdGhpbiogbG9jYWwgc2NvcGUgKGUuZy4gaWYgYSBzdHlsZSBoYXMgbXVsdGlwbGUgJ2NvbG9yJyBibG9ja3MpXG4gICAgLy8gIGxpbmU6IGxpbmUgbnVtYmVyICp3aXRoaW4qIHRoZSBzaGFkZXIgYmxvY2sgKG5vdCB0aGUgd2hvbGUgc2hhZGVyIHByb2dyYW0pLCB1c2VmdWwgZm9yIGVycm9yIGhpZ2hsaWdodGluZ1xuICAgIC8vICBzb3VyY2U6IHRoZSBjb2RlIGZvciB0aGUgbGluZVxuICAgIC8vIE5PVEU6IHRoaXMgZG9lcyBhIGJydXRlZm9yY2UgbG9vcCBvdmVyIHRoZSBzaGFkZXIgc291cmNlIGFuZCBsb29rcyBmb3Igc2hhZGVyIGJsb2NrIHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgLy8gV2UgY291bGQgdHJhY2sgbGluZSByYW5nZXMgZm9yIHNoYWRlciBibG9ja3MgYXMgdGhleSBhcmUgaW5zZXJ0ZWQsIGJ1dCBhcyB0aGlzIGNvZGUgaXMgb25seSB1c2VkIGZvclxuICAgIC8vIGVycm9yIGhhbmRsaW5nIG9uIGNvbXBpbGF0aW9uIGZhaWx1cmUsIGl0IHdhcyBzaW1wbGVyIHRvIGtlZXAgaXQgc2VwYXJhdGUgdGhhbiB0byBidXJkZW4gdGhlIGNvcmVcbiAgICAvLyBjb21waWxhdGlvbiBwYXRoLlxuICAgIGJsb2NrKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBsZXQgYmxvY2s7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG51bSAmJiBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1zdGFydDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIGJsb2NrID0ge1xuICAgICAgICAgICAgICAgICAgICBzY29wZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICBudW06IG1hdGNoWzNdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stZW5kOiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IG51bGw7IC8vIGNsZWFyIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lICMgYW5kIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIC8vIGluaXQgdG8gLTEgc28gdGhhdCBsaW5lIDAgaXMgZmlyc3QgYWN0dWFsIGxpbmUgb2YgYmxvY2sgY29kZSwgYWZ0ZXIgY29tbWVudCBtYXJrZXJcbiAgICAgICAgICAgICAgICBibG9jay5saW5lID0gKGJsb2NrLmxpbmUgPT0gbnVsbCkgPyAtMSA6IGJsb2NrLmxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGJsb2NrLnNvdXJjZSA9IGxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBmcm9tIHRob3NlIHJlcXVlc3RlZFxuICAgIC8vIFNldHMgaW50ZXJuYWwgI2RlZmluZXMgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgb2YgZWFjaCByZXF1ZXN0ZWQgZXh0ZW5zaW9uXG4gICAgY2hlY2tFeHRlbnNpb25zKCkge1xuICAgICAgICBsZXQgZXh0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIHRoaXMuZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbih0aGlzLmdsLCBuYW1lKTtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9FWFRFTlNJT05fJHtuYW1lfWA7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmaW5lc1tkZWZdID0gKGV4dCAhPSBudWxsKTtcblxuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ291bGQgbm90IGVuYWJsZSBleHRlbnNpb24gJyR7bmFtZX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljIG1ldGhvZHMgYW5kIHN0YXRlXG5cblNoYWRlclByb2dyYW0uaWQgPSAwOyAgICAgICAgICAgLy8gYXNzaWduIGVhY2ggcHJvZ3JhbSBhIHVuaXF1ZSBpZFxuU2hhZGVyUHJvZ3JhbS5wcm9ncmFtcyA9IHt9OyAgICAvLyBwcm9ncmFtcywgYnkgaWRcblNoYWRlclByb2dyYW0uY3VycmVudCA9IG51bGw7ICAgLy8gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cblxuLy8gR2xvYmFsIGNvbmZpZyBhcHBsaWVkIHRvIGFsbCBwcm9ncmFtcyAoZHVwbGljYXRlIHByb3BlcnRpZXMgZm9yIGEgc3BlY2lmaWMgcHJvZ3JhbSB3aWxsIHRha2UgcHJlY2VkZW5jZSlcblNoYWRlclByb2dyYW0uZGVmaW5lcyA9IHt9O1xuU2hhZGVyUHJvZ3JhbS5ibG9ja3MgPSB7fTtcblxuLy8gVHVybiBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcgPSBmdW5jdGlvbiAoZGVmaW5lcykge1xuICAgIHZhciBkZWZpbmVfc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBkIGluIGRlZmluZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZXNbZF0gPT0gbnVsbCB8fCBkZWZpbmVzW2RdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdib29sZWFuJyAmJiBkZWZpbmVzW2RdID09PSB0cnVlKSB7IC8vIGJvb2xlYW5zIGFyZSBzaW1wbGUgZGVmaW5lcyB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGRlZmluZXNbZF0pID09PSBkZWZpbmVzW2RdKSB7IC8vIGludCB0byBmbG9hdCBjb252ZXJzaW9uIHRvIHNhdGlzZnkgR0xTTCBmbG9hdHNcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXS50b0ZpeGVkKDEpICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gYW55IG90aGVyIGZsb2F0IG9yIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lX3N0cjtcbn07XG5cbi8vIFR1cm4gYSBsaXN0IG9mIGV4dGVuc2lvbiBuYW1lcyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2V4dGVuc2lvbiBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nID0gZnVuY3Rpb24gKGV4dGVuc2lvbnMpIHtcbiAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGxldCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICBzdHIgKz0gYCNpZmRlZiBHTF8ke2V4dH1cXG4jZXh0ZW5zaW9uIEdMXyR7ZXh0fSA6IGVuYWJsZVxcbiNlbmRpZlxcbmA7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuXG5TaGFkZXJQcm9ncmFtLmFkZEJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gfHwgW107XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5wdXNoKC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBSZW1vdmUgYWxsIGdsb2JhbCBzaGFkZXIgYmxvY2tzIGZvciBhIGdpdmVuIGtleVxuU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gW107XG59O1xuXG5TaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soa2V5KTtcbiAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKGtleSwgLi4uYmxvY2tzKTtcbn07XG5cbi8vIENvbXBpbGUgJiBsaW5rIGEgV2ViR0wgcHJvZ3JhbSBmcm9tIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXNcbi8vIHVwZGF0ZSBhIHByb2dyYW0gaWYgb25lIGlzIHBhc3NlZCBpbi4gQ3JlYXRlIG9uZSBpZiBub3QuIEFsZXJ0IGFuZCBkb24ndCB1cGRhdGUgYW55dGhpbmcgaWYgdGhlIHNoYWRlcnMgZG9uJ3QgY29tcGlsZS5cblNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSA9IGZ1bmN0aW9uIChnbCwgcHJvZ3JhbSwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgdmVydGV4X3NoYWRlciA9IFNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyKGdsLCB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIHZhciBmcmFnbWVudF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZSwgZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBnbC51c2VQcm9ncmFtKG51bGwpO1xuICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG9sZF9zaGFkZXJzID0gZ2wuZ2V0QXR0YWNoZWRTaGFkZXJzKHByb2dyYW0pO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2xkX3NoYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGdsLmRldGFjaFNoYWRlcihwcm9ncmFtLCBvbGRfc2hhZGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIH1cblxuICAgIGlmICh2ZXJ0ZXhfc2hhZGVyID09IG51bGwgfHwgZnJhZ21lbnRfc2hhZGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleF9zaGFkZXIpO1xuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudF9zaGFkZXIpO1xuXG4gICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleF9zaGFkZXIpO1xuICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudF9zaGFkZXIpO1xuXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYFdlYkdMIHByb2dyYW0gZXJyb3I6XG4gICAgICAgICAgICBWQUxJREFURV9TVEFUVVM6ICR7Z2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMpfVxuICAgICAgICAgICAgRVJST1I6ICR7Z2wuZ2V0RXJyb3IoKX1cbiAgICAgICAgICAgIC0tLSBWZXJ0ZXggU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHt2ZXJ0ZXhfc2hhZGVyX3NvdXJjZX1cbiAgICAgICAgICAgIC0tLSBGcmFnbWVudCBTaGFkZXIgLS0tXG4gICAgICAgICAgICAke2ZyYWdtZW50X3NoYWRlcl9zb3VyY2V9YCk7XG5cbiAgICAgICAgbGV0IGVycm9yID0geyB0eXBlOiAncHJvZ3JhbScsIG1lc3NhZ2UgfTtcbiAgICAgICAgbG9nKCdlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZ3JhbTtcbn07XG5cbi8vIENvbXBpbGUgYSB2ZXJ0ZXggb3IgZnJhZ21lbnQgc2hhZGVyIGZyb20gcHJvdmlkZWQgc291cmNlXG5TaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlciA9IGZ1bmN0aW9uIChnbCwgc291cmNlLCBzdHlwZSkge1xuICAgIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc3R5cGUpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICBsZXQgdHlwZSA9IChzdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50Jyk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgICBsZXQgZXJyb3JzID0gcGFyc2VTaGFkZXJFcnJvcnMobWVzc2FnZSk7XG4gICAgICAgIHRocm93IHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlcjtcbn07XG4iLCIvLyBUZXh0dXJlIG1hbmFnZW1lbnRcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbi8vIEdMIHRleHR1cmUgd3JhcHBlciBvYmplY3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYSBnbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBrZXllZCBieSBhIHVuaXF1ZSB1c2VyLWRlZmluZWQgbmFtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgbmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJpbmQoKTtcblxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsOyAgICAvLyBhIFByb21pc2Ugb2JqZWN0IHRvIHRyYWNrIHRoZSBsb2FkaW5nIHN0YXRlIG9mIHRoaXMgdGV4dHVyZVxuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlOyAgICAvLyBzdWNjZXNzZnVsbHkgbG9hZGVkIGFzIGV4cGVjdGVkXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmc7XG4gICAgICAgIHRoaXMuc3ByaXRlcyA9IG9wdGlvbnMuc3ByaXRlcztcbiAgICAgICAgdGhpcy50ZXhjb29yZHMgPSB7fTsgICAgLy8gc3ByaXRlIFVWcyAoWzAsIDFdIHJhbmdlKVxuICAgICAgICB0aGlzLnNpemVzID0ge307ICAgICAgICAvLyBzcHJpdGUgc2l6ZXMgKHBpeGVsIHNpemUpXG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBhIDEtcGl4ZWwgYmxhY2sgdGV4dHVyZSBzbyB3ZSBjYW4gc2FmZWx5IHJlbmRlciB3aGlsZSB3ZSB3YWl0IGZvciBhbiBpbWFnZSB0byBsb2FkXG4gICAgICAgIC8vIFNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcyMjI0Ny93ZWJnbC13YWl0LWZvci10ZXh0dXJlLXRvLWxvYWRcbiAgICAgICAgdGhpcy5zZXREYXRhKDEsIDEsIG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAyNTVdKSwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcblxuICAgICAgICAvLyBEZXN0cm95IHByZXZpb3VzIHRleHR1cmUgaWYgcHJlc2VudFxuICAgICAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdKSB7XG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91cyByZXRhaW4gY291bnRcbiAgICAgICAgICAgIHRoaXMucmV0YWluX2NvdW50ID0gVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLnJldGFpbl9jb3VudDtcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQgPSAwOyAvLyBhbGxvdyB0byBiZSBmcmVlZFxuICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIHRleHR1cmUgaW5zdGFuY2UgYW5kIGRlZmluaXRpb25cbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdID0gdGhpcztcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbdGhpcy5uYW1lXSA9IE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZChvcHRpb25zKTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBjcmVhdGluZyBUZXh0dXJlICR7dGhpcy5uYW1lfWApO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYSBzaW5nbGUgdGV4dHVyZSBpbnN0YW5jZVxuICAgIGRlc3Ryb3koeyBmb3JjZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50ID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogZGVzdHJveWluZyB0ZXh0dXJlIHdpdGggcmV0YWluIGNvdW50IG9mICcke3RoaXMucmV0YWluX2NvdW50fSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBudWxsO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICBkZWxldGUgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdO1xuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG4gICAgICAgIGxvZygndHJhY2UnLCBgZGVzdHJveWluZyBUZXh0dXJlICR7dGhpcy5uYW1lfWApO1xuICAgIH1cblxuICAgIHJldGFpbiAoKSB7XG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50Kys7XG4gICAgfVxuXG4gICAgcmVsZWFzZSAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IHJlbGVhc2luZyB0ZXh0dXJlIHdpdGggcmV0YWluIGNvdW50IG9mICcke3RoaXMucmV0YWluX2NvdW50fSdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50LS07XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQodW5pdCA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVGV4dHVyZS5hY3RpdmVVbml0ICE9PSB1bml0KSB7XG4gICAgICAgICAgICB0aGlzLmdsLmFjdGl2ZVRleHR1cmUodGhpcy5nbC5URVhUVVJFMCArIHVuaXQpO1xuICAgICAgICAgICAgVGV4dHVyZS5hY3RpdmVVbml0ID0gdW5pdDtcbiAgICAgICAgICAgIFRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDsgLy8gdGV4dHVyZSBtdXN0IGJlIHJlLWJvdW5kIHdoZW4gdW5pdCBjaGFuZ2VzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVGV4dHVyZS5ib3VuZFRleHR1cmUgIT09IHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAndXJsJztcbiAgICAgICAgICAgIHRoaXMuc2V0VXJsKG9wdGlvbnMudXJsLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZWxlbWVudCc7XG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQob3B0aW9ucy5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICdkYXRhJztcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YShvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCwgb3B0aW9ucy5kYXRhLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9XG4gICAgICAgICAgICAodGhpcy5sb2FkaW5nICYmIHRoaXMubG9hZGluZy50aGVuKCgpID0+IHsgdGhpcy5jYWxjdWxhdGVTcHJpdGVzKCk7IHJldHVybiB0aGlzOyB9KSkgfHxcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRleHR1cmUgZnJvbSBhbiB1cmxcbiAgICBzZXRVcmwodXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVGV4dHVyZS5iYXNlX3VybCkge1xuICAgICAgICAgICAgdXJsID0gVXRpbHMuYWRkQmFzZVVSTCh1cmwsIFRleHR1cmUuYmFzZV91cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ3VybCc7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KGltYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIGxvYWRpbmcgZGF0YS1VUkwgaW1hZ2VzIHdpdGggQ09SUyBlbmFibGVkLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgICAgICAgICAgaWYgKCEoVXRpbHMuaXNTYWZhcmkoKSAmJiB0aGlzLnNvdXJjZS5zbGljZSgwLCA1KSA9PT0gJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2RhdGEnO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBhcnJheSB0byB0eXBlZCBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIHRleHR1cmUgdG8gdHJhY2sgYSBlbGVtZW50IChjYW52YXMvaW1hZ2UpXG4gICAgc2V0RWxlbWVudChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLy8gYSBzdHJpbmcgZWxlbWVudCBpcyBpbnRlcnBldGVkIGFzIGEgQ1NTIHNlbGVjdG9yXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgdGhlICdlbGVtZW50JyBwYXJhbWV0ZXIgKFxcYGVsZW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZWwpfVxcYCkgbXVzdCBiZSBhIENTUyBgO1xuICAgICAgICAgICAgbXNnICs9IGBzZWxlY3RvciBzdHJpbmcsIG9yIGEgPGNhbnZhcz4sIDxpbWFnZT4gb3IgPHZpZGVvPiBvYmplY3RgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6ICR7bXNnfWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBiZWNhdXNlICR7bXNnfWAsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBVcGxvYWRzIGN1cnJlbnQgaW1hZ2Ugb3IgYnVmZmVyIHRvIHRoZSBHUFUgKGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhbmltYXRlZCB0ZXh0dXJlcyBvbiB0aGUgZmx5KVxuICAgIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIChvcHRpb25zLlVOUEFDS19GTElQX1lfV0VCR0wgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKSk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIG9wdGlvbnMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIHx8IGZhbHNlKTtcblxuICAgICAgICAvLyBJbWFnZSBvciBDYW52YXMgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgdGhpcy5zb3VyY2UuY29tcGxldGUpKSB7XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VfdHlwZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmcgfHwgJ2xpbmVhcic7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKFV0aWxzLmlzUG93ZXJPZjIodGhpcy53aWR0aCkgJiYgVXRpbHMuaXNQb3dlck9mMih0aGlzLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IHRydWU7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBvcHRpb25zLlRFWFRVUkVfV1JBUF9TIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgb3B0aW9ucy5URVhUVVJFX1dSQVBfVCB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbWlwbWFwJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ21pcG1hcCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2ViR0wgaGFzIHN0cmljdCByZXF1aXJlbWVudHMgb24gbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXM6XG4gICAgICAgICAgICAvLyBObyBtaXBtYXBzIGFuZCBtdXN0IGNsYW1wIHRvIGVkZ2VcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFByZS1jYWxjIHNwcml0ZSByZWdpb25zIGZvciBhIHRleHR1cmUgc3ByaXRlIGluIFVWIFswLCAxXSBzcGFjZVxuICAgIGNhbGN1bGF0ZVNwcml0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwcml0ZSA9IHRoaXMuc3ByaXRlc1tzXTtcblxuICAgICAgICAgICAgICAgIC8vIE1hcCBbMCwgMF0gdG8gWzEsIDFdIGNvb3JkcyB0byB0aGUgYXBwcm9wcmlhdGUgc3ByaXRlIHN1Yi1hcmVhIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhjb29yZHNbc10gPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVswXSwgc3ByaXRlWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzaXplIG9mIHNwcml0ZVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZXNbc10gPSBbc3ByaXRlWzJdLCBzcHJpdGVbM11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljL2NsYXNzIG1ldGhvZHMgYW5kIHN0YXRlXG5cblRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gKGdsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlKGdsLCBuYW1lLCBvcHRpb25zKTtcbn07XG5cblRleHR1cmUucmV0YWluID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJldGFpbigpO1xuICAgIH1cbn07XG5cblRleHR1cmUucmVsZWFzZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZWxlYXNlKCk7XG4gICAgfVxufTtcblxuLy8gRGVzdHJveSBhbGwgdGV4dHVyZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuVGV4dHVyZS5kZXN0cm95ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgdmFyIHRleHR1cmVzID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgZm9yICh2YXIgdCBvZiB0ZXh0dXJlcykge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgIGlmICh0ZXh0dXJlLmdsID09PSBnbCkge1xuICAgICAgICAgICAgdGV4dHVyZS5kZXN0cm95KHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBHZXQgc3ByaXRlIHBpeGVsIHNpemUgYW5kIFVWc1xuVGV4dHVyZS5nZXRTcHJpdGVJbmZvID0gZnVuY3Rpb24gKHRleG5hbWUsIHNwcml0ZSkge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXhuYW1lXTtcbiAgICByZXR1cm4gdGV4dHVyZSAmJiB7IHNpemU6IHRleHR1cmUuc2l6ZXNbc3ByaXRlXSwgdGV4Y29vcmRzOiB0ZXh0dXJlLnRleGNvb3Jkc1tzcHJpdGVdIH07XG59O1xuXG4vLyBSZS1zY2FsZSBVVnMgZnJvbSBbMCwgMV0gcmFuZ2UgdG8gYSBzbWFsbGVyIGFyZWEgd2l0aGluIHRoZSBpbWFnZVxuVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUgPSBmdW5jdGlvbiAoYXJlYV9vcmlnaW4sIGFyZWFfc2l6ZSwgdGV4X3NpemUpIHtcbiAgICB2YXIgYXJlYV9vcmlnaW5feSA9IHRleF9zaXplWzFdIC0gYXJlYV9vcmlnaW5bMV0gLSBhcmVhX3NpemVbMV07XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhcmVhX29yaWdpblswXSAvIHRleF9zaXplWzBdLFxuICAgICAgICBhcmVhX29yaWdpbl95IC8gdGV4X3NpemVbMV0sXG4gICAgICAgIChhcmVhX3NpemVbMF0gKyBhcmVhX29yaWdpblswXSkgLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgKGFyZWFfc2l6ZVsxXSArIGFyZWFfb3JpZ2luX3kpIC8gdGV4X3NpemVbMV1cbiAgICBdO1xufTtcblxuLy8gQ3JlYXRlIGEgc2V0IG9mIHRleHR1cmVzIGtleWVkIGluIGFuIG9iamVjdFxuLy8gT3B0aW9uYWxseSBsb2FkIGVhY2ggaWYgaXQgaGFzIGEgVVJMIHNwZWNpZmllZFxuVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGdsLCB0ZXh0dXJlcykge1xuICAgIGxldCBsb2FkaW5nID0gW107XG4gICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgIGZvciAobGV0IHRleG5hbWUgaW4gdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSB0ZXh0dXJlc1t0ZXhuYW1lXTtcblxuICAgICAgICAgICAgLy8gSWYgdGV4dHVyZSBhbHJlYWR5IGV4aXN0cyBhbmQgZGVmaW5pdGlvbiBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byByZS1jcmVhdGVcbiAgICAgICAgICAgIC8vIE5vdGU6IHRvIGF2b2lkIGZsaWNrZXIgd2hlbiBvdGhlciB0ZXh0dXJlcy9zY2VuZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgICAgIGlmICghVGV4dHVyZS5jaGFuZ2VkKHRleG5hbWUsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZShnbCwgdGV4bmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIGxvYWRpbmcucHVzaCh0ZXh0dXJlLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbn07XG5cbi8vIENyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlICgxeDEgcGl4ZWwpIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlclxuLy8gKGZvciBleGFtcGxlIHRvIHByZXZlbnQgR0wgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmJvdW5kIHRleHR1cmVzKVxuVGV4dHVyZS5kZWZhdWx0ID0gJ19fZGVmYXVsdCc7XG5UZXh0dXJlLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGUoZ2wsIFRleHR1cmUuZGVmYXVsdCk7XG59O1xuXG4vLyBJbmRpY2F0ZSBpZiBhIHRleHR1cmUgZGVmaW5pdGlvbiB3b3VsZCBiZSBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGNhY2hlXG5UZXh0dXJlLmNoYW5nZWQgPSBmdW5jdGlvbiAobmFtZSwgY29uZmlnKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXh0dXJlKSB7IC8vIGNhY2hlZCB0ZXh0dXJlXG4gICAgICAgIC8vIGNhbnZhcy9pbWFnZS1iYXNlZCB0ZXh0dXJlcyBhcmUgY29uc2lkZXJlZCBkeW5hbWljIGFuZCBhbHdheXMgcmVmcmVzaFxuICAgICAgICBpZiAodGV4dHVyZS5jb25maWdfdHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGNvbmZpZy5lbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcGFyZSBkZWZpbml0aW9uc1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbbmFtZV0pID09PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgY29uZmlnKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBtZXRhZGF0YSBmb3IgYSB0ZXh0dXJlIGJ5IG5hbWVcbi8vIFJldHVybnMgdmlhIHByb21pc2UsIGluIGNhc2UgdGV4dHVyZSBpcyBzdGlsbCBsb2FkaW5nXG4vLyBDYW4gYmUgY2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBzeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcblRleHR1cmUuZ2V0SW5mbyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gR2V0IGluZm8gZm9yIGFsbCB0ZXh0dXJlcyBieSBkZWZhdWx0XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmFtZS5tYXAobiA9PiBUZXh0dXJlLmdldEluZm8obikpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2luZ2xlIHRleHR1cmVcbiAgICB2YXIgdGV4ID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4KSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoaXMgdGV4dHVyZSB0byBmaW5pc2ggbG9hZGluZywgb3IgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGV4LmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRleCk7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3Vic2V0IG9mIHRleHR1cmUgaW5mb1xuICAgICAgICAgICAgLy8gKGNvbXBhdGlibGUgdy9zdHJ1Y3R1cmVkIGNsb25pbmcsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgd29ya2VyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXgubmFtZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4LmhlaWdodCxcbiAgICAgICAgICAgICAgICBzcHJpdGVzOiB0ZXguc3ByaXRlcyxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZHM6IHRleC50ZXhjb29yZHMsXG4gICAgICAgICAgICAgICAgc2l6ZXM6IHRleC5zaXplcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IHRleC5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgcG93ZXJfb2ZfMjogdGV4LnBvd2VyX29mXzIsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IHRleC52YWxpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBObyB0ZXh0dXJlIGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxufTtcblxuLy8gU3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG4vLyBDYWxsZWQgZnJvbSB3b3JrZXIsIGdldHMgaW5mbyBvbiBvbmUgb3IgbW9yZSB0ZXh0dXJlcyBpbmZvIGZyb20gbWFpbiB0aHJlYWQgdmlhIHJlbW90ZSBjYWxsLCB0aGVuIHN0b3JlcyBpdFxuLy8gbG9jYWxseSBpbiB3b3JrZXIuICd0ZXh0dXJlcycgY2FuIGJlIGFuIGFycmF5IG9mIHRleHR1cmUgbmFtZXMgdG8gc3luYywgb3IgaWYgbnVsbCwgYWxsIHRleHR1cmVzIGFyZSBzeW5jZWQuXG5UZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyID0gZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVGV4dHVyZS5nZXRJbmZvJywgbmFtZXMpLlxuICAgICAgICB0aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgIGZvciAodmFyIHRleCBvZiB0ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGV4Lm5hbWVdID0gdGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUudGV4dHVyZXM7XG4gICAgICAgIH0pO1xufTtcblxuLy8gUmVwb3J0IG1heCB0ZXh0dXJlIHNpemUgZm9yIGEgR0wgY29udGV4dFxuVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG59O1xuXG4vLyBHbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBieSBuYW1lXG5UZXh0dXJlLnRleHR1cmVzID0ge307XG5UZXh0dXJlLnRleHR1cmVfY29uZmlncyA9IHt9O1xuVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsO1xuVGV4dHVyZS5hY3RpdmVVbml0ID0gbnVsbDtcblxuVGV4dHVyZS5iYXNlX3VybCA9IG51bGw7IC8vIG9wdGlvbmFsIGJhc2UgVVJMIHRvIGFkZCB0byB0ZXh0dXJlc1xuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdUZXh0dXJlJywgVGV4dHVyZSk7XG5zdWJzY3JpYmVNaXhpbihUZXh0dXJlKTtcbiIsIi8vIENyZWF0ZXMgYSBWZXJ0ZXggQXJyYXkgT2JqZWN0IGlmIHRoZSBleHRlbnNpb24gaXMgYXZhaWxhYmxlLCBvciBmYWxscyBiYWNrIG9uIHN0YW5kYXJkIGF0dHJpYnV0ZSBjYWxsc1xuXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbnZhciBWZXJ0ZXhBcnJheU9iamVjdDtcbmV4cG9ydCBkZWZhdWx0IFZlcnRleEFycmF5T2JqZWN0ID0ge307XG5cblZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkID0gZmFsc2U7ICAgICAgLy8gc2V0IHRvIHRydWUgdG8gZGlzYWJsZSBWQU9zIGV2ZW4gaWYgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZVxuVmVydGV4QXJyYXlPYmplY3QuZXh0ID0gbmV3IE1hcCgpOyAgICAgICAvLyBWQU8gZXh0ZW5zaW9ucywgYnkgR0wgY29udGV4dFxuVmVydGV4QXJyYXlPYmplY3QuYm91bmRfdmFvID0gbmV3IE1hcCgpOyAvLyBjdXJyZW50bHkgYm91bmQgVkFPLCBieSBHTCBjb250ZXh0XG5cblZlcnRleEFycmF5T2JqZWN0LmluaXQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICBpZiAoVmVydGV4QXJyYXlPYmplY3QuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZXh0LnNldChnbCwgZ2wuZ2V0RXh0ZW5zaW9uKFwiT0VTX3ZlcnRleF9hcnJheV9vYmplY3RcIikpO1xuICAgIH1cblxuICAgIGlmIChWZXJ0ZXhBcnJheU9iamVjdC5leHQuZ2V0KGdsKSAhPSBudWxsKSB7XG4gICAgICAgIGxvZygnaW5mbycsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoVmVydGV4QXJyYXlPYmplY3QuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIE5PVCBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBmb3JjZSBkaXNhYmxlZCcpO1xuICAgIH1cbn07XG5cblZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChnbCwgc2V0dXAsIHRlYXJkb3duKSB7XG4gICAgbGV0IHZhbyA9IHt9O1xuICAgIHZhby5zZXR1cCA9IHNldHVwO1xuICAgIHZhby50ZWFyZG93biA9IHRlYXJkb3duO1xuXG4gICAgbGV0IGV4dCA9IFZlcnRleEFycmF5T2JqZWN0LmV4dC5nZXQoZ2wpO1xuICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICB2YW8uX3ZhbyA9IGV4dC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICB9XG5cbiAgICB2YW8uc2V0dXAodHJ1ZSk7XG5cbiAgICByZXR1cm4gdmFvO1xufTtcblxuVmVydGV4QXJyYXlPYmplY3QuYmluZCA9IGZ1bmN0aW9uIChnbCwgdmFvKSB7XG4gICAgbGV0IGV4dCA9IFZlcnRleEFycmF5T2JqZWN0LmV4dC5nZXQoZ2wpO1xuICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5ib3VuZF92YW8uc2V0KGdsLCB2YW8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFvLnNldHVwKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IFZlcnRleEFycmF5T2JqZWN0LmJvdW5kX3Zhby5nZXQoZ2wpO1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYm91bmRfdmFvICE9IG51bGwgJiYgdHlwZW9mIGJvdW5kX3Zhby50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYm91bmRfdmFvLnRlYXJkb3duKCk7XG4gICAgICAgIH1cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYm91bmRfdmFvLnNldChnbCwgbnVsbCk7XG4gICAgfVxufTtcblxuVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSA9IGZ1bmN0aW9uIChnbCwgdmFvKSB7XG4gICAgbGV0IGV4dCA9IFZlcnRleEFycmF5T2JqZWN0LmV4dC5nZXQoZ2wpO1xuICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8gIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgIGV4dC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgIHZhby5fdmFvID0gbnVsbDtcbiAgICB9XG4gICAgLy8gZGVzdHJveSBpcyBhIG5vLW9wIGlmIFZBTyBleHRlbnNpb24gaXNuJ3QgYXZhaWxhYmxlXG59O1xuIiwiLy8gTWFuYWdlIHJlbmRlcmluZyBmb3IgcHJpbWl0aXZlc1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi92YW8nO1xuXG4vLyBBIHNpbmdsZSBtZXNoL1ZCTywgZGVzY3JpYmVkIGJ5IGEgdmVydGV4IGxheW91dCwgdGhhdCBjYW4gYmUgZHJhd24gd2l0aCBvbmUgb3IgbW9yZSBwcm9ncmFtc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVkJPTWVzaCAge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9kYXRhLCBlbGVtZW50X2RhdGEsIHZlcnRleF9sYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnZlcnRleF9kYXRhID0gdmVydGV4X2RhdGE7IC8vIHR5cGVkIGFycmF5XG4gICAgICAgIHRoaXMuZWxlbWVudF9kYXRhID0gZWxlbWVudF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSB2ZXJ0ZXhfbGF5b3V0O1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmRyYXdfbW9kZSA9IG9wdGlvbnMuZHJhd19tb2RlIHx8IHRoaXMuZ2wuVFJJQU5HTEVTO1xuICAgICAgICB0aGlzLmRhdGFfdXNhZ2UgPSBvcHRpb25zLmRhdGFfdXNhZ2UgfHwgdGhpcy5nbC5TVEFUSUNfRFJBVztcbiAgICAgICAgdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnkgPSAzOyAvLyBUT0RPOiBzdXBwb3J0IGxpbmVzLCBzdHJpcCwgZmFuLCBldGMuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSBvcHRpb25zLnVuaWZvcm1zO1xuICAgICAgICB0aGlzLnJldGFpbiA9IG9wdGlvbnMucmV0YWluIHx8IGZhbHNlOyAvLyB3aGV0aGVyIHRvIHJldGFpbiBtZXNoIGRhdGEgaW4gQ1BVIGFmdGVyIHVwbG9hZGluZyB0byBHUFVcbiAgICAgICAgdGhpcy5jcmVhdGVkX2F0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gb3B0aW9ucy5mYWRlX2luX3RpbWUgfHwgMDsgLy8gb3B0aW9uYWwgdGltZSB0byBmYWRlIGluIG1lc2hcblxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IHRoaXMudmVydGV4X2RhdGEuYnl0ZUxlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmFvcyA9IG5ldyBNYXAoKTsgLy8gbWFwIG9mIFZlcnRleEFycmF5T2JqZWN0cywga2V5ZWQgYnkgcHJvZ3JhbVxuXG4gICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2NvdW50ID0gdGhpcy5lbGVtZW50X2RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMuZWxlbWVudF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X3R5cGUgPSAodGhpcy5lbGVtZW50X2RhdGEuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5KSA/IHRoaXMuZ2wuVU5TSUdORURfU0hPUlQ6IHRoaXMuZ2wuVU5TSUdORURfSU5UO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy52ZXJ0ZXhfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZXRhaW4pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciwgYnkgZGVmYXVsdCB3aXRoIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtLCBvciBvdGhlcndpc2Ugd2l0aCBvcHRpb25hbGx5IHByb3ZpZGVkIG9uZVxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBtZXNoIHJlcXVlc3RzIGEgcmVuZGVyIG9uIG5leHQgZnJhbWUgKGUuZy4gZm9yIGZhZGUgYW5pbWF0aW9ucylcbiAgICByZW5kZXIob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBvcHRpb25zLnByb2dyYW0gfHwgU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNhdmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy51bmlmb3JtcywgZmFsc2UpOyAvLyBkb24ndCByZXNldCB0ZXh0dXJlIHVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aXNpYmxlX3RpbWUgPSAoK25ldyBEYXRlKCkgLSB0aGlzLmNyZWF0ZWRfYXQpIC8gMTAwMDtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3Zpc2libGVfdGltZScsIHZpc2libGVfdGltZSk7XG5cbiAgICAgICAgdGhpcy5iaW5kKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KXtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZHJhd19tb2RlLCB0aGlzLmVsZW1lbnRfY291bnQsIHRoaXMuZWxlbWVudF90eXBlLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmRyYXdfbW9kZSwgMCwgdGhpcy52ZXJ0ZXhfY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCBudWxsKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5yZXN0b3JlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IG5leHQgcmVuZGVyIGlmIG1lc2ggaXMgZmFkaW5nIGluXG4gICAgICAgIHJldHVybiAodmlzaWJsZV90aW1lIDwgdGhpcy5mYWRlX2luX3RpbWUpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYnVmZmVycyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gcHJlcGFyZSBmb3IgcmVuZGVyaW5nXG4gICAgYmluZChwcm9ncmFtKSB7XG4gICAgICAgIC8vIEJpbmQgVkFPIGZvciB0aGlzIHByb2dhbSwgb3IgY3JlYXRlIG9uZVxuICAgICAgICBsZXQgdmFvID0gdGhpcy52YW9zLmdldChwcm9ncmFtKTtcbiAgICAgICAgaWYgKHZhbykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCB2YW8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YW9zLnNldChwcm9ncmFtLCBWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUodGhpcy5nbCwgKGZvcmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmVuYWJsZSh0aGlzLmdsLCBwcm9ncmFtLCBmb3JjZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgdmFvIG9mIHRoaXMudmFvcy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSh0aGlzLmdsLCB2YW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdWQk9NZXNoLmRlc3Ryb3k6IGRlbGV0ZSBidWZmZXInICsgKHRoaXMudmVydGV4X2RhdGEgPyBgIG9mIHNpemUgJHt0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGh9YCA6ICcnKSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFZlcnRleEVsZW1lbnRzIGZyb20gJy4vdmVydGV4X2VsZW1lbnRzJztcblxuLy8gTWFwcyBHTCB0eXBlcyB0byBKUyBhcnJheSB0eXBlc1xubGV0IGFycmF5X3R5cGVzID0ge1xuICAgIFtnbC5GTE9BVF06IEZsb2F0MzJBcnJheSxcbiAgICBbZ2wuQllURV06IEludDhBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXG4gICAgW2dsLklOVF06IEludDMyQXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxuICAgIFtnbC5TSE9SVF06IEludDE2QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXlcbn07XG5cbi8vIEFuIGludGVybWVkaWFyeSBvYmplY3QgdGhhdCBob2xkcyB2ZXJ0ZXggZGF0YSBpbiB0eXBlZCBhcnJheXMsIGFjY29yZGluZyB0byBhIGdpdmVuIHZlcnRleCBsYXlvdXRcbi8vIFVzZWQgdG8gY29uc3RydWN0IGEgbWVzaC9WQk8gZm9yIHJlbmRlcmluZ1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RGF0YSB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmVydGV4X2xheW91dCwgeyBwcmVhbGxvYyA9IDUwMCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZWxlbWVudHMgPSBuZXcgVmVydGV4RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoVmVydGV4RGF0YS5hcnJheV9wb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IFZlcnRleERhdGEuYXJyYXlfcG9vbC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5ieXRlX2xlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiByZXVzZWQgYnVmZmVyIG9mIGJ5dGVzICR7dGhpcy5ieXRlX2xlbmd0aH0sICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gcHJlYWxsb2M7IC8vICMgb2YgdmVydGljZXMgdG8gYWxsb2NhdGVcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgICAvLyBieXRlIG9mZnNldCBpbnRvIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGNvbXBvbmVudCBvZiB0aGlzLnZlcnRleF9sYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goWy4uLmNvbXBvbmVudF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgIH1cblxuICAgIC8vIChSZS0pYWxsb2NhdGUgdHlwZWQgdmlld3MgaW50byB0aGUgbWFpbiBidWZmZXIgLSBvbmx5IGNyZWF0ZSB0aGUgdHlwZXMgd2UgbmVlZCBmb3IgdGhpcyBsYXlvdXRcbiAgICBzZXRCdWZmZXJWaWV3cyAoKSB7XG4gICAgICAgIHRoaXMudmlld3MgPSB7fTtcbiAgICAgICAgdGhpcy52aWV3c1tnbC5VTlNJR05FRF9CWVRFXSA9IHRoaXMudmVydGV4X2J1ZmZlcjtcbiAgICAgICAgZm9yICh2YXIgYXR0cmliIG9mIHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHZpZXcgZm9yIHRoaXMgdHlwZT9cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdzW2F0dHJpYi50eXBlXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFycmF5X3R5cGUgPSBhcnJheV90eXBlc1thdHRyaWIudHlwZV07XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3c1thdHRyaWIudHlwZV0gPSBuZXcgYXJyYXlfdHlwZSh0aGlzLnZlcnRleF9idWZmZXIuYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgYnVmZmVyIHBvaW50ZXJzXG4gICAgICAgIGZvciAodmFyIGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXSA9IHRoaXMudmlld3NbY29tcG9uZW50WzBdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSwgZXhwYW5kL3JlYWxsb2MgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGNoZWNrQnVmZmVyU2l6ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5vZmZzZXQgKyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKSA+IHRoaXMuYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5zaXplICogMS41KTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemUgJSA0O1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB2YXIgbmV3X3ZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld192aWV3LnNldCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgdG8gbmV3IGJ1ZmZlclxuICAgICAgICAgICAgVmVydGV4RGF0YS5hcnJheV9wb29sLnB1c2godGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gc2F2ZSBwcmV2aW91cyBidWZmZXIgZm9yIHVzZSBieSBuZXh0IHRpbGVcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ld192aWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50Kys7XG4gICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgVmVydGV4RGF0YTogZXhwYW5kZWQgdmVydGV4IGJsb2NrIHRvICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgdmVydGV4LCBjb3BpZWQgZnJvbSBhIHBsYWluIEpTIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAvLyBOb3RlOiB1c2VzIHByZS1jYWxjdWxhdGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUsIGluY2x1ZGluZyBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIHR5cGVkIGFycmF5XG4gICAgLy8gdmlldyBhbmQgb2Zmc2V0IGludG8gaXQuIFRoaXMgd2FzIHRoZSBmYXN0ZXN0IG1ldGhvZCBwcm9maWxlZCBzbyBmYXIgZm9yIGZpbGxpbmcgYSBtaXhlZC10eXBlXG4gICAgLy8gdmVydGV4IGxheW91dCAodGhvdWdoIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QgdGhhdCBvbmx5IHN1cHBvcnRlZCBGbG9hdDMyQXJyYXkgYXR0cmlidXRlcykuXG4gICAgYWRkVmVydGV4ICh2ZXJ0ZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0J1ZmZlclNpemUoKTtcbiAgICAgICAgdmFyIGk9MDtcblxuICAgICAgICB2YXIgY2xlbiA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGM9MDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXVsodGhpcy5vZmZzZXQgPj4gY29tcG9uZW50WzJdKSArIGNvbXBvbmVudFszXV0gPSB2ZXJ0ZXhbaSsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemUgdmVydGV4IGJ1ZmZlciBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyBhIG1lc2hcbiAgICBlbmQgKCkge1xuICAgICAgICAvLyBDbGlwIHRoZSBidWZmZXIgdG8gc2l6ZSB1c2VkIGZvciB0aGlzIFZCT1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLnZlcnRleF9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfZWxlbWVudHMuZW5kKCk7XG5cbiAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiAke3RoaXMuc2l6ZX0gdmVydGljZXMgdG90YWwsIHJlYWxsb2MgY291bnQgJHt0aGlzLnJlYWxsb2NfY291bnR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cblZlcnRleERhdGEuYXJyYXlfcG9vbCA9IFtdOyAvLyBwb29sIG9mIGN1cnJlbnRseSBhdmFpbGFibGUgKHByZXZpb3VzbHkgdXNlZCkgYnVmZmVycyAodWludDgpXG4iLCJpbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcbmxldCBVaW50MzJfZmxhZyA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhFbGVtZW50cyB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoICh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaGF2ZSBvdmVyZmxvd24gYW5kIG5vIFVpbnQzMiBvcHRpb24gaXMgYXZhaWxhYmxlLCBkbyBub3QgcHVzaCB2YWx1ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzX292ZXJmbG93biAmJiAhVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgb3ZlcmZsb3cgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFVpbnQxNiBtYXhcbiAgICAgICAgaWYgKHZhbHVlID4gTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVuZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gY3JlYXRlQnVmZmVyKHRoaXMuYXJyYXksIHRoaXMuaGFzX292ZXJmbG93bik7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgVWludDMyX2ZsYWcgPSBmbGFnO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGFycmF5LCBvdmVyZmxvd24pIHtcbiAgICB2YXIgdHlwZWRBcnJheSA9IChvdmVyZmxvd24gJiYgVWludDMyX2ZsYWcpID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkoYXJyYXkpO1xufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdWZXJ0ZXhFbGVtZW50cycsIFZlcnRleEVsZW1lbnRzKTtcbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL3ZlcnRleF9kYXRhJztcblxuLy8gRGVzY3JpYmVzIGEgdmVydGV4IGxheW91dCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBkaWZmZXJlbnQgR0wgcHJvZ3JhbXMuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhMYXlvdXQge1xuICAgIC8vIEF0dHJpYnMgYXJlIGFuIGFycmF5LCBpbiBsYXlvdXQgb3JkZXIsIG9mOiBuYW1lLCBzaXplLCB0eXBlLCBub3JtYWxpemVkXG4gICAgLy8gZXg6IHsgbmFtZTogJ3Bvc2l0aW9uJywgc2l6ZTogMywgdHlwZTogZ2wuRkxPQVQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH1cbiAgICBjb25zdHJ1Y3RvciAoYXR0cmlicykge1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSBhdHRyaWJzOyAvLyBkaWN0aW9uYXJ5IG9mIGF0dHJpYnV0ZXMsIHNwZWNpZmllZCBhcyBzdGFuZGFyZCBHTCBhdHRyaWIgb3B0aW9uc1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTsgICAvLyBsaXN0IG9mIHR5cGUgYW5kIG9mZnNldCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICB0aGlzLmluZGV4ID0ge307ICAgICAgICAvLyBsaW5lYXIgYnVmZmVyIGluZGV4IG9mIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudCwgZS5nLiB0aGlzLmluZGV4LnBvc2l0aW9uLnhcblxuICAgICAgICAvLyBDYWxjIHZlcnRleCBzdHJpZGVcbiAgICAgICAgdGhpcy5zdHJpZGUgPSAwO1xuXG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIGZvciAodmFyIGF0dHJpYiBvZiB0aGlzLmF0dHJpYnMpIHtcbiAgICAgICAgICAgIGF0dHJpYi5vZmZzZXQgPSB0aGlzLnN0cmlkZTtcbiAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgPSBhdHRyaWIuc2l6ZTtcbiAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoYXR0cmliLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGdsLkZMT0FUOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuSU5UOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuVU5TSUdORURfSU5UOlxuICAgICAgICAgICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplICo9IDQ7XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5TSE9SVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplICo9IDI7XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIDQtYnl0ZSBhbGlnbm1lbnQgb24gYXR0cmlidXRlc1xuICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gYXR0cmliLmJ5dGVfc2l6ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmlkZSAmIDMpIHsgLy8gcGFkIHRvIG11bHRpcGxlIG9mIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmlkZSArPSA0IC0gKHRoaXMuc3RyaWRlICYgMyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBpbmZvIHRvIGxpc3Qgb2YgYXR0cmlidXRlIGNvbXBvbmVudHNcbiAgICAgICAgICAgIC8vIFVzZWQgdG8gYnVpbGQgdGhlIHZlcnRleCBkYXRhLCBwcm92aWRlcyBwb2ludGVycyBhbmQgb2Zmc2V0cyBpbnRvIGVhY2ggdHlwZWQgYXJyYXkgdmlld1xuICAgICAgICAgICAgLy8gRWFjaCBjb21wb25lbnQgaXMgYW4gYXJyYXkgb2Y6XG4gICAgICAgICAgICAvLyBbR0wgYXR0cmliIHR5cGUsIHBvaW50ZXIgdG8gdHlwZWQgYXJyYXkgdmlldywgYml0cyB0byBzaGlmdCByaWdodCB0byBkZXRlcm1pbmUgYnVmZmVyIG9mZnNldCwgYWRkaXRpb25hbCBidWZmZXIgb2Zmc2V0IGZvciB0aGUgY29tcG9uZW50XVxuICAgICAgICAgICAgdmFyIG9mZnNldF90eXBlZCA9IGF0dHJpYi5vZmZzZXQgPj4gc2hpZnQ7XG4gICAgICAgICAgICBpZiAoYXR0cmliLnNpemUgPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYT0wOyBhIDwgYXR0cmliLnNpemU7IGErKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWQrK10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFthdHRyaWIudHlwZSwgbnVsbCwgc2hpZnQsIG9mZnNldF90eXBlZF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm92aWRlIGFuIGluZGV4IGludG8gdGhlIHZlcnRleCBkYXRhIGJ1ZmZlciBmb3IgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50XG4gICAgICAgICAgICB0aGlzLmluZGV4W2F0dHJpYi5uYW1lXSA9IGNvdW50O1xuICAgICAgICAgICAgY291bnQgKz0gYXR0cmliLnNpemU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCBhIHZlcnRleCBsYXlvdXQgZm9yIGEgc3BlY2lmaWMgR0wgcHJvZ3JhbVxuICAgIC8vIEFzc3VtZXMgdGhhdCB0aGUgZGVzaXJlZCB2ZXJ0ZXggYnVmZmVyIChWQk8pIGlzIGFscmVhZHkgYm91bmRcbiAgICAvLyBJZiBhIGdpdmVuIHByb2dyYW0gZG9lc24ndCBpbmNsdWRlIGFsbCBhdHRyaWJ1dGVzLCBpdCBjYW4gc3RpbGwgdXNlIHRoZSB2ZXJ0ZXggbGF5b3V0XG4gICAgLy8gdG8gcmVhZCB0aG9zZSBhdHRyaWJzIHRoYXQgaXQgZG9lcyByZWNvZ25pemUsIHVzaW5nIHRoZSBhdHRyaWIgb2Zmc2V0cyB0byBza2lwIG90aGVycy5cbiAgICBlbmFibGUgKGdsLCBwcm9ncmFtLCBmb3JjZSlcbiAgICB7XG4gICAgICAgIHZhciBhdHRyaWIsIGxvY2F0aW9uO1xuXG4gICAgICAgIC8vIEVuYWJsZSBhbGwgYXR0cmlidXRlcyBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yICh2YXIgYT0wOyBhIDwgdGhpcy5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBsb2NhdGlvbiA9IHByb2dyYW0uYXR0cmlidXRlKGF0dHJpYi5uYW1lKS5sb2NhdGlvbjtcblxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICghVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gfHwgZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvY2F0aW9uLCBhdHRyaWIuc2l6ZSwgYXR0cmliLnR5cGUsIGF0dHJpYi5ub3JtYWxpemVkLCB0aGlzLnN0cmlkZSwgYXR0cmliLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gPSBwcm9ncmFtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzYWJsZSBhbnkgcHJldmlvdXNseSBib3VuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGZvciB0aGlzIGxheW91dFxuICAgICAgICBmb3IgKGxvY2F0aW9uIGluIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZShnbCwgbG9jYXRpb24sIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBhbiBhdHRyaWJ1dGUgaWYgaXQgd2FzIG5vdCBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkIHByb2dyYW1cbiAgICAvLyBOT1RFOiB0aGlzIHdhcyBtb3ZlZCBvdXQgb2YgdGhlIGlubmVyIGxvb3AgaW4gZW5hYmxlKCkgdG8gYXNzaXN0IHcvVk0gb3B0aW1pemF0aW9uXG4gICAgZGlzYWJsZVVudXNlZEF0dHJpYnV0ZSAoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKSB7XG4gICAgICAgIGlmIChWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSAhPT0gcHJvZ3JhbSkge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgIGRlbGV0ZSBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZVZlcnRleERhdGEgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlcnRleERhdGEodGhpcyk7XG4gICAgfVxuXG59XG5cbi8vIFRyYWNrIGN1cnJlbnRseSBlbmFibGVkIGF0dHJpYnMsIGJ5IHRoZSBwcm9ncmFtIHRoZXkgYXJlIGJvdW5kIHRvXG4vLyBTdGF0aWMgY2xhc3MgcHJvcGVydHkgdG8gcmVmbGVjdCBnbG9iYWwgR0wgc3RhdGVcblZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnMgPSB7fTtcbiIsImltcG9ydCBSZXBlYXRHcm91cCBmcm9tICcuL3JlcGVhdF9ncm91cCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbnZhciBDb2xsaXNpb247XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxpc2lvbiA9IHtcblxuICAgIHRpbGVzOiB7fSxcbiAgICBsaW5rX2lkOiAwLFxuXG4gICAgbmV4dExpbmtJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlua19pZCsrO1xuICAgIH0sXG5cbiAgICBzdGFydFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXSA9IHtcbiAgICAgICAgICAgIGJib3hlczogeyAgICAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgcGxhY2VkIGJvdW5kaW5nIGJveGVzXG4gICAgICAgICAgICAgICAgYWFiYjogW10sXG4gICAgICAgICAgICAgICAgb2JiOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdHM6IHt9LCAgICAgICAgLy8gb2JqZWN0cyB0byBjb2xsaWRlLCBncm91cGVkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgICAgICBrZWVwOiB7fSwgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3ZXJlIGtlcHQgYWZ0ZXIgY29sbGlzaW9uLCBncm91cGVkIGJ5IHN0eWxlXG4gICAgICAgICAgICBzdHlsZXM6IG5ldyBTZXQoKSAgIC8vIHN0eWxlcyBjb250cmlidXRpbmcgY29sbGlzaW9uIG9iamVjdHNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkIHdoZW4gYWxsIHJlZ2lzdGVyZWQgc3R5bGVzIGhhdmUgYWRkZWQgb2JqZWN0c1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRUaWxlICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgcGVuZGluZyBzZXQsIGNvbGxpc2lvbiB3aWxsIGJsb2NrIG9uIGFsbCBzdHlsZXMgc3VibWl0dGluZyB0byBjb2xsaXNpb24gc2V0XG4gICAgYWRkU3R5bGUgKHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZV0uc3R5bGVzLmFkZChzdHlsZSk7XG4gICAgfSxcblxuICAgIC8vIEFkZCBjb2xsaXNpb24gb2JqZWN0cyBmb3IgYSBzdHlsZVxuICAgIGNvbGxpZGUgKG9iamVjdHMsIHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQ29sbGlzaW9uLmNvbGxpZGUoKSBjYWxsZWQgd2l0aCBudWxsIHRpbGUnLCB0aWxlLCB0aGlzLnRpbGVzLCBzdHlsZSwgb2JqZWN0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdyb3VwIGJ5IHByaW9yaXR5IGFuZCBzdHlsZVxuICAgICAgICBsZXQgdGlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0cztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9iaiA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBvYmoubGFiZWwubGF5b3V0LnByaW9yaXR5O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV0gfHwge307XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdIHx8IFtdO1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0ucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcGVuZGluZyBzdHlsZSBzZXQsIGlmIG5vIG1vcmUgc3R5bGVzLCBkbyBjb2xsaXNpb24gJiBmaW5pc2ggdGlsZVxuICAgICAgICBzdGF0ZS5zdHlsZXMuZGVsZXRlKHN0eWxlKTtcbiAgICAgICAgaWYgKHN0YXRlLnN0eWxlcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbGUodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBvYmplY3RzIHRvIGJlIGFkZGVkIGZyb20gYWxsIHN0eWxlc1xuICAgICAgICByZXR1cm4gc3RhdGUuY29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUua2VlcFtzdHlsZV0gfHwgW107XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUZXN0IGxhYmVscyBmb3IgY29sbGlzaW9ucywgaGlnaGVyIHRvIGxvd2VyIHByaW9yaXR5XG4gICAgLy8gV2hlbiB0d28gY29sbGlkZSwgZGlzY2FyZCB0aGUgbG93ZXItcHJpb3JpdHkgbGFiZWxcbiAgICBlbmRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGxldCBrZWVwID0gc3RhdGUua2VlcDtcblxuICAgICAgICBSZXBlYXRHcm91cC5jbGVhcih0aWxlKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGxhYmVscyBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICBsZXQgcHJpb3JpdGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLm9iamVjdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgcHJpb3JpdHkgb2YgcHJpb3JpdGllcykge1xuICAgICAgICAgICAgbGV0IHN0eWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzW3ByaW9yaXR5XTtcbiAgICAgICAgICAgIGlmICghc3R5bGVfb2JqZWN0cykgeyAvLyBubyBsYWJlbHMgYXQgdGhpcyBwcmlvcml0eSwgc2tpcCB0byBuZXh0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHN0eWxlXG4gICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdHMgPSBzdHlsZV9vYmplY3RzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXSA9IGtlZXBbc3R5bGVdIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3QgPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QsIHRpbGUsIG9iamVjdC5saW5rZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9iamVjdCBpZiBpdCBpc24ndCBkZXBlbmRlbnQgb24gYSBwYXJlbnQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5saW5rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiBhIHBhcmVudCwgb25seSBrZWVwIGlmIGJvdGggY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QubGlua2VkLCB0aWxlLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdC5saW5rZWQsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gUnVuIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGNoZWNrIHRvIHNlZSBpZiBsYWJlbCBjYW4gY3VycmVudGx5IGJlIHBsYWNlZFxuICAgIGNhbkJlUGxhY2VkIChvYmplY3QsIHRpbGUsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IG9iamVjdC5sYWJlbDtcbiAgICAgICAgbGV0IGxheW91dCA9IG9iamVjdC5sYWJlbC5sYXlvdXQ7XG5cbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXN0IHRoZSBsYWJlbCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgICAgICBsZXQgYmJveGVzID0gdGhpcy50aWxlc1t0aWxlXS5iYm94ZXM7XG4gICAgICAgIGlmICghbGF5b3V0LmNvbGxpZGUgfHwgIWxhYmVsLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlICYmIGV4Y2x1ZGUubGFiZWwpKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgcmVwZWF0c1xuICAgICAgICAgICAgbGV0IHJlcGVhdCA9IFJlcGVhdEdyb3VwLmNoZWNrKGxhYmVsLCBsYXlvdXQsIHRpbGUpO1xuICAgICAgICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScsIChvbmVfcGVyX2dyb3VwOiAke3JlcGVhdC5vbmVfcGVyX2dyb3VwfSksIGRpc3QgJHtNYXRoLnNxcnQocmVwZWF0LmRpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9IDwgJHtNYXRoLnNxcnQocmVwZWF0LnJlcGVhdF9kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfWApO1xuICAgICAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGF5b3V0LmNvbGxpZGUpIHtcbiAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScgZHVlIHRvIGNvbGxpc2lvbmApO1xuICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICB9LFxuXG4gICAgLy8gUGxhY2UgbGFiZWxcbiAgICBwbGFjZSAoeyBsYWJlbCB9LCB0aWxlKSB7XG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBhcyBwbGFjZWQgZm9yIGZ1dHVyZSBjb2xsaXNpb24gYW5kIHJlcGVhdCBjdWxsaW5nXG4gICAgICAgIFJlcGVhdEdyb3VwLmFkZChsYWJlbCwgbGFiZWwubGF5b3V0LCB0aWxlKTtcbiAgICAgICAgbGFiZWwuYWRkKHRoaXMudGlsZXNbdGlsZV0uYmJveGVzKTtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IGJveEludGVyc2VjdCBmcm9tICdib3gtaW50ZXJzZWN0JzsgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pa29sYWx5c2Vua28vYm94LWludGVyc2VjdFxuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbi8vIGltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxheW91dCA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikgPyB0aGlzLmxheW91dC5hbmNob3JbMF0gOiB0aGlzLmxheW91dC5hbmNob3I7IC8vIGluaXRpYWwgYW5jaG9yXG4gICAgICAgIHRoaXMucGxhY2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBsYXlvdXQub2Zmc2V0O1xuICAgICAgICB0aGlzLmFhYmIgPSBudWxsO1xuICAgICAgICB0aGlzLm9iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gZmFsc2U7ICAgIC8vIGlmIGxhYmVsIGRvZXMgbm90IGZpdCAoZXhjZWVkcyB0aWxlIGJvdW5kYXJ5LCBldGMpIHRoaXMgYm9vbGVhbiB3aWxsIGJlIHRydWVcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmFsaWduID0gdGhpcy5sYXlvdXQuYWxpZ24gfHwgUG9pbnRBbmNob3IuYWxpZ25Gb3JBbmNob3IodGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBvdmVybGFwcyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgIG9jY2x1ZGVkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFhYmJzID0gYmJveGVzLmFhYmI7XG4gICAgICAgIGxldCBvYmJzID0gYmJveGVzLm9iYjtcblxuICAgICAgICAvLyBCcm9hZCBwaGFzZVxuICAgICAgICBpZiAoYWFiYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYm94SW50ZXJzZWN0KFt0aGlzLmFhYmJdLCBhYWJicywgKGksIGopID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogYnJvYWQgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLmFhYmIsIGFhYmJzW2pdKTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29sbGlkaW5nIHdpdGggZXhjbHVkZWQgbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSAmJiBhYWJic1tqXSA9PT0gZXhjbHVkZS5hYWJiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwcGluZyBkdWUgdG8gZXhwbGljaXQgZXhjbHVzaW9uJywgdGhpcywgZXhjbHVkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hcnJvdyBwaGFzZSBjb2xsaXNpb24gaWYgbm8gcm90YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmIuYW5nbGUgPT09IDAgJiYgb2Jic1tqXS5hbmdsZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcCBuYXJyb3cgcGhhc2UgY29sbGlkZSBiZWNhdXNlIG5laXRoZXIgaXMgcm90YXRlZCcsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBwaGFzZVxuICAgICAgICAgICAgICAgIGlmIChPQkIuaW50ZXJzZWN0KHRoaXMub2JiLCBvYmJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogbmFycm93IHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGlzIGxhYmVsJ3MgYm91bmRpbmcgYm94IHRvIHRoZSBwcm92aWRlZCBzZXRcbiAgICBhZGQgKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGJib3hlcy5hYWJiLnB1c2godGhpcy5hYWJiKTtcbiAgICAgICAgYmJveGVzLm9iYi5wdXNoKHRoaXMub2JiKTtcbiAgICB9XG5cbiAgICAvLyBjaGVja3Mgd2hldGhlciB0aGUgbGFiZWwgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXNcbiAgICBpblRpbGVCb3VuZHMgKCkge1xuICAgICAgICBsZXQgbWluID0gWyB0aGlzLmFhYmJbMF0sIHRoaXMuYWFiYlsxXSBdO1xuICAgICAgICBsZXQgbWF4ID0gWyB0aGlzLmFhYmJbMl0sIHRoaXMuYWFiYlszXSBdO1xuXG4gICAgICAgIGlmICghVXRpbHMucG9pbnRJblRpbGUobWluKSB8fCAhVXRpbHMucG9pbnRJblRpbGUobWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIGRpc2NhcmRlZFxuICAgIC8vIERlcGVuZHMgb24gd2hldGhlciBsYWJlbCBtdXN0IGZpdCBpbiB0aGUgdGlsZSBib3VuZHMsIGFuZCBpZiBzbywgY2FuIGl0IGJlIG1vdmVkIHRvIGZpdCB0aGVyZVxuICAgIGRpc2NhcmQoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd19hd2F5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vY2NsdWRlZChiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgIH1cbn1cblxuTGFiZWwuZXBzaWxvbiA9IDAuOTk5OTsgLy8gdG9sZXJhbmNlIGFyb3VuZCBjb2xsaXNpb24gYm94ZXMsIHByZXZlbnQgcGVyZmVjdGx5IGFkamFjZW50IG9iamVjdHMgZnJvbSBjb2xsaWRpbmdcbiIsImltcG9ydCBMYWJlbCBmcm9tICcuL2xhYmVsJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcblxuY29uc3QgUExBQ0VNRU5UID0ge1xuICAgIE1JRF9QT0lOVDogMCxcbiAgICBDT1JORVI6IDFcbn07XG5cbmNvbnN0IE1BWF9BTkdMRSA9IE1hdGguUEkgLyAyOyAgICAgIC8vIG1heGltdW0gYW5nbGUgZm9yIGFydGljdWxhdGVkIGxhYmVsc1xuY29uc3QgTElORV9FWENFRURfU1RSQUlHSFQgPSAwLjc7ICAgLy8gbWluaW1hbCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGgpIC8gKGxpbmUgbGVuZ3RoKVxuY29uc3QgTElORV9FWENFRURfS0lOS0VEID0gMC42OyAgICAgLy8gbWluaW1hbCByYXRpbyBmb3Iga2lua2VkIGxhYmVsc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbExpbmUge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxpbmVzLCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5zcGFjZV93aWR0aCA9IGxheW91dC5zcGFjZV93aWR0aDsgLy8gd2lkdGggb2Ygc3BhY2UgZm9yIHRoZSBmb250IHVzZWRcbiAgICAgICAgdGhpcy5udW1fc2VnbWVudHMgPSBzaXplLmxlbmd0aDsgLy8gbnVtYmVyIG9mIGxhYmVsIHNlZ21lbnRzXG4gICAgICAgIHRoaXMudG90YWxfbGVuZ3RoID0gc2l6ZS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCl7IHJldHVybiBwcmV2ICsgbmV4dFswXTsgfSwgMCkgKyAoc2l6ZS5sZW5ndGggLSAxKSAqIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgIHRoaXMudG90YWxfaGVpZ2h0ID0gc2l6ZVswXVsxXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAobGF5b3V0LnBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSA/IFBMQUNFTUVOVC5NSURfUE9JTlQgOiBsYXlvdXQucGxhY2VtZW50O1xuXG4gICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7IC8vIGluZGV4IGF0IHdoaWNoIGFuIGFydGljdWxhdGVkIGxhYmVsIHdpbGwga2luayAoZS5nLiwgMSBtZWFucyBhIGtpbmsgX2FmdGVyXyB0aGUgZmlyc3Qgc2VnbWVudClcbiAgICAgICAgdGhpcy5zcHJlYWRfZmFjdG9yID0gMC41OyAvLyBzcGFjZXMgb3V0IGFkamFjZW50IHdvcmRzIHRvIHByZXZlbnQgb3ZlcmxhcFxuICAgICAgICB0aGlzLmZpdG5lc3MgPSAwOyAvLyBtZWFzdXJlIG9mIHF1YWxpdHkgb2YgZml0XG5cbiAgICAgICAgLy8gQXJyYXlzIGZvciBMYWJlbCBwcm9wZXJ0aWVzLiBUT0RPOiBjcmVhdGUgYXJyYXkgb2YgTGFiZWwgdHlwZXMsIHdoZXJlIExhYmVsTGluZSBhY3RzIGFzIGEgXCJncm91cGVkIGxhYmVsXCJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gW107XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIG9wdGlvbmFsbHkgbGltaXQgdGhlIGxpbmUgc2VnbWVudHMgdGhhdCB0aGUgbGFiZWwgbWF5IGJlIHBsYWNlZCBpbiwgYnkgc3BlY2lmeWluZyBhIHNlZ21lbnQgaW5kZXggcmFuZ2VcbiAgICAgICAgLy8gdXNlZCBhcyBhIGNvYXJzZSBzdWJkaXZpZGUgZm9yIHBsYWNpbmcgbXVsdGlwbGUgbGFiZWxzIHBlciBsaW5lIGdlb21ldHJ5XG4gICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCA9IGxheW91dC5zZWdtZW50X2luZGV4IHx8IGxheW91dC5zZWdtZW50X3N0YXJ0IHx8IDA7XG4gICAgICAgIHRoaXMuc2VnbWVudF9tYXggPSBsYXlvdXQuc2VnbWVudF9lbmQgfHwgdGhpcy5saW5lcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gRmlyc3QgZml0dGluZyBzZWdtZW50XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQodGhpcy5nZXRDdXJyZW50U2VnbWVudCgpKTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gKCFzZWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpbmUgZ2VvbWV0cnkgY3JlYXRpbmcgdGhlIG5leHQgdmFsaWQgbGFiZWwuXG4gICAgc3RhdGljIG5leHRMYWJlbChsYWJlbCkge1xuICAgICAgICAvLyBpbmNyZW1lbnQgc2VnbWVudFxuICAgICAgICBsZXQgaGFzTmV4dCA9IGxhYmVsLmdldE5leHRTZWdtZW50KCk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvbmUgb3B0aW9uc1xuICAgICAgICBsZXQgbGF5b3V0ID0gT2JqZWN0LmNyZWF0ZShsYWJlbC5sYXlvdXQpO1xuICAgICAgICBsYXlvdXQuc2VnbWVudF9pbmRleCA9IGxhYmVsLnNlZ21lbnRfaW5kZXg7XG4gICAgICAgIGxheW91dC5wbGFjZW1lbnQgPSBsYWJlbC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG5ldyBsYWJlbFxuICAgICAgICBsZXQgbmV4dExhYmVsID0gbmV3IExhYmVsTGluZShsYWJlbC5zaXplLCBsYWJlbC5saW5lcywgbGF5b3V0KTtcblxuICAgICAgICByZXR1cm4gKG5leHRMYWJlbC50aHJvd19hd2F5KSA/IGZhbHNlIDogbmV4dExhYmVsO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IGZvciByZXR1cm5pbmcgdGhlIG5leHQgc2VnbWVudC4gQXNzdW1lcyBhbiBcIm9yZGVyaW5nXCIgb2YgcG9zc2libGUgc2VnbWVudHNcbiAgICAvLyB0YWtpbmcgaW50byBhY2NvdW50IGJvdGggc3RyYWlnaHQgYW5kIGFydGljdWxhdGVkIHNlZ21lbnRzLiBSZXR1cm5zIGZhbHNlIGlmIGFsbCBwb3NzaWJpbGl0aWVzXG4gICAgLy8gaGF2ZSBiZWVuIGV4aGF1c3RlZFxuICAgIGdldE5leHRTZWdtZW50KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuTUlEX1BPSU5UO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRfaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaXplLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuQ09STkVSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRfaW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGluZSBzZWdtZW50cyBuZWNlc3NhcnkgZm9yIG90aGVyIGNhbGN1bGF0aW9ucyBhdCB0aGUgY3VycmVudCBsaW5lIHNlZ21lbnQgaW5kZXguXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBhbmQgbmV4dCBzZWdtZW50IGZvciBhIHN0cmFpZ2h0IGxpbmUsIGFuZCB0aGUgcHJldmlvdXMsIGN1cnJlbnQgYW5kIG5leHRcbiAgICAvLyBmb3IgYW4gYXJ0aWN1bGF0ZWQgc2VnbWVudC5cbiAgICBnZXRDdXJyZW50U2VnbWVudCgpIHtcbiAgICAgICAgbGV0IHAxLCBwMiwgc2VnbWVudDtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgcDMgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBbIHAxLCBwMiwgcDMgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIG5leHQgc2VnbWVudCB0aGF0IGlzIHZhbGlkICh3aXRoaW4gdGlsZSwgaW5zaWRlIGFuZ2xlIHJlcXVpcmVtZW50cyBhbmQgd2l0aGluIGxpbmUgZ2VvbWV0cnkpLlxuICAgIGdldE5leHRGaXR0aW5nU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIHNlZ21lbnQgPSBzZWdtZW50IHx8IHRoaXMuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb2VzU2VnbWVudEZpdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpICYmIHRoaXMuaW5BbmdsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGN1cnJlbnQgc2VnbWVudCBpcyB2YWxpZFxuICAgIGRvZXNTZWdtZW50Rml0KHNlZ21lbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBraW5rZWQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEN5Y2xlcyB0aHJvdWdoIHZhcmlvdXMgd2F5cyBvZiBraW5raW5nIHRoZSBsYWJlbHMgYXJvdW5kIHRoZSBzZWdtZW50J3MgcGl2b3QsXG4gICAgLy8gZmluZGluZyB0aGUgYmVzdCBmaXQsIGFuZCBkZXRlcm1pbmVzIHRoZSBraW5rX2luZGV4LlxuICAgIGZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgIC8vIERvbid0IGZpdCBpZiBzZWdtZW50IGRvZXNuJ3QgcGFzcyB0aGUgdmVydGljYWwgbGluZSB0ZXN0LCByZXN1bHRpbmcgaW4gdXBzaWRlLWRvd24gbGFiZWxzXG4gICAgICAgIGlmIChwMHAxWzBdICogcDFwMlswXSA8IDAgJiYgcDBwMVsxXSAqIHAxcDJbMV0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZV9sZW5ndGgxID0gVmVjdG9yLmxlbmd0aChwMHAxKSAvIHVwcDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoMiA9IFZlY3Rvci5sZW5ndGgocDFwMikgLyB1cHA7XG5cbiAgICAgICAgLy8gYnJlYWsgdXAgbXVsdGlwbGUgc2VnbWVudHMgaW50byB0d28gY2h1bmtzIChOLTEgb3B0aW9ucylcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDEgPSB0aGlzLnRvdGFsX2xlbmd0aDtcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDIgPSAwO1xuICAgICAgICBsZXQgd2lkdGgsIGZpdG5lc3MgPSAwO1xuICAgICAgICBsZXQga2lua19pbmRleCA9IHRoaXMubnVtX3NlZ21lbnRzIC0gMTtcbiAgICAgICAgbGV0IGZpdG5lc3NlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChraW5rX2luZGV4ID4gMCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLnNpemVba2lua19pbmRleF1bMF0gKyB0aGlzLnNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgxIC09IHdpZHRoO1xuICAgICAgICAgICAgbGFiZWxfbGVuZ3RoMiArPSB3aWR0aDtcblxuICAgICAgICAgICAgZml0bmVzcyA9IE1hdGgubWF4KGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMSwgbGFiZWxfbGVuZ3RoMSksIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMiwgbGFiZWxfbGVuZ3RoMikpO1xuICAgICAgICAgICAgZml0bmVzc2VzLnVuc2hpZnQoZml0bmVzcyk7XG5cbiAgICAgICAgICAgIGtpbmtfaW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhfZml0bmVzcyA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGZpdG5lc3Nlcyk7XG5cbiAgICAgICAgaWYgKG1heF9maXRuZXNzIDwgTElORV9FWENFRURfS0lOS0VEKSB7XG4gICAgICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSBmaXRuZXNzZXMuaW5kZXhPZihtYXhfZml0bmVzcykgKyAxO1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gbWF4X2ZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHN0cmFpZ2h0IHNlZ21lbnQgaXMgdmFsaWRcbiAgICAvLyBBIHN0cmFpZ2h0IHNlZ21lbnQgaXMgcGxhY2VkIGF0IHRoZSBtaWRwb2ludCBhbmQgaXMgdmFsaWQgaWYgdGhlIGxhYmVsJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gICAgLy8gZmFjdG9yIChMSU5FX0VYQ0VFRF9TVFJBSUdIVCkgb2YgdGhlIGxpbmUgc2VnbWVudCdzIGxlbmd0aFxuICAgIGZpdFN0cmFpZ2h0U2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCBsaW5lX2xlbmd0aCA9IFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKSkgLyB1cHA7XG4gICAgICAgIGxldCBmaXRuZXNzID0gY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgsIHRoaXMudG90YWxfbGVuZ3RoKTtcblxuICAgICAgICBpZiAoZml0bmVzcyA8IExJTkVfRVhDRUVEX1NUUkFJR0hUKXtcbiAgICAgICAgICAgIHRoaXMuZml0bmVzcyA9IGZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uY2UgYSBmaXR0aW5nIHNlZ21lbnQgaXMgZm91bmQsIGRldGVybWluZSBpdHMgYW5nbGVzLCBwb3NpdGlvbnMgYW5kIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDdXJyZW50QW5nbGUoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEFuZ2xlKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IGFuZ2xlcyA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGExID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEyID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3JpZW50YXRpb24gPSAocDBwMVswXSA+PSAwICYmIHAxcDJbMF0gPj0gMCkgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0aGlzLmtpbmtfaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMiA6IHRoZXRhMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKG9yaWVudGF0aW9uID4gMCkgPyB0aGV0YTEgOiB0aGV0YTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2goYW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlcy5wdXNoKHRoZXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5nbGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbGFiZWxcbiAgICBnZXRDdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgcG9zaXRpb247XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudFsxXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVswXSArIHNlZ21lbnRbMV1bMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVsxXSArIHNlZ21lbnRbMV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzIHRvIGJlIHdpdGhpbiBhbiBhbmdsZSByYW5nZSBbLU1BWF9BTkdMRSwgK01BWF9BTkdMRV1cbiAgICBpbkFuZ2xlQm91bmRzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbMF07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUwICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTEgPSB0aGlzLmFuZ2xlWzFdO1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZTEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlMSArPSAyICogTWF0aC5QSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBNYXRoLmFicyhhbmdsZTEgLSBhbmdsZTApO1xuICAgICAgICAgICAgICAgIHRoZXRhID0gTWF0aC5taW4oMiAqIE1hdGguUEkgLSB0aGV0YSwgdGhldGEpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZXRhIDw9IE1BWF9BTkdMRTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBib3VuZGluZyBib3hlc1xuICAgIHVwZGF0ZUJCb3hlcygpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnRvdGFsX2hlaWdodCArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyByZXNldCBib3VuZGluZyBib3hlc1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXggLSAxXTsgLy8gYW5nbGUgYmVmb3JlIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXhdOyAvLyBhbmdsZSBhZnRlciBraW5rXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTsgLy8gYW5nbGUgZGVsdGFcblxuICAgICAgICAgICAgICAgIC8vIEEgc3ByZWFkIGZhY3RvciBvZiAwIHBpdm90cyB0aGUgYm94ZXMgb24gdGhlaXIgaG9yaXpvbnRhbCBjZW50ZXIsIGxvb2tpbmcgbGlrZTogXCJYXCJcbiAgICAgICAgICAgICAgICAvLyBhIHNwcmVhZCBmYWN0b3Igb2YgMSBvZmZzZXRzIHRoZSBib3hlcyBzbyB0aGF0IHRoZWlyIGNvcm5lcnMgdG91Y2gsIGxvb2tpbmcgbGlrZTogXCJcXC9cIiBvciBcIi9cXFwiXG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gdGhpcy5zcHJlYWRfZmFjdG9yICogTWF0aC5hYnModGhpcy50b3RhbF9oZWlnaHQgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSkpO1xuICAgICAgICAgICAgICAgIGxldCBudWRnZSA9IDAuNSAqICgtZHggLSB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBiYWNrd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBmb3J3YXJkcyBmcm9tIGtpbmsgaW5kZXhcbiAgICAgICAgICAgICAgICBudWRnZSA9IDAuNSAqIChkeCArIHRoaXMuc3BhY2Vfd2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBudWRnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgbGV0IHNoaWZ0ID0gLTAuNSAqIHRoaXMudG90YWxfbGVuZ3RoOyAvLyBzaGlmdCBmb3IgY2VudGVyaW5nIHRoZSBsYWJlbHNcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5nbGUgPSB0aGlzLmFuZ2xlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtzaGlmdCAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBzaGlmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IGlzIHdpdGhpbiB0aGUgdGlsZS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgaW5UaWxlQm91bmRzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIgfTtcbiAgICAgICAgICAgIGxldCBpbl9ib3VuZHMgPSBMYWJlbC5wcm90b3R5cGUuaW5UaWxlQm91bmRzLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghaW5fYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZHMgZWFjaCBzZWdtZW50IHRvIHRoZSBjb2xsaXNpb24gcGFzcyBhcyBpdHMgb3duIGJvdW5kaW5nIGJveFxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgYWRkKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuICAgICAgICAgICAgTGFiZWwucHJvdG90eXBlLmFkZC5jYWxsKG9iaiwgYmJveGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQgKHZpYSBjb2xsaXNpb24pLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2Jicy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG5cbiAgICAgICAgICAgIGxldCBzaG91bGREaXNjYXJkID0gTGFiZWwucHJvdG90eXBlLm9jY2x1ZGVkLmNhbGwob2JqLCBiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgb3JpZW50ZWQgYm91bmRpbmcgYm94XG5mdW5jdGlvbiBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBvZmZzZXQsIHVwcCkge1xuICAgIGxldCBwMCwgcDE7XG4gICAgLy8gYXBwbHkgb2Zmc2V0LCB4IHBvc2l0aXZlLCB5IHBvaW50aW5nIGRvd25cbiAgICBpZiAob2Zmc2V0ICYmIChvZmZzZXRbMF0gIT09IDAgfHwgb2Zmc2V0WzFdICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSBWZWN0b3Iucm90KG9mZnNldCwgYW5nbGUpO1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCk7XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV0gLSAob2Zmc2V0WzFdICogdXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF07XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBvYmIgaXMgbmVnYXRpdmUgc2luY2UgaXQncyB0aGUgdGlsZSBzeXN0ZW0geSBheGlzIGlzIHBvaW50aW5nIGRvd25cbiAgICByZXR1cm4gbmV3IE9CQihwMCwgcDEsIC1hbmdsZSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgYSBzZWdtZW50LlxuLy8gVHJhbnNmb3JtcyB0aGUgYW5nbGUgdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UgWzAsIFBJLzJdIGFuZCBbMypQSS8yLCAyKlBJXSAoMXN0IG9yIDR0aCBxdWFkcmFudHMpXG4vLyBhcyBvdGhlciByYW5nZXMgcHJvZHVjZSBcInVwc2lkZSBkb3duXCIgbGFiZWxzXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21TZWdtZW50KHB0MSwgcHQyKSB7XG4gICAgbGV0IFBJID0gTWF0aC5QSTtcbiAgICBsZXQgUElfMiA9IFBJIC8gMjtcbiAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIocHQxLCBwdDIpO1xuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIocDFwMlswXSwgcDFwMlsxXSkgKyBQSV8yO1xuXG4gICAgaWYgKHRoZXRhID4gUElfMikge1xuICAgICAgICAvLyBJZiBpbiAybmQgcXVhZHJhbnQsIG1vdmUgdG8gNHRoIHF1YWRyYW50XG4gICAgICAgIHRoZXRhICs9IFBJO1xuICAgICAgICB0aGV0YSAlPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhldGEgPCAwKSB7XG4gICAgICAgIC8vIElmIGluIDR0aCBxdWFkcmFudCwgbWFrZSBhIHBvc2l0aXZlIGFuZ2xlXG4gICAgICAgIHRoZXRhICs9IDIgKiBQSTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhldGE7XG59XG5cbmZ1bmN0aW9uIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCBsYWJlbF9sZW5ndGgpe1xuICAgIHJldHVybiAxIC0gbGluZV9sZW5ndGggLyBsYWJlbF9sZW5ndGg7XG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5hbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNOZXh0ID0gdGhpcy5nZXROZXh0Rml0KCk7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICFoYXNOZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAvLyBubyB0ZXh0IG9mZnNldCwgdXNlIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBwYXJlbnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICBsZXQgcCA9IFtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKyAodGhpcy5vZmZzZXRbMF0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpLFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtICh0aGlzLm9mZnNldFsxXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYWFiYiA9IHRoaXMub2JiLmdldEV4dGVudCgpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBsYWJlbCBpbnRvIHRoZSB0aWxlIGJvdW5kc1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsYWJlbCB3YXMgbW92ZWQgaW50byB0aWxlLCBmYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZFxuICAgIG1vdmVJbnRvVGlsZSAoKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlswXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKz0gLXRoaXMuYWFiYlswXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsyXSA+PSBHZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSAtPSB0aGlzLmFhYmJbMl0gLSBHZW8udGlsZV9zY2FsZSArIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbM10gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlszXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsxXSA8PSAtR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzFdICsgR2VvLnRpbGVfc2NhbGUgLSAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cblxuICAgIGdldE5leHRGaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgfHwgdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQubW92ZV9pbnRvX3RpbGUpIHtcbiAgICAgICAgICAgIHRoaXMubW92ZUludG9UaWxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0X2FuY2hvcl9pbmRleCA9IGk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm8gYW5jaG9ycyByZXN1bHQgaW4gZml0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNjYXJkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmIChzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYW5jaG9yIHNwZWNpZmllZCwgdHJ5IHRoZW0gaW4gb3JkZXJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPXRoaXMuc3RhcnRfYW5jaG9yX2luZGV4OyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSAmJiAhdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuIiwiLy8gU2V0cyBvZiB2YWx1ZXMgdG8gbWF0Y2ggZm9yIGRpcmVjdGlvbmFsIGFuZCBjb3JuZXIgYW5jaG9yc1xuY29uc3QgbGVmdHMgPSBbJ2xlZnQnLCAndG9wLWxlZnQnLCAnYm90dG9tLWxlZnQnXTtcbmNvbnN0IHJpZ2h0cyA9IFsncmlnaHQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1yaWdodCddO1xuY29uc3QgdG9wcyA9IFsndG9wJywgJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCddO1xuY29uc3QgYm90dG9tcyA9IFsnYm90dG9tJywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddO1xuXG5sZXQgUG9pbnRBbmNob3I7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50QW5jaG9yID0ge1xuXG4gICAgY29tcHV0ZU9mZnNldCAob2Zmc2V0LCBzaXplLCBhbmNob3IsIGJ1ZmZlciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFhbmNob3IgfHwgYW5jaG9yID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQyID0gW29mZnNldFswXSwgb2Zmc2V0WzFdXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyIHx8IHRoaXMuZGVmYXVsdF9idWZmZXI7XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgbGVmdC9yaWdodCBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdIC09IGJ1ZmZlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdICs9IGJ1ZmZlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIHRvcC9ib3R0b20gb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzVG9wQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gYnVmZmVyWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNCb3R0b21BbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBidWZmZXJbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0MjtcbiAgICB9LFxuXG4gICAgYWxpZ25Gb3JBbmNob3IgKGFuY2hvcikge1xuICAgICAgICBpZiAoYW5jaG9yICYmIGFuY2hvciAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH0sXG5cbiAgICBpc0xlZnRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGxlZnRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNSaWdodEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAocmlnaHRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNUb3BBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHRvcHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc0JvdHRvbUFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAoYm90dG9tcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIC8vIEJ1ZmZlcnM6IFtsZWZ0LCByaWdodCwgdG9wLCBib3R0b21dXG4gICAgZGVmYXVsdF9idWZmZXI6IFsyLjUsIDIuNSwgMS41LCAwLjc1XSxcbiAgICB6ZXJvX2J1ZmZlcjogWzAsIDAsIDAsIDBdXG5cbn07XG4iLCJpbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcGVhdEdyb3VwIHtcblxuICAgIGNvbnN0cnVjdG9yIChrZXksIHJlcGVhdF9kaXN0LCBtYXhfcmVwZWF0X2Rpc3QpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3QgPSByZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5yZXBlYXRfZGlzdF9zcSA9IHRoaXMucmVwZWF0X2Rpc3QgKiB0aGlzLnJlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSA9IG1heF9yZXBlYXRfZGlzdCAqIG1heF9yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5vbmVfcGVyX2dyb3VwID0gKHRoaXMucmVwZWF0X2Rpc3Rfc3EgPj0gdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFuIG9iamVjdCB0byBzZWUgaWYgaXQncyBhIHJlcGVhdCBpbiB0aGlzIGdyb3VwXG4gICAgY2hlY2sgKG9iaikge1xuICAgICAgICAvLyBJZiBvbmx5IG9uZSBvYmplY3QgYWxsb3dlZCBwZXIgZ3JvdXAsIHNob3J0Y3V0IGRpc3RhbmNlIGxvZ2ljXG4gICAgICAgIGlmICh0aGlzLm9uZV9wZXJfZ3JvdXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgZGlzdGFuY2UgbWF4ZXMgb3V0IGF0IHRocmVzaG9sZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgICAgICAvLyAobm90IHRydWUgZGlzdCB2YWx1ZSBzaW5jZSB3ZSBza2lwcGVkIGNhbGN1bGF0aW5nIGl0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rfc3E6IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICByZXBlYXRfZGlzdF9zcTogdGhpcy5yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgb25lX3Blcl9ncm91cDogdGhpcy5vbmVfcGVyX2dyb3VwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gb2JqZWN0IGZvciB0aGlzIGdyb3VwIHlldFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGlzdGFuY2UgZnJvbSBuZXcgb2JqZWN0IHRvIG9iamVjdHMgYWxyZWFkeSBpbiBncm91cFxuICAgICAgICBsZXQgcDEgPSBvYmoucG9zaXRpb247XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcDIgPSB0aGlzLnBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgIGxldCBkeCA9IHAxWzBdIC0gcDJbMF07XG4gICAgICAgICAgICBsZXQgZHkgPSBwMVsxXSAtIHAyWzFdO1xuICAgICAgICAgICAgbGV0IGRpc3Rfc3EgPSBkeCAqIGR4ICsgZHkgKiBkeTtcblxuICAgICAgICAgICAgLy8gRm91bmQgYW4gZXhpc3Rpbmcgb2JqZWN0IHdpdGhpbiBhbGxvd2VkIGRpc3RhbmNlXG4gICAgICAgICAgICBpZiAoZGlzdF9zcSA8IHRoaXMucmVwZWF0X2Rpc3Rfc3EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICByZXBlYXRfZGlzdF9zcTogdGhpcy5yZXBlYXRfZGlzdF9zcVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgb2JqZWN0IHRvIHRoaXMgZ3JvdXBcbiAgICBhZGQgKG9iaikge1xuICAgICAgICAvLyBvbmx5IHN0b3JlIG9iamVjdCdzIHBvc2l0aW9uLCB0byBzYXZlIHNwYWNlIC8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWZlcmVuY2VzXG4gICAgICAgIGlmIChvYmogJiYgb2JqLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKG9iai5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGF0aWMgbWV0aG9kcyBhcmUgdXNlZCB0byBtYW5hZ2UgcmVwZWF0IGdyb3Vwcywgd2l0aGluIGFuZCBhY3Jvc3MgdGlsZXNcblxuICAgIC8vIFJlc2V0IGFsbCBncm91cHMgZm9yIHRoaXMgdGlsZVxuICAgIHN0YXRpYyBjbGVhciAodGlsZSkge1xuICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXSA9IHt9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFuIG9iamVjdCB0byBzZWUgaWYgaXQncyBhIHJlcGVhdCB3aXRoaW4gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgY2hlY2sgKG9iaiwgbGF5b3V0LCB0aWxlKSB7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICYmIGxheW91dC5yZXBlYXRfZ3JvdXAgJiYgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXS5jaGVjayhvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGFuIG9iamVjdCB0byBpdHMgZGVzaWduYXRlZCBncm91cFxuICAgIHN0YXRpYyBhZGQgKG9iaiwgbGF5b3V0LCB0aWxlKSB7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICYmIGxheW91dC5yZXBlYXRfZ3JvdXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPSBuZXcgUmVwZWF0R3JvdXAoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAsXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIFJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXS5hZGQob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vLyBDdXJyZW50IHNldCBvZiByZXBlYXQgZ3JvdXBzLCBncm91cGVkIGFuZCBrZXllZCBieSB0aWxlXG5SZXBlYXRHcm91cC5ncm91cHMgPSB7fTtcblxuLy8gTWF4IHJlcGVhdCBkaXN0OiBmb3IgZ3JvdXBzIHdpdGggYSByZXBlYXQgZGlzdCBiZXlvbmQgdGhpcyB0aHJlc2hvbGQsIG9ubHkgb25lIGxhYmVsXG4vLyB3aWxsIGJlIGFsbG93ZWQgcGVyIGdyb3VwLCBlLmcuIHNldCB0byB0aWxlIHNpemUgZm9yIG9uZS1sYWJlbC1wZXItdGlsZVxuUmVwZWF0R3JvdXAubWF4X3JlcGVhdF9kaXN0ID0gR2VvLnRpbGVfc2NhbGU7XG4iLCJpbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuXG4vLyBFeHBvcnRzIG11c3QgYXBwZWFyIG91dHNpZGUgYSBmdW5jdGlvbiwgYnV0IHdpbGwgb25seSBiZSBkZWZpbmVkIGluIG1haW4gdGhyZWFkIChiZWxvdylcbmV4cG9ydCB2YXIgTGVhZmxldExheWVyO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWZsZXRMYXllcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGV4dGVuZExlYWZsZXQob3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZExlYWZsZXQob3B0aW9ucykge1xuXG4gICAgLy8gSWYgTGVhZmxldExheWVyIGlzIGFscmVhZHkgZGVmaW5lZCB3aGVuIHRoaXMgaXMgY2FsbGVkIGp1c3QgcmV0dXJuIHRoYXQgaW1tZWRpYXRlbHlcbiAgICAvLyBlLmcuIGlmIHlvdSBjYWxsIGxlYWZsZXRMYXllciBtdWx0aXBsZSB0aW1lcyAod2hpY2ggaXMgdmFsaWQpXG4gICAgaWYgKHR5cGVvZiBMZWFmbGV0TGF5ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExlYWZsZXQgbGF5ZXIgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGRlZmluZWQgaW4gbWFpbiB0aHJlYWRcbiAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcblxuICAgICAgICBsZXQgTCA9IG9wdGlvbnMubGVhZmxldCB8fCB3aW5kb3cuTDtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIGV4dGVuZGluZyB0aGUgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIgY2xhc3MsIG9yIHRoZSBuZXdlclxuICAgICAgICAvLyBsZWFmbGV0IDEueCBHcmlkTGF5ZXIgY2xhc3MuXG4gICAgICAgIGxldCBsYXllckJhc2VDbGFzcyA9IEwuR3JpZExheWVyID8gTC5HcmlkTGF5ZXIgOiBMLlRpbGVMYXllcjtcbiAgICAgICAgbGV0IGxlYWZsZXRWZXJzaW9uID0gbGF5ZXJCYXNlQ2xhc3MgPT09IEwuR3JpZExheWVyID8gJzEueCcgOiAnMC43LngnO1xuICAgICAgICBsZXQgbGF5ZXJDbGFzc0NvbmZpZyA9IHt9O1xuXG4gICAgICAgIC8vIElmIGV4dGVuZGluZyBsZWFmbGV0IDAuNy54IFRpbGVMYXllciwgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWRcbiAgICAgICAgaWYgKGxheWVyQmFzZUNsYXNzID09PSBMLlRpbGVMYXllcikge1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fYWRkVGlsZSA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX3JlbW92ZVRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5fcmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAvLyByZS1hZGQgdGhlIGNhbnZhcyBzaW5jZSBiYXNlIGNsYXNzIGB2aWV3cmVzZXRgIGV2ZW50IGNhbiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSAmJiB0aGlzLnNjZW5lLmNvbnRhaW5lciAmJiB0aGlzLnNjZW5lLmNhbnZhcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjZW5lLmNhbnZhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBjdXN0b20gbGF5ZXIgbWV0aG9kc1xuICAgICAgICBPYmplY3QuYXNzaWduKGxheWVyQ2xhc3NDb25maWcsIHtcblxuICAgICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvd0RlYnVnID0gKCFvcHRpb25zLnNob3dEZWJ1ZyA/IGZhbHNlIDogdHJ1ZSk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy53aGVlbERlYm91bmNlVGltZSA9IG9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWUgfHwgNDA7XG5cbiAgICAgICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBsZWFmbGV0IHpvb20gYW5pbWF0aW9ucyBvZmZcbiAgICAgICAgICAgICAgICB0aGlzLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VWaWV3UmVzZXQgPSBVdGlscy5kZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKCd6b29tZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLndoZWVsRGVib3VuY2VUaW1lKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVNjZW5lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IFNjZW5lLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1Xb3JrZXJzOiB0aGlzLm9wdGlvbnMubnVtV29ya2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVVwZGF0ZTogdGhpcy5vcHRpb25zLnByZVVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RVcGRhdGU6IHRoaXMub3B0aW9ucy5wb3N0VXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c1pvb206IChMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPT09ICcxLngnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hEZW5zaXR5RGlzcGxheTogdGhpcy5vcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLm9wdGlvbnMubG9nTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLm9wdGlvbnMuaW50cm9zcGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsZWQgc2NlbmUudXBkYXRlKCkgcGVyIGZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVuZGVyTG9vcDogdGhpcy5vcHRpb25zLmRpc2FibGVSZW5kZXJMb29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCB3aWxsIHJlcXVpcmUgbGlicmFyeSB0byBiZSBzZXJ2ZWQgYXMgc2FtZSBob3N0IGFzIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzOiB0aGlzLm9wdGlvbnMuYWxsb3dDcm9zc0RvbWFpbldvcmtlcnNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGaW5pc2ggaW5pdGlhbGl6aW5nIHNjZW5lIGFuZCBzZXR1cCBldmVudHMgd2hlbiBsYXllciBpcyBhZGRlZCB0byBtYXBcbiAgICAgICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25BZGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MucmVzaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3ZlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSBNYXRoLm1pbihtYXAuZ2V0Wm9vbSgpLCBtYXAuZ2V0TWF4Wm9vbSgpIHx8IEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmltbWVkaWF0ZVJlZHJhdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3Muem9vbXN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zdGFydFpvb20oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmRyYWdzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnBhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmRyYWdlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5wYW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ2RyYWdlbmQnLCB0aGlzLmhvb2tzLmRyYWdlbmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgbWFwLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIE1vZGlmeSBkZWZhdWx0IGxlYWZsZXQgc2Nyb2xsIHdoZWVsIGJlaGF2aW9yXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yKG1hcCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25FdmVudHModGhpcy5vcHRpb25zLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgR0wgY2FudmFzIHRvIGxheWVyIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmlld1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRhbmdyYW0gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBtb3ZlOiB0aGlzLm9uVGFuZ3JhbVZpZXdVcGRhdGUuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGxlYWZsZXQncyBleGlzdGluZyBldmVudCBzeXN0ZW0gYXMgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUubG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2luaXQnKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vblJlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbWFwLm9mZigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ2VuZCcsIHRoaXMuaG9va3MuZHJhZ2VuZCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY3JlYXRlVGlsZTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjb29yZHMueCArICcvJyArIGNvb3Jkcy55ICsgJy8nICsgY29vcmRzLno7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZS1rZXknLCBrZXkpO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICcyNTZweCc7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9ICcyNTZweCc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dEZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdfb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnRleHRDb250ZW50ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50b3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5mb250U2l6ZSA9ICcxNnB4JztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50ZXh0T3V0bGluZSA9ICcxcHggIzAwMDAwMCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucGFkZGluZyA9ICc4cHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkZWJ1Z19vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlclN0eWxlID0gJ3NvbGlkJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlcldpZHRoID0gJzFweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpdjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBzY3JvbGwgd2hlZWwgYmVoYXZpb3IgdG8gaGF2ZSBhIG11Y2ggbW9yZSBzZW5zaXR2ZS9jb250aW51b3VzIHpvb21cbiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgb25jZSBsZWFmbGV0IGNvbnRpbnVvdXMgem9vbSBpcyBtb3JlIHdpZGVseSB1c2VkIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgaXMgcHJlc3VtYWJseSBpbXByb3ZlZFxuICAgICAgICAgICAgbW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcjogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5zY3JvbGxXaGVlbFpvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeVNjcm9sbFdoZWVsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy56b29tU25hcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5vcHRpb25zLndoZWVsUHhQZXJab29tTGV2ZWwgPSAxMDAwO1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy53aGVlbERlYm91bmNlVGltZSA9IDEwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSBNYXRoLm1pbih0aGlzLl9tYXAuZ2V0Wm9vbSgpLCB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIHx8IEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnJlc2l6ZU1hcChzaXplLngsIHNpemUueSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvblRhbmdyYW1WaWV3VXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXRWaWV3KFt0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxhdCwgdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sbmddLCB0aGlzLnNjZW5lLnZpZXcuem9vbSwgeyBhbmltYXRlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUmV2ZXJzZSB0aGUgQ1NTIHBvc2l0aW9uaW5nIExlYWZsZXQgYXBwbGllcyB0byB0aGUgbGF5ZXIsIHNpbmNlIFRhbmdyYW0ncyBXZWJHTCBjYW52YXNcbiAgICAgICAgICAgIC8vIGlzIGV4cGVjdGVkIHRvIGJlICdhYnNvbHV0ZWx5JyBwb3NpdGlvbmVkLlxuICAgICAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLnNjZW5lIHx8ICF0aGlzLnNjZW5lLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHRvcF9sZWZ0ID0gdGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KFswLCAwXSk7XG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuc2NlbmUuY29udGFpbmVyLCB0b3BfbGVmdCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBUaWUgTGVhZmxldCBldmVudCBoYW5kbGVycyB0byBUYW5ncmFtIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0ge307XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2socmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2Vtb3ZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW91dCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vdXNlIGxlYXZlcyBtYXAsIHNlbmQgYW4gYWRkaXRpb25hbCBzZWxlY3Rpb24gZXZlbnQgdG8gaW5kaWNhdGUgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIoeyBjaGFuZ2VkOiB0cnVlLCBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW91dCcsIHRoaXMuaG9va3MubW91c2VvdXQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gU2V0IHVzZXItZGVmaW5lZCBoYW5kbGVycyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gZXZlbnRzXG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgb25seSBvbmUgaGFuZGxlciBjYW4gYmUgZGVmaW5lZCBmb3IgZWFjaCBldmVudCB0eXBlXG4gICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBhcmU6IGBjbGlja2AsIGBob3ZlcmAgKGxlYWZsZXQgYG1vdXNlbW92ZWApXG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25FdmVudHM6IGZ1bmN0aW9uIChldmVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0gT2JqZWN0LmFzc2lnbih0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLCBldmVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbGF5ZXIgY2xhc3NcbiAgICAgICAgTGVhZmxldExheWVyID0gbGF5ZXJCYXNlQ2xhc3MuZXh0ZW5kKGxheWVyQ2xhc3NDb25maWcpO1xuXG4gICAgICAgIC8vIFBvbHlmaWxsIHNvbWUgMS4wIG1ldGhvZHNcbiAgICAgICAgaWYgKHR5cGVvZiBMZWFmbGV0TGF5ZXIucmVtb3ZlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBMZWFmbGV0TGF5ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZScpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIExlYWZsZXRMYXllci5sYXllckJhc2VDbGFzcyA9IGxheWVyQmFzZUNsYXNzO1xuICAgICAgICBMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPSBsZWFmbGV0VmVyc2lvbjtcblxuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi92ZWN0b3InO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuY29uc3Qgc2hhZGVyU3JjX2FtYmllbnRMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvYW1iaWVudExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL2RpcmVjdGlvbmFsTGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvcG9pbnRMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19zcG90TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL3Nwb3RMaWdodC5nbHNsJywgJ3V0ZjgnKTtcblxuLy8gQWJzdHJhY3QgbGlnaHRcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5hbWJpZW50ID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5hbWJpZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5hbWJpZW50IHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuYW1iaWVudCkuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmRpZmZ1c2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmRpZmZ1c2UgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmRpZmZ1c2UgIT0gbnVsbCA/IGNvbmZpZy5kaWZmdXNlIDogMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpZmZ1c2UgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5kaWZmdXNlKS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuc3BlY3VsYXIgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLnNwZWN1bGFyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhciA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuc3BlY3VsYXIgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuc3BlY3VsYXIpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbGlnaHQgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgLy8gJ2NvbmZpZycgbXVzdCBpbmNsdWRlICduYW1lJyBhbmQgJ3R5cGUnLCBhbG9uZyB3aXRoIGFueSBvdGhlciB0eXBlLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBzdGF0aWMgY3JlYXRlICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgaWYgKExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWdodC50eXBlc1tjb25maWcudHlwZV0odmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBsaWdodCBmb3IgYSBzdHlsZTogZnJhZ21lbnQgbGlnaHRpbmcsIHZlcnRleCBsaWdodGluZywgb3Igbm9uZVxuICAgIHN0YXRpYyBzZXRNb2RlIChtb2RlLCBzdHlsZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbW9kZSA9ICdmcmFnbWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgbW9kZSA9IExpZ2h0LmVuYWJsZWQgJiYgKChtb2RlICE9IG51bGwpID8gbW9kZSA6ICdmcmFnbWVudCcpOyAvLyBkZWZhdWx0IHRvIGZyYWdtZW50IGxpZ2h0aW5nXG4gICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTElHSFRJTkdfRlJBR01FTlQnXSA9IChtb2RlID09PSAnZnJhZ21lbnQnKTtcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19WRVJURVgnXSA9IChtb2RlID09PSAndmVydGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGFsbCBwcm92aWRlZCBsaWdodCBkZWZpbml0aW9ucywgYW5kIGNhbGN1bGF0ZSBjdW11bGF0aXZlIGxpZ2h0IGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAobGlnaHRzKSB7XG4gICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGluamVjdGlvbnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayhMaWdodC5ibG9jayk7XG5cbiAgICAgICAgLy8gSWYgbGlnaHRpbmcgaXMgZ2xvYmFsbHkgZGlzYWJsZWQsIG5vdGhpbmcgaXMgaW5qZWN0ZWQgKG1vc3RseSBmb3IgZGVidWdnaW5nIG9yIGxpdmUgZWRpdGluZylcbiAgICAgICAgaWYgKCFMaWdodC5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgY29kZSB0byBjYWxjdWxhdGUgZWFjaCBsaWdodCBpbnN0YW5jZVxuICAgICAgICBsZXQgY2FsY3VsYXRlTGlnaHRzID0gXCJcIjtcbiAgICAgICAgaWYgKGxpZ2h0cyAmJiBPYmplY3Qua2V5cyhsaWdodHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENvbGxlY3QgdW5pcXVlcyB0eXBlcyBvZiBsaWdodHNcbiAgICAgICAgICAgIGxldCB0eXBlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgbGlnaHRfbmFtZSBpbiBsaWdodHMpIHtcbiAgICAgICAgICAgICAgICB0eXBlc1tsaWdodHNbbGlnaHRfbmFtZV0udHlwZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgZWFjaCB0eXBlIG9mIGxpZ2h0XG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHR5cGVzKSB7XG4gICAgICAgICAgICAgICAgTGlnaHQudHlwZXNbdHlwZV0uaW5qZWN0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBwZXItaW5zdGFuY2UgYmxvY2tzIGFuZCBjb25zdHJ1Y3QgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIC8vIERlZmluZSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIGxpZ2h0c1tsaWdodF9uYW1lXS5pbmplY3QoKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY2FsY3VsYXRpb24gZnVuY3Rpb24gdG8gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVMaWdodHMgKz0gYGNhbGN1bGF0ZUxpZ2h0KCR7bGlnaHRfbmFtZX0sIF9leWVUb1BvaW50LCBfbm9ybWFsKTtcXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2x1ZSB0b2dldGhlciB0aGUgZmluYWwgbGlnaHRpbmcgZnVuY3Rpb24gdGhhdCBzdW1zIGFsbCB0aGUgbGlnaHRzXG4gICAgICAgIGxldCBjYWxjdWxhdGVGdW5jdGlvbiA9IGBcbiAgICAgICAgICAgIHZlYzQgY2FsY3VsYXRlTGlnaHRpbmcoaW4gdmVjMyBfZXllVG9Qb2ludCwgaW4gdmVjMyBfbm9ybWFsLCBpbiB2ZWM0IF9jb2xvcikge1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gaW5pdGlhbCBtYXRlcmlhbCBjYWxjdWxhdGlvbnMgb3ZlciBub3JtYWwsIGVtaXNzaW9uLCBhbWJpZW50LCBkaWZmdXNlIGFuZCBzcGVjdWxhciB2YWx1ZXNcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXRlcmlhbChfZXllVG9Qb2ludCxfbm9ybWFsKTtcblxuICAgICAgICAgICAgICAgIC8vIFVuIHJvbGwgdGhlIGxvb3Agb2YgaW5kaXZpZHVhbCBsaWd0aHMgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgJHtjYWxjdWxhdGVMaWdodHN9XG5cbiAgICAgICAgICAgICAgICAvLyAgRmluYWwgbGlnaHQgaW50ZW5zaXR5IGNhbGN1bGF0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIEtlZXAgbWF0ZXJpYWwgYWxwaGEgY2hhbm5lbCB3aGVuIGFscGhhIGJsZW5kaW5nIGlzIG9uXG4gICAgICAgICAgICAgICAgI2lmICFkZWZpbmVkKFRBTkdSQU1fQkxFTkRfT1BBUVVFKVxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBtYXRlcmlhbC5lbWlzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfQU1CSUVOVFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudCAqIF9jb2xvciAqIG1hdGVyaWFsLmFtYmllbnQ7XG4gICAgICAgICAgICAgICAgICAgICNlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudCAqIF9jb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZSAqIF9jb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2U7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX1NQRUNVTEFSXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9zcGVjdWxhciAqIG1hdGVyaWFsLnNwZWN1bGFyO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAvLyBNdWx0aXBseSBtYXRlcmlhbCBhbHBoYSBjaGFubmVsIGludG8gbWF0ZXJpYWwgUkdCIHdoZW4gYWxwaGEgYmxlbmRpbmcgaXMgb2ZmXG4gICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSA9IF9jb2xvci5hOyAvLyB1c2UgdmVydGV4IGNvbG9yIGFscGhhXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRU1JU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiA9IG1hdGVyaWFsLmVtaXNzaW9uLnJnYiAqIG1hdGVyaWFsLmVtaXNzaW9uLmE7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0FNQklFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5hbWJpZW50LnJnYiAqIG1hdGVyaWFsLmFtYmllbnQuYTtcbiAgICAgICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudC5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2IgKiBtYXRlcmlhbC5kaWZmdXNlLmE7XG4gICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2RpZmZ1c2UucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5hO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9TUEVDVUxBUlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX3NwZWN1bGFyLnJnYiAqIG1hdGVyaWFsLnNwZWN1bGFyLnJnYiAqIG1hdGVyaWFsLnNwZWN1bGFyLmE7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgLy8gQ2xhbXAgZmluYWwgY29sb3JcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNsYW1wKGNvbG9yLCAwLjAsIDEuMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBjYWxjdWxhdGVGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGluc3RhbmNlIGRlZmluaXRpb25cbiAgICBpbmplY3QgKCkge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSAgYFxuICAgICAgICAgICAgdW5pZm9ybSAke3RoaXMuc3RydWN0X25hbWV9IHVfJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgJHt0aGlzLnN0cnVjdF9uYW1lfSAke3RoaXMubmFtZX07XG4gICAgICAgICAgICBgO1xuICAgICAgICBsZXQgYXNzaWduID0gYFxuICAgICAgICAgICAgJHt0aGlzLm5hbWV9ID0gdV8ke3RoaXMubmFtZX07XFxuXG4gICAgICAgIGA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgaW5zdGFuY2UpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdzZXR1cCcsIGFzc2lnbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsXG4gICAgLy8gcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyAgVGhyZWUgY29tbW9uIGxpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlmZnVzZWAsIHRoaXMuZGlmZnVzZSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5zcGVjdWxhcmAsIHRoaXMuc3BlY3VsYXIpO1xuICAgIH1cblxufVxuXG5MaWdodC50eXBlcyA9IHt9OyAvLyByZWZlcmVuY2VzIHRvIHN1YmNsYXNzZXMgYnkgc2hvcnQgbmFtZVxuTGlnaHQuYmxvY2sgPSAnbGlnaHRpbmcnOyAvLyBzaGFkZXIgYmxvY2sgbmFtZVxuTGlnaHQuZW5hYmxlZCA9IHRydWU7IC8vIGxpZ2h0aW5nIGNhbiBiZSBnbG9iYWxseSBlbmFibGVkL2Rpc2FibGVkXG5cblxuLy8gTGlnaHQgc3ViY2xhc3Nlc1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhbWJpZW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdBbWJpZW50TGlnaHQnO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19hbWJpZW50TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2FtYmllbnQnXSA9IEFtYmllbnRMaWdodDtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZGlyZWN0aW9uYWwnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG4gICAgICAgIGlmIChjb25maWcuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBjb25maWcuZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBkaXJlY3Rpb25hbCBsaWdodCBtYWludGFpbnMgZnVsbCBpbnRlbnNpdHkgb24gZ3JvdW5kLCB3aXRoIGJhc2ljIGV4dHJ1c2lvbiBzaGFkaW5nXG4gICAgICAgICAgICBsZXQgdGhldGEgPSAxMzU7IC8vIGFuZ2xlIG9mIGxpZ2h0IGluIHh5IHBsYW5lIChyb3RhdGVkIGFyb3VuZCB6IGF4aXMpXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBNYXRoLnNpbihNYXRoLlBJKjYwLzE4MCk7IC8vIHNjYWxpbmcgZmFjdG9yIHRvIGtlZXAgdG90YWwgZGlyZWN0aW9uYWwgaW50ZW5zaXR5IHRvIDAuNVxuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gW1xuICAgICAgICAgICAgICAgIE1hdGguY29zKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIE1hdGguc2luKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIC0wLjVcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2RpcmVjdGlvbmFsJ10gPSBEaXJlY3Rpb25hbExpZ2h0O1xuXG5cbmNsYXNzIFBvaW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwb2ludCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnUG9pbnRMaWdodCc7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbiB8fCBbMCwgMCwgJzEwMHB4J107XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gW107IC8vIHBvc2l0aW9uIGluIGV5ZXNwYWNlXG4gICAgICAgIHRoaXMub3JpZ2luID0gY29uZmlnLm9yaWdpbiB8fCAnZ3JvdW5kJztcbiAgICAgICAgdGhpcy5hdHRlbnVhdGlvbiA9ICFpc05hTihwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikpID8gcGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pIDogMDtcblxuICAgICAgICBpZiAoY29uZmlnLnJhZGl1cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhZGl1cykgJiYgY29uZmlnLnJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IGNvbmZpZy5yYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IFtudWxsLCBjb25maWcucmFkaXVzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfcG9pbnRMaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGlzbnRhbmNlLXNwZWNpZmljIHNldHRpbmdzXG4gICAgaW5qZWN0KCkge1xuICAgICAgICBzdXBlci5pbmplY3QoKTtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddID0gKHRoaXMuYXR0ZW51YXRpb24gIT09IDApO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsICYmIHRoaXMucmFkaXVzWzBdICE9IG51bGwpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUV5ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRXllUG9zaXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICd3b3JsZCcpIHtcbiAgICAgICAgICAgIC8vIEZvciB3b3JsZCBvcmlnaW4sIGZvcm1hdCBpczogW2xvbmdpdHVkZSwgbGF0aXR1ZGUsIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNdXG5cbiAgICAgICAgICAgIC8vIE1vdmUgbGlnaHQncyB3b3JsZCBwb3NpdGlvbiBpbnRvIGNhbWVyYSBzcGFjZVxuICAgICAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzBdID0geCAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzBdO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMV0gPSB5IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMV07XG5cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb25bMl0sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcgfHwgdGhpcy5vcmlnaW4gPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICAvLyBGb3IgY2FtZXJhIG9yIGdyb3VuZCBvcmlnaW4sIGZvcm1hdCBpczogW3gsIHksIHpdIGluIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNcblxuICAgICAgICAgICAgLy8gTGlnaHQgaXMgaW4gY2FtZXJhIHNwYWNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIC8vIExlYXZlIGxpZ2h0J3MgeHkgaW4gY2FtZXJhIHNwYWNlLCBidXQgeiBuZWVkcyB0byBiZSBtb3ZlZCByZWxhdGl2ZSB0byBncm91bmQgcGxhbmVcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbM10gPSAxO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV8ke3RoaXMubmFtZX0ucG9zaXRpb25gLCB0aGlzLnBvc2l0aW9uX2V5ZSk7XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uYXR0ZW51YXRpb25FeHBvbmVudGAsIHRoaXMuYXR0ZW51YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmlubmVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9Lm91dGVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMV0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuTGlnaHQudHlwZXNbJ3BvaW50J10gPSBQb2ludExpZ2h0O1xuXG5cbmNsYXNzIFNwb3RMaWdodCBleHRlbmRzIFBvaW50TGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnc3BvdGxpZ2h0JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdTcG90TGlnaHQnO1xuXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uID0gKGNvbmZpZy5kaXJlY3Rpb24gfHwgWzAsIDAsIC0xXSkubWFwKHBhcnNlRmxvYXQpOyAvLyBbeCwgeSwgel1cbiAgICAgICAgdGhpcy5leHBvbmVudCA9IGNvbmZpZy5leHBvbmVudCA/IHBhcnNlRmxvYXQoY29uZmlnLmV4cG9uZW50KSA6IDAuMjtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGNvbmZpZy5hbmdsZSA/IHBhcnNlRmxvYXQoY29uZmlnLmFuZ2xlKSA6IDIwO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3Nwb3RMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RDb3NDdXRvZmZgLCBNYXRoLmNvcyh0aGlzLmFuZ2xlICogMy4xNDE1OSAvIDE4MCkpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90RXhwb25lbnRgLCB0aGlzLmV4cG9uZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydzcG90bGlnaHQnXSA9IFNwb3RMaWdodDtcbiIsImltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX21hdGVyaWFsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9tYXRlcmlhbC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWwge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcblxuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhbGwgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0cywgc28gdGhleSBjYW4gYmUgc2V0IGluIGJ1bGtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBvZiBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhciddKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHZhbHVlLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiB2YWx1ZS5tYXBwaW5nIHx8ICdzcGhlcmVtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyh2YWx1ZS5zY2FsZSAhPSBudWxsID8gdmFsdWUuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlLmFtb3VudCAhPSBudWxsID8gdmFsdWUuYW1vdW50IDogMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzID0gY29uZmlnLnNoaW5pbmVzcyA/IHBhcnNlRmxvYXQoY29uZmlnLnNoaW5pbmVzcykgOiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAoY29uZmlnLm5vcm1hbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb25maWcubm9ybWFsLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgbWFwcGluZzogY29uZmlnLm5vcm1hbC5tYXBwaW5nIHx8ICd0cmlwbGFuYXInLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLm5vcm1hbC5zY2FsZSAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29uZmlnLm5vcm1hbC5hbW91bnQgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuYW1vdW50IDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBhIG1hdGVyaWFsIGNvbmZpZyBibG9jayBoYXMgc3VmZmljaWVudCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIG1hdGVyaWFsXG4gICAgc3RhdGljIGlzVmFsaWQgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZW1pc3Npb24gPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmFtYmllbnQgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLnNwZWN1bGFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluamVjdCAoc3R5bGUpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgZGVmaW5lcyB0byBjb25maWd1cmUgdGV4dHVyZSBtYXBwaW5nLCB3aXRoIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkUsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBBbHNvIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEVuYWJsZXMgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IG9uXG4gICAgICAgIGZvciAobGV0IHByb3Agb2YgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInXSkge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX01BVEVSSUFMXyR7cHJvcC50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgICBsZXQgdGV4ZGVmID0gZGVmICsgJ19URVhUVVJFJztcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbZGVmXSA9ICh0aGlzW3Byb3BdICE9IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0gJiYgdGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZiArICdfJyArIHRoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpc1twcm9wXS5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIC8vIEFzIGFub3ZlLCBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRSddID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkVfJyArIHRoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpcy5ub3JtYWwubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5yZXBsYWNlU2hhZGVyQmxvY2soTWF0ZXJpYWwuYmxvY2ssIHNoYWRlclNyY19tYXRlcmlhbCwgJ01hdGVyaWFsJyk7XG4gICAgICAgIHN0eWxlLmFkZFNoYWRlckJsb2NrKCdzZXR1cCcsICdcXG5tYXRlcmlhbCA9IHVfbWF0ZXJpYWw7XFxuJywgJ01hdGVyaWFsJyk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyB1bmlmb3JtcyBpbiB0aGUgcGF0dGVybjpcbiAgICAgICAgLy8gdV9tYXRlcmlhbC5kaWZmdXNlLCB1X21hdGVyaWFsLmRpZmZ1c2VTY2FsZSB1X21hdGVyaWFsX2RpZmZ1c2VfdGV4dHVyZVxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJ10pIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybShgdV9tYXRlcmlhbF8ke3Byb3B9X3RleHR1cmVgLCB0aGlzW3Byb3BdLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9U2NhbGVgLCB0aGlzW3Byb3BdLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcF0uYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwuc2hpbmluZXNzJywgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKCd1X21hdGVyaWFsX25vcm1hbF90ZXh0dXJlJywgdGhpcy5ub3JtYWwudGV4dHVyZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXRlcmlhbC5ub3JtYWxTY2FsZScsIHRoaXMubm9ybWFsLnNjYWxlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwubm9ybWFsQW1vdW50JywgdGhpcy5ub3JtYWwuYW1vdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTWF0ZXJpYWwuYmxvY2sgPSAnbWF0ZXJpYWwnO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gVGhlIGxlYWZsZXQgbGF5ZXIgcGx1Z2luIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBwdWJsaWMgQVBJXG5pbXBvcnQge2xlYWZsZXRMYXllcn0gZnJvbSAnLi9sZWFmbGV0X2xheWVyJztcblxuLy8gVGhlIHNjZW5lIHdvcmtlciBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIGEgd29ya2VyIHRocmVhZCBpcyBpbnN0YW50aWF0ZWQsIGJ1dCBtdXN0IGFsd2F5cyBiZSBsb2FkZWRcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCB7U2NlbmVXb3JrZXJ9IGZyb20gJy4vc2NlbmVfd29ya2VyJztcblxuLy8gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSBleHBvc2VkIGZvciBkZWJ1Z2dpbmdcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdXRpbHMvdmVyc2lvbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgJy4vc291cmNlcy9nZW9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL3RvcG9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL212dCc7XG5pbXBvcnQgJy4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi9nbC92ZXJ0ZXhfZGF0YSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHtsYXllcl9jYWNoZX0gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4vc3R5bGVzL3RleHQvY2FudmFzX3RleHQnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcblxuLy8gTWFrZSBzb21lIG1vZHVsZXMgYWNjZXNzaWJsZSBmb3IgZGVidWdnaW5nXG52YXIgZGVidWcgPSB7XG4gICAgbG9nLFxuICAgIHlhbWwsXG4gICAgVGhyZWFkLFxuICAgIFV0aWxzLFxuICAgIEdlbyxcbiAgICBWZWN0b3IsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBHTFNMLFxuICAgIFNoYWRlclByb2dyYW0sXG4gICAgVmVydGV4RGF0YSxcbiAgICBUZXh0dXJlLFxuICAgIE1hdGVyaWFsLFxuICAgIExpZ2h0LFxuICAgIFNjZW5lLFxuICAgIFNjZW5lV29ya2VyLFxuICAgIFdvcmtlckJyb2tlcixcbiAgICBsYXllcl9jYWNoZSxcbiAgICBTdHlsZU1hbmFnZXIsXG4gICAgU3R5bGVQYXJzZXIsXG4gICAgQ29sbGlzaW9uLFxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG4gICAgQ2FudmFzVGV4dCxcbiAgICBkZWJ1Z1NldHRpbmdzXG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xuXG4gICAgLy8gQXR0YWNoIFByb21pc2UgcG9seWZpbGwgdG8gd2luZG93XG4gICAgLy8gQWxsb3dzIEZvbnRGYWNlT2JzZXJ2ZXIgdG8gdXNlIHBvbHlmaWxsICh3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBpdHMgb3duIGR1cGxpY2F0ZSBwb2x5ZmlsbClcbiAgICBpZiAod2luZG93LlByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgICAgIEpTWmlwLmV4dGVybmFsLlByb21pc2UgPSBQcm9taXNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbGVhZmxldExheWVyLFxuICAgIGRlYnVnLFxuICAgIHZlcnNpb25cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2dsL2NvbnRleHQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL2dsL3Zhbyc7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuL3N0eWxlcy9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFNjZW5lTG9hZGVyIGZyb20gJy4vc2NlbmVfbG9hZGVyJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgVGlsZU1hbmFnZXIgZnJvbSAnLi90aWxlX21hbmFnZXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBSZW5kZXJTdGF0ZU1hbmFnZXIgZnJvbSAnLi9nbC9yZW5kZXJfc3RhdGUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vc3R5bGVzL3RleHQvZm9udF9tYW5hZ2VyJztcbmltcG9ydCBNZWRpYUNhcHR1cmUgZnJvbSAnLi91dGlscy9tZWRpYV9jYXB0dXJlJztcblxuLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uOiBwYXNzIGFuIG9iamVjdCBkaXJlY3RseSwgb3IgYSBVUkwgYXMgc3RyaW5nIHRvIGxvYWQgcmVtb3RlbHlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ19zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTY2VuZS5pZCsrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDsgLy8gd2lsbCBiZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjZW5lIGlzIGxvYWRlZFxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgVmlldyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIoeyBzY2VuZTogdGhpcywgdmlldzogdGhpcy52aWV3IH0pO1xuICAgICAgICB0aGlzLm51bV93b3JrZXJzID0gb3B0aW9ucy5udW1Xb3JrZXJzIHx8IDI7XG4gICAgICAgIHRoaXMud29ya2VyX3VybCA9IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgOiB0cnVlO1xuICAgICAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0ge307XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcblxuICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3VycmVudCBzY2VuZSBidWlsZGluZyBzdGF0ZSAodGlsZXMgYmVpbmcgYnVpbHQsIGV0Yy4pXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgYSByZWRyYXdcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCByZWRyYXcgZXZlcnkgZnJhbWVcbiAgICAgICAgdGhpcy5wcmVVcGRhdGUgPSBvcHRpb25zLnByZVVwZGF0ZTsgICAgICAgICAgICAgLy8gb3B0aW9uYWwgcHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5wb3N0VXBkYXRlID0gb3B0aW9ucy5wb3N0VXBkYXRlOyAgICAgICAgICAgLy8gb3B0aW9uYWwgcG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3AgPSAhb3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcDsgIC8vIGRpc2FibGUgcmVuZGVyIGxvb3AgLSBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgU2NlbmUucmVuZGVyKCkgcGVyIGZyYW1lXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMubGFzdF9yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZnJhbWUgPSAwO1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUgPSBuZXcgTWVkaWFDYXB0dXJlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcblxuICAgICAgICB0aGlzLmxpZ2h0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGluZyA9IDA7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGFuIGlkIHRoYXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBzY2VuZSBjb25maWcgaXMgaW52YWxpZGF0ZWRcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBsYXN0IGdlbmVyYXRpb24gaWQgd2l0aCBhIGNvbXBsZXRlIHZpZXdcbiAgICAgICAgdGhpcy5zZXR1cERlYnVnKCk7XG5cbiAgICAgICAgdGhpcy5sb2dfbGV2ZWwgPSBvcHRpb25zLmxvZ0xldmVsIHx8ICd3YXJuJztcbiAgICAgICAgbG9nLnNldExldmVsKHRoaXMubG9nX2xldmVsKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlIChjb25maWcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFNjZW5lKGNvbmZpZywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCAob3IgcmVsb2FkKSBzY2VuZSBjb25maWdcbiAgICAvLyBPcHRpb25hbGx5IHNwZWNpZnkgbmV3IHNjZW5lIGZpbGUgVVJMXG4gICAgbG9hZChjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uIChzb3VyY2VzLCBzdHlsZXMsIGV0Yy4pLCB0aGVuIGNyZWF0ZSBzdHlsZXMgJiB3b3JrZXJzXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdGhpcy5sb2FkU2NlbmUoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNyZWF0ZVdvcmtlcnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2NlbmUgbG9hZGVkIGZyb20gYSBKUyBvYmplY3QsIG9yIG1vZGlmaWVkIGJ5IGEgYGxvYWRgIGV2ZW50LCBtYXkgY29udGFpbiBjb21waWxlZCBKUyBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsIHdoaWxlIG9uZSBsb2FkZWQgb25seSBmcm9tIGEgVVJMIGRvZXMgbm90LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9mdW5jcyA9ICgodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpIHx8IHRoaXMuaGFzU3Vic2NyaWJlcnNGb3IoJ2xvYWQnKSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDb25maWcoeyBzZXJpYWxpemVfZnVuY3MgfSk7XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNvbnRleHQgbG9zc1xuICAgICAgICAgICAgbGV0IGV4dCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHQubG9zZUNvbnRleHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZUNhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUubGVmdCA9IDA7XG5cbiAgICAgICAgLy8gRm9yY2UgdGFuZ3JhbSBjYW52YXMgdW5kZXJuZWF0aCBhbGwgbGVhZmxldCBsYXllcnMsIGFuZCBzZXQgYmFja2dyb3VuZCB0byB0cmFuc3BhcmVudFxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZ2wgPSBDb250ZXh0LmdldENvbnRleHQodGhpcy5jYW52YXMsIHtcbiAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSwgcHJlbXVsdGlwbGllZEFscGhhOiB0cnVlLCAvLyBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgICAgICAgICBkZXZpY2VfcGl4ZWxfcmF0aW86IFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdXIgYnJvd3NlciBtYXkgbm90IHN1cHBvcnQgV2ViR0wsIG9yIGl0J3MgdHVybmVkIG9mZj8gXCIgK1xuICAgICAgICAgICAgICAgIFwiVmlzaXQgaHR0cDovL3dlYmdscmVwb3J0LmNvbS8gZm9yIG1vcmUgaW5mby5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplTWFwKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQpO1xuICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5pbml0KHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMgPSBuZXcgUmVuZGVyU3RhdGVNYW5hZ2VyKHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuc2V0Q2FudmFzKHRoaXMuY2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIFVSTCB0byBsb2FkIHRoZSB3ZWIgd29ya2VyIGZyb21cbiAgICBnZXRXb3JrZXJVcmwoKSB7XG4gICAgICAgIGxldCB3b3JrZXJfdXJsID0gdGhpcy53b3JrZXJfdXJsIHx8IFV0aWxzLmZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5cbiAgICAgICAgaWYgKCF3b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBsb2FkIHdvcmtlciBiZWNhdXNlIGNvdWxkbid0IGZpbmQgYmFzZSBVUkwgdGhhdCBsaWJyYXJ5IHdhcyBsb2FkZWQgZnJvbVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBhbG9uZ3NpZGUgY29yZSBsaWJyYXJ5XG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZm9yIGlzc3VlIHdoZXJlIGxhcmdlIGxpYnJhcmllcyBpbnRlcm1pdHRlbnRseSBmYWlsIHRvIGxvYWQgaW4gd2ViIHdvcmtlcnMsXG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgaW1wb3J0U2NyaXB0cygpIGNhbGxzIGFyZSB1c2VkLiBMb2FkaW5nIGFsbCBzY3JpcHRzIChpbmNsdWRpbmcgVGFuZ3JhbSBpdHNlbGYpXG4gICAgICAgIC8vIGluIG9uZSBjYWxsIGF0IGF0IHdvcmtlciBjcmVhdGlvbiB0aW1lIGhhcyBub3QgZXhoaWJpdGVkIHRoZSBzYW1lIGlzc3VlLlxuICAgICAgICBsZXQgdXJscyA9IFsuLi50aGlzLmRhdGFfc291cmNlX3NjcmlwdHNdO1xuICAgICAgICB1cmxzLnB1c2god29ya2VyX3VybCk7IC8vIGxvYWQgVGFuZ3JhbSAqbGFzdCogKGhhcyBiZWVuIG1vcmUgcmVsaWFibGUsIHRob3VnaCByZWFzb24gdW5rbm93bilcbiAgICAgICAgbGV0IGJvZHkgPSBgaW1wb3J0U2NyaXB0cygke3VybHMubWFwKHVybCA9PiBgJyR7dXJsfSdgKS5qb2luKCcsJyl9KTtgO1xuICAgICAgICByZXR1cm4gVXRpbHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtib2R5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaXN0IG9mIGFueSBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyAoaWYgYW55KVxuICAgIHVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzICgpIHtcbiAgICAgICAgbGV0IHByZXZfc2NyaXB0cyA9IFsuLi4odGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzfHxbXSldOyAvLyBzYXZlIGxpc3Qgb2YgcHJldmlvdXNseSBsb2FkZWQgc2NyaXB0c1xuICAgICAgICBsZXQgc2NyaXB0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnNvdXJjZXMpLm1hcChzID0+IHRoaXMuY29uZmlnLnNvdXJjZXNbc10uc2NyaXB0cykuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChzY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCAnbG9hZGluZyBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBpbiB3b3JrZXI6Jywgc2NyaXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzID0gW10uY29uY2F0KC4uLnNjcmlwdHMpLnNvcnQoKTtcblxuICAgICAgICAvLyBTY3JpcHRzIGNoYW5nZWQ/XG4gICAgICAgIHJldHVybiAhKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5sZW5ndGggPT09IHByZXZfc2NyaXB0cy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gcHJldl9zY3JpcHRzW2ldKSk7XG4gICAgfVxuXG4gICAgLy8gV2ViIHdvcmtlcnMgaGFuZGxlIGhlYXZ5IGR1dHkgdGlsZSBjb25zdHJ1Y3Rpb246IG5ldHdvcmtpbmcsIGdlb21ldHJ5IHByb2Nlc3NpbmcsIGV0Yy5cbiAgICBjcmVhdGVXb3JrZXJzKCkge1xuICAgICAgICAvLyBSZXNldCBvbGQgd29ya2VycyAoaWYgYW55KSBpZiB3ZSBuZWVkIHRvIHJlLWluc3RhbnRpYXRlIHdpdGggbmV3IGV4dGVybmFsIHNjcmlwdHNcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMoKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VXb3JrZXJzKHRoaXMuZ2V0V29ya2VyVXJsKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW50aWF0ZSB3b3JrZXJzIGZyb20gVVJMLCBpbml0IGV2ZW50IGhhbmRsZXJzXG4gICAgbWFrZVdvcmtlcnModXJsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZD0wOyBpZCA8IHRoaXMubnVtX3dvcmtlcnM7IGlkKyspIHtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnNbaWRdID0gd29ya2VyO1xuXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG5cbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemluZyB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgIGxldCBfaWQgPSBpZDtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuaW5pdCcsIHRoaXMuaWQsIGlkLCB0aGlzLm51bV93b3JrZXJzLCB0aGlzLmxvZ19sZXZlbCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKS50aGVuKFxuICAgICAgICAgICAgICAgIChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXplZCB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgU2NlbmUubWFrZVdvcmtlcnM6IGZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtlciAke19pZH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9IDA7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2Vycyh0aGlzLndvcmtlcnMpO1xuXG4gICAgICAgICAgICAvLyBMZXQgVmVydGV4RWxlbWVudHMga25vdyBpZiAzMiBiaXQgaW5kaWNlcyBmb3IgZWxlbWVudCBhcnJheXMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IFVpbnQzMl9mbGFnID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfZWxlbWVudF9pbmRleF91aW50XCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ1ZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcnLCBVaW50MzJfZmxhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3lXb3JrZXJzKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLndvcmtlcnMpKSB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2VycyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnJlbW92ZVdvcmtlcih3b3JrZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUm91bmQgcm9iaW4gc2VsZWN0aW9uIG9mIG5leHQgd29ya2VyXG4gICAgbmV4dFdvcmtlcigpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IHRoaXMud29ya2Vyc1t0aGlzLm5leHRfd29ya2VyXTtcbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9ICh0aGlzLm5leHRfd29ya2VyICsgMSkgJSB0aGlzLndvcmtlcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH1cblxuICAgIC8vIFNjZW5lIGlzIHJlYWR5IGZvciByZW5kZXJpbmdcbiAgICByZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcucmVhZHkoKSB8fCBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgdGhlIG1hcCB3aGVuIGRldmljZSBwaXhlbCByYXRpbyBjaGFuZ2VzLCBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZGlzcGxheXNcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvICgpIHtcbiAgICAgICAgaWYgKFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKSkge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbycsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYnVpbGQoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlc2l6ZU1hcCh0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGgsIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2l6ZU1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcuc2V0Vmlld3BvcnRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgQ29udGV4dC5yZXNpemUodGhpcy5nbCwgd2lkdGgsIGhlaWdodCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3Qgc2NlbmUgYmUgcmVkcmF3biBhdCBuZXh0IGFuaW1hdGlvbiBsb29wXG4gICAgcmVxdWVzdFJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVkcmF3IHNjZW5lIGltbWVkaWF0ZWx5IC0gZG9uJ3Qgd2FpdCBmb3IgYW5pbWF0aW9uIGxvb3BcbiAgICAvLyBVc2Ugc3BhcmluZ2x5LCBidXQgZm9yIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHN5bmMgd2l0aCBvdGhlciBVSSBlbGVtZW50cyxcbiAgICAvLyBzdWNoIGFzIG90aGVyLCBub24tV2ViR0wgbWFwIGxheWVycyAoZS5nLiBMZWFmbGV0IHJhc3RlciBsYXllcnMsIG1hcmtlcnMsIGV0Yy4pXG4gICAgaW1tZWRpYXRlUmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICByZW5kZXJMb29wICgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSB0cnVlOyAvLyBvbmx5IGxldCB0aGUgcmVuZGVyIGxvb3AgaW5zdGFudGlhdGUgb25jZVxuXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCB0aGUgbmV4dCBmcmFtZSBpZiBub3Qgc2NoZWR1bGVkIHRvIHN0b3BcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX3N0b3ApIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXJMb29wLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIHJlbmRlciBsb29wXG4gICAgc2V0dXBSZW5kZXJMb29wKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3BfYWN0aXZlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5yZW5kZXJMb29wKCk7IH0sIDApOyAvLyBkZWxheSBzdGFydCBieSBvbmUgdGlja1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBSZW5kZXIgb24gZGVtYW5kXG4gICAgICAgIHZhciB3aWxsX3JlbmRlciA9ICEoXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnJlYWR5KCkgPT09IGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wcmVVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFpbCBpZiBubyBuZWVkIHRvIHJlbmRlclxuICAgICAgICBpZiAoIXdpbGxfcmVuZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOyAvLyBzdWJjbGFzc2VzIGNhbiBzZXQgdGhpcyBiYWNrIHRvIHRydWUgd2hlbiBhbmltYXRpb24gaXMgbmVlZGVkXG5cbiAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICB0aGlzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3Q29tcGxldGUoKTsgLy8gZmlyZXMgZXZlbnQgd2hlbiByZW5kZXJlZCB0aWxlIHNldCBvciBzdHlsZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5jb21wbGV0ZVNjcmVlbnNob3QoKTsgLy8gY29tcGxldGVzIHNjcmVlbnNob3QgY2FwdHVyZSBpZiByZXF1ZXN0ZWRcblxuICAgICAgICAvLyBQb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdFVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWRyYXcgZXZlcnkgZnJhbWUgaWYgYW5pbWF0aW5nXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZnJhbWUrKztcbiAgICAgICAgbG9nKCd0cmFjZScsICdTY2VuZS5yZW5kZXIoKScpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0eWxlcywgY2FtZXJhLCBsaWdodHNcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZSgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9zdHlsZXMpLmZvckVhY2goaSA9PiB0aGlzLnN0eWxlc1tpXS51cGRhdGUoKSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlcmFibGUgdGlsZSBsaXN0XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXNfY291bnQgPSB0aGlzLnJlbmRlcmFibGVfdGlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IHJlbmRlcmVkICR7dGhpcy5yZW5kZXJfY291bnR9IHByaW1pdGl2ZXMgKCR7c2l6ZX0gZmVhdHVyZXMgaW4gc2VsZWN0aW9uIG1hcClgKTtcbiAgICAgICAgICAgIH0sICgpID0+IHt9KTsgLy8gbm8gb3Agd2hlbiBwcm9taXNlIHJlamVjdHMgKG9ubHkgcHJpbnQgbGFzdCByZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gdGhpcy5yZW5kZXJfY291bnQ7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGFsbCBhY3RpdmUgc3R5bGVzLCBncm91cGVkIGJ5IGJsZW5kL2RlcHRoIHR5cGUgKG9wYXF1ZSwgb3ZlcmxheSwgZXRjLikgYW5kIGJ5IHByb2dyYW0gKHN0eWxlKVxuICAgIC8vIENhbGxlZCBib3RoIGZvciBtYWluIHJlbmRlciBwYXNzLCBhbmQgZm9yIHNlY29uZGFyeSBwYXNzZXMgbGlrZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgcmVuZGVyUGFzcyhwcm9ncmFtX2tleSA9ICdwcm9ncmFtJywgeyBhbGxvd19ibGVuZCB9ID0ge30pIHtcbiAgICAgICAgLy8gb3B0aW9uYWxseSBmb3JjZSBhbHBoYSBvZmYgKGUuZy4gZm9yIHNlbGVjdGlvbiBwYXNzKVxuICAgICAgICBhbGxvd19ibGVuZCA9IChhbGxvd19ibGVuZCA9PSBudWxsKSA/IHRydWUgOiBhbGxvd19ibGVuZDtcblxuICAgICAgICB0aGlzLmNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvcjogdHJ1ZSwgY2xlYXJfZGVwdGg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgYmxlbmQgb3JkZXJcbiAgICAgICAgbGV0IHN0eWxlcyA9IE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcykuXG4gICAgICAgICAgICBtYXAocyA9PiB0aGlzLnN0eWxlc1tzXSkuXG4gICAgICAgICAgICBzb3J0KFN0eWxlLmJsZW5kT3JkZXJTb3J0KTtcblxuICAgICAgICAvLyBSZW5kZXIgc3R5bGVzXG4gICAgICAgIGxldCBjb3VudCA9IDA7IC8vIGhvdyBtYW55IHByaW1pdGl2ZXMgd2VyZSByZW5kZXJlZFxuICAgICAgICBsZXQgbGFzdF9ibGVuZDtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc3R5bGVzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNbc107XG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSByZW5kZXIgc3RhdGUgd2hlbiBibGVuZCBtb2RlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5ibGVuZCAhPT0gbGFzdF9ibGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sXG4gICAgICAgICAgICAgICAgICAgIFN0eWxlLnJlbmRlcl9zdGF0ZXNbc3R5bGUuYmxlbmRdLCAgICAgICAvLyByZW5kZXIgc3RhdGUgZm9yIGJsZW5kIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgeyBibGVuZDogKGFsbG93X2JsZW5kICYmIHN0eWxlLmJsZW5kKSB9IC8vIGVuYWJsZS9kaXNhYmxlIGJsZW5kaW5nIChlLmcuIG5vIGJsZW5kIGZvciBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlclN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMucmVuZGVyU3R5bGUoc3R5bGUubmFtZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgbGFzdF9ibGVuZCA9IHN0eWxlLmJsZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHJlbmRlclN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSkge1xuICAgICAgICBsZXQgZmlyc3RfZm9yX3N0eWxlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJlbmRlcl9jb3VudCA9IDA7XG5cbiAgICAgICAgbGV0IHByb2dyYW0gPSB0aGlzLnN0eWxlc1tzdHlsZV1bcHJvZ3JhbV9rZXldO1xuICAgICAgICBpZiAoIXByb2dyYW0gfHwgIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVuZGVyIHRpbGUgR0wgZ2VvbWV0cmllc1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aGlzLnJlbmRlcmFibGVfdGlsZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5yZW5kZXJhYmxlX3RpbGVzW3RdO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5tZXNoZXNbc3R5bGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0dXAgc3R5bGUgaWYgcmVuZGVyaW5nIGZvciBmaXJzdCB0aW1lIHRoaXMgZnJhbWVcbiAgICAgICAgICAgIC8vIChsYXp5IGluaXQsIG5vdCBhbGwgc3R5bGVzIHdpbGwgYmUgdXNlZCBpbiBhbGwgc2NyZWVuIHZpZXdzOyBzb21lIHN0eWxlcyBtaWdodCBiZSBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0X2Zvcl9zdHlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpcnN0X2Zvcl9zdHlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS51c2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZV0uc2V0dXAoKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHNldCB1bmlmb3JtcyB3aGVuIHRoZXkgaGF2ZW4ndCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3RpbWUnLCB0aGlzLmFuaW1hdGVkID8gKCgoK25ldyBEYXRlKCkpIC0gdGhpcy5zdGFydF90aW1lKSAvIDEwMDApIDogMCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMubGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2ldLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcHJveHkgdGlsZXMgaWYgbmV3IHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZyB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoIXRpbGUuc2hvdWxkUHJveHlGb3JTdHlsZShzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYFNjZW5lLnJlbmRlclN0eWxlKCk6IFNraXAgcHJveHkgdGlsZSBmb3Igc3R5bGUgJyR7c3R5bGV9JyBgLCB0aWxlLCB0aWxlLnByb3h5X2Zvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIHRoaXMudmlldy5zZXR1cFRpbGUodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciB0aWxlXG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZXNbc3R5bGVdLnJlbmRlcih0aWxlLm1lc2hlc1tzdHlsZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jdXIgYWRkaXRpb25hbCByZW5kZXJzIHdoaWxlIHZpZXdwb3J0IGlzIG1vdmluZ1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcl9jb3VudCArPSB0aWxlLm1lc2hlc1tzdHlsZV0uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyX2NvdW50O1xuICAgIH1cblxuICAgIGNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvciwgY2xlYXJfZGVwdGggfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgY2xlYXJfY29sb3IgPSAoY2xlYXJfY29sb3IgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGNsZWFyX2RlcHRoID0gKGNsZWFyX2RlcHRoID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuXG4gICAgICAgIC8vIFNldCBHTCBzdGF0ZVxuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGNsZWFyX2RlcHRoIH0pO1xuXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChjbGVhcl9jb2xvciB8fCBjbGVhcl9kZXB0aCkge1xuICAgICAgICAgICAgbGV0IG1hc2sgPSAoY2xlYXJfY29sb3IgJiYgZ2wuQ09MT1JfQlVGRkVSX0JJVCkgfCAoY2xlYXJfZGVwdGggJiYgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlbmRlclN0YXRlKHsgZGVwdGhfdGVzdCwgZGVwdGhfd3JpdGUsIGN1bGxfZmFjZSwgYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgLy8gVE9ETzogd2hlbiB3ZSBhYnN0cmFjdCBvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVuZGVyIHBhc3NlcywgdGhlc2UgY2FuIGJlIHBlci1wYXNzIGNvbmZpZyBvcHRpb25zXG4gICAgICAgIGxldCByZW5kZXJfc3RhdGVzID0gdGhpcy5yZW5kZXJfc3RhdGVzO1xuICAgICAgICBkZXB0aF90ZXN0ID0gKGRlcHRoX3Rlc3QgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF90ZXN0OyAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBkZXB0aF93cml0ZSA9IChkZXB0aF93cml0ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3dyaXRlOyAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjdWxsX2ZhY2UgPSAoY3VsbF9mYWNlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZzsgICAgICAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBibGVuZCA9IChibGVuZCAhPSBudWxsKSA/IGJsZW5kIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5ibGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFsc2VcblxuICAgICAgICAvLyBSZXNldCBmcmFtZSBzdGF0ZVxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfdGVzdC5zZXQoeyBkZXB0aF90ZXN0OiBkZXB0aF90ZXN0IH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBkZXB0aF93cml0ZSB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5jdWxsaW5nLnNldCh7IGN1bGw6IGN1bGxfZmFjZSwgZmFjZTogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSk7XG5cbiAgICAgICAgLy8gQmxlbmRpbmcgb2YgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB0byBhY2NvdW50IGZvciBXZWJHTCBhbHBoYSBiZWhhdmlvciwgc2VlOlxuICAgICAgICAvLyBodHRwOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTE1MzM0MTZcbiAgICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgICAgICAvLyBPcGFxdWU6IGFsbCBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICBpZiAoYmxlbmQgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5TUkNfQUxQSEEsIGRzdDogZ2wuWkVST1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgYWxwaGEgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnb3ZlcmxheScgfHwgYmxlbmQgPT09ICdpbmxheScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlNSQ19BTFBIQSwgZHN0OiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZGRpdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5PTkUsIGRzdDogZ2wuT05FLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdWx0aXBsaWNhdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdtdWx0aXBseScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlpFUk8sIGRzdDogZ2wuU1JDX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7IGJsZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb24gYXQgZ2l2ZW4gcGl4ZWwuIFJ1bnMgYXN5bmMgYW5kIHJldHVybnMgcmVzdWx0cyB2aWEgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVBdChwaXhlbCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBcIlNjZW5lLmdldEZlYXR1cmVBdCgpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9pbnQgc2NhbGVkIHRvIFswLi4xXSByYW5nZVxuICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBwaXhlbC54ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLndpZHRoLFxuICAgICAgICAgICAgeTogcGl4ZWwueSAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS5oZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgLy8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNjZW5lIHJlLXJlbmRlcnMgZm9yIHRoZXNlIHRvIGJlIHByb2Nlc3NlZFxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0RmVhdHVyZUF0KHBvaW50KS5cbiAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IE9iamVjdC5hc3NpZ24oc2VsZWN0aW9uLCB7IHBpeGVsIH0pKS5cbiAgICAgICAgICAgIGNhdGNoKGVycm9yID0+IFByb21pc2UucmVzb2x2ZSh7IGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5LCB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGNvbmZpZyBvciByZS1jb21waWxpbmcgc3R5bGVzXG4gICAgLy8gVE9ETzogZGV0ZWN0IHdoaWNoIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVmcmVzaGVkL3JlYnVpbHQgKHN0eWxlc2hlZXQgY2hhbmdlcywgZXRjLilcbiAgICByZWJ1aWxkKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZEdlb21ldHJ5KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgYWxsIHRpbGVzXG4gICAgLy8gc3luYzogYm9vbGVhbiBvZiB3aGV0aGVyIHRvIHN5bmMgdGhlIGNvbmZpZyBvYmplY3QgdG8gdGhlIHdvcmtlclxuICAgIC8vIHNvdXJjZXM6IG9wdGlvbmFsIGFycmF5IG9mIGRhdGEgc291cmNlcyB0byBzZWxlY3RpdmVseSByZWJ1aWxkIChieSBkZWZhdWx0IGFsbCBvdXIgcmVidWlsdClcbiAgICByZWJ1aWxkR2VvbWV0cnkoeyBzeW5jID0gdHJ1ZSwgc291cmNlcyA9IG51bGwsIHNlcmlhbGl6ZV9mdW5jcywgcHJvZmlsZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gU2tpcCByZWJ1aWxkIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgdG8gb25lIHJlYnVpbGQgY2FsbCBhdCBhIHRpbWUsIG9ubHkgc2F2ZSBsYXN0IHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5xdWV1ZWQgJiYgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgaXQgZGlkIG5vdCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgJ1NjZW5lLnJlYnVpbGQ6IHJlcXVlc3Qgc3VwZXJjZWRlZCBieSBhIG5ld2VyIGNhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVzb2x2ZShmYWxzZSk7IC8vIGZhbHNlIGZsYWcgaW5kaWNhdGVzIHJlYnVpbGQgcmVxdWVzdCB3YXMgc3VwZXJjZWRlZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNhdmUgcXVldWVkIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnF1ZXVlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTY2VuZS5yZWJ1aWxkKCk6IHF1ZXVpbmcgcmVxdWVzdGApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG5cbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb25maWcgKGluIGNhc2UgSlMgb2JqZWN0cyB3ZXJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5KVxuICAgICAgICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuY29tcGlsZSh0aGlzLnVwZGF0ZUFjdGl2ZVN0eWxlcygpLCB0aGlzKTsgLy8gb25seSByZWNvbXBpbGUgbmV3bHkgYWN0aXZlIHN0eWxlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYnVpbGQgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucHJ1bmVUb1Zpc2libGVUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmJ1aWxkVGlsZSh0aWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpOyAvLyBwaWNrcyB1cCBhZGRpdGlvbmFsIHRpbGVzIGZvciBhbnkgbmV3L2NoYW5nZWQgZGF0YSBzb3VyY2VzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5jaGVja0J1aWxkUXVldWUoKTsgICAgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBubyB0aWxlcyB0byBidWlsZFxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlRW5kKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRpbGUgbWFuYWdlciBmaW5pc2hlZCBidWlsZGluZyB0aWxlc1xuICAgIC8vIFRPRE8gbW92ZSB0byB0aWxlIG1hbmFnZXJcbiAgICB0aWxlTWFuYWdlckJ1aWxkRG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogYnVpbGQgZ2VvbWV0cnkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgcmVidWlsZCBxdWV1ZWQ/XG4gICAgICAgICAgICB2YXIgcXVldWVkID0gdGhpcy5idWlsZGluZy5xdWV1ZWQ7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lOiBzdGFydGluZyBxdWV1ZWQgcmVidWlsZCgpIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGQoKS50aGVuKHF1ZXVlZC5yZXNvbHZlLCBxdWV1ZWQucmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgIExvYWQgKG9yIHJlbG9hZCkgdGhlIHNjZW5lIGNvbmZpZ1xuICAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICBsb2FkU2NlbmUoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlIHx8IHRoaXMuY29uZmlnX3NvdXJjZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVdGlscy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoIHx8IHRoaXMuY29uZmlnX3NvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVXRpbHMucGF0aEZvclVSTChjb25maWdfcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2NlbmVMb2FkZXIubG9hZFNjZW5lKHRoaXMuY29uZmlnX3NvdXJjZSwgdGhpcy5jb25maWdfcGF0aCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWQnLCB7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBzb3VyY2UgdG8gYSBzY2VuZSwgYXJndW1lbnRzIGBuYW1lYCBhbmQgYGNvbmZpZ2AgbmVlZCB0byBiZSBwcm92aWRlZDpcbiAgICAvLyAgLSBJZiB0aGUgbmFtZSBkb2Vzbid0IG1hdGNoIGEgc291cmNlcyBpdCB3aWxsIGNyZWF0ZSBpdFxuICAgIC8vICAtIHRoZSBgY29uZmlnYCBvYmogZm9sbG93IHRoZSBZQU1MIHNjZW5lIHNwZWMsIGV4OiBgYGB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiXX1gYGBcbiAgICAvLyAgICB0aGF0IGxvb2tzIGxpa2U6XG4gICAgLy9cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJvc21cIiwge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIiB9KTtcbiAgICAvL1xuICAgIC8vICAtIGFsc28gY2FuIGJlIHBhc3MgYSBgYGBkYXRhYGBgIG9iajogYGBge3R5cGU6ICdHZW9KU09OJywgZGF0YTogSlNPYmogXX1gYGBcbiAgICAvL1xuICAgIC8vICAgICAgdmFyIGdlb2pzb25fZGF0YSA9IHt9O1xuICAgIC8vICAgICAgLi4uXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwiZHluYW1pY19kYXRhXCIsIHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IGdlb2pzb25fZGF0YSB9KTtcbiAgICAvL1xuICAgIHNldERhdGFTb3VyY2UgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWNvbmZpZyB8fCAhY29uZmlnLnR5cGUgfHwgKCFjb25maWcudXJsICYmICFjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIk5vIG5hbWUgcHJvdmlkZWQgb3Igbm90IGEgdmFsaWQgY29uZmlnOlwiLCBuYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvYWQgPSAodGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xuXG4gICAgICAgIGlmIChzb3VyY2UuZGF0YSAmJiB0eXBlb2Ygc291cmNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gVXRpbHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzb3VyY2UuZGF0YSldKSk7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgbGV0IHByZXZfc291cmNlID0gdGhpcy5zb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tuYW1lXSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwge25hbWV9KSwgdGhpcy5zb3VyY2VzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb3VsZCBub3QgY3JlYXRlIGRhdGEgc291cmNlOiAke2UubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTY2VuZTogJHttZXNzYWdlfWAsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgeyB0eXBlOiAnc291cmNlcycsIHNvdXJjZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGF0YSBzb3VyY2UgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChEYXRhU291cmNlLmNoYW5nZWQodGhpcy5zb3VyY2VzW25hbWVdLCBwcmV2X3NvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU291cmNlcyB0aGF0IHdlcmUgcmVtb3ZlZFxuICAgICAgICBmb3IgKGxldCBzIG9mIHByZXZfc291cmNlX25hbWVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNvdXJjZXNbc10pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW3NdOyAvLyBUT0RPOiByZW1vdmUgZnJvbSB3b3JrZXJzIHRvbz9cbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIGZyb20gc291cmNlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICBpZiAocmVzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNldC5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHNvdXJjZXMgdGhhdCB3aWxsIGdlbmVyYXRlIGdlb21ldHJ5IHRpbGVzXG4gICAgICAgIC8vIChhbGwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIG9ubHkgcmFzdGVyIHNvdXJjZXMgYXR0YWNoZWQgdG8gb3RoZXIgc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgb2YgVXRpbHMudmFsdWVzKHRoaXMuY29uZmlnLmxheWVycykpIHtcbiAgICAgICAgICAgIGlmIChsYXllci5kYXRhICYmIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCB0ZXh0dXJlcyBpbiB0aGUgc2NlbmUgZGVmaW5pdGlvblxuICAgIGxvYWRUZXh0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCh0aGlzLmdsLCB0aGlzLmNvbmZpZy50ZXh0dXJlcykuXG4gICAgICAgICAgICB0aGVuKCgpID0+IFRleHR1cmUuY3JlYXRlRGVmYXVsdCh0aGlzLmdsKSk7IC8vIGNyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlIGZvciBwbGFjZWhvbGRlcnNcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgKGN1cnJlbnRseSBtYW51YWxseSkgYWZ0ZXIgc3R5bGVzIGFyZSB1cGRhdGVkIGluIHN0eWxlc2hlZXRcbiAgICB1cGRhdGVTdHlsZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiAhdGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NlbmUudXBkYXRlU3R5bGVzKCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIChSZSlidWlsZCBzdHlsZXMgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlX21hbmFnZXIuYnVpbGQodGhpcy5jb25maWcuc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXModGhpcyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgR0wgY29udGV4dCAodXNlZCB3aGVuIGluaXRpYWxpemluZyBvciByZS1pbml0aWFsaXppbmcgR0wgcmVzb3VyY2VzKVxuICAgICAgICBmb3IgKHZhciBzdHlsZSBvZiBVdGlscy52YWx1ZXModGhpcy5zdHlsZXMpKSB7XG4gICAgICAgICAgICBzdHlsZS5zZXRHTCh0aGlzLmdsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgJiBjb21waWxlIGFjdGl2ZSBzdHlsZXNcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmNvbXBpbGUoT2JqZWN0LmtleXModGhpcy5hY3RpdmVfc3R5bGVzKSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlQWN0aXZlU3R5bGVzKCkge1xuICAgICAgICAvLyBNYWtlIGEgc2V0IG9mIGN1cnJlbnRseSBhY3RpdmUgc3R5bGVzICh1c2VkIGluIGEgbGF5ZXIpXG4gICAgICAgIC8vIE5vdGU6IGRvZXNuJ3QgYWN0dWFsbHkgY2hlY2sgaWYgYW55IGdlb21ldHJ5IG1hdGNoZXMgdGhlIGxheWVyLCBqdXN0IHRoYXQgdGhlIHN0eWxlIGlzIHBvdGVudGlhbGx5IHJlbmRlcmFibGVcbiAgICAgICAgbGV0IHByZXZfc3R5bGVzID0gT2JqZWN0LmtleXModGhpcy5hY3RpdmVfc3R5bGVzIHx8IHt9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0ge307XG4gICAgICAgIGxldCBhbmltYXRlZCA9IGZhbHNlOyAvLyBpcyBhbnkgYWN0aXZlIHN0eWxlIGFuaW1hdGVkP1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBVdGlscy5yZWN1cnNlVmFsdWVzKHRoaXMuY29uZmlnLmxheWVycykpIHtcbiAgICAgICAgICAgIGlmIChsYXllciAmJiBsYXllci5kcmF3KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW25hbWUsIGdyb3VwXSBvZiBVdGlscy5lbnRyaWVzKGxheWVyLmRyYXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm4gb24gbm9uLW9iamVjdCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIHR5cGVvZiBncm91cCA9PT0gJ29iamVjdCcgJiYgZ3JvdXAudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSBbc3R5bGVfbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIGFkZGl0aW9uYWwgb3V0bGluZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLm91dGxpbmUgJiYgZ3JvdXAub3V0bGluZS5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKGdyb3VwLm91dGxpbmUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMgPSBzdHlsZXMuZmlsdGVyKHggPT4gdGhpcy5zdHlsZXNbeF0pLmZvckVhY2goc3R5bGVfbmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGVfbmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlX3N0eWxlc1tzdHlsZV9uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZS5hbmltYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgZXhwbGljaXRseSBzZXQgc2NlbmUgYW5pbWF0aW9uIGZsYWcgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIHR1cm4gb24gYW5pbWF0aW9uXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgYW5pbWF0ZWQgc3R5bGVzXG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgOiBhbmltYXRlZDtcblxuICAgICAgICAvLyBDb21waWxlIG5ld2x5IGFjdGl2ZSBzdHlsZXNcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcykuZmlsdGVyKHMgPT4gcHJldl9zdHlsZXMuaW5kZXhPZihzKSA9PT0gLTEpO1xuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYShuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc2V0QWN0aXZlQ2FtZXJhKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBsaWdodGluZ1xuICAgIGNyZWF0ZUxpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5saWdodHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmNvbmZpZy5saWdodHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGlnaHRzW2ldIHx8IHR5cGVvZiB0aGlzLmNvbmZpZy5saWdodHNbaV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGlnaHQgPSB0aGlzLmNvbmZpZy5saWdodHNbaV07XG4gICAgICAgICAgICBsaWdodC5uYW1lID0gaS5yZXBsYWNlKCctJywgJ18nKTsgLy8gbGlnaHQgbmFtZXMgYXJlIGluamVjdGVkIGluIHNoYWRlcnMsIGNhbid0IGhhdmUgaHlwaGVuc1xuICAgICAgICAgICAgbGlnaHQudmlzaWJsZSA9IChsaWdodC52aXNpYmxlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAobGlnaHQudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2xpZ2h0Lm5hbWVdID0gTGlnaHQuY3JlYXRlKHRoaXMudmlldywgbGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExpZ2h0LmluamVjdCh0aGlzLmxpZ2h0cyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgYmcgPSB0aGlzLmNvbmZpZy5zY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB7fTtcbiAgICAgICAgaWYgKGJnICYmIGJnLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGJnLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZC5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gWzAsIDAsIDAsIDBdOyAvLyBkZWZhdWx0IGJhY2tncm91bmQgVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBiYWNrZ3JvdW5kIGlzIGZ1bGx5IG9wYXF1ZSwgc2V0IGNhbnZhcyBiYWNrZ3JvdW5kIHRvIG1hdGNoXG4gICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQuY29sb3JbM10gPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICAgICAgYHJnYmEoJHt0aGlzLmJhY2tncm91bmQuY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoLi4udGhpcy5iYWNrZ3JvdW5kLmNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuIGludHJvc3BlY3Rpb24gbW9kZSBvbi9vZmZcbiAgICBzZXRJbnRyb3NwZWN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gdmFsIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzY2VuZSBjb25maWcsIGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAvLyByZWJ1aWxkIGNhbiBiZSBib29sZWFuLCBvciBhbiBvYmplY3QgY29udGFpbmluZyByZWJ1aWxkIG9wdGlvbnMgdG8gcGFzc3Rocm91Z2hcbiAgICB1cGRhdGVDb25maWcoeyByZWJ1aWxkID0gdHJ1ZSwgc2VyaWFsaXplX2Z1bmNzIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSArK1NjZW5lLmdlbmVyYXRpb247XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcblxuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLnZpZXcucmVzZXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMaWdodHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEYXRhU291cmNlcygpO1xuICAgICAgICB0aGlzLmxvYWRUZXh0dXJlcygpO1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmQoKTtcbiAgICAgICAgRm9udE1hbmFnZXIubG9hZEZvbnRzKHRoaXMuY29uZmlnLmZvbnRzKTtcblxuICAgICAgICAvLyBUT0RPOiBkZXRlY3QgY2hhbmdlcyB0byBzdHlsZXM/IGFscmVhZHkgKGN1cnJlbnRseSkgbmVlZCB0byByZWNvbXBpbGUgYW55d2F5IHdoZW4gY2FtZXJhIG9yIGxpZ2h0cyBjaGFuZ2VcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgbGV0IGRvbmUgPSByZWJ1aWxkID9cbiAgICAgICAgICAgIHRoaXMucmVidWlsZChPYmplY3QuYXNzaWduKHsgc2VyaWFsaXplX2Z1bmNzIH0sIHR5cGVvZiByZWJ1aWxkID09PSAnb2JqZWN0JyAmJiByZWJ1aWxkKSkgOlxuICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7IC8vIHJlYnVpbGQoKSBhbHNvIHN5bmNzIGNvbmZpZ1xuXG4gICAgICAgIC8vIEZpbmlzaCBieSB1cGRhdGluZyBib3VuZHMgYW5kIHJlLXJlbmRlcmluZ1xuICAgICAgICByZXR1cm4gZG9uZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgY29uZmlnIGFuZCBzZW5kIHRvIHdvcmtlclxuICAgIHN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIC8vIFRlbGwgd29ya2VycyB3ZSdyZSBhYm91dCB0byByZWJ1aWxkIChzbyB0aGV5IGNhbiB1cGRhdGUgc3R5bGVzLCBldGMuKVxuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID1cbiAgICAgICAgICAgIHNlcmlhbGl6ZV9mdW5jcyA/IFV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnModGhpcy5jb25maWcpIDogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlQ29uZmlnJywge1xuICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ19zZXJpYWxpemVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byByZWxhdGVkIG9iamVjdHNcbiAgICBjcmVhdGVMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnZpZXcgPSB7XG4gICAgICAgICAgICBtb3ZlOiAoKSA9PiB0aGlzLnRyaWdnZXIoJ21vdmUnKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZXcuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnRleHR1cmUgPSB7XG4gICAgICAgICAgICB1cGRhdGU6ICgpID0+IHRoaXMuZGlydHkgPSB0cnVlLFxuICAgICAgICAgICAgd2FybmluZzogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignd2FybmluZycsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAndGV4dHVyZXMnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBUZXh0dXJlLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIgPSB7XG4gICAgICAgICAgICBlcnJvcjogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignZXJyb3InLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3NjZW5lJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgU2NlbmVMb2FkZXIuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVBbGwoKTtcbiAgICAgICAgdGhpcy52aWV3LnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuICAgICAgICBUZXh0dXJlLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuICAgICAgICBTY2VuZUxvYWRlci51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBGZWF0dXJlU2VsZWN0aW9uKHRoaXMuZ2wsIHRoaXMud29ya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5yZXNldEZlYXR1cmVTZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgZmVhdHVyZSBzZWxlY3Rpb24gbWFwIHNpemUgYWNyb3NzIGFsbCB3b3JrZXJzLiBSZXR1cm5zIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnNjcmVlbnNob3QoKTtcbiAgICB9XG5cbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0YXJ0VmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RvcFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuXG4gICAgLy8gU3RhdHMvZGVidWcvcHJvZmlsaW5nIG1ldGhvZHNcblxuICAgIC8vIFByb2ZpbGUgaGVscGVycywgaXNzdWVzIGEgcHJvZmlsZSBvbiBtYWluIHRocmVhZCAmIGFsbCB3b3JrZXJzXG4gICAgX3Byb2ZpbGUobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBfcHJvZmlsZUVuZChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZUVuZCcsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIERlYnVnIGNvbmZpZyBhbmQgZnVuY3Rpb25zXG4gICAgc2V0dXBEZWJ1ZyAoKSB7XG4gICAgICAgIGxldCBzY2VuZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVidWcgPSB7XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5IGEgZ2l2ZW4gIyBvZiB0aW1lcyBhbmQgcHJpbnQgYXZlcmFnZSwgbWluLCBtYXggdGltaW5nc1xuICAgICAgICAgICAgdGltZVJlYnVpbGQgKG51bSA9IDEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjeWNsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLnJlYnVpbGQob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5wdXNoKCtuZXcgRGF0ZSgpIC0gc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMubGVuZ3RoIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdmcgPSB+fih0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSAvIHRpbWVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFByb2ZpbGVkIHJlYnVpbGQgJHtudW19IHRpbWVzOiAke2F2Z30gYXZnICgke01hdGgubWluKC4uLnRpbWVzKX0gbWluLCAke01hdGgubWF4KC4uLnRpbWVzKX0gbWF4KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZ2VvbWV0cnkgY291bnRzIG9mIHZpc2libGUgdGlsZXMsIGdyb3VwZWQgYnkgc3R5bGUgbmFtZVxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5U3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0aWxlIG9mIHNjZW5lLnRpbGVfbWFuYWdlci5nZXRSZW5kZXJhYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0aWxlLm1lc2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW3N0eWxlXSA9IGNvdW50c1tzdHlsZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gKz0gdGlsZS5tZXNoZXNbc3R5bGVdLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlCYXNlU3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9jb3VudHMgPSBzY2VuZS5kZWJ1Zy5nZW9tZXRyeUNvdW50QnlTdHlsZSgpO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9jb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzY2VuZS5zdHlsZXNbc3R5bGVdLmJ1aWx0X2luID8gc3R5bGUgOiBzY2VuZS5zdHlsZXNbc3R5bGVdLmJhc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50c1tiYXNlXSA9IGNvdW50c1tiYXNlXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gKz0gc3R5bGVfY291bnRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbn1cblxuU2NlbmUuaWQgPSAwOyAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgYSBzY2VuZSBpbnN0YW5jZVxuU2NlbmUuZ2VuZXJhdGlvbiA9IDA7IC8vIGlkIHRoYXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgc2NlbmUgY29uZmlnIGlzIHJlLXBhcnNlZFxuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcblxuZXhwb3J0IGNsYXNzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcblxuICAgICAgICAvLyBJZiBhIGJhc2UgcGF0aCB3YXMgcHJvdmlkZWQsIHVzZSBpdCBmb3IgcmVzb2x2aW5nIGxvY2FsIGJ1bmRsZSByZXNvdXJjZXMgb25seSBpZlxuICAgICAgICAvLyB0aGUgYmFzZSBwYXRoIGlzIGFic29sdXRlLCBvciB0aGlzIGJ1bmRsZSdzIHBhdGggaXMgcmVsYXRpdmVcbiAgICAgICAgaWYgKHBhdGggJiYgKCFVdGlscy5pc1JlbGF0aXZlVVJMKHBhdGgpIHx8IFV0aWxzLmlzUmVsYXRpdmVVUkwodGhpcy51cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IFV0aWxzLnBhdGhGb3JVUkwodGhpcy51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXRoX2Zvcl9wYXJlbnQgPSBwYXRoIHx8IHRoaXMucGF0aDsgLy8gZm9yIHJlc29sdmluZyBwYXRocyByZWxhdGl2ZSB0byBhIHBhcmVudCBidW5kbGVcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgLy8gQW4gYW5jZXN0b3IgYnVuZGxlIG1heSBiZSBhIGNvbnRhaW5lciAoZS5nLiB6aXAgZmlsZSkgdGhhdCBuZWVkcyB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzXG4gICAgICAgIC8vIGZvciBhbnkgc2NlbmVzIGl0IGNvbnRhaW5zLCBlLmcuIGByb290LnppcGAgaGFzIGEgYHJvb3QueWFtbGAgdGhhdCBpbmNsdWRlcyBhIGBmb2xkZXIvY2hpbGQueWFtbGA6XG4gICAgICAgIC8vIHJlc291cmNlcyB3aXRoaW4gYGNoaWxkLnlhbWxgIG11c3QgYmUgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgYnVuZGxlIGZvciBgcm9vdC56aXBgXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnBhcmVudC5jb250YWluZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5pc0NvbnRhaW5lcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5sb2FkUmVzb3VyY2UodGhpcy51cmwpO1xuICAgIH1cblxuICAgIC8vIEluZm8gZm9yIHJldHJpZXZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmcm9tIHRoaXMgYnVuZGxlXG4gICAgLy8gdXJsOiBmdWxseSBxdWFsaWZpZWQgVVJMIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZSAoZS5nLiB6aXBzIHdpbGwgdHJhbnNmb3JtIHRoaXMgdG8gYmxvYiBVUkwpXG4gICAgLy8gcGF0aDogb3JpZ2luYWwgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBidW5kbGUgKGZvciByZXNvbHZpbmcgcGF0aHMgdXAgdGhlIGJ1bmRsZSB0cmVlKVxuICAgIC8vIHR5cGU6IGZpbGUgZXh0ZW5zaW9uICh1c2VkIGZvciBkZXRlcm1pbmluZyBidW5kbGUgdHlwZSwgYHlhbWxgIG9yIGB6aXBgKVxuICAgIHJlc291cmNlRm9yKHVybCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiB0aGlzLnVybEZvcih1cmwpLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoRm9yKHVybCksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVGb3IodXJsKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVybEZvcih1cmwpIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzUmVsYXRpdmVVUkwodXJsKSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnVybEZvcih0aGlzLnBhdGhfZm9yX3BhcmVudCArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxzLmFkZEJhc2VVUkwodXJsLCB0aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHBhdGhGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5wYXRoRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmV4dGVuc2lvbkZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBaaXBTY2VuZUJ1bmRsZSBleHRlbmRzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy56aXAgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVzID0ge307XG4gICAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLnppcCA9IG5ldyBKU1ppcCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuaW8odGhpcy51cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKVxuICAgICAgICAgICAgICAgIC50aGVuKGJvZHkgPT4gdGhpcy56aXAubG9hZEFzeW5jKGJvZHkpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucGFyc2VaaXBGaWxlcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZFJvb3QoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoVXRpbHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cmxGb3JaaXBGaWxlKFV0aWxzLmZsYXR0ZW5SZWxhdGl2ZVVSTCh1cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudXJsRm9yKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZUZvclppcEZpbGUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudHlwZUZvcih1cmwpO1xuICAgIH1cblxuICAgIGxvYWRSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kUm9vdCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBVdGlscy5sb2FkUmVzb3VyY2UodGhpcy51cmxGb3JaaXBGaWxlKHRoaXMucm9vdCkpKTtcbiAgICB9XG5cbiAgICBmaW5kUm9vdCgpIHtcbiAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhIHNpbmdsZSBZQU1MIGZpbGUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgemlwXG4gICAgICAgIGNvbnN0IHlhbWxzID0gT2JqZWN0LmtleXModGhpcy5maWxlcylcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiB0aGlzLmZpbGVzW3BhdGhdLmRlcHRoID09PSAwKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IFV0aWxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSA9PT0gJ3lhbWwnKTtcblxuICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB5YW1sc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJvb3QgZm91bmRcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcm9vdCBzY2VuZSBmb3IgYnVuZGxlICcke3RoaXMudXJsfSc6IGA7XG4gICAgICAgICAgICBtc2cgKz0gYFRoZSB6aXAgYXJjaGl2ZSdzIHJvb3QgbGV2ZWwgbXVzdCBjb250YWluIGEgc2luZ2xlIHNjZW5lIGZpbGUgd2l0aCB0aGUgJy55YW1sJyBleHRlbnNpb24uIGA7XG4gICAgICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgbXVsdGlwbGUgWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbDogJHt5YW1scy5tYXAociA9PiAnXFwnJyArIHIgKyAnXFwnJyApLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIE5PIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWwuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcGFyc2VaaXBGaWxlcygpIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW107XG4gICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnppcC5mb3JFYWNoKChwYXRoLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZGlyKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGZpbGUuYXN5bmMoJ2FycmF5YnVmZmVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSBwYXRoLnNwbGl0KCcvJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBVdGlscy5leHRlbnNpb25Gb3JVUkwocGF0aCksXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXJsRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVzW2ZpbGVdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXNbZmlsZV0udXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1tmaWxlXS51cmwgPSBVdGlscy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RoaXMuZmlsZXNbZmlsZV0uZGF0YV0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0udXJsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHlwZUZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXSAmJiB0aGlzLmZpbGVzW2ZpbGVdLnR5cGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSA9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3ppcCcgfHwgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIFV0aWxzLmV4dGVuc2lvbkZvclVSTCh1cmwpID09PSAnemlwJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBaaXBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQge2NyZWF0ZVNjZW5lQnVuZGxlfSBmcm9tICcuL3NjZW5lX2J1bmRsZSc7XG5cbnZhciBTY2VuZUxvYWRlcjtcblxuZXhwb3J0IGRlZmF1bHQgU2NlbmVMb2FkZXIgPSB7XG5cbiAgICAvLyBMb2FkIHNjZW5lcyBkZWZpbml0aW9ucyBmcm9tIFVSTCAmIHByb3Byb2Nlc3NcbiAgICBsb2FkU2NlbmUodXJsLCBwYXRoID0gbnVsbCkge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCB9LCBudWxsLCBlcnJvcnMpLlxuICAgICAgICAgICAgdGhlbihjb25maWcgPT4gdGhpcy5maW5hbGl6ZShjb25maWcpKS5cbiAgICAgICAgICAgIHRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyByb290IHNjZW5lIGZhaWxlZCB0byBsb2FkLCByZWplY3Qgd2l0aCBmaXJzdCBlcnJvclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3JzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2NlbmUgbG9hZGVkLCBidXQgc29tZSBpbXBvcnRzIGhhZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGltcG9ydCBzY2VuZTogJHtlcnJvci51cmx9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgeyB0eXBlOiAnc2NlbmVfaW1wb3J0JywgbWVzc2FnZSwgZXJyb3IsIHVybDogZXJyb3IudXJsIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBzY2VuZSBmaWxlcyBmcm9tIFVSTCwgcmVjdXJzaXZlbHkgbG9hZGluZyAnaW1wb3J0JyBzY2VuZXNcbiAgICAvLyBPcHRpb25hbCAqaW5pdGlhbCogcGF0aCBvbmx5ICh3b24ndCBiZSBwYXNzZWQgdG8gcmVjdXJzaXZlICdpbXBvcnQnIGNhbGxzKVxuICAgIC8vIFVzZWZ1bCBmb3IgbG9hZGluZyByZXNvdXJjZXMgaW4gYmFzZSBzY2VuZSBmaWxlIGZyb20gYSBzZXBhcmF0ZSBsb2NhdGlvblxuICAgIC8vIChlLmcuIGluIFRhbmdyYW0gUGxheSwgd2hlbiBtb2RpZmllZCBsb2NhbCBzY2VuZSBzaG91bGQgc3RpbGwgcmVmZXIgdG8gb3JpZ2luYWwgcmVzb3VyY2UgVVJMcylcbiAgICBsb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGgsIHR5cGUgfSwgcGFyZW50LCBlcnJvcnMgPSBbXSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVuZGxlID0gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUpO1xuXG4gICAgICAgIHJldHVybiBidW5kbGUubG9hZCgpLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBzaW5nbGUtc3RyaW5nIG9yIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5pbXBvcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmltcG9ydCA9IFtjb25maWcuaW1wb3J0XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5pbXBvcnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbGxlY3QgVVJMcyBvZiBzY2VuZXMgdG8gaW1wb3J0XG4gICAgICAgICAgICBsZXQgaW1wb3J0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgdXJsIG9mIGNvbmZpZy5pbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goYnVuZGxlLnJlc291cmNlRm9yKHVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5pbXBvcnQ7IC8vIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhpcyBwcm9wZXJ0eVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5cbiAgICAgICAgICAgIGFsbChpbXBvcnRzLm1hcChyZXNvdXJjZSA9PiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZShyZXNvdXJjZSwgYnVuZGxlLCBlcnJvcnMpKSkuXG4gICAgICAgICAgICAgICAgdGhlbihjb25maWdzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCAuLi5jb25maWdzLCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3Qgc2NlbmUgbG9hZCBlcnJvcnMgYXMgd2UgZ29cbiAgICAgICAgICAgIGVycm9yLnVybCA9IHVybDtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGFkanVzdCB3aXRoaW4gZWFjaCBsb2NhbCBzY2VuZSBmaWxlICh1c3VhbGx5IGJ5IHBhdGgpXG4gICAgbm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZGF0YSBzb3VyY2VcbiAgICBub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IGNvbmZpZy5zb3VyY2VzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiAgVXRpbHMudmFsdWVzKGNvbmZpZy5zb3VyY2VzKSkge1xuICAgICAgICAgICAgc291cmNlLnVybCA9IGJ1bmRsZS51cmxGb3Ioc291cmNlLnVybCk7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZS5zY3JpcHRzKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZS5zY3JpcHRzID0gc291cmNlLnNjcmlwdHMubWFwKHVybCA9PiBidW5kbGUudXJsRm9yKHVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBmb250c1xuICAgIG5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5mb250cyA9IGNvbmZpZy5mb250cyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCB2YWwgb2YgVXRpbHMucmVjdXJzZVZhbHVlcyhjb25maWcuZm9udHMpKSB7XG4gICAgICAgICAgICBpZiAodmFsLnVybCkge1xuICAgICAgICAgICAgICAgIHZhbC51cmwgPSBidW5kbGUudXJsRm9yKHZhbC51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGFuZCBjZW50cmFsaXplIHRleHR1cmUgZGVmaW5pdGlvbnMgZm9yIGEgc2NlbmUgb2JqZWN0XG4gICAgbm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnRleHR1cmVzID0gY29uZmlnLnRleHR1cmVzIHx8IHt9O1xuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoIHRvIGdsb2JhbGx5IGRlZmluZWQgdGV4dHVyZXNcbiAgICAgICAgLy8gT25seSBhZGRzIHBhdGggZm9yIHRleHR1cmVzIHdpdGggcmVsYXRpdmUgVVJMcywgc28gdGV4dHVyZXMgaW4gaW1wb3J0ZWQgc2NlbmVzIGdldCB0aGUgYmFzZVxuICAgICAgICAvLyBwYXRoIG9mIHRoZWlyIGltbWVkaWF0ZSBzY2VuZSBmaWxlXG4gICAgICAgIGlmIChjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRleHR1cmUgb2YgVXRpbHMudmFsdWVzKGNvbmZpZy50ZXh0dXJlcykpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS51cmwgPSBidW5kbGUudXJsRm9yKHRleHR1cmUudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIFwiVVJMIHNob3J0Y3V0XCIgdGV4dHVyZXMsIGUuZy4gdGhvc2Ugc3BlY2lmaWVkIGFzIGlubGluZSBVUkwgc3RyaW5ncywgdG8gdGhlIHNjZW5lJ3MgdG9wLWxldmVsXG4gICAgICAgIC8vIHNldCBvZiB0ZXh0dXJlcyAoY29uZmlnLnRleHR1cmVzKS4gVGhlcmUgYXJlIDMgc3VjaCBjYXNlcyBvZiB0ZXh0dXJlczpcbiAgICAgICAgLy8gLSBpbiBhIHN0eWxlJ3MgYHRleHR1cmVgIHByb3BlcnR5XG4gICAgICAgIC8vIC0gaW4gYSBzdHlsZSdzIGBtYXRlcmlhbGAgcHJvcGVydGllc1xuICAgICAgICAvLyAtIGluIGEgc3R5bGUncyBjdXN0b20gdW5pZm9ybXMgKGBzaGFkZXJzLnVuaWZvcm1zYClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdGV4dHVyZSBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IHN0cmluZyBuYW1lLiBUaGUgdGV4dHVyZSdzIFVSTFxuICAgICAgICAvLyBpcyBleHBhbmRlZCB0byBpbmNsdWRlIHRoZSBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoLlxuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgb2YgVXRpbHMudmFsdWVzKGNvbmZpZy5zdHlsZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXggPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1t0ZXhdID0geyB1cmw6IHRleCB9O1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gdGV4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3Agb2YgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4ID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1t0ZXhdID0geyB1cmw6IHRleCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmUgPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30gb2YgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IGJ1bmRsZS51cmxGb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1t0ZXhdID0geyB1cmw6IHRleCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIFN1YnN0aXR1dGVzIGdsb2JhbCBzY2VuZSBwcm9wZXJ0aWVzICh0aG9zZSBkZWZpbmVkIGluIHRoZSBgY29uZmlnLmdsb2JhbGAgb2JqZWN0KSBmb3IgYW55IHN0eWxlIHZhbHVlc1xuICAgIC8vIG9mIHRoZSBmb3JtIGBnbG9iYWwuYCwgZm9yIGV4YW1wbGUgYGNvbG9yOiBnbG9iYWwucGFya19jb2xvcmAgd291bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgKGlmIGFueSlcbiAgICAvLyBkZWZpbmVkIGZvciB0aGUgYHBhcmtfY29sb3JgIHByb3BlcnR5IGluIGBjb25maWcuZ2xvYmFsLnBhcmtfY29sb3JgLlxuICAgIGFwcGx5R2xvYmFsUHJvcGVydGllcyhjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcuZ2xvYmFsIHx8IE9iamVjdC5rZXlzKGNvbmZpZy5nbG9iYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsgLy8gbm8gZ2xvYmFsIHByb3BlcnRpZXMgdG8gdHJhbnNmb3JtXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSAnOic7XG4gICAgICAgIGNvbnN0IHByb3BzID0gZmxhdHRlblByb3BlcnRpZXMoY29uZmlnLmdsb2JhbCwgc2VwYXJhdG9yKTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzIChvYmopIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gKG9iai5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSAmJiAob2JqLnNsaWNlKDcpLnJlcGxhY2UoL1xcLi9nLCBzZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBvYmogPSBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcF0gPSBhcHBseVByb3BzKG9ialtwXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHBseVByb3BzKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBzb21lIHNjZW5lLXdpZGUgc2V0dGluZ3MgdGhhdCBhcHBseSB0byB0aGUgZmluYWwsIG1lcmdlZCBzY2VuZVxuICAgIGZpbmFsaXplKGNvbmZpZykge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbmZpZy5zY2VuZSA9IGNvbmZpZy5zY2VuZSB8fCB7fTtcbiAgICAgICAgY29uZmlnLmNhbWVyYXMgPSBjb25maWcuY2FtZXJhcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxpZ2h0cyA9IGNvbmZpZy5saWdodHMgfHwge307XG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBjb25maWcuc3R5bGVzIHx8IHt9O1xuICAgICAgICBjb25maWcubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCB7fTtcblxuICAgICAgICAvLyBSZXBsYWNlIGdsb2JhbCBzY2VuZSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbmZpZyA9IHRoaXMuYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKGNvbmZpZyk7XG5cbiAgICAgICAgLy8gQXNzaWduIGlkcyB0byBkYXRhIHNvdXJjZXNcbiAgICAgICAgbGV0IHNvdXJjZV9pZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgY29uZmlnLnNvdXJjZXNbc291cmNlXS5pZCA9IHNvdXJjZV9pZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb25seSBvbmUgY2FtZXJhIHNwZWNpZmllZCwgc2V0IGl0IGFzIGRlZmF1bHRcbiAgICAgICAgaWYgKGNvbmZpZy5jYW1lcmEpIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSBjb25maWcuY2FtZXJhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gY2FtZXJhcyBzcGVjaWZpZWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5jYW1lcmFzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGNhbWVyYSBzZXQgYXMgYWN0aXZlLCB1c2UgZmlyc3Qgb25lXG4gICAgICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgY2FtZXJhIG9mIFV0aWxzLnZhbHVlcyhjb25maWcuY2FtZXJhcykpIHtcbiAgICAgICAgICAgIGlmIChjYW1lcmEuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWN0aXZlKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhc1tPYmplY3Qua2V5cyhjb25maWcuY2FtZXJhcylbMF1dLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBsaWdodHMgc3BlY2lmaWVkLCBjcmVhdGUgZGVmYXVsdFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5ldmVyeShpID0+IGNvbmZpZy5saWdodHNbaV0udmlzaWJsZSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25maWcubGlnaHRzLmRlZmF1bHRfbGlnaHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RpcmVjdGlvbmFsJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG59O1xuXG4vLyBGbGF0dGVuIG5lc3RlZCBwcm9wZXJ0aWVzIGZvciBzaW1wbGVyIHN0cmluZyBsb29rLXVwc1xuLy8gZS5nLiBnbG9iYWwuYmFja2dyb3VuZC5jb2xvciAtPiAnZ2xvYmFsOmJhY2tncm91bmQ6Y29sb3InXG5mdW5jdGlvbiBmbGF0dGVuUHJvcGVydGllcyAob2JqLCBzZXBhcmF0b3IgPSAnOicsIHByZWZpeCA9IG51bGwsIHByb3BzID0ge30pIHtcbiAgICBwcmVmaXggPSBwcmVmaXggPyAocHJlZml4ICsgc2VwYXJhdG9yKSA6ICcnO1xuXG4gICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IGtleSA9IHByZWZpeCArIHA7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcF07XG4gICAgICAgIHByb3BzW2tleV0gPSB2YWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5Qcm9wZXJ0aWVzKHZhbCwgc2VwYXJhdG9yLCBrZXksIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbnN1YnNjcmliZU1peGluKFNjZW5lTG9hZGVyKTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge3BhcnNlTGF5ZXJzfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5leHBvcnQgdmFyIFNjZW5lV29ya2VyID0gc2VsZjtcblxuLy8gV29ya2VyIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gd29ya2VyIHRocmVhZFxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcblxuT2JqZWN0LmFzc2lnbihzZWxmLCB7XG5cbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuXG4gICAgc291cmNlczoge1xuICAgICAgICB0aWxlczoge30sXG4gICAgICAgIG9iamVjdHM6IHt9XG4gICAgfSxcbiAgICBzdHlsZXM6IHt9LFxuICAgIGxheWVyczoge30sXG4gICAgdGlsZXM6IHt9LFxuICAgIG9iamVjdHM6IHt9LFxuICAgIGNvbmZpZzoge30sICAgICAvLyByYXcgY29uZmlnIChlLmcuIGZ1bmN0aW9ucywgZXRjLiBub3QgZXhwYW5kZWQpXG5cbiAgICAvLyBJbml0aWFsaXplIHdvcmtlclxuICAgIGluaXQgKHNjZW5lX2lkLCB3b3JrZXJfaWQsIG51bV93b3JrZXJzLCBsb2dfbGV2ZWwsIGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBzZWxmLnNjZW5lX2lkID0gc2NlbmVfaWQ7XG4gICAgICAgIHNlbGYuX3dvcmtlcl9pZCA9IHdvcmtlcl9pZDtcbiAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IG51bV93b3JrZXJzO1xuICAgICAgICBsb2cuc2V0TGV2ZWwobG9nX2xldmVsKTtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnNldFByZWZpeChzZWxmLl93b3JrZXJfaWQpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG4gICAgICAgIHJldHVybiB3b3JrZXJfaWQ7XG4gICAgfSxcblxuICAgIC8vIFN0YXJ0cyBhIGNvbmZpZyByZWZyZXNoXG4gICAgdXBkYXRlQ29uZmlnICh7IGNvbmZpZywgZ2VuZXJhdGlvbiwgaW50cm9zcGVjdGlvbiB9KSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnKTtcblxuICAgICAgICBzZWxmLmxhc3RfY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBzZWxmLmNvbmZpZyk7XG4gICAgICAgIHNlbGYuY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpO1xuICAgICAgICBzZWxmLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICBzZWxmLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uO1xuXG4gICAgICAgIC8vIERhdGEgYmxvY2sgZnVuY3Rpb25zIGFyZSBub3QgY29udGV4dCB3cmFwcGVkIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHN0eWxlIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgLy8gVE9ETzogcHJvYmFibHkgd2FudCBhIGNsZWFuZXIgd2F5IHRvIGV4Y2x1ZGUgdGhlc2VcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgaW4gY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXllcnNbbGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4cGFuZCBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICBzZWxmLmdsb2JhbCA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuZ2xvYmFsKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzXG4gICAgICAgIHNlbGYuY3JlYXRlRGF0YVNvdXJjZXMoY29uZmlnKTtcblxuICAgICAgICAvLyBFeHBhbmQgc3R5bGVzXG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnN0eWxlcywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgc2VsZi5zdHlsZXMgPSBzZWxmLnN0eWxlX21hbmFnZXIuYnVpbGQoY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHtcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHNlbGYuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIHN0eWxlczogc2VsZi5zdHlsZXMsXG4gICAgICAgICAgICBzb3VyY2VzOiBzZWxmLnNvdXJjZXMudGlsZXMsXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiBzZWxmLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgZWFjaCB0b3AtbGV2ZWwgbGF5ZXIgYXMgYSBzZXBhcmF0ZSB0cmVlXG4gICAgICAgIHNlbGYubGF5ZXJzID0gcGFyc2VMYXllcnMoY29uZmlnLmxheWVycyk7XG5cbiAgICAgICAgLy8gU3luYyB0ZXR4dXJlIGluZm8gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICBzZWxmLnN5bmNpbmdfdGV4dHVyZXMgPSBzZWxmLnN5bmNUZXh0dXJlcyhjb25maWcudGV4dHVyZXMpO1xuXG4gICAgICAgIC8vIFJldHVybiBwcm9taXNlIGZvciB3aGVuIGNvbmZpZyByZWZyZXNoIGZpbmlzaGVzXG4gICAgICAgIHNlbGYuY29uZmlndXJpbmcgPSBzZWxmLnN5bmNpbmdfdGV4dHVyZXMudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYHVwZGF0ZWQgY29uZmlnYCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzIGFuZCBjbGVhciB0aWxlIGNhY2hlIGlmIG5lY2Vzc2FyeVxuICAgIGNyZWF0ZURhdGFTb3VyY2VzIChjb25maWcpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnNvdXJjZXMpOyAvLyBwYXJzZSBuZXcgc291cmNlc1xuICAgICAgICBzZWxmLnNvdXJjZXMudGlsZXMgPSB7fTsgLy8gY2xlYXIgcHJldmlvdXMgc291cmNlc1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSBEYXRhU291cmNlLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9LCBjb25maWcuc291cmNlc1tuYW1lXSwge25hbWV9KSwgc2VsZi5zb3VyY2VzLnRpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNvdXJjZS50aWxlZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuc291cmNlcy50aWxlc1tuYW1lXSA9IHNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERpc3RyaWJ1dGUgb2JqZWN0IHNvdXJjZXMgYWNyb3NzIHdvcmtlcnNcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlkICUgc2VsZi5udW1fd29ya2VycyA9PT0gc2VsZi5fd29ya2VyX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgc291cmNlIGlmIG5vdCBjYWNoZWRcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VzLm9iamVjdHNbbmFtZV0gPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmxvYWQoc2VsZi5vYmplY3RzW3NvdXJjZS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aWxlIGNhY2hlIGlmIGRhdGEgc291cmNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgIXNlbGYubGFzdF9jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jb25maWcuc291cmNlcykuc29tZShzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VsZi5jb25maWcuc291cmNlc1tzXSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGYubGFzdF9jb25maWcuc291cmNlc1tzXSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc2VsZi50aWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiBjb25maWcgcmVmcmVzaCBpcyBmaW5pc2hlZFxuICAgIGF3YWl0Q29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ3VyaW5nO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBhIHRpbGU6IGxvYWQgZnJvbSB0aWxlIHNvdXJjZSBpZiBidWlsZGluZyBmb3IgZmlyc3QgdGltZSwgb3RoZXJ3aXNlIHJlYnVpbGQgd2l0aCBleGlzdGluZyBkYXRhXG4gICAgYnVpbGRUaWxlICh7IHRpbGUgfSkge1xuICAgICAgICAvLyBUaWxlIGNhY2hlZD9cbiAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsb2FkaW5nP1xuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aWxlIGNhY2hlXG4gICAgICAgIHRpbGUgPSBzZWxmLnRpbGVzW3RpbGUua2V5XSA9IE9iamVjdC5hc3NpZ24oc2VsZi5nZXRUaWxlKHRpbGUua2V5KSB8fCB7fSwgdGlsZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoc3R5bGVzLCBldGMuKSwgdGhlbiBidWlsZCB0aWxlXG4gICAgICAgIHJldHVybiBzZWxmLmF3YWl0Q29uZmlndXJhdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBidWlsZGluZyB0aGUgdGlsZVxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaWxlU291cmNlRGF0YSh0aWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmdldFRpbGUodGlsZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBhZnRlciBkYXRhIHNvdXJjZSBsb2FkIGJlY2F1c2UgdGlsZSB3YXMgcmVtb3ZlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgdGlsZSBsb2FkIGVycm9yKHMpIGZvciAke3RpbGUua2V5fTogJHt0aWxlLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgdGlsZSBsb2FkIGVycm9yIGZvciAke3RpbGUua2V5fTogJHt0aWxlLmVycm9yfSBhdDogJHtlcnJvci5zdGFja31gKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGlsZSBhbHJlYWR5IGxvYWRlZCwganVzdCByZWJ1aWxkXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHVzZWQgd29ya2VyIGNhY2hlIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCB0aGlzIHRpbGUncyBkYXRhIHNvdXJjZVxuICAgIGxvYWRUaWxlU291cmNlRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAoc2VsZi5zb3VyY2VzLnRpbGVzW3RpbGUuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlcy50aWxlc1t0aWxlLnNvdXJjZV0ubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7IGVycm9yOiBgRGF0YSBzb3VyY2UgJyR7dGlsZS5zb3VyY2V9JyBub3QgZm91bmRgIH07XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnRpbGVzW2tleV07XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB0aWxlXG4gICAgcmVtb3ZlVGlsZSAoa2V5KSB7XG4gICAgICAgIHZhciB0aWxlID0gc2VsZi50aWxlc1trZXldO1xuXG4gICAgICAgIGlmICh0aWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBpZiBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBjYW5jZWwgdGlsZSBsb2FkIGZvciAke2tleX1gKTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBUaWxlLmNhbmNlbCh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uY2xlYXJUaWxlKGtleSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZi50aWxlc1trZXldO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZW1vdmUgdGlsZSBmcm9tIGNhY2hlIGZvciAke2tleX1gKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBHZXQgYSBmZWF0dXJlIGZyb20gdGhlIHNlbGVjdGlvbiBtYXBcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uICh7IGlkLCBrZXkgfSA9IHt9KSB7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBGZWF0dXJlU2VsZWN0aW9uLm1hcFtrZXldO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBmZWF0dXJlOiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mZWF0dXJlKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBSZXNldHMgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRlXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uICgpIHtcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvLyBTZWxlY3Rpb24gbWFwIHNpemUgZm9yIHRoaXMgd29ya2VyXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUgKCkge1xuICAgICAgICByZXR1cm4gRmVhdHVyZVNlbGVjdGlvbi5nZXRNYXBTaXplKCk7XG4gICAgfSxcblxuICAgIC8vIFRleHR1cmUgaW5mbyBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSBtYWluIHRocmVhZCwgZS5nLiB3aWR0aC9oZWlnaHQsIHdoaWNoIHdlIG9ubHkga25vdyBhZnRlciB0aGUgdGV4dHVyZSBsb2Fkc1xuICAgIHN5bmNUZXh0dXJlcyAodGV4X2NvbmZpZykge1xuICAgICAgICBsZXQgdGV4dHVyZXMgPSBbXTtcbiAgICAgICAgaWYgKHRleF9jb25maWcpIHtcbiAgICAgICAgICAgIHRleHR1cmVzLnB1c2goLi4uT2JqZWN0LmtleXModGV4X2NvbmZpZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdzeW5jIHRleHR1cmVzIHRvIHdvcmtlcjonLCB0ZXh0dXJlcyk7XG4gICAgICAgIGlmICh0ZXh0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlcih0ZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBTeW5jIGRldmljZSBwaXhlbCByYXRpbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICB9LFxuXG4gICAgLy8gUHJvZmlsaW5nIGhlbHBlcnNcbiAgICBwcm9maWxlIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH0sXG5cbiAgICBwcm9maWxlRW5kIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH1cblxufSk7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlU2VsZWN0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB3b3JrZXJzKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsgLy8gcG9vbCBvZiB3b3JrZXJzIHRvIHJlcXVlc3QgZmVhdHVyZSBsb29rLXVwcyBmcm9tLCBrZXllZCBieSBpZFxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBTZWxlY3Rpb24gc3RhdGUgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHt9OyAvLyBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsOyAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXkgPSA1OyAvLyBkZWxheSB0aW1lIGZyb20gc2VsZWN0aW9uIHJlbmRlciB0byBmcmFtZWJ1ZmZlciBzYW1wbGUsIHRvIGF2b2lkIENQVS9HUFUgc3luYyBsb2NrXG4gICAgICAgIHRoaXMucmVhZF9kZWxheV90aW1lciA9IG51bGw7IC8vIGN1cnJlbnQgdGltZXIgKHNldFRpbWVvdXQpIGZvciBkZWxheWVkIHNlbGVjdGlvbiByZWFkc1xuXG4gICAgICAgIHRoaXMucGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgdGhpcy5waXhlbDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnBpeGVsLmJ1ZmZlcik7XG5cbiAgICAgICAgLy8gRnJhbWUgYnVmZmVyIGZvciBzZWxlY3Rpb25cbiAgICAgICAgLy8gVE9ETzogaW5pdGlhdGUgbGF6aWx5IGluIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuZmJvID0gdGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZmJvX3NpemUgPSB7IHdpZHRoOiAyNTYsIGhlaWdodDogMjU2IH07IC8vIFRPRE86IG1ha2UgY29uZmlndXJhYmxlIC8gYWRhcHRpdmUgYmFzZWQgb24gY2FudmFzIHNpemVcbiAgICAgICAgdGhpcy5mYm9fc2l6ZS5hc3BlY3QgPSB0aGlzLmZib19zaXplLndpZHRoIC8gdGhpcy5mYm9fc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgLy8gVGV4dHVyZSBmb3IgdGhlIEZCTyBjb2xvciBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fdGV4dHVyZSA9IFRleHR1cmUuY3JlYXRlKCB0aGlzLmdsLCAnc2VsZWN0aW9uX2ZibycsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIGZib190ZXh0dXJlLnNldERhdGEodGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQsIG51bGwsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGhpcy5nbC5URVhUVVJFXzJELCBmYm9fdGV4dHVyZS50ZXh0dXJlLCAwKTtcblxuICAgICAgICAvLyBSZW5kZXJidWZmZXIgZm9yIHRoZSBGQk8gZGVwdGggYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX2RlcHRoX3JiID0gdGhpcy5nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kUmVuZGVyYnVmZmVyKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuICAgICAgICB0aGlzLmdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UodGhpcy5nbC5SRU5ERVJCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQsIHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmdsICYmIHRoaXMuZmJvKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZmJvKTtcbiAgICAgICAgICAgIHRoaXMuZmJvID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZnJlZSB0ZXh0dXJlP1xuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIC8vIFN3aXRjaCB0byBGQk9cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgLy8gUnVucyBhc3luY2hyb25vdXNseSwgc2NoZWR1bGVzIHNlbGVjdGlvbiBidWZmZXIgdG8gYmUgdXBkYXRlZFxuICAgIGdldEZlYXR1cmVBdChwb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUXVldWUgcmVxdWVzdHMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBhbmQgdGhleSB3aWxsIGJlIHBpY2tlZCB1cCBieSB0aGUgcmVuZGVyIGxvb3BcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgPSAodGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCArIDEpIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RzW3RoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQsXG4gICAgICAgICAgICAgICAgcG9pbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFueSBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgIHBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2VsZWN0aW9uIHR5cGVzLCBzdWNoIGFzIGZlYXR1cmVzIHdpdGhpbiBhIGJveFxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCwgZmVhdHVyZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7IC8vIHNhdmUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7IC8vIGZ1bGwgc2V0IG9mIGRhdGEgc291cmNlcyBUT0RPOiBjZW50cmFsaXplIHRoZXNlIGxpa2UgdGV4dHVyZXM/XG4gICAgICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IGNvbmZpZy5wYWRfc2NhbGUgfHwgMC4wMDAxOyAvLyBzY2FsZSB0aWxlIHVwIGJ5IHNtYWxsIGZhY3RvciB0byBjb3ZlciBzZWFtc1xuICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IG51bGw7IC8vIHdpbmRpbmcgb3JkZXIgd2lsbCBhZGFwdCB0byBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLnJhc3RlcnMgPSAvLyBhdHRhY2hlZCByYXN0ZXIgdGlsZSBzb3VyY2VzXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5yYXN0ZXJzKSA/IFsuLi5uZXcgU2V0KGNvbmZpZy5yYXN0ZXJzKV0gOiBbXTsgLy8gZGUtZHVwZSB3aXRoIHNldCBjb252ZXJzaW9uXG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IChjb25maWcubWF4X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X3pvb20gOiBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG5cbiAgICAgICAgLy8gbm8gdGlsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgb3IgZGlzcGxheWVkIG91dHNpZGUgb2YgdGhlc2UgbWluL21heCB2YWx1ZXNcbiAgICAgICAgdGhpcy5taW5fZGlzcGxheV96b29tID0gKGNvbmZpZy5taW5fZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gOiAwO1xuICAgICAgICB0aGlzLm1heF9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X2Rpc3BsYXlfem9vbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBBbGwgZGF0YSBzb3VyY2VzIHN1cHBvcnQgYSBtaW4gem9vbSwgdGlsZWQgc291cmNlcyBjYW4gc3ViY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgbGltaXRzIChlLmcuIGJvdW5kaW5nIGJveClcbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICAvLyBMaW1pdCBieSB0aGlzIGRhdGEgc291cmNlXG4gICAgICAgIGlmIChjb29yZHMueiA8IHRoaXMubWluX2Rpc3BsYXlfem9vbSB8fCAodGhpcy5tYXhfZGlzcGxheV96b29tICE9IG51bGwgJiYgc3R5bGVfem9vbSA+IHRoaXMubWF4X2Rpc3BsYXlfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGJ5IGFueSBkZXBlbmRlbnQgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgc291cmNlX25hbWUgb2YgdGhpcy5yYXN0ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0gIT09IHRoaXMgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXS5pbmNsdWRlc1RpbGUoY29vcmRzLCBjb29yZHMueikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBhIG5ldyBkYXRhIHNvdXJjZSB0eXBlLCB1bmRlciBhIHR5cGUgbmFtZVxuICAgIHN0YXRpYyByZWdpc3Rlcih0eXBlX2NsYXNzLCB0eXBlX25hbWUpIHtcbiAgICAgICAgaWYgKCF0eXBlX2NsYXNzIHx8ICF0eXBlX25hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIERhdGFTb3VyY2UudHlwZXNbdHlwZV9uYW1lXSA9IHR5cGVfY2xhc3M7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UudHlwZXMgPSB7fTsgLy8gc2V0IG9mIHN1cHBvcnRlZCBkYXRhIHNvdXJjZSBjbGFzc2VzLCByZWZlcmVuY2VkIGJ5IHR5cGUgbmFtZVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIGxvYWRpbmcgc291cmNlIC0gYWJzdHJhY3QgY2xhc3MgKioqL1xuXG5leHBvcnQgY2xhc3MgTmV0d29ya1NvdXJjZSBleHRlbmRzIERhdGFTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLnVybCA9IFV0aWxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICBzb3VyY2VfZGF0YS5yZXF1ZXN0ID0gcHJvbWlzZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTsgLy8gcmVzb2x2ZSByZXF1ZXN0IGJ1dCBwYXNzIGFsb25nIGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6XG5cbiAgICBmb3JtYXRVcmwgKHVybF90ZW1wbGF0ZSwgZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ2Zvcm1hdFVybCcpO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAoZGVzdCwgc291cmNlLCByZXBvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgncGFyc2VTb3VyY2VEYXRhJyk7XG4gICAgfVxufVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIHRpbGUgbG9hZGluZyAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyc2VCb3VuZHMoc291cmNlKTtcblxuICAgICAgICAvLyBpbmRpY2F0ZXMgaWYgc291cmNlIHNob3VsZCBidWlsZCBnZW9tZXRyeSB0aWxlcywgZW5hYmxlZCBmb3Igc291cmNlcyByZWZlcmVuY2VkIGluIHRoZSBzY2VuZSdzIGxheWVycyxcbiAgICAgICAgLy8gYW5kIGxlZnQgZGlzYWJsZWQgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbmV2ZXIgcmVmZXJlbmNlZCwgb3Igb25seSB1c2VkIGFzIHJhc3RlciB0ZXh0dXJlc1xuICAgICAgICB0aGlzLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG1zID0gKHNvdXJjZS50bXMgPT09IHRydWUpOyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB0aGlzLnVybF9ob3N0cyA9IG51bGw7XG4gICAgICAgIHZhciBob3N0X21hdGNoID0gdGhpcy51cmwubWF0Y2goL3tzOlxcWyhbXn0rXSspXFxdfS8pO1xuICAgICAgICBpZiAoaG9zdF9tYXRjaCAhPSBudWxsICYmIGhvc3RfbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBob3N0X21hdGNoWzFdLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYm91bmRzIGZyb20gc291cmNlIGNvbmZpZyBwYXJhbWV0ZXJzXG4gICAgcGFyc2VCb3VuZHMgKHNvdXJjZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuYm91bmRzKSAmJiBzb3VyY2UuYm91bmRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBzb3VyY2UuYm91bmRzO1xuICAgICAgICAgICAgbGV0IFt3LCBzLCBlLCBuXSA9IHRoaXMuYm91bmRzO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgIG1pbjogR2VvLmxhdExuZ1RvTWV0ZXJzKFt3LCBuXSksXG4gICAgICAgICAgICAgICAgbWF4OiBHZW8ubGF0TG5nVG9NZXRlcnMoW2UsIHNdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJvdW5kc190aWxlcyA9IHsgbWluOiB7fSwgbWF4OiB7fSB9OyAvLyBtYXggdGlsZSBib3VuZHMgcGVyIHpvb20gKGxhemlseSBldmFsdWF0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRpbGUgaXMgb3V0c2lkZSBkYXRhIHNvdXJjZSdzIGJvdW5kcywgdHJ1ZSBpZiB3aXRoaW5cbiAgICBjaGVja0JvdW5kcyAoY29vcmRzKSB7XG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgY29vcmRzID0gR2VvLndyYXBUaWxlKGNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBsZXQgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XTtcbiAgICAgICAgICAgIGlmICghbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XSA9IEdlby50aWxlRm9yTWV0ZXJzKHRoaXMuYm91bmRzX21ldGVycy5taW4sIGNvb3Jkcy56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWF4LCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb29yZHMueCA8IG1pbi54IHx8IGNvb3Jkcy54ID4gbWF4LnggfHxcbiAgICAgICAgICAgICAgICBjb29yZHMueSA8IG1pbi55IHx8IGNvb3Jkcy55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5jbHVkZXNUaWxlIChjb29yZHMsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgaWYgKCFzdXBlci5pbmNsdWRlc1RpbGUoY29vcmRzLCBzdHlsZV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZSBib3VuZHNcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQm91bmRzKGNvb3JkcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwodXJsX3RlbXBsYXRlLCB0aWxlKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICBpZiAodGhpcy50bXMpIHtcbiAgICAgICAgICAgIGNvb3Jkcy55ID0gTWF0aC5wb3coMiwgY29vcmRzLnopIC0gMSAtIGNvb3Jkcy55OyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybCA9IHVybF90ZW1wbGF0ZS5yZXBsYWNlKCd7eH0nLCBjb29yZHMueCkucmVwbGFjZSgne3l9JywgY29vcmRzLnkpLnJlcGxhY2UoJ3t6fScsIGNvb3Jkcy56KTtcblxuICAgICAgICBpZiAodGhpcy51cmxfaG9zdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL3tzOlxcWyhbXn0rXSspXFxdfS8sIHRoaXMudXJsX2hvc3RzW3RoaXMubmV4dF9ob3N0XSk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9ICh0aGlzLm5leHRfaG9zdCArIDEpICUgdGhpcy51cmxfaG9zdHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGZvciB0aGUgeC95L3ogdGlsZSBwYXR0ZXJuIGluIFVSTCB0ZW1wbGF0ZVxuICAgIHVybEhhc1RpbGVQYXR0ZXJuKHVybCkge1xuICAgICAgICByZXR1cm4gdXJsICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eH0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eX0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7en0nKSA+IC0xO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrU291cmNlLCBOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge2RlY29kZU11bHRpUG9seWdvbn0gZnJvbSAnLi9tdnQnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG4vLyBGb3IgdGlsaW5nIEdlb0pTT04gY2xpZW50LXNpZGVcbmltcG9ydCBnZW9qc29udnQgZnJvbSAnZ2VvanNvbi12dCc7XG5cbi8qKlxuIEdlb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBOZXR3b3JrU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbGVfaW5kZXhlcyA9IHt9OyAvLyBnZW9qc29uLXZ0IHRpbGUgaW5kaWNlcywgYnkgbGF5ZXIgbmFtZVxuICAgICAgICB0aGlzLm1heF96b29tID0gTWF0aC5tYXgodGhpcy5tYXhfem9vbSB8fCAwLCAxNSk7IC8vIFRPRE86IG1heCB6b29tIDwgMTUgY2F1c2VzIGFydGlmYWN0cy9uby1kcmF3IGF0IDIwLCBpbnZlc3RpZ2F0ZVxuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IDA7IC8vIHdlIGRvbid0IHdhbnQgcGFkZGluZyBvbiBhdXRvLXRpbGVkIHNvdXJjZXNcbiAgICB9XG5cbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZF9kYXRhID0gc3VwZXIuX2xvYWQoeyBzb3VyY2VfZGF0YTogeyBsYXllcnM6IHt9IH0gfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJzID0gZGF0YS5zb3VyY2VfZGF0YS5sYXllcnM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0gPSBnZW9qc29udnQobGF5ZXJzW2xheWVyX25hbWVdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heF96b29tLCAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IDMsIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ6IEdlby50aWxlX3NjYWxlLCAvLyB0aWxlIGV4dGVudCAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiAwLjAwMDEgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRfZGF0YS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gdGhpcy50aWxlX2luZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl9uYW1lXSA9IHRoaXMuZ2V0VGlsZUZlYXR1cmVzKGRlc3QsIGxheWVyX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFRpbGVGZWF0dXJlcyh0aWxlLCBsYXllcl9uYW1lKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyByZXF1ZXN0IGEgcGFydGljdWxhciB0aWxlXG4gICAgICAgIGxldCB0ID0gdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0uZ2V0VGlsZShjb29yZHMueiwgY29vcmRzLngsIGNvb3Jkcy55KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gTVZULXN0eWxlIEpTT04gc3RydWN0IHRvIEdlb0pTT05cbiAgICAgICAgbGV0IGNvbGxlY3Rpb247XG4gICAgICAgIGlmICh0ICYmIHQuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGZlYXR1cmUgb2YgdC5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIC8vIEdlb0pTT04gZmVhdHVyZVxuICAgICAgICAgICAgICAgIGxldCBmID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS50YWdzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKTtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09IDIgfHwgZmVhdHVyZS50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nLm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGYuZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5nZW9tZXRyeSA9PSBudWxsKSB7IC8vIHNraXAgcG9seXMgdGhhdCBjb3VsZG4ndCBiZSBkZWNvZGVkIChlLmcuIGRlZ2VuZXJhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIGZvcm1hdFVybCAoZGVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBwYXJzZWRfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKHBhcnNlZF9yZXNwb25zZSk7XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gbGF5ZXJzO1xuICAgIH1cblxuICAgIHByZXByb2Nlc3NMYXllcnMgKGxheWVycyl7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzRmVhdHVyZXMobGF5ZXIuZmVhdHVyZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlcHJvY2VzcyBmZWF0dXJlcy4gQ3VycmVudGx5IHVzZWQgdG8gYWRkIGEgbmV3IFwiY2VudHJvaWRcIiBmZWF0dXJlIGZvciBwb2x5Z29uIGxhYmVsaW5nXG4gICAgcHJlcHJvY2Vzc0ZlYXR1cmVzIChmZWF0dXJlcykge1xuICAgICAgICAvLyBEZWZpbmUgY2VudHJvaWRzIGZvciBwb2x5Z29ucyBmb3IgY2VudHJvaWQgbGFiZWwgcGxhY2VtZW50XG4gICAgICAgIC8vIEF2b2lkcyByZWR1bmRhbnQgbGFiZWwgcGxhY2VtZW50IGZvciBlYWNoIGdlbmVyYXRlZCB0aWxlIGF0IGhpZ2hlciB6b29tIGxldmVsc1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVfbGFiZWxfY2VudHJvaWRzKXtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlc19jZW50cm9pZCA9IFtdO1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7XCJsYWJlbF9wbGFjZW1lbnRcIiA6IHRydWV9O1xuXG4gICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcywgY2VudHJvaWRfZmVhdHVyZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNlbnRyb2lkIGZlYXR1cmUgZm9yIGxhcmdlc3QgcG9seWdvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb29yZGluYXRlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJlYSA9IEdlby5wb2x5Z29uQXJlYShjb29yZGluYXRlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID4gbWF4X2FyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYV9pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzW21heF9hcmVhX2luZGV4XSwgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYXBwZW5kIGNlbnRyb2lkIGZlYXR1cmVzIHRvIGZlYXR1cmVzIGFycmF5XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShmZWF0dXJlcywgZmVhdHVyZXNfY2VudHJvaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBzaW5nbGUgb3IgbXVsdGlwbGUgbGF5ZXJzIGluIHJldHVybmVkIGRhdGFcbiAgICBnZXRMYXllcnMgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnIHx8IGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgX2RlZmF1bHQ6IGRhdGEgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8qKlxuIEdlb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIEdlb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05UaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIFVSTCB0aWxlIHBhdHRlcm4sIGlmIG5vdCBmb3VuZCwgdHJlYXQgYXMgc3RhbmRhbG9uZSBHZW9KU09OL1RvcG9KU09OIG9iamVjdFxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpbnN0YW5jZSB0eXBlIGZyb20gcGFyZW50IGNsYXNzXG4gICAgICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdHZW9KU09OJykge1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgaW5zdGFuY2UgdHlwZVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBiYWNrIHRvIHBhcmVudCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHJlcGFyZUdlb0pTT04gKGRhdGEsIHRpbGUsIHNvdXJjZSkge1xuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy50cmFuc2Zvcm0oZGF0YSwgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBHZW9KU09OU291cmNlLnByb3RvdHlwZS5nZXRMYXllcnMoZGF0YSk7XG5cbiAgICAgICAgLy8gQSBcInN5bnRoZXRpY1wiIHRpbGUgdGhhdCBhZGp1c3RzIHRoZSB0aWxlIG1pbiBhbmNob3IgdG8gYWNjb3VudCBmb3IgdGlsZSBsb25naXR1ZGUgd3JhcHBpbmdcbiAgICAgICAgbGV0IGFuY2hvciA9IHtcbiAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICBtaW46IEdlby5tZXRlcnNGb3JUaWxlKEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pKVxuICAgICAgICB9O1xuXG4gICAgICAgIERhdGFTb3VyY2UucHJvamVjdERhdGEoc291cmNlKTsgLy8gbWVyY2F0b3IgcHJvamVjdGlvblxuICAgICAgICBEYXRhU291cmNlLnNjYWxlRGF0YShzb3VyY2UsIGFuY2hvcik7IC8vIHJlLXNjYWxlIGZyb20gbWV0ZXJzIHRvIGxvY2FsIHRpbGUgY29vcmRzXG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoR2VvSlNPTlRpbGVTb3VyY2UsICdHZW9KU09OJyk7ICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgY2VudHJvaWQgcG9pbnQgZmVhdHVyZSBmcm9tIHBvbHlnb24gY29vcmRpbmF0ZXMgYW5kIHByb3ZpZGVkIGZlYXR1cmUgbWV0YS1kYXRhXG5mdW5jdGlvbiBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uIChjb29yZGluYXRlcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcykge1xuICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChjb29yZGluYXRlcyk7XG5cbiAgICAvLyBjbG9uZSBwcm9wZXJ0aWVzIGFuZCBtaXhpeCBuZXdQcm9wZXJ0aWVzXG4gICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7fTtcbiAgICBPYmplY3QuYXNzaWduKGNlbnRyb2lkX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIHByb3BlcnRpZXM6IGNlbnRyb2lkX3Byb3BlcnRpZXMsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiBcIlBvaW50XCIsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY2VudHJvaWRcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IFBiZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlLCBWZWN0b3JUaWxlRmVhdHVyZX0gZnJvbSAndmVjdG9yLXRpbGUnO1xuXG4vKipcbiBNYXBib3ggVmVjdG9yIFRpbGUgZm9ybWF0XG4gQGNsYXNzIE1WVFNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBNVlRTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgLy8gYmluYXJ5IGRhdGFcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ29udmVydCBNYXBib3ggdmVjdG9yIHRpbGUgdG8gR2VvSlNPTlxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBQYmYoZGF0YSk7XG4gICAgICAgIHNvdXJjZS5kYXRhID0gbmV3IFZlY3RvclRpbGUoYnVmZmVyKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudG9HZW9KU09OKHNvdXJjZS5kYXRhKTtcbiAgICAgICAgZGVsZXRlIHNvdXJjZS5kYXRhOyAvLyBjb21tZW50IG91dCB0byBzYXZlIHJhdyBkYXRhIGZvciBkZWJ1Z2dpbmdcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggbGF5ZXJzL2ZlYXR1cmVzIHVzaW5nIE1hcGJveCBsaWIgQVBJLCBjb252ZXJ0IHRvIEdlb0pTT04gZmVhdHVyZXNcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGtleXMgZm9yIGVhY2ggbGF5ZXIsIGUuZy4geyBsYXllcjogZ2VvanNvbiB9XG4gICAgdG9HZW9KU09OICh0aWxlKSB7XG4gICAgICAgIHZhciBsYXllcnMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgbCBpbiB0aWxlLmxheWVycykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gdGlsZS5sYXllcnNbbF07XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdLnlcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcblxuICAgICAgICAgICAgICAgIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyX2dlb2pzb24uZmVhdHVyZXMucHVzaChmZWF0dXJlX2dlb2pzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5ZXJzW2xdID0gbGF5ZXJfZ2VvanNvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxufVxuXG4vLyBEZWNvZGUgbXVsdGlwb2x5Z29ucywgd2hpY2ggYXJlIGVuY29kZWQgYXMgYSBzaW5nbGUgc2V0IG9mIHJpbmdzXG4vLyBXaW5kaW5nIG9yZGVyIG9mIGZpcnN0IHJpbmcgaXMgYXNzdW1lZCB0byBpbmRpY2F0ZSBleHRlcmlvciByaW5nLFxuLy8gdGhlIG9wcG9zaXRlIHdpbmRpbmcgb3JkZXIgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIG5ldyBwb2x5Z29uLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU11bHRpUG9seWdvbiAoZ2VvbSkge1xuICAgIGxldCBwb2x5cyA9IFtdO1xuICAgIGxldCBwb2x5ID0gW107XG4gICAgbGV0IG91dGVyX3dpbmRpbmc7XG4gICAgZm9yIChsZXQgcj0wOyByIDwgZ2VvbS5jb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgcmluZyA9IGdlb20uY29vcmRpbmF0ZXNbcl07XG4gICAgICAgIGxldCB3aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKHJpbmcpO1xuICAgICAgICBpZiAod2luZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB6ZXJvLWFyZWEgcmluZ3NcbiAgICAgICAgfVxuXG4gICAgICAgIG91dGVyX3dpbmRpbmcgPSBvdXRlcl93aW5kaW5nIHx8IHdpbmRpbmc7IC8vIGFzc3VtZSBmaXJzdCByaW5nIGluZGljYXRlcyBvdXRlciByaW5nIHdpbmRpbmdcblxuICAgICAgICBpZiAod2luZGluZyA9PT0gb3V0ZXJfd2luZGluZyAmJiBwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgICAgICAgICBwb2x5ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcG9seS5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICBpZiAocG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIG9yIG11bHRpP1xuICAgIGlmIChwb2x5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ1BvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXNbMF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvbHlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ011bHRpUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5cztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdlb20gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBnZW9tO1xufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKE1WVFNvdXJjZSwgJ01WVCcpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuLi90aWxlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGNsYXNzIFJhc3RlclRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YodGhpcy5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmFzdGVycy51bnNoaWZ0KHRoaXMubmFtZSk7IC8vIGFkZCB0aGlzIHJhc3RlciBhcyB0aGUgZmlyc3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IHNvdXJjZS5maWx0ZXJpbmc7IC8vIG9wdGlvbmFsIHRleHR1cmUgZmlsdGVyaW5nIChuZWFyZXN0LCBsaW5lYXIsIG1pcG1hcClcblxuICAgICAgICAvLyBzYXZlIHRleHR1cmUgb2JqZWN0cyBieSB0aWxlIGtleSwgc28gVVJMIHJlbWFpbnMgc3RhYmxlIGlmIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMsXG4gICAgICAgIC8vIGUuZy4gYXZvaWQgcmUtbG9hZGluZyB0aGUgc2FtZSB0aWxlIHRleHR1cmUgdW5kZXIgYSBkaWZmZXJlbnQgc3ViZG9tYWluIHdoZW4gdXNpbmcgdGlsZSBob3N0c1xuICAgICAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgfVxuXG4gICAgbG9hZCh0aWxlKSB7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgdGlsZS5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgdGlsZS5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHNpbmdsZSBxdWFkIHRoYXQgZmlsbHMgdGhlIGVudGlyZSB0aWxlXG4gICAgICAgIGxldCBzY2FsZSA9IEdlby50aWxlX3NjYWxlO1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHtcbiAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW3tcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXSwgW3NjYWxlLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGUsIC1zY2FsZV0sIFswLCAtc2NhbGVdLCBbMCwgMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1dXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9XG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLmRlZmF1bHRfd2luZGluZyA9ICdDVyc7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRleHR1cmUgaW5mbyBmb3IgYSByYXN0ZXIgdGlsZVxuICAgIHRpbGVUZXh0dXJlICh0aWxlKSB7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlc1trZXldKSB7XG4gICAgICAgICAgICBsZXQgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20odGlsZS5jb29yZHMsIHRoaXMubWF4X3pvb20pO1xuICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCB7IGNvb3JkcyB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXNba2V5XSA9IHsgdXJsLCBmaWx0ZXJpbmc6IHRoaXMuZmlsdGVyaW5nLCBjb29yZHMgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlc1trZXldO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFJhc3RlclRpbGVTb3VyY2UsICdSYXN0ZXInKTtcbiIsImltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtHZW9KU09OU291cmNlLCBHZW9KU09OVGlsZVNvdXJjZX0gZnJvbSAnLi9nZW9qc29uJztcblxuaW1wb3J0IHRvcG9qc29uIGZyb20gJ3RvcG9qc29uJztcblxuLyoqXG4gVG9wb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIFRvcG9KU09OU291cmNlIGV4dGVuZHMgR2VvSlNPTlNvdXJjZSB7XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IHRoaXMudG9HZW9KU09OKGRhdGEpO1xuXG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhkYXRhKTtcbiAgICAgICAgc3VwZXIucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gbGF5ZXJzO1xuICAgIH1cblxuICAgIHRvR2VvSlNPTiAoZGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbGF5ZXJcbiAgICAgICAgaWYgKGRhdGEub2JqZWN0cyAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cylbMF07XG4gICAgICAgICAgICBkYXRhID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1tsYXllcl0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE11bHRpcGxlIGxheWVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXllcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhLm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsYXllcnNba2V5XSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhID0gbGF5ZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBnZXRUb3BvSlNPTkZlYXR1cmUgKHRvcG9sb2d5LCBvYmplY3QpIHtcbiAgICBsZXQgZmVhdHVyZSA9IHRvcG9qc29uLmZlYXR1cmUodG9wb2xvZ3ksIG9iamVjdCk7XG5cbiAgICAvLyBDb252ZXJ0IHNpbmdsZSBmZWF0dXJlIHRvIGEgZmVhdHVyZSBjb2xsZWN0aW9uXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGZlYXR1cmUgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuXG4vKipcbiBUb3BvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgVG9wb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZSBleHRlbmRzIEdlb0pTT05UaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBub24tdGlsZWQgc291cmNlIGlmIHRpbGVkIHNvdXJjZSBmYWlsZWQgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUb3BvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSBUb3BvSlNPTlNvdXJjZS5wcm90b3R5cGUudG9HZW9KU09OKGRhdGEpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoVG9wb0pTT05UaWxlU291cmNlLCAnVG9wb0pTT04nKTsgICAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuIiwiaW1wb3J0IHtTdHlsZXN9IGZyb20gJy4vc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuLi91dGlscy9tZXJnZSc7XG5pbXBvcnQge21hdGNofSBmcm9tICdtYXRjaC1mZWF0dXJlJztcblxuZXhwb3J0IGNvbnN0IHdoaXRlTGlzdCA9IFsnZmlsdGVyJywgJ2RyYXcnLCAndmlzaWJsZScsICdkYXRhJ107XG5cbmV4cG9ydCBjb25zdCBsYXllcl9jYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBjYWNoZUtleSAobGF5ZXJzKSB7XG4gICAgaWYgKGxheWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBrID0gbGF5ZXJzWzBdO1xuICAgICAgICBmb3IgKHZhciBpPTE7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGsgKz0gJy8nICsgbGF5ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNbMF07XG59XG5cbi8vIE1lcmdlIG1hdGNoaW5nIGxheWVyIHRyZWVzIGludG8gYSBmaW5hbCBkcmF3IGdyb3VwXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmVlcyhtYXRjaGluZ1RyZWVzLCBncm91cCkge1xuICAgIGxldCBkcmF3cywgdHJlZURlcHRoID0gMDtcblxuICAgIGxldCBkcmF3ID0ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlIC8vIHZpc2libGUgYnkgZGVmYXVsdFxuICAgIH07XG5cbiAgICAvLyBGaW5kIGRlZXBlc3QgdHJlZVxuICAgIGZvciAobGV0IHQ9MDsgdCA8IG1hdGNoaW5nVHJlZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgaWYgKG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoID4gdHJlZURlcHRoKSB7XG4gICAgICAgICAgICB0cmVlRGVwdGggPSBtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGxheWVycyB0byBwYXJzZVxuICAgIGlmICh0cmVlRGVwdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0cmVlcyBpbiBwYXJhbGxlbFxuICAgIGZvciAobGV0IHg9MDsgeCA8IHRyZWVEZXB0aDsgeCsrKSB7XG4gICAgICAgIC8vIFB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgZHJhdyBncm91cCwgZm9yIGVhY2ggdHJlZSwgYXQgdGhpcyBkZXB0aFxuICAgICAgICBkcmF3cyA9IG1hdGNoaW5nVHJlZXMubWFwKHRyZWUgPT4gdHJlZVt4XSAmJiB0cmVlW3hdW2dyb3VwXSk7XG4gICAgICAgIGlmIChkcmF3cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBieSBsYXllciBuYW1lIGJlZm9yZSBtZXJnaW5nLCBzbyBsYXllcnMgYXJlIGFwcGxpZWQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBsYXllcnMgbW9kaWZ5IHRoZSBzYW1lIHByb3BlcnRpZXNcbiAgICAgICAgZHJhd3Muc29ydCgoYSwgYikgPT4gKGEgJiYgYS5sYXllcl9uYW1lKSA+IChiICYmIGIubGF5ZXJfbmFtZSkgPyAxIDogLTEpO1xuXG4gICAgICAgIC8vIE1lcmdlIGRyYXcgb2JqZWN0c1xuICAgICAgICBtZXJnZU9iamVjdHMoZHJhdywgLi4uZHJhd3MpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBsYXllciBuYW1lcywgdGhleSB3ZXJlIG9ubHkgdXNlZCB0cmFuc2llbnRseSB0byBzb3J0IGFuZCBjYWxjdWxhdGUgZmluYWwgbGF5ZXJcbiAgICAgICAgLy8gKGZpbmFsIG1lcmdlZCBuYW1lcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZSBzaW5jZSBvbmx5IG9uZSB0cmVlIGNhbiB3aW4pXG4gICAgICAgIGRlbGV0ZSBkcmF3LmxheWVyX25hbWU7XG4gICAgfVxuXG4gICAgLy8gU2hvcnQtY2lyY3VpdCBpZiBub3QgdmlzaWJsZVxuICAgIGlmIChkcmF3LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBkcmF3O1xufVxuXG5jb25zdCBibGFja2xpc3QgPSBbJ2FueScsICdhbGwnLCAnbm90JywgJ25vbmUnXTtcblxuY2xhc3MgTGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBsYXllciwgbmFtZSwgcGFyZW50LCBkcmF3LCB2aXNpYmxlLCBmaWx0ZXIgfSkge1xuICAgICAgICB0aGlzLmlkID0gTGF5ZXIuaWQrKztcbiAgICAgICAgdGhpcy5jb25maWcgPSBsYXllcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZnVsbF9uYW1lID0gdGhpcy5wYXJlbnQgPyAodGhpcy5wYXJlbnQuZnVsbF9uYW1lICsgJzonICsgdGhpcy5uYW1lKSA6IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5kcmF3ID0gZHJhdztcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC52aXNpYmxlKTtcblxuICAgICAgICAvLyBEZW5vcm1hbGl6ZSBsYXllciBuYW1lIHRvIGRyYXcgZ3JvdXBzXG4gICAgICAgIGlmICh0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwIGluIHRoaXMuZHJhdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1tncm91cF0gPSB0aGlzLmRyYXdbZ3JvdXBdIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1tncm91cF0ubGF5ZXJfbmFtZSA9IHRoaXMuZnVsbF9uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGQgKCkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYEJ1aWxkaW5nIGxheWVyICcke3RoaXMuZnVsbF9uYW1lfSdgKTtcbiAgICAgICAgdGhpcy5idWlsZEZpbHRlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkRHJhdygpO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZERyYXcoKSB7XG4gICAgICAgIHRoaXMuZHJhdyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmRyYXcsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZERyYXcgPSBjYWxjdWxhdGVEcmF3KHRoaXMpO1xuICAgIH1cblxuICAgIGJ1aWxkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmZpbHRlcl9vcmlnaW5hbCA9IHRoaXMuZmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlciA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmZpbHRlciwgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcblxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB0aGlzLmZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgdHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgZnVuY3Rpb24sIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcn1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRab29tcygpO1xuICAgICAgICAgICAgdGhpcy5idWlsZFByb3BNYXRjaGVzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbWF0Y2godGhpcy5maWx0ZXIsIEZpbHRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgXFxgZmlsdGVyOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKX1cXGAgYDtcbiAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZS5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Uuc3RhY2t9YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBab29tcyBvZnRlbiBjdWxsIGxhcmdlIHN3YXRocyBvZiB0aGUgbGF5ZXIgdHJlZSwgc28gdGhleSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgYW5kIGFyZSBjaGVja2VkIGZpcnN0XG4gICAgYnVpbGRab29tcygpIHtcbiAgICAgICAgbGV0IHpvb20gPSB0aGlzLmZpbHRlciAmJiB0aGlzLmZpbHRlci4kem9vbTtcbiAgICAgICAgbGV0IHp0eXBlID0gdHlwZW9mIHpvb207XG4gICAgICAgIGlmICh6b29tICE9IG51bGwgJiYgenR5cGUgIT09ICdmdW5jdGlvbicpIHsgLy8gZG9uJ3QgYWNjZWxlcmF0ZSBmdW5jdGlvbi1iYXNlZCBmaWx0ZXJzXG4gICAgICAgICAgICB0aGlzLnpvb21zID0ge307XG5cbiAgICAgICAgICAgIGlmICh6dHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoem9vbSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PTA7IHogPCB6b29tLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbVt6XV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHp0eXBlID09PSAnb2JqZWN0JyAmJiAoem9vbS5taW4gIT0gbnVsbCB8fCB6b29tLm1heCAhPSBudWxsKSkge1xuICAgICAgICAgICAgICAgIGxldCB6bWluID0gem9vbS5taW4gfHwgMDtcbiAgICAgICAgICAgICAgICBsZXQgem1heCA9IHpvb20ubWF4IHx8IDI1OyAvLyBUT0RPOiByZXBsYWNlIGNvbnN0YW50IGZvciBtYXggcG9zc2libGUgem9vbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9em1pbjsgeiA8IHptYXg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlci4kem9vbTsgLy8gZG9uJ3QgcHJvY2VzcyB6b29tIHRocm91Z2ggdXN1YWwgZ2VuZXJpYyBmaWx0ZXIgbG9naWNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkUHJvcE1hdGNoZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmZpbHRlcikgfHwgdHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGJsYWNrbGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IEFycmF5LmlzQXJyYXkodmFsKTtcblxuICAgICAgICAgICAgICAgIGlmICghKGFycmF5IHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMucHVzaChba2V5LnN1YnN0cmluZygxKSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmVhdHVyZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9Qcm9wTWF0Y2hlcyAoY29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0W21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZG9lc01hdGNoIChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc19idWlsdCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gem9vbSBwcmUtZmlsdGVyOiBza2lwIHJlc3Qgb2YgZmlsdGVyIGlmIG91dCBvZiBsYXllciB6b29tIHJhbmdlXG4gICAgICAgIGlmICh0aGlzLnpvb21zICE9IG51bGwgJiYgIXRoaXMuem9vbXNbY29udGV4dC56b29tXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlyZWN0IGZlYXR1cmUgcHJvcGVydHkgbWF0Y2hlc1xuICAgICAgICBpZiAoIXRoaXMuZG9Qcm9wTWF0Y2hlcyhjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYW55IHJlbWFpbmluZyBmaWx0ZXIgKG1vcmUgY29tcGxleCBtYXRjaGVzIG9yIGR5bmFtaWMgZnVuY3Rpb24pXG4gICAgICAgIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlsdGVyIGZ1bmN0aW9uIGVycm9yXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIHRoaXMgJHt0aGlzLmZ1bGxfbmFtZX06IFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcl9vcmlnaW5hbH1cXGAgYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2Vycm9yLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZXJyb3Iuc3RhY2t9YDtcbiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbXNnLCBjb250ZXh0LmZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyID09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuTGF5ZXIuaWQgPSAwO1xuXG5cbmV4cG9ydCBjbGFzcyBMYXllckxlYWYgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX2xlYWYgPSB0cnVlO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgTGF5ZXJUcmVlIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc190cmVlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIGFkZExheWVyIChsYXllcikge1xuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICB9XG5cbiAgICBidWlsZERyYXdHcm91cHMgKGNvbnRleHQpIHtcbiAgICAgICAgbGV0IGxheWVycyA9IFtdLCBsYXllcl9pZHMgPSBbXTtcbiAgICAgICAgbWF0Y2hGZWF0dXJlKGNvbnRleHQsIFt0aGlzXSwgbGF5ZXJzLCBsYXllcl9pZHMpO1xuXG4gICAgICAgIGlmIChsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGNhY2hlX2tleSA9IGNhY2hlS2V5KGxheWVyX2lkcyk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgZXZhbHVhdGUgZWFjaCBsYXllciBjb21iaW5hdGlvbiBvbmNlICh1bmRlZmluZWQgbWVhbnMgbm90IHlldCBldmFsdWF0ZWQsXG4gICAgICAgICAgICAvLyBudWxsIG1lYW5zIGV2YWx1YXRlZCB3aXRoIG5vIGRyYXcgb2JqZWN0KVxuICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgYWxsIHRoZSB1bmlxdWUgdmlzaWJsZSBkcmF3IGJsb2NrcyBmb3IgdGhpcyBsYXllciB0cmVlXG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC52aXNpYmxlICE9PSBmYWxzZSAmJiB4LmNhbGN1bGF0ZWREcmF3KTtcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19rZXlzID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCBkcmF3X2dyb3Vwcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGF5ZXIgPSBkcmF3X2dyb3Vwc1tyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZz0wOyBnIDwgbGF5ZXIubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGxheWVyW2ddO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19rZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZHJhdyBncm91cFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGRyYXdfa2V5IGluIGRyYXdfa2V5cykge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0gPSBtZXJnZVRyZWVzKGRyYXdfZ3JvdXBzLCBkcmF3X2tleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzYXZlIHRoZSBvbmVzIHRoYXQgd2VyZW4ndCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmtleSA9IGNhY2hlX2tleSArICcvJyArIGRyYXdfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ubGF5ZXJzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC5mdWxsX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gbGF5ZXJzIGV2YWx1YXRlZFxuICAgICAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldICYmIE9iamVjdC5rZXlzKGxheWVyX2NhY2hlW2NhY2hlX2tleV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5jb25zdCBGaWx0ZXJPcHRpb25zID0ge1xuICAgIC8vIEhhbmRsZSB1bml0IGNvbnZlcnNpb25zIG9uIGZpbHRlciByYW5nZXNcbiAgICByYW5nZVRyYW5zZm9ybSh2YWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkuc2xpY2UoLTMpID09PSAncHgyJykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQodmFsKX0gKiBjb250ZXh0Lm1ldGVyc19wZXJfcGl4ZWxfc3FgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaXNXaGl0ZUxpc3RlZChrZXkpIHtcbiAgICByZXR1cm4gd2hpdGVMaXN0LmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUHJvcHMob2JqKSB7XG4gICAgbGV0IHdoaXRlTGlzdGVkID0ge30sIG5vbldoaXRlTGlzdGVkID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChpc1doaXRlTGlzdGVkKGtleSkpIHtcbiAgICAgICAgICAgIHdoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vbldoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3doaXRlTGlzdGVkLCBub25XaGl0ZUxpc3RlZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEcmF3KGxheWVyKSB7XG5cbiAgICBsZXQgZHJhdyAgPSBbXTtcblxuICAgIGlmIChsYXllci5wYXJlbnQpIHtcbiAgICAgICAgbGV0IGNzID0gbGF5ZXIucGFyZW50LmNhbGN1bGF0ZWREcmF3IHx8IFtdO1xuICAgICAgICBkcmF3LnB1c2goLi4uY3MpO1xuICAgIH1cblxuICAgIGRyYXcucHVzaChsYXllci5kcmF3KTtcbiAgICByZXR1cm4gZHJhdztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJUcmVlKG5hbWUsIGxheWVyLCBwYXJlbnQpIHtcblxuICAgIGxldCBwcm9wZXJ0aWVzID0geyBuYW1lLCBsYXllciwgcGFyZW50IH07XG4gICAgbGV0IFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdID0gZ3JvdXBQcm9wcyhsYXllcik7XG4gICAgbGV0IGVtcHR5ID0gaXNFbXB0eShub25XaGl0ZUxpc3RlZCk7XG4gICAgbGV0IENyZWF0ZTtcblxuICAgIGlmIChlbXB0eSAmJiBwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBDcmVhdGUgPSBMYXllckxlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJUcmVlO1xuICAgIH1cblxuICAgIGxldCByID0gbmV3IENyZWF0ZShPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIHdoaXRlTGlzdGVkKSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5hZGRMYXllcihyKTtcbiAgICB9XG5cbiAgICBpZiAoIWVtcHR5KSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBub25XaGl0ZUxpc3RlZCkge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5ID0gbm9uV2hpdGVMaXN0ZWRba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJUcmVlKGtleSwgcHJvcGVydHksIHIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGxheWVyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBMYXllciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdDogY2Fubm90IGNyZWF0ZSBsYXllciAnJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX0nYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYCwgdW5kZXIgcGFyZW50IGxheWVyICcke3IuZnVsbF9uYW1lfScuYDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgYSBzdHlsZSBuYW1lLCB0aGlzIG1heSBiZSBhbiBpbmNvcnJlY3RseSBuZXN0ZWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBpZiAoU3R5bGVzW3IubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgVGhlIHBhcmVudCAnJHtyLm5hbWV9JyBpcyBhbHNvIHRoZSBuYW1lIG9mIGEgc3R5bGUsIGRpZCB5b3UgbWVhbiB0byBjcmVhdGUgYSAnZHJhdycgZ3JvdXBgO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCB1bmRlciAnJHtwYXJlbnQubmFtZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBpbnN0ZWFkP2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVycyAobGF5ZXJzKSB7XG4gICAgbGV0IGxheWVyX3RyZWVzID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICBpZiAobGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyX3RyZWVzW2tleV0gPSBwYXJzZUxheWVyVHJlZShrZXksIGxheWVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcl90cmVlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmVhdHVyZShjb250ZXh0LCBsYXllcnMsIGNvbGxlY3RlZF9sYXllcnMsIGNvbGxlY3RlZF9sYXllcnNfaWRzKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcbiAgICBsZXQgY2hpbGRNYXRjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIGZvciAobGV0IHI9MDsgciA8IGxheWVycy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgY3VycmVudCA9IGxheWVyc1tyXTtcblxuICAgICAgICBpZiAoY3VycmVudC5pc19sZWFmKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaXNfdHJlZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBjaGlsZE1hdGNoZWQgPSBtYXRjaEZlYXR1cmUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQ7XG59XG4iLCIvLyBSZW5kZXJzIGFuIGFycmF5IHNwZWNpZnlpbmcgYSBsaW5lIHBhdHRlcm4gb2YgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBzcGFjZXMsXG4vLyBzaW1pbGFyIHRvIGFuIFNWRyBgZGFzaGFycmF5YCBvciBDYW52YXMgc2V0TGluZURhc2goKSwgaW50byBhIGJ5dGUgYXJyYXkgb2YgUkdCQSBwaXhlbHNcbi8vIFJldHVybnM6XG4vLyB7XG4vLyAgICBwaXhlbDogcmVuZGVyZWQgaW1hZ2UgaW4gVWludDhBcnJheSBidWZmZXJcbi8vICAgIGxlbmd0aDogcGl4ZWwgbGVuZ3RoIG9mIHJlbmRlcmVkIGRhc2ggcGF0dGVybiAoc3VtIG9mIGFsbCBkYXNoZXMgYW5kIHNwYWNlcylcbi8vIH1cbi8vXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHL3BhaW50aW5nLmh0bWwjU3Ryb2tlRGFzaGFycmF5UHJvcGVydHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvc3Ryb2tlLWRhc2hhcnJheVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9zZXRMaW5lRGFzaFxuXG5jb25zdCBkZWZhdWx0X2Rhc2hfY29sb3IgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcbmNvbnN0IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvciA9IFswLCAwLCAwLCAwXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRGFzaEFycmF5IChwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXNoX3BpeGVsID0gb3B0aW9ucy5kYXNoX2NvbG9yIHx8IGRlZmF1bHRfZGFzaF9jb2xvcjtcbiAgICBjb25zdCBiYWNrZ3JvdW5kX2NvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kX2NvbG9yIHx8IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvcjtcbiAgICBjb25zdCBkYXNoZXMgPSBwYXR0ZXJuO1xuICAgIGNvbnN0IHNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCAxO1xuXG4gICAgLy8gSWYgcGF0dGVybiBpcyBvZGQsIHJlcGVhdCBpdCB0byBtYWtlIGl0IGV2ZW4gKHNlZSBTVkcgc3BlYylcbiAgICBpZiAoZGFzaGVzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZGFzaGVzLCBkYXNoZXMpO1xuICAgIH1cblxuICAgIGxldCBkYXNoID0gdHJ1ZTtcbiAgICBsZXQgcGl4ZWxzID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgZGFzaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gTWF0aC5mbG9vcihkYXNoZXNbaV0gKiBzY2FsZSk7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNlZ21lbnQ7IHMrKykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocGl4ZWxzLCBkYXNoID8gZGFzaF9waXhlbCA6IGJhY2tncm91bmRfY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGRhc2ggPSAhZGFzaDsgLy8gYWx0ZXJuYXRlIGJldHdlZW4gZGFzaGVzIGFuZCBzcGFjZXNcbiAgICB9XG5cbiAgICBwaXhlbHMgPSBuZXcgVWludDhBcnJheShwaXhlbHMpOyAvLyBjb252ZXJ0IHRvIHR5cGVkIGFycmF5XG4gICAgY29uc3QgbGVuZ3RoID0gcGl4ZWxzLmxlbmd0aCAvIDQ7IC8vIG9uZSBSR0JBIGJ5dGUgc2VxdWVuY2VzIHRvIG9uZSBwaXhlbFxuXG4gICAgcmV0dXJuIHsgcGl4ZWxzLCBsZW5ndGggfTtcbn1cbiIsIi8vIExpbmUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5bGluZXN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlsaW5lcyc7XG5pbXBvcnQgcmVuZGVyRGFzaEFycmF5IGZyb20gJy4vZGFzaGFycmF5JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7c2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudH0gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgdmFyIExpbmVzID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbk9iamVjdC5hc3NpZ24oTGluZXMsIHtcbiAgICBuYW1lOiAnbGluZXMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAvLyB0dXJuIGZlYXR1cmUgc2VsZWN0aW9uIG9uXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfZXh0cnVkZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSB3YW50IGEgb3JkZXIgaW4gdmVydGV4IGF0dHJpYnV0ZXMsIGFuZCB0byBleHRydWRlIGxpbmVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRVhUUlVERV9MSU5FUyA9IHRydWU7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgbGluZSB0ZXh0dXJlIG9yIGRhc2ggYXJyYXlcbiAgICAgICAgLy8gKGxhdHRlciB3aWxsIGJlIHJlbmRlcmVkIGF0IGNvbXBpbGUtdGltZSwgd2hlbiBHTCBjb250ZXh0IGF2YWlsYWJsZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSB8fCB0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAxO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBzaW5nbGUtYWxsb2NhdGVkIG9iamVjdCB1c2VkIGZvciBob2xkaW5nIG91dGxpbmUgc3R5bGUgYXMgaXQgaXMgcHJvY2Vzc2VkXG4gICAgICAgIC8vIFNlcGFyYXRlIGZyb20gdGhpcy5mZWF0dXJlX3N0eWxlIHNvIHRoYXQgb3V0bGluZSBwcm9wZXJ0aWVzIGRvIG5vdCBvdmVyd3JpdGUgY2FsY3VsYXRlZFxuICAgICAgICAvLyBpbmxpbmUgcHJvcGVydGllcyAob3V0bGluZSBjYWxsIGlzIG1hZGUgKndpdGhpbiogdGhlIGlubGluZSBjYWxsKVxuICAgICAgICB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZSA9IHt9O1xuICAgICAgICB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlOyAvLyBzYXZlIHJlZmVyZW5jZSB0byBtYWluIGNvbXB1dGVkIHN0eWxlIG9iamVjdFxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGNvbXBpbGUgKCkge1xuICAgICAgICB0aGlzLnBhcnNlTGluZVRleHR1cmUoKTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLmNvbXBpbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgLy8gT3B0aW9uYWxseSBhcHBseSBhIGRhc2ggYXJyYXkgcGF0dGVybiB0byB0aGlzIGxpbmVcbiAgICBwYXJzZUxpbmVUZXh0dXJlICgpIHtcbiAgICAgICAgLy8gU3BlY2lmeSBhIGxpbmUgcGF0dGVyblxuICAgICAgICBpZiAodGhpcy5kYXNoKSB7XG4gICAgICAgICAgICAvLyBPcHRpb25hbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBkYXNoIHBhdHRlcm4gKGRlZmF1bHRzIHRyYW5zcGFyZW50KVxuICAgICAgICAgICAgaWYgKHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX0JBQ0tHUk9VTkRfQ09MT1IgPVxuICAgICAgICAgICAgICAgICAgICBgdmVjMygke3RoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yLnNsaWNlKDAsIDMpLmpvaW4oJywgJyl9KWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB0ZXhjb29yZCBzY2FsZSB0byBhbGxvdyBmb3IgZGFzaCBwYXR0ZXJucyB0aGF0IGFyZSBhIGZyYWN0aW9uIG9mIGxpbmUgd2lkdGhcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAyMDtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZfU0NBTEVfQURKVVNUID0gR2VvLnRpbGVfc2NhbGUgKiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgbGluZSBwYXR0ZXJuXG4gICAgICAgICAgICBjb25zdCBkYXNoID0gcmVuZGVyRGFzaEFycmF5KHRoaXMuZGFzaCwgeyBzY2FsZTogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9ICdfJyArIHRoaXMubmFtZSArICdfZGFzaGFycmF5JztcbiAgICAgICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHRoaXMudGV4dHVyZSwge1xuICAgICAgICAgICAgICAgIGRhdGE6IGRhc2gucGl4ZWxzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZGFzaC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiAnbmVhcmVzdCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lmeSBhIGxpbmUgdGV4dHVyZSAoZWl0aGVyIGRpcmVjdGx5LCBvciByZW5kZXJlZCBkYXNoIHBhdHRlcm4gZnJvbSBhYm92ZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0FMUEhBX1RFU1QgPSAwLjU7IC8vIHBpeGVscyBiZWxvdyB0aGlzIHRocmVzaG9sZCBhcmUgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gMTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgcGF0dGVybiBhc3BlY3QgcmF0aW8gYWZ0ZXIgdGV4dHVyZSBsb2Fkc1xuICAgICAgICAgICAgVGV4dHVyZS5nZXRJbmZvKHRoaXMudGV4dHVyZSkudGhlbih0ZXh0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gdGV4dHVyZS5oZWlnaHQgLyB0ZXh0dXJlLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCB6b29tIGdpdmVuIGluIGBjb250ZXh0YFxuICAgIGNhbGNXaWR0aCAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICh3aWR0aCAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eSh3aWR0aCwgY29udGV4dCkpIHx8IDA7XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCBuZXh0IHpvb20gKHVzZWQgZm9yIGxpbmUgd2lkdGggaW50ZXJwb2xhdGlvbilcbiAgICBjYWxjV2lkdGhOZXh0Wm9vbSAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC56b29tKys7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmNhbGNXaWR0aCh3aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuem9vbS0tO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAvLyBsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3LndpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHdpdGggbmVnYXRpdmUgd2lkdGhcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5uZXh0X3dpZHRoLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoKHdpZHRoID09PSAwICYmIG5leHRfd2lkdGggPT09IDApIHx8IG5leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSB0byBhIHBvc2l0aXZlIHZhbHVlIGF0IG5leHQgem9vbVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCB0byB1bml0cyBhbmQgcmVsYXRpdmUgY2hhbmdlIGZyb20gcHJldmlvdXMgem9vbVxuICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIGEgZ2l2ZW4gd2lkdGggaXMgdHdpY2UgYXMgYmlnIGluIHNjcmVlbiBzcGFjZSBhdCB0aGUgbmV4dCB6b29tXG4gICAgICAgIHN0eWxlLndpZHRoID0gd2lkdGggKiBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCA9IChuZXh0X3dpZHRoICogMikgLSB3aWR0aDtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAqPSBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAvPSAyOyAvLyBOQjogZGl2aWRlIGJ5IDIgYmVjYXVzZSBleHRydXNpb24gd2lkdGggaXMgaGFsdmVkIGluIGJ1aWxkZXIgLSByZW1vdmU/XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhlaWdodCBkZWZhdWx0cyB0byBmZWF0dXJlIGhlaWdodCwgYnV0IGV4dHJ1ZGUgc3R5bGUgY2FuIGR5bmFtaWNhbGx5IGFkanVzdCBoZWlnaHQgYnkgcmV0dXJuaW5nIGEgbnVtYmVyIG9yIGFycmF5IChpbnN0ZWFkIG9mIGEgYm9vbGVhbilcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56IHx8IDAsIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhaXNlIGxpbmUgaGVpZ2h0IGlmIGV4dHJ1ZGVkXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgc3R5bGUueiArPSBzdHlsZS5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcblxuICAgICAgICBzdHlsZS5jYXAgPSBkcmF3LmNhcDtcbiAgICAgICAgc3R5bGUuam9pbiA9IGRyYXcuam9pbjtcbiAgICAgICAgc3R5bGUubWl0ZXJfbGltaXQgPSBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gb3V0bGluZSBzdHlsZVxuICAgICAgICAvLyBSZXVzYWJsZSBvdXRsaW5lIHN0eWxlIG9iamVjdCwgbWFya2VkIGFzIGFscmVhZHkgd3JhcHBlZCBpbiBjYWNoZSBvYmplY3RzIChwcmVwcm9jZXNzZWQgPSB0cnVlKVxuICAgICAgICBzdHlsZS5vdXRsaW5lID0gc3R5bGUub3V0bGluZSB8fCB7IHdpZHRoOiB7fSwgbmV4dF93aWR0aDoge30sIHByZXByb2Nlc3NlZDogdHJ1ZSB9O1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUgJiYgZHJhdy5vdXRsaW5lLnZpc2libGUgIT09IGZhbHNlICYmIGRyYXcub3V0bGluZS5jb2xvciAmJiBkcmF3Lm91dGxpbmUud2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG91dGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIG91dGxpbmUgaXMgYXBwbGllZCBvbiBib3RoIHNpZGVzIG9mIGxpbmVcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX3dpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy5vdXRsaW5lLndpZHRoLCBjb250ZXh0KSAqIDI7XG4gICAgICAgICAgICBsZXQgb3V0bGluZV9uZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm91dGxpbmUubmV4dF93aWR0aCwgY29udGV4dCkgKiAyO1xuXG4gICAgICAgICAgICBpZiAoKG91dGxpbmVfd2lkdGggPT09IDAgJiYgb3V0bGluZV9uZXh0X3dpZHRoID09PSAwKSB8fCBvdXRsaW5lX3dpZHRoIDwgMCB8fCBvdXRsaW5lX25leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIGJldHdlZW4gemVybyBvciBncmVhdGVyIHdpZHRoXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1haW50YWluIGNvbnNpc3RlbnQgb3V0bGluZSB3aWR0aCBhcm91bmQgdGhlIGxpbmUgZmlsbFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBvdXRsaW5lX3dpZHRoICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gb3V0bGluZV9uZXh0X3dpZHRoICsgbmV4dF93aWR0aDtcblxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBkcmF3Lm91dGxpbmUuY29sb3I7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jYXAgPSBkcmF3Lm91dGxpbmUuY2FwIHx8IGRyYXcuY2FwO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuam9pbiA9IGRyYXcub3V0bGluZS5qb2luIHx8IGRyYXcuam9pbjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm1pdGVyX2xpbWl0ID0gZHJhdy5vdXRsaW5lLm1pdGVyX2xpbWl0IHx8IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5zdHlsZSA9IGRyYXcub3V0bGluZS5zdHlsZSB8fCB0aGlzLm5hbWU7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGRlZmluZWQgb3V0bGluZSBvcmRlciwgb3IgaW5oZXJpdGVkIGZyb20gaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChkcmF3Lm91dGxpbmUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm91dGxpbmUub3JkZXIsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIERvbid0IGxldCBvdXRsaW5lIGJlIGFib3ZlIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUub3V0bGluZS5vcmRlciA+IHN0eWxlLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPdXRsaW5lcyBhcmUgYWx3YXlzIGF0IGhhbGYtbGF5ZXIgaW50ZXJ2YWxzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggaW5uZXIgbGluZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyIC09IDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgZHJhdy5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggd2lsbCBiZSBjb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lKSB7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLmNvbG9yKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCByZS1jb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIGV4dHJ1c2lvbiB2ZWN0b3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcblxuICAgICAgICAvLyBzY2FsaW5nIHRvIHByZXZpb3VzIGFuZCBuZXh0IHpvb21cbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLm5leHRfd2lkdGg7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZExpbmVzKGxpbmVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gT3V0bGluZSAoYnVpbGQgZmlyc3Qgc28gdGhhdCBibGVuZGVkIGdlb21ldHJ5IHdpdGhvdXQgYSBkZXB0aCB0ZXN0IGlzIGRyYXduIGZpcnN0L3VuZGVyIHRoZSBpbm5lciBsaW5lKVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gc3dhcCBpbiBvdXRsaW5lLXNwZWNpZmljIHN0eWxlIGhvbGRlclxuICAgICAgICBpZiAoc3R5bGUub3V0bGluZSAmJiBzdHlsZS5vdXRsaW5lLmNvbG9yICE9IG51bGwgJiYgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgb3V0bGluZV9zdHlsZSA9IHRoaXMuc3R5bGVzW3N0eWxlLm91dGxpbmUuc3R5bGVdO1xuICAgICAgICAgICAgaWYgKG91dGxpbmVfc3R5bGUpIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lX3N0eWxlLmFkZEZlYXR1cmUoY29udGV4dC5mZWF0dXJlLCBzdHlsZS5vdXRsaW5lLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1haW4gbGluZVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlOyAvLyByZXN0b3JlIGNhbGN1bGF0ZWQgc3R5bGUgZm9yIGlubGluZVxuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBidWlsZFBvbHlsaW5lcyhcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3R5bGUud2lkdGgsXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXA6IHN0eWxlLmNhcCxcbiAgICAgICAgICAgICAgICBqb2luOiBzdHlsZS5qb2luLFxuICAgICAgICAgICAgICAgIG1pdGVyX2xpbWl0OiBzdHlsZS5taXRlcl9saW1pdCxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9leHRydWRlLFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfbm9ybWFsaXplOiAyNTYsIC8vIHZhbHVlcyBoYXZlIGFuIDgtYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3dpZHRoOiAoc3R5bGUud2lkdGggfHwgc3R5bGUubmV4dF93aWR0aCkgLyBjb250ZXh0LnRpbGUub3Zlcnpvb20yLCAvLyBVVnMgY2FuJ3QgY2FsYyBmb3IgemVyby13aWR0aCwgdXNlIG5leHQgem9vbSB3aWR0aCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICAgICAgY2xvc2VkX3BvbHlnb246IG9wdGlvbnMgJiYgb3B0aW9ucy5jbG9zZWRfcG9seWdvbixcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIFJlbmRlciBwb2x5Z29ucyBhcyBpbmRpdmlkdWFsIGxpbmVzXG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMocG9seWdvbnNbcF0sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgeyBjbG9zZWRfcG9seWdvbjogdHJ1ZSwgcmVtb3ZlX3RpbGVfZWRnZXM6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUG9pbnQgKyB0ZXh0IGxhYmVsIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFF1YWRzRm9yUG9pbnRzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2ludHMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uLy4uL3ZlY3Rvcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCB7VGV4dExhYmVsc30gZnJvbSAnLi4vdGV4dC90ZXh0X2xhYmVscyc7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuLi8uLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNGcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAgLy8gc3R5bGUgZW5hYmxlcyBmZWF0dXJlIHNlbGVjdGlvblxuICAgIGNvbGxpc2lvbjogdHJ1ZSwgIC8vIHN0eWxlIGluY2x1ZGVzIGEgY29sbGlzaW9uIHBhc3NcbiAgICBibGVuZDogJ292ZXJsYXknLCAvLyBvdmVybGF5cyBkcmF3biBvbiB0b3Agb2YgYWxsIG90aGVyIHN0eWxlcywgd2l0aCBibGVuZGluZ1xuXG4gICAgaW5pdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2Ugc2hhZGVyc1xuICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c1ZlcnRleDtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50O1xuXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9zaGFwZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX29mZnNldCcsIHNpemU6IDIsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cyA9IHRoaXMubmFtZSsnLXBvaW50cyc7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQgPSB0aGlzLm5hbWUrJy10ZXh0JztcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlcyA9IHt9OyAvLyB0cmFjayB3aGljaCBtaXNzaW5nIHNwcml0ZXMgd2UndmUgZm91bmQgKHJlZHVjZSBkdXBlIGxvZyBtZXNzYWdlcylcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0eWxlID0ge307XG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxpbmdcblxuICAgICAgICAvLyByZXF1aXJlIGNvbG9yIG9yIHRleHR1cmVcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvciAmJiAhdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcHJpdGUgPSBzdHlsZS5zcHJpdGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5zcHJpdGUsIGNvbnRleHQpO1xuICAgICAgICBzdHlsZS5zcHJpdGVfZGVmYXVsdCA9IGRyYXcuc3ByaXRlX2RlZmF1bHQ7IC8vIG9wdGlvbmFsIGZhbGxiYWNrIGlmICdzcHJpdGUnIG5vdCBmb3VuZFxuXG4gICAgICAgIC8vIGlmIHBvaW50IGhhcyB0ZXh0dXJlIGFuZCBzcHJpdGVzLCByZXF1aXJlIGEgdmFsaWQgc3ByaXRlIHRvIGRyYXdcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0gJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGlmICghc3ByaXRlICYmICFzdHlsZS5zcHJpdGVfZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc3ByaXRlIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGRlZmF1bHQgc3ByaXRlXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwcml0ZSA9IHN0eWxlLnNwcml0ZV9kZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIHNwcml0ZSAnJHtzcHJpdGV9JyBmb3IgdGV4dHVyZSAnJHt0aGlzLnRleHR1cmV9J2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwcml0ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9Jywgc3ByaXRlICcke3Nwcml0ZX0nIHdhcyBzcGVjaWZpZWQsIGJ1dCB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nIGhhcyBubyBzcHJpdGVzYCk7XG4gICAgICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyB0ZXhjb29yZCBzY2FsZSBpZiBuZWVkZWQgKGUuZy4gZm9yIHNwcml0ZSBzdWItYXJlYSlcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIHNwcml0ZSkge1xuICAgICAgICAgICAgc3ByaXRlX2luZm8gPSBUZXh0dXJlLmdldFNwcml0ZUluZm8odGhpcy50ZXh0dXJlLCBzcHJpdGUpO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3ByaXRlX2luZm8udGV4Y29vcmRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgLy8gcG9pbnQgc2l6ZSBkZWZpbmVkIGV4cGxpY2l0bHksIG9yIGRlZmF1bHRzIHRvIHNwcml0ZSBzaXplLCBvciBnZW5lcmljIGZhbGxiYWNrXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LnNpemU7XG4gICAgICAgIGlmICghc3R5bGUuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHNwcml0ZV9pbmZvKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHNwcml0ZV9pbmZvLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gWzE2LCAxNl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KHN0eWxlLnNpemUsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2l6ZSB3aWxsIGJlIHNjYWxlZCB0byAxNi1iaXQgc2lnbmVkIGludCwgc28gbWF4IGFsbG93ZWQgd2lkdGggKyBoZWlnaHQgb2YgMjU2IHBpeGVsc1xuICAgICAgICBzdHlsZS5zaXplID0gW1xuICAgICAgICAgICAgTWF0aC5taW4oKHN0eWxlLnNpemVbMF0gfHwgc3R5bGUuc2l6ZSksIDI1NiksXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVsxXSB8fCBzdHlsZS5zaXplKSwgMjU2KVxuICAgICAgICBdO1xuXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gKFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmFuZ2xlLCBjb250ZXh0KSAqIE1hdGguUEkgLyAxODApIHx8IDA7XG4gICAgICAgIHN0eWxlLnNhbXBsZXIgPSAwOyAvLyAwID0gc3ByaXRlc1xuXG4gICAgICAgIHRoaXMuY29tcHV0ZUxheW91dChzdHlsZSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gVGV4dCBzdHlsaW5nXG4gICAgICAgIGxldCB0ZiA9XG4gICAgICAgICAgICBkcmF3LnRleHQgJiZcbiAgICAgICAgICAgIGRyYXcudGV4dC52aXNpYmxlICE9PSBmYWxzZSAmJiAvLyBleHBsaWNpdGx5IGhhbmRsZSBgdmlzaWJsZWAgcHJvcGVydHkgZm9yIG5lc3RlZCB0ZXh0XG4gICAgICAgICAgICB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdy50ZXh0LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICBpZiAodGYpIHtcbiAgICAgICAgICAgIHRmLmxheW91dC5wYXJlbnQgPSBzdHlsZTsgLy8gcGFyZW50IHBvaW50IHdpbGwgYXBwbHkgYWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IHRvIHRleHRcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgaGF2ZSBhIGRlZmF1bHQgcHJpb3JpdHkgb2YgMC41IGJlbG93IHRoZWlyIHBhcmVudCBwb2ludCAoKzAuNSwgcHJpb3JpdHkgaXMgbG93ZXItaXMtYmV0dGVyKVxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBhcyBsb25nIGFzIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgdGYubGF5b3V0LnByaW9yaXR5ID0gZHJhdy50ZXh0LnByaW9yaXR5ID8gTWF0aC5tYXgodGYubGF5b3V0LnByaW9yaXR5LCBzdHlsZS5wcmlvcml0eSArIDAuNSkgOiAoc3R5bGUucHJpb3JpdHkgKyAwLjUpO1xuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbnRvIHRpbGVcbiAgICAgICAgICAgIC8vICh0aGV5IHNob3VsZCBzdGF5IGZpeGVkIHJlbGF0aXZlIHRvIHRoZSBwb2ludClcbiAgICAgICAgICAgIHRmLmxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGlsZS5rZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2goe1xuICAgICAgICAgICAgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgc3R5bGUsXG4gICAgICAgICAgICB0ZXh0X2ZlYXR1cmU6IHRmXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWV1ZSA9IHRoaXMucXVldWVzW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggcG9pbnQgZmVhdHVyZSwgY3JlYXRlIG9uZSBvciBtb3JlIGxhYmVsc1xuICAgICAgICBsZXQgdGV4dF9vYmpzID0gW107XG4gICAgICAgIGxldCBwb2ludF9vYmpzID0gW107XG5cbiAgICAgICAgcXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZSA9IHEuZmVhdHVyZTtcbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG5cbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc3R5bGUuc2l6ZSwgZ2VvbWV0cnksIHN0eWxlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwb2ludF9vYmpzLnB1c2gocG9pbnRfb2JqKTtcblxuICAgICAgICAgICAgICAgIGlmIChxLnRleHRfZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhdzogcS50ZXh0X2ZlYXR1cmUuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHEudGV4dF9mZWF0dXJlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzX2tleTogcS50ZXh0X2ZlYXR1cmUudGV4dF9zZXR0aW5nc19rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IHEudGV4dF9mZWF0dXJlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2xhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZDogcG9pbnRfb2JqICAgLy8gbGluayBzbyB0ZXh0IG9ubHkgcmVuZGVycyB3aGVuIHBhcmVudCBwb2ludCBpcyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9vYmpzLnB1c2godGV4dF9vYmopO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyB0ZXh0IGZlYXR1cmUgaXMgb3B0aW9uYWwsIGNyZWF0ZSBhIHR3by13YXkgbGluayBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB3aWxsIG9ubHkgcmVuZGVyIHdoZW4gdGV4dCBpcyBhbHNvIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXEuZHJhdy50ZXh0Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmoubGlua2VkID0gdGV4dF9vYmo7IC8vIHR3by13YXkgbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb2xsaWRlIGJvdGggcG9pbnRzIGFuZCB0ZXh0LCB0aGVuIGJ1aWxkIGZlYXR1cmVzXG4gICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKFtcbiAgICAgICAgICAgICAgICAvLyBQb2ludHNcbiAgICAgICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZShwb2ludF9vYmpzLCB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KS50aGVuKHBvaW50X29ianMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmpzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gTGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0ZXh0X29ianMpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIGxhYmVscykpXG4gICAgICAgICAgICBdKS50aGVuKChbLCB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGxhYmVsc1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHMgJiYgdGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciA9IDE7IC8vIG5vbi0wID0gbGFiZWxzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgLy8gU2l6ZSAoMWQgdmFsdWUgb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5zaXplLCB2ID0+IEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcChwYXJzZUZsb2F0KSA6IHBhcnNlRmxvYXQodikpO1xuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciAyZCBhcnJheSwgZXhwYW5kIDFkIHRvIDJkKVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dCBzdHlsaW5nXG4gICAgICAgIGRyYXcudGV4dCA9IHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdy50ZXh0KTsgLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB2YWxpZCB0ZXh0IHN0eWxpbmcgd2Fzbid0IHByb3ZpZGVkXG4gICAgICAgIGlmIChkcmF3LnRleHQpIHtcbiAgICAgICAgICAgIGRyYXcudGV4dC5rZXkgPSBkcmF3LmtleTsgLy8gY29weSBsYXllciBrZXkgZm9yIHVzZSBhcyBsYWJlbCByZXBlYXQgZ3JvdXBcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiBmYWxzZTtcblxuICAgICAgICAvLyBwb2x5Z29ucyByZW5kZXJpbmcgYXMgcG9pbnRzIHdpbGwgcmVuZGVyIGF0IGVhY2ggb2YgdGhlIHBvbHlnb24ncyB2ZXJ0aWNlcyBieSBkZWZhdWx0LFxuICAgICAgICAvLyBidXQgY2FuIGJlIHNldCB0byByZW5kZXIgYXQgdGhlIHBvbHlnb24ncyBjZW50cm9pZCBpbnN0ZWFkXG4gICAgICAgIC8vIFRPRE86IGNoYW5nZSBkZWZhdWx0IHRvIGJlIGNlbnRyb2lkLCBhbmQvb3IgcmVwbGFjZSB3aXRoIG1vcmUgZmxleGlibGUgJ3BsYWNlbWVudCdcbiAgICAgICAgLy8gcGFyYW1ldGVyIHRvIGFsbG93IHBsYWNlbWVudCBvbiB2ZXJ0ZXgsIGFsb25nIGEgbGluZSwgb3IgYXQgYSBwb2x5Z29uIGNlbnRyb2lkXG4gICAgICAgIGxheW91dC5jZW50cm9pZCA9IGRyYXcuY2VudHJvaWQ7XG5cbiAgICAgICAgLy8gbGFiZWwgYW5jaG9ycyAocG9pbnQgbGFiZWxzIG9ubHkpXG4gICAgICAgIC8vIGxhYmVsIHBvc2l0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgcmVsYXRpdmUgdG8gaXRzIG9yaWdpbmFsIHBvaW50XG4gICAgICAgIC8vIG9uZSBvZjogbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIGxheW91dC5hbmNob3IgPSBkcmF3LmFuY2hvcjtcblxuICAgICAgICAvLyBsYWJlbCBvZmZzZXQgYW5kIGJ1ZmZlciBpbiBwaXhlbCAoYXBwbGllZCBpbiBzY3JlZW4gc3BhY2UpXG4gICAgICAgIGxheW91dC5vZmZzZXQgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5vZmZzZXQsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuICAgICAgICBsYXlvdXQuYnVmZmVyID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuYnVmZmVyLCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcblxuICAgICAgICAvLyBsYWJlbCBwcmlvcml0eSAobG93ZXIgaXMgaGlnaGVyKVxuICAgICAgICBsZXQgcHJpb3JpdHkgPSBkcmF3LnByaW9yaXR5O1xuICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9IC0xID4+PiAwOyAvLyBkZWZhdWx0IHRvIG1heCBwcmlvcml0eSB2YWx1ZSBpZiBub25lIHNldFxuICAgICAgICB9XG4gICAgICAgIGxheW91dC5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgZnEubGFiZWwgPSBuZXcgTGFiZWxQb2ludChmcS5wb2ludF9sYWJlbC5wb3NpdGlvbiwgc2l6ZSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgcG9pbnQgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIGxpbmUgdmVydGV4XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50c1tpXSwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIFBvaW50IGF0IGVhY2ggbGluZSB2ZXJ0ZXhcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmVzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludHMgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2VudHJvaWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludHMgPSByaW5nc1tsbl07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludHNbaV0sIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGNvbG9yID0gc3R5bGUuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIDAsIHsgc2l6ZTogMiB9KTtcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCBzdHlsZS56IHx8IDAsIHsgc2l6ZTogMSwgb2Zmc2V0OiAyIH0pO1xuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKSwgeyBzaXplOiAxLCBvZmZzZXQ6IDMgfSk7XG5cbiAgICAgICAgLy8gc2NhbGluZyB2ZWN0b3IgLSAoeCwgeSkgY29tcG9uZW50cyBwZXIgcGl4ZWwsIHogPSBhbmdsZSwgdyA9IHNjYWxpbmcgZmFjdG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NoYXBlJywgMCwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHRleHR1cmUgY29vcmRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3RleGNvb3JkJywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIG9mZnNldHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffb2Zmc2V0JywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX2NvbG9yJywgVmVjdG9yLm11bHQoY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zZWxlY3Rpb25fY29sb3InLCBWZWN0b3IubXVsdChzdHlsZS5zZWxlY3Rpb25fY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRRdWFkKHBvaW50cywgc2l6ZSwgYW5nbGUsIHNhbXBsZXIsIG9mZnNldCwgdGV4Y29vcmRfc2NhbGUsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUpIHtcbiAgICAgICAgYnVpbGRRdWFkc0ZvclBvaW50cyhcbiAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2hhcGVfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3NoYXBlLFxuICAgICAgICAgICAgICAgIG9mZnNldF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfb2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1YWQ6IHNpemUsXG4gICAgICAgICAgICAgICAgcXVhZF9ub3JtYWxpemU6IDI1NiwgICAgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgYW5nbGU6IGFuZ2xlICogNDA5NiwgICAgLy8gdmFsdWVzIGhhdmUgYSAxMi1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBzaGFwZV93OiBzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgcXVhZCBmb3IgcG9pbnQgc3ByaXRlXG4gICAgYnVpbGQgKHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgbGFiZWwgPSBzdHlsZS5sYWJlbDtcbiAgICAgICAgaWYgKGxhYmVsLm51bV9zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5idWlsZEFydGljdWxhdGVkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYnVpbGRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgc3R5bGUuc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUuYW5nbGUsICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiByYWRpYW5zXG4gICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgIGxhYmVsLm9mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzLCAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGVbaV07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0eWxlLnNpemVbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbGFiZWwub2Zmc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCB0ZXhjb29yZCA9IHN0eWxlLnRleGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgICAgICBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICB0ZXhjb29yZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHBhc3MtdGhyb3VnaCB0byBnZW5lcmljIHBvaW50IGJ1aWxkZXJcbiAgICBidWlsZExpbmVzIChsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2ludHMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFkZCBsYWJlbCBmYWRlIHRpbWVcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHsgZmFkZV9pbl90aW1lOiB0aGlzLmZhZGVfaW5fdGltZSB9KTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLm1ha2VNZXNoLmNhbGwodGhpcywgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvbHlnb24gcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWdvbnMsIGJ1aWxkRXh0cnVkZWRQb2x5Z29uc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWdvbnMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2x5Z29ucyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBleHBvcnQgc2hhZGVycyBmb3IgdXNlIGluIGxpbmVzLmpzXG5leHBvcnQge1xuICAgIHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudFxufTtcblxuT2JqZWN0LmFzc2lnbihQb2x5Z29ucywge1xuICAgIG5hbWU6ICdwb2x5Z29ucycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcbiAgICBzZWxlY3Rpb246IHRydWUsIC8vIHR1cm4gZmVhdHVyZSBzZWxlY3Rpb24gb25cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9ub3JtYWwnLCBzaXplOiAzLCB0eXBlOiBnbC5CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0sIC8vIGdldHMgcGFkZGVkIHRvIDQtYnl0ZXNcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2UgaGF2ZSBhIG5vcm1hbCBhbmQgb3JkZXIgYXR0cmlidXRlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OT1JNQUxfQVRUUklCVVRFID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnosIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7IC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG5cbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgLy8gdXNlIGZlYXR1cmUncyBoZWlnaHQgYW5kIG1pbl9oZWlnaHQgcHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLm1pbl9oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMubWluX2hlaWdodDtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0LCBubyBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMF07XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIG5vcm1hbFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAxICogMTI3O1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzLFxuICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNCxcbiAgICAgICAgICAgIHdpbmRpbmc6IGNvbnRleHQud2luZGluZ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEV4dHJ1ZGVkIHBvbHlnb25zIChlLmcuIDNEIGJ1aWxkaW5ncylcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBidWlsZEV4dHJ1ZGVkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgc3R5bGUueiwgc3R5bGUuaGVpZ2h0LCBzdHlsZS5taW5faGVpZ2h0LFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfbm9ybWFsLFxuICAgICAgICAgICAgICAgIDEyNywgLy8gc2NhbGUgbm9ybWFscyB0byBzaWduZWQgYnl0ZXNcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgcG9seWdvbnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWlsZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBSYXN0ZXIgdGlsZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7UG9seWdvbnN9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IGxldCBSYXN0ZXJTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9seWdvbnMpO1xuXG5PYmplY3QuYXNzaWduKFJhc3RlclN0eWxlLCB7XG4gICAgbmFtZTogJ3Jhc3RlcicsXG4gICAgc3VwZXI6IFBvbHlnb25zLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHNlbGVjdGlvbjogZmFsc2UsIC8vIG5vIGZlYXR1cmUgc2VsZWN0aW9uIGJ5IGRlZmF1bHRcblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciByYXN0ZXIgdGlsZXNcbiAgICAgICAgdGhpcy5yYXN0ZXIgPSB0aGlzLnJhc3RlciB8fCAnY29sb3InO1xuXG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBSYXN0ZXIgdGlsZXMgZGVmYXVsdCB0byB3aGl0ZSB2ZXJ0ZXggY29sb3IsIGFzIHRoaXMgY29sb3Igd2lsbCB0aW50IHRoZSB1bmRlcmx5aW5nIHRleHR1cmVcbiAgICAgICAgZHJhdy5jb2xvciA9IGRyYXcuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cGVyLl9wcmVwcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFJlbmRlcmluZyBzdHlsZXNcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWQk9NZXNoIGZyb20gJy4uL2dsL3Zib19tZXNoJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuLi9saWdodCc7XG5pbXBvcnQge1Jhc3RlclRpbGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19yYXN0ZXJzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9yYXN0ZXJzLmdsc2wnLCAndXRmOCcpO1xuXG4vLyBCYXNlIGNsYXNzXG5cbmV4cG9ydCB2YXIgU3R5bGUgPSB7XG4gICAgaW5pdCAoeyBnZW5lcmF0aW9uLCBzdHlsZXMsIHNvdXJjZXMgPSB7fSwgaW50cm9zcGVjdGlvbiB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQnVpbHRJbigpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0X2luID0gZmFsc2U7IC8vIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIHRvIGF2b2lkIGFueSBjb25mdXNpb25cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247ICAgICAgICAgICAgICAgLy8gc2NlbmUgZ2VuZXJhdGlvbiBpZCB0aGlzIHN0eWxlIHdhcyBjcmVhdGVkIGZvclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHNvdXJjZXMgZm9yIHNjZW5lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdkZWZpbmVzJykgJiYgdGhpcy5kZWZpbmVzKSB8fCB7fTsgLy8gI2RlZmluZXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgc2hhZGVyc1xuICAgICAgICB0aGlzLnNoYWRlcnMgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnc2hhZGVycycpICYmIHRoaXMuc2hhZGVycykgfHwge307IC8vIHNoYWRlciBjdXN0b21pemF0aW9uICh1bmlmb3JtcywgZGVmaW5lcywgYmxvY2tzLCBldGMuKVxuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuaW50cm9zcGVjdGlvbiB8fCBmYWxzZTsgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBzdHlsZSBzdXBwb3J0cyBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgIC8vIHByb2dyYW1zIGFyZSBjdXJyZW50bHkgY29tcGlsaW5nXG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbXMgYXJlIGZpbmlzaGVkIGNvbXBpbGluZ1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIChmb3IgbWFpbiByZW5kZXIgcGFzcylcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAvLyBHTCBwcm9ncmFtIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gcmVuZGVyIHBhc3NcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0ge307ICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZSBmb3IgZmVhdHVyZSBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLCBzaGFyZWQgdG8gbGVzc2VuIEdDL21lbW9yeSB0aHJhc2hcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGUgPSBbXTsgICAgICAgICAgICAgICAgICAvLyBzaGFyZWQgc2luZ2xlLXZlcnRleCB0ZW1wbGF0ZSwgZmlsbGVkIG91dCBieSBlYWNoIHN0eWxlXG4gICAgICAgIHRoaXMudGlsZV9kYXRhID0ge307XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydTdHlsZScsIHRoaXMubmFtZSwgdGhpcy5nZW5lcmF0aW9uXS5qb2luKCcvJyk7XG4gICAgICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHdvcmxkIGNvb3JkcyB0byB3cmFwIGV2ZXJ5IDEwMCwwMDAgbWV0ZXJzLCBjYW4gdHVybiBvZmYgYnkgc2V0dGluZyB0aGlzIHRvICdmYWxzZSdcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fV09STERfUE9TSVRJT05fV1JBUCA9IDEwMDAwMDtcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmJsZW5kID0gdGhpcy5ibGVuZCB8fCAnb3BhcXVlJzsgICAgICAgIC8vIGRlZmF1bHQ6IG9wYXF1ZSBzdHlsZXMgYXJlIGRyYXduIGZpcnN0LCB3aXRob3V0IGJsZW5kaW5nXG4gICAgICAgIHRoaXMuZGVmaW5lc1tgVEFOR1JBTV9CTEVORF8ke3RoaXMuYmxlbmQudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmJsZW5kX29yZGVyID09IG51bGwpIHsgLy8gY29udHJvbHMgb3JkZXIgb2YgcmVuZGVyaW5nIGZvciBzdHlsZXMgdy9ub24tb3BhcXVlIGJsZW5kaW5nXG4gICAgICAgICAgICB0aGlzLmJsZW5kX29yZGVyID0gLTE7IC8vIGRlZmF1bHRzIHRvIGZpcnN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgc3R5bGUgZGVmaW5lcyBpdHMgb3duIG1hdGVyaWFsLCByZXBsYWNlIHRoZSBpbmhlcml0ZWQgbWF0ZXJpYWwgaW5zdGFuY2VcbiAgICAgICAgaWYgKCEodGhpcy5tYXRlcmlhbCBpbnN0YW5jZW9mIE1hdGVyaWFsKSkge1xuICAgICAgICAgICAgaWYgKCFNYXRlcmlhbC5pc1ZhbGlkKHRoaXMubWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IFN0eWxlUGFyc2VyLmRlZmF1bHRzLm1hdGVyaWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh0aGlzLm1hdGVyaWFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hdGVyaWFsLmluamVjdCh0aGlzKTtcblxuICAgICAgICAvLyBTZXQgbGlnaHRpbmcgbW9kZTogZnJhZ21lbnQsIHZlcnRleCwgb3Igbm9uZSAoc3BlY2lmaWVkIGFzICdmYWxzZScpXG4gICAgICAgIExpZ2h0LnNldE1vZGUodGhpcy5saWdodGluZywgdGhpcyk7XG5cbiAgICAgICAgLy8gU2V0dXAgcmFzdGVyIHNhbXBsZXJzIGlmIG5lZWRlZFxuICAgICAgICB0aGlzLnNldHVwUmFzdGVycygpO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBkZXN0cm95ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3JhbSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICB9LFxuXG4gICAgaXNCdWlsdEluICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoJ2J1aWx0X2luJykgJiYgdGhpcy5idWlsdF9pbjtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgY29tcGlsZSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYHN0eWxlLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5uYW1lfSBiZWNhdXNlIHN0eWxlIGlzIGFscmVhZHkgY29tcGlsaW5nYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGRlZmluZXMgJiBmb3Igc2VsZWN0aW9uIChuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc2luY2UgdGhlIGZpcnN0IGlzIHN0b3JlZCBhcyBhIHJlZmVyZW5jZSBieSB0aGUgcHJvZ3JhbSlcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25fZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmluZXMpO1xuICAgICAgICAgICAgc2VsZWN0aW9uX2RlZmluZXMuVEFOR1JBTV9GRUFUVVJFX1NFTEVDVElPTiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYW55IGN1c3RvbSBjb2RlIGJsb2NrcywgdW5pZm9ybSBkZXBlbmRlbmNpZXMsIGV0Yy5cbiAgICAgICAgdmFyIGJsb2NrcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2Nrcyk7XG4gICAgICAgIHZhciBibG9ja19zY29wZXMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXMpO1xuICAgICAgICB2YXIgdW5pZm9ybXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zKTtcblxuICAgICAgICAvLyBBY2NlcHQgYSBzaW5nbGUgZXh0ZW5zaW9uLCBvciBhbiBhcnJheSBvZiBleHRlbnNpb25zXG4gICAgICAgIHZhciBleHRlbnNpb25zID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuZXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgZXh0ZW5zaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBbZXh0ZW5zaW9uc107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgc2hhZGVyc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRfc2hhZGVyX3NyYyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbS5jb21waWxlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBuZXcgU2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyxcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3JjX3NlbGVjdGlvbkZyYWdtZW50LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAodGhpcy5uYW1lICsgJyAoc2VsZWN0aW9uKScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lczogc2VsZWN0aW9uX2RlZmluZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgc3R5bGUuY29tcGlsZSgpOiBzdHlsZSAke3RoaXMubmFtZX0gZXJyb3I6YCwgZXJyb3IpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdIG9mIHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkXG4gICAgbG9hZFRleHR1cmVzICh0ZXh0dXJlcykge1xuICAgICAgICAvLyBOQjogb25seSByZXR1cm4gbmFtZSBhbmQgc2l6ZSBvZiB0ZXh0dXJlcyBsb2FkZWQsIGJlY2F1c2Ugd2UgY2FuJ3Qgc2VuZCBhY3R1YWwgdGV4dHVyZSBvYmplY3RzIHRvIHdvcmtlclxuICAgICAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0KHRoaXMuZ2wsIHRleHR1cmVzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyh0ZXh0dXJlcykubWFwKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dHVyZS50ZXh0dXJlc1t0XSAmJiBUZXh0dXJlLnRleHR1cmVzW3RdLmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4odGV4dHVyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB0LnJldGFpbigpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZXMubWFwKHQgPT4gW3QubmFtZSwgdC53aWR0aCwgdC5oZWlnaHRdKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXR1cCBhbnkgR0wgc3RhdGUgZm9yIHJlbmRlcmluZ1xuICAgIHNldHVwICgpIHtcbiAgICAgICAgdGhpcy5zZXRVbmlmb3JtcygpO1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldHVwUHJvZ3JhbShTaGFkZXJQcm9ncmFtLmN1cnJlbnQpO1xuICAgIH0sXG5cbiAgICAvLyBTZXQgc3R5bGUgdW5pZm9ybXMgb24gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cbiAgICBzZXRVbmlmb3JtcyAoKSB7XG4gICAgICAgIHZhciBwcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy51bmlmb3JtcywgdHJ1ZSk7IC8vIHJlc2V0IHRleHR1cmUgdW5pdCB0byAwXG4gICAgfSxcblxuICAgIC8vIFJlbmRlciBzdGF0ZSBzZXR0aW5ncyBieSBibGVuZCBtb2RlXG4gICAgcmVuZGVyX3N0YXRlczoge1xuICAgICAgICBvcGFxdWU6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IHRydWUgfSxcbiAgICAgICAgYWRkOiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBtdWx0aXBseTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgaW5sYXk6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG92ZXJsYXk6IHsgZGVwdGhfdGVzdDogZmFsc2UsIGRlcHRoX3dyaXRlOiBmYWxzZSB9XG4gICAgfSxcblxuICAgIC8vIERlZmF1bHQgc29ydCBvcmRlciBmb3IgYmxlbmQgbW9kZXNcbiAgICBkZWZhdWx0X2JsZW5kX29yZGVyczoge1xuICAgICAgICBvcGFxdWU6IDAsXG4gICAgICAgIGFkZDogMSxcbiAgICAgICAgbXVsdGlwbHk6IDIsXG4gICAgICAgIGlubGF5OiAzLFxuICAgICAgICBvdmVybGF5OiA0XG4gICAgfSxcblxuICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHNvcnRpbmcgc3R5bGVzIGJ5IGJsZW5kXG4gICAgYmxlbmRPcmRlclNvcnQgKGEsIGIpIHtcbiAgICAgICAgLy8gb3BhcXVlIGFsd2F5cyBjb21lcyBmaXJzdFxuICAgICAgICBpZiAoYS5ibGVuZCA9PT0gJ29wYXF1ZScgfHwgYi5ibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyAmJiBiLmJsZW5kID09PSAnb3BhcXVlJykgeyAvLyBpZiBib3RoIGFyZSBvcGFxdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYS5ibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8vIG9ubHkgYGFgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBvbmx5IGBiYCB3YXMgb3BhcXVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1c2UgZXhwbGljaXQgYmxlbmQgb3JkZXIgaWYgcG9zc2libGVcbiAgICAgICAgaWYgKGEuYmxlbmRfb3JkZXIgPCBiLmJsZW5kX29yZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5ibGVuZF9vcmRlciA+IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYmxlbmQgb3JkZXJzIGFyZSBlcXVhbCwgdXNlIGRlZmF1bHQgb3JkZXIgYnkgYmxlbmQgbW9kZVxuICAgICAgICBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPCBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2EuYmxlbmRdID4gU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYi5ibGVuZF0pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGEubmFtZSA8IGIubmFtZSA/IC0xIDogMTsgLy8gdXNlIG5hbWUgYXMgdGllIGJyZWFrZXJcbiAgICB9LFxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgYW5pbWF0aW9uXG4gICAgICAgIC8vIGlmICh0eXBlb2YgdGhpcy5hbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYW5pbWF0aW9uKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbn07XG4iLCIvLyBNYW5hZ2UgcmVuZGVyaW5nIHN0eWxlc1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5pbXBvcnQge1BvbHlnb25zfSBmcm9tICcuL3BvbHlnb25zL3BvbHlnb25zJztcbmltcG9ydCB7TGluZXN9IGZyb20gJy4vbGluZXMvbGluZXMnO1xuaW1wb3J0IHtQb2ludHN9IGZyb20gJy4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQge1RleHRTdHlsZX0gZnJvbSAnLi90ZXh0L3RleHQnO1xuaW1wb3J0IHtSYXN0ZXJTdHlsZX0gZnJvbSAnLi9yYXN0ZXIvcmFzdGVyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19hY2Nlc3NvcnMgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL2FjY2Vzc29ycy5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19sYXllck9yZGVyID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9sYXllcl9vcmRlci5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19zZWxlY3Rpb25HbG9iYWxzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fZ2xvYmFscy5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl92ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzID0ge307XG5cbiAgICAgICAgLy8gQWRkIGJ1aWx0LWluIHJlbmRlcmluZyBzdHlsZXNcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvbHlnb25zKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShMaW5lcykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoUG9pbnRzKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShUZXh0U3R5bGUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFJhc3RlclN0eWxlKSk7XG4gICAgfVxuXG4gICAgLy8gR2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBzdHlsZXNcbiAgICBpbml0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jaygnZ2xvYmFsJyk7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ3NldHVwJyk7XG5cbiAgICAgICAgLy8gTW9kZWwgYW5kIHdvcmxkIHBvc2l0aW9uIGFjY2Vzc29yc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfYWNjZXNzb3JzKTtcblxuICAgICAgICAvLyBMYXllciByZS1vcmRlcmluZyBmdW5jdGlvblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfbGF5ZXJPcmRlcik7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gZ2xvYmFsXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ2dsb2JhbCcsIHNoYWRlclNyY19zZWxlY3Rpb25HbG9iYWxzKTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvbiB2ZXJ0ZXggc2hhZGVyIHN1cHBvcnRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ3NldHVwJywgc2hhZGVyU3JjX3NlbGVjdGlvblZlcnRleCk7XG5cbiAgICAgICAgLy8gTWluaW11bSB2YWx1ZSBmb3IgZmxvYXQgY29tcGFyaXNvbnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzLlRBTkdSQU1fRVBTSUxPTiA9IDAuMDAwMDE7XG5cbiAgICAgICAgLy8gTWluaW11bSBkZXB0aCBidWZmZXIgdmFsdWUgc2VwYXJhdGluZyBlYWNoIGBvcmRlcmAgdW5pdFxuICAgICAgICAvLyBBc3N1bWUgbWluIDE2LWJpdCBkZXB0aCBidWZmZXIsIGluIHByYWN0aWNlIHVzZXMgMTQtYml0cywgMSBleHRyYSBiaXQgdG8gaGFuZGxlIHZpcnR1YWwgaGFsZi1sYXllcnNcbiAgICAgICAgLy8gZm9yIG91dGxpbmVzIChpbnNlcnRlZCBpbiBiZXR3ZWVuIGxheWVycyksIGFub3RoZXIgZXh0cmEgYml0IHRvIHByZXZlbnQgcHJlY2lzaW9uIGxvc3NcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfREVMVEEgPSAxIC8gKDEgPDwgMTQpO1xuXG4gICAgICAgIC8vIEludGVybmFsIHRpbGUgc2NhbGVcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzLlRBTkdSQU1fVElMRV9TQ0FMRSA9XG4gICAgICAgICAgICBgdmVjMygke0dlby50aWxlX3NjYWxlfS4sICR7R2VvLnRpbGVfc2NhbGV9LiwgdV9tZXRlcnNfcGVyX3BpeGVsICogJHtHZW8udGlsZV9zaXplfS4pYDtcblxuICAgICAgICAvLyBJbmNyZWFzZXMgcHJlY2lzaW9uIGZvciBoZWlnaHQgdmFsdWVzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0hFSUdIVF9TQ0FMRSA9IEdlby5oZWlnaHRfc2NhbGU7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBhbGwgc3R5bGVzIGZvciBhIGdpdmVuIEdMIGNvbnRleHRcbiAgICBkZXN0cm95IChnbCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcykuZm9yRWFjaCgoX25hbWUpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuc3R5bGVzW19uYW1lXTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFN0eWxlTWFuYWdlci5kZXN0cm95OiBkZXN0cm95aW5nIHJlbmRlciBzdHlsZSAke3N0eWxlLm5hbWV9YCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0eWxlLmlzQnVpbHRJbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHN0eWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHlsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgc3R5bGVcbiAgICByZWdpc3RlciAoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5zdHlsZXNbc3R5bGUubmFtZV0gPSBzdHlsZTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHN0eWxlXG4gICAgcmVtb3ZlIChuYW1lKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICBtaXggKHN0eWxlLCBzdHlsZXMpIHtcbiAgICAgICAgLy8gRXhpdCBlYXJseSBpZiB3ZSBoYXZlIGFscmVhZHkgYXBwbGllZCBtaXhpbnMgdG8gdGhpcyBzdHlsZVxuICAgICAgICBpZiAoc3R5bGUubWl4ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5taXhlZCA9IHt9O1xuXG4gICAgICAgIC8vIE1peGluIHNvdXJjZXMsIGluIG9yZGVyXG4gICAgICAgIGxldCBzb3VyY2VzID0gW107XG4gICAgICAgIGlmIChzdHlsZS5taXgpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLm1peCkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goLi4uc3R5bGUubWl4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMubWFwKHggPT4gc3R5bGVzW3hdKS5maWx0ZXIoeCA9PiB4ICYmIHggIT09IHN0eWxlKTsgLy8gVE9ETzogd2FybmluZyBvbiB0cnlpbmcgdG8gbWl4IGludG8gc2VsZlxuXG4gICAgICAgICAgICAvLyBUcmFjayB3aGljaCBzdHlsZXMgd2VyZSBtaXhlZCBpbnRvIHRoaXMgb25lXG4gICAgICAgICAgICBmb3IgKGxldCBzIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5taXhlZFtzLm5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgW2ssIGJsb2NrXSBvZiBVdGlscy5lbnRyaWVzKHN0eWxlLnNoYWRlcnMuYmxvY2tzKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNoYWRlcl9tZXJnZXMpIHtcbiAgICAgICAgICAgIGlmICghc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrcyA9IHNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXMgPSBzaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgICAgIGxldCBtaXhlZF9zb3VyY2UgPSB7fTsgLy8gc2NvcGVzIG1peGVkIGZvciB0aGlzIHNvdXJjZSBzdHlsZVxuXG4gICAgICAgICAgICBmb3IgKGxldCBbdCwgYmxvY2tdIG9mIFV0aWxzLmVudHJpZXMoc291cmNlLmJsb2NrcykpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tfc2NvcGUgPSBzb3VyY2UuYmxvY2tfc2NvcGVzW3RdO1xuXG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja3NbdF0gPSBzaGFkZXJzLmJsb2Nrc1t0XSB8fCBbXTtcbiAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzW3RdIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemUgb24gYXJyYXlzIChibG9jayBjYW4gYmUgc2luZ2xlIG9yIG11bHRpLXZhbHVlKVxuICAgICAgICAgICAgICAgIGJsb2NrID0gQXJyYXkuaXNBcnJheShibG9jaykgPyBibG9jayA6IFtibG9ja107XG4gICAgICAgICAgICAgICAgYmxvY2tfc2NvcGUgPSBBcnJheS5pc0FycmF5KGJsb2NrX3Njb3BlKSA/IGJsb2NrX3Njb3BlIDogW2Jsb2NrX3Njb3BlXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGI9MDsgYiA8IGJsb2NrLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYmxvY2tzIHdlJ3ZlIGFscmVhZHkgbWl4ZWQgaW4gZnJvbSB0aGUgc2FtZSBzY29wZVxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBlYXRpbmcgc2NvcGUgaW5kaWNhdGVzIGEgZGlhbW9uZCBwYXR0ZXJuIHdoZXJlIGEgc3R5bGUgaXMgYmVpbmcgbWl4ZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1peGVkW2Jsb2NrX3Njb3BlW2JdXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWl4ZWRfc291cmNlW2Jsb2NrX3Njb3BlW2JdXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja3NbdF0ucHVzaChibG9ja1tiXSk7XG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tfc2NvcGVzW3RdLnB1c2goYmxvY2tfc2NvcGVbYl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHN0eWxlcyBtaXhlZCBpbiBmcm9tIHRoaXMgc291cmNlIC0gdGhleSBjb3VsZCBiZSBtdWx0aS1sZXZlbCBhbmNlc3RvcnMsXG4gICAgICAgICAgICAvLyBiZXlvbmQgdGhlIGZpcnN0LWxldmVsIFwicGFyZW50c1wiIGRlZmluZWQgaW4gdGhpcyBzdHlsZSdzIGBtaXhgIGxpc3RcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWl4ZWQsIG1peGVkX3NvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIGZvciAobGV0IHNuYW1lIG9mIHN0eWxlX2RlcHMpIHtcbiAgICAgICAgICAgIHdzW3NuYW1lXSA9IHRoaXMuY3JlYXRlKHNuYW1lLCBzdHlsZXNbc25hbWVdLCB3cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvLyBDb21waWxlIGFsbCBzdHlsZXNcbiAgICBjb21waWxlIChrZXlzLCBzY2VuZSkge1xuICAgICAgICBrZXlzID0ga2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcyk7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1trZXldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdHlsZS5jb21waWxlKCk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuY29tcGlsZSgpOiBjb21waWxlZCBzdHlsZSAke2tleX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBTdHlsZU1hbmFnZXIuY29tcGlsZSgpOiBlcnJvciBjb21waWxpbmcgc3R5bGUgJHtrZXl9OmAsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgIHNjZW5lLnRyaWdnZXIoJ3dhcm5pbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHlsZXMnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgY29tcGlsaW5nIHN0eWxlICR7a2V5fWAsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJfZXJyb3JzOiBzdHlsZS5wcm9ncmFtICYmIHN0eWxlLnByb2dyYW0uc2hhZGVyX2Vycm9yc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZU1hbmFnZXIuY29tcGlsZSgpOiBjb21waWxlZCBhbGwgc3R5bGVzYCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBzdHlsZXMgd2l0aCBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZVxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucHhfc2l6ZSA9IHB4X3NpemU7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KCcgJykud2lkdGggLyBkcHI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNwYWNlX3dpZHRoID0gc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnRzID0gc3BsaXRMYWJlbFRleHQodGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zZWdtZW50cyA9IHNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XSA9IHRoaXMudGV4dFNpemUoc2VnbWVudCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUucHVzaChDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSA9IHRoaXMudGV4dFNpemUodGV4dCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMuaGl0cysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIHRleHQgc2l6ZXMgYmFjayB0byB3b3JrZXIgKGtlZXAgY29tcHV0ZWQgdGV4dCBsaW5lIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG1haW4gdGhyZWFkLCBmb3IgZnV0dXJlIHJlbmRlcmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5zaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGV4dCBiYXNlZCBvbiBjdXJyZW50IGZvbnQgc3R5bGVcbiAgICAvLyBJbmNsdWRlcyB3b3JkIHdyYXBwaW5nLCByZXR1cm5zIHNpemUgaW5mbyBmb3Igd2hvbGUgdGV4dCBibG9jayBhbmQgaW5kaXZpZHVhbCBsaW5lc1xuICAgIHRleHRTaXplICh0ZXh0LCB7dHJhbnNmb3JtLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgc3Ryb2tlX3dpZHRoID0gMH0pIHtcbiAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKHRleHQsIHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAoc3Ryb2tlX3dpZHRoICsgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyKTtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSAyICogZHByOyAvLyBtYWtlIGNvbmZpZ3VyYWJsZSBhbmQvb3IgdXNlIENhbnZhcyBUZXh0TWV0cmljcyB3aGVuIGF2YWlsYWJsZVxuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSB0aGlzLnB4X3NpemUgKyBsZWFkaW5nOyAvLyBweF9zaXplIGFscmVhZHkgaW4gZGV2aWNlIHBpeGVsc1xuXG4gICAgICAgIC8vIFBhcnNlIHN0cmluZyBpbnRvIHNlcmllcyBvZiBsaW5lcyBpZiBpdCBleGNlZWRzIHRoZSB0ZXh0IHdyYXBwaW5nIHZhbHVlIG9yIGNvbnRhaW5zIGxpbmUgYnJlYWtzXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBNdWx0aUxpbmUucGFyc2Uoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCk7XG5cbiAgICAgICAgLy8gRmluYWwgZGltZW5zaW9ucyBvZiB0ZXh0XG4gICAgICAgIGxldCBoZWlnaHQgPSBtdWx0aWxpbmUuaGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGggPSBtdWx0aWxpbmUud2lkdGg7XG4gICAgICAgIGxldCBsaW5lcyA9IG11bHRpbGluZS5saW5lcztcblxuICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCAvIGRwcixcbiAgICAgICAgICAgIGhlaWdodCAvIGRwclxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCArIDIgKiBob3Jpem9udGFsX2J1ZmZlcixcbiAgICAgICAgICAgIGhlaWdodCArIDIgKiB2ZXJ0aWNhbF9idWZmZXJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgbG9naWNhbF9zaXplID0gW1xuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzBdIC8gZHByLFxuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzFdIC8gZHByLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFJldHVybnMgbGluZXMgKHcvcGVyLWxpbmUgaW5mbyBmb3IgZHJhd2luZykgYW5kIHRleHQncyBvdmVyYWxsIGJvdW5kaW5nIGJveCArIGNhbnZhcyBzaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHNpemU6IHsgY29sbGlzaW9uX3NpemUsIHRleHR1cmVfc2l6ZSwgbG9naWNhbF9zaXplLCBsaW5lX2hlaWdodCB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRHJhdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gICAgZHJhd1RleHRNdWx0aUxpbmUgKGxpbmVzLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGggPSAwLCB0cmFuc2Zvcm0sIGFsaWduIH0pIHtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IHk7XG4gICAgICAgIGZvciAobGV0IGxpbmVfbnVtPTA7IGxpbmVfbnVtIDwgbGluZXMubGVuZ3RoOyBsaW5lX251bSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xpbmVfbnVtXTtcbiAgICAgICAgICAgIHRoaXMuZHJhd1RleHRMaW5lKGxpbmUsIFt4LCBoZWlnaHRdLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoLCB0cmFuc2Zvcm0sIGFsaWduIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlciArIHN0cm9rZV93aWR0aCk7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gZHByICogdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlcjtcbiAgICAgICAgICAgIGxldCBjb2xsaXNpb25fc2l6ZSA9IHNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VSZWN0KHggKyBob3Jpem9udGFsX2J1ZmZlciwgeSArIHZlcnRpY2FsX2J1ZmZlciwgZHByICogY29sbGlzaW9uX3NpemVbMF0sIGRwciAqIGNvbGxpc2lvbl9zaXplWzFdKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IHNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgLy8gc3Ryb2tlIGlzIGFwcGxpZWQgaW50ZXJuYWxseSwgc28gdGhlIG91dGVyIGJvcmRlciBpcyB0aGUgZWRnZSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGxpbmVXaWR0aCwgeSArIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzBdIC0gMiAqIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzFdIC0gMiAqIGxpbmVXaWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHNpbmdsZSBsaW5lIG9mIHRleHQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uLCBhZGp1c3RpbmcgZm9yIGJ1ZmZlciBhbmQgYmFzZWxpbmVcbiAgICBkcmF3VGV4dExpbmUgKGxpbmUsIFt4LCB5XSwgc2l6ZSwgeyBzdHJva2UsIHN0cm9rZV93aWR0aCA9IDAsIHRyYW5zZm9ybSwgYWxpZ24gfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBhbGlnbiA9IGFsaWduIHx8ICdjZW50ZXInO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG4gICAgICAgIGxldCBob3Jpem9udGFsX2J1ZmZlciA9IGRwciAqIChzdHJva2Vfd2lkdGggKyB0aGlzLmhvcml6b250YWxfdGV4dF9idWZmZXIpO1xuXG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybShsaW5lLnRleHQsIHRyYW5zZm9ybSk7XG5cbiAgICAgICAgLy8gVGV4dCBhbGlnbm1lbnRcbiAgICAgICAgbGV0IHR4O1xuICAgICAgICBpZiAoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0vMiAtIGxpbmUud2lkdGgvMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgdGV4dHVyZV9zaXplWzBdIC0gbGluZS53aWR0aCAtIGhvcml6b250YWxfYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgYmV0dGVyIENhbnZhcyBUZXh0TWV0cmljcyAobm90IHN1cHBvcnRlZCBieSBicm93c2VycyB5ZXQpLFxuICAgICAgICAvLyAwLjc1IGJ1ZmZlciBwcm9kdWNlcyBhIGJldHRlciBhcHByb3hpbWF0ZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dFxuICAgICAgICBsZXQgdHkgPSB5ICsgdmVydGljYWxfYnVmZmVyICogMC43NSArIGxpbmVfaGVpZ2h0O1xuXG4gICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlX3dpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVRleHQoc3RyLCB0eCwgdHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgfVxuXG4gICAgcmFzdGVyaXplICh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5ncyA9IHRleHRfaW5mby50ZXh0X3NldHRpbmdzO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZvbnQgb24gZmlyc3Qgb2NjdXJlbmNlIG9mIG5ldyBmb250IHN0eWxlXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JkcyA9IHRleHRfaW5mby5zZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnRleGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB3b3Jkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXhjb29yZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Y29vcmQgPSBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbiA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5saW5lcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNdWx0aUxpbmUobGluZSwgdGV4dHVyZV9wb3NpdGlvbiwgc2l6ZSwgdGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCA9IHRleGNvb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzLnB1c2godGV4Y29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZXMgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdLmxpbmVzOyAvLyBnZXQgcHJldmlvdXNseSBjb21wdXRlZCBsaW5lcyBvZiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFsaWduIGluIHRleHRfaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lcywgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLCB0ZXh0X2luZm8uc2l6ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogdGV4dF9zZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX3dpZHRoOiB0ZXh0X3NldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRleHRfc2V0dGluZ3MudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4Y29vcmRzID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQbGFjZSB0ZXh0IGxhYmVscyB3aXRoaW4gYW4gYXRsYXMgb2YgdGhlIGdpdmVuIG1heCBzaXplXG4gICAgc2V0VGV4dHVyZVRleHRQb3NpdGlvbnMgKHRleHRzLCBtYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldKSB7XG4gICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2x1bW4gd2lkdGhcbiAgICAgICAgbGV0IGNvbHVtbl93aWR0aCA9IDA7XG5cbiAgICAgICAgLy8gTGF5b3V0IGxhYmVscywgc3RhY2tlZCBpbiBjb2x1bW5zXG4gICAgICAgIGxldCBjeCA9IDAsIGN5ID0gMDsgLy8gY3VycmVudCB4L3kgcG9zaXRpb24gaW4gYXRsYXNcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7ICAgICAvLyBvdmVyYWxsIGF0bGFzIGhlaWdodFxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV0pIHtcbiAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0X2luZm8uc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB0ZXh0X2luZm8uc2VnbWVudHNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZVtpXS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ICsgc2l6ZVsxXSA8IG1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbjogdGV4dHVyZV9wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVkIHNpemUgaXMgc2FtZSBmb3IgYWxsIGFsaWdubWVudHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gY29sdW1uX3dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGVhY2ggYWxpZ25tZW50IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHNlcGFyYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldOyAvLyBhZGQgbGFiZWwgdG8gY3VycmVudCBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gY29sdW1uX3dpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjeCArIGNvbHVtbl93aWR0aCwgaGVpZ2h0XTsgLy8gb3ZlcmFsbCBhdGxhcyBzaXplXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGJlZm9yZSByYXN0ZXJpemF0aW9uXG4gICAgYXBwbHlUZXh0VHJhbnNmb3JtICh0ZXh0LCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gJ2NhcGl0YWxpemUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uICh0eHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGZvbnQgQ1NTLXN0eWxlIHNpemUgKCcxMnB4JywgJzE0cHQnLCAnMS41ZW0nLCBldGMuKSB0byBwaXhlbCBzaXplIChhZGp1c3RlZCBmb3IgZGV2aWNlIHBpeGVsIHJhdGlvKVxuICAgIC8vIERlZmF1bHRzIHVuaXRzIHRvIHBpeGVscyBpZiBub3Qgc3BlY2lmaWVkXG4gICAgc3RhdGljIGZvbnRQaXhlbFNpemUgKHNpemUpIHtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpemUgPSAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSA/IHNpemUgOiBTdHJpbmcoc2l6ZSk7IC8vIG5lZWQgYSBzdHJpbmcgZm9yIHJlZ2V4XG5cbiAgICAgICAgbGV0IFssIHB4X3NpemUsIHVuaXRzXSA9IHNpemUubWF0Y2goQ2FudmFzVGV4dC5mb250X3NpemVfcmUpIHx8IFtdO1xuICAgICAgICB1bml0cyA9IHVuaXRzIHx8ICdweCc7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSBcImVtXCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgKj0gMTY7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwicHRcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSAwLjc1O1xuICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSBcIiVcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSA2LjI1O1xuICAgICAgICB9XG5cbiAgICAgICAgcHhfc2l6ZSA9IHBhcnNlRmxvYXQocHhfc2l6ZSk7XG4gICAgICAgIHB4X3NpemUgKj0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICByZXR1cm4gcHhfc2l6ZTtcbiAgICB9XG5cbiAgICBjbGVhclRleGNvb3JkQ2FjaGUgKHRpbGVfa2V5KSB7XG4gICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgfVxuXG59XG5cbi8vIEV4dHJhY3QgZm9udCBzaXplIGFuZCB1bml0c1xuQ2FudmFzVGV4dC5mb250X3NpemVfcmUgPSAvKCg/OlswLTldKlxcLik/WzAtOV0rKVxccyoocHh8cHR8ZW18JSk/LztcblxuLy8gQ2FjaGUgc2l6ZXMgb2YgcmVuZGVyZWQgdGV4dFxuQ2FudmFzVGV4dC50ZXh0X2NhY2hlID0ge307IC8vIGJ5IHRleHQgc3R5bGUsIHRoZW4gdGV4dCBzdHJpbmdcbkNhbnZhc1RleHQuY2FjaGVfc3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZSA9IHt9O1xuXG4vLyBSaWdodC10by1sZWZ0IC8gYmktZGlyZWN0aW9uYWwgdGV4dCBoYW5kbGluZ1xuLy8gVGFrZW4gZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMDA2MDk1L2phdmFzY3JpcHQtaG93LXRvLWNoZWNrLWlmLWNoYXJhY3Rlci1pcy1ydGxcbmZ1bmN0aW9uIGlzUlRMKHMpe1xuICAgIHZhciB3ZWFrQ2hhcnMgICAgICAgPSAnXFx1MDAwMC1cXHUwMDQwXFx1MDA1Qi1cXHUwMDYwXFx1MDA3Qi1cXHUwMEJGXFx1MDBEN1xcdTAwRjdcXHUwMkI5LVxcdTAyRkZcXHUyMDAwLVxcdTJCRkZcXHUyMDEwLVxcdTIwMjlcXHUyMDJDXFx1MjAyRi1cXHUyQkZGJyxcbiAgICAgICAgcnRsQ2hhcnMgICAgICAgID0gJ1xcdTA1OTEtXFx1MDdGRlxcdTIwMEZcXHUyMDJCXFx1MjAyRVxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQycsXG4gICAgICAgIHJ0bERpckNoZWNrICAgICA9IG5ldyBSZWdFeHAoJ15bJyt3ZWFrQ2hhcnMrJ10qWycrcnRsQ2hhcnMrJ10nKTtcblxuICAgIHJldHVybiBydGxEaXJDaGVjay50ZXN0KHMpO1xufVxuXG5mdW5jdGlvbiByZW9yZGVyV29yZHNMVFIod29yZHMpIHtcbiAgICBsZXQgd29yZHNfTFRSID0gW107XG4gICAgbGV0IHdvcmRzX1JUTCA9IFtdO1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIHdvcmRzIGFuZCByZS1vcmRlciBSVEwgZ3JvdXBzIGluIHJldmVyc2Ugb3JkZXIgKGJ1dCBpbiBMVFIgdmlzdWFsIG9yZGVyKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc3RyID0gd29yZHNbaV07XG4gICAgICAgIHZhciBydGwgPSBpc1JUTChzdHIpO1xuICAgICAgICBpZiAocnRsKXtcbiAgICAgICAgICAgIHdvcmRzX1JUTC5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAod29yZHNfUlRMLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3Jkc19MVFIucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgd29yZHNfTFRSLnB1c2god29yZHNfUlRMLnBvcCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29yZHNfTFRSO1xufVxuXG4vLyBTcGxpdHRpbmcgc3RyYXRlZ3kgZm9yIGNob3BwaW5nIGEgbGFiZWwgaW50byBzZWdtZW50c1xuZnVuY3Rpb24gc3BsaXRMYWJlbFRleHQodGV4dCl7XG4gICAgbGV0IHdvcmRzID0gdGV4dC5zcGxpdCgnICcpO1xuICAgIHJldHVybiByZW9yZGVyV29yZHNMVFIod29yZHMpO1xufVxuXG4vLyBQcml2YXRlIGNsYXNzIHRvIGFycmFuZ2UgdGV4dCBsYWJlbHMgaW50byBtdWx0aXBsZSBsaW5lcyBiYXNlZCBvblxuLy8gXCJ0ZXh0IHdyYXBcIiBhbmQgXCJtYXggbGluZVwiIHZhbHVlc1xuY2xhc3MgTXVsdGlMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoY29udGV4dCwgbWF4X2xpbmVzID0gSW5maW5pdHksIHRleHRfd3JhcCA9IEluZmluaXR5KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMubGluZXMgPSBbXTtcblxuICAgICAgICB0aGlzLmVsbGlwc2lzID0gJy4uLic7XG4gICAgICAgIHRoaXMuZWxsaXBzaXNfd2lkdGggPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHRoaXMuZWxsaXBzaXMpLndpZHRoO1xuXG4gICAgICAgIHRoaXMubWF4X2xpbmVzID0gbWF4X2xpbmVzO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjcmVhdGVMaW5lIChsaW5lX2hlaWdodCl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShsaW5lX2hlaWdodCwgdGhpcy50ZXh0X3dyYXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCAobGluZSl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgbGluZSB3aWR0aFxuICAgICAgICAgICAgbGV0IGxpbmVfd2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQobGluZS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX3dpZHRoO1xuXG4gICAgICAgICAgICBpZiAobGluZV93aWR0aCA+IHRoaXMud2lkdGgpe1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwobGluZV93aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0byBsaW5lcyBhbmQgaW5jcmVtZW50IGhlaWdodFxuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1c2hlcyB0byB0aGUgbGluZXMgYXJyYXkgYW5kIHJldHVybnMgYSBuZXcgbGluZSBpZiBwb3NzaWJsZSAoZmFsc2Ugb3RoZXJ3aXNlKVxuICAgIGFkdmFuY2UgKGxpbmUsIGxpbmVfaGVpZ2h0KSB7XG4gICAgICAgIGxldCBjYW5fcHVzaCA9IHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGNhbl9wdXNoKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxsaXBzaXMgKCl7XG4gICAgICAgIGxldCBsYXN0X2xpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdF9saW5lLmFwcGVuZCh0aGlzLmVsbGlwc2lzKTtcbiAgICAgICAgbGFzdF9saW5lLndpZHRoICs9IHRoaXMuZWxsaXBzaXNfd2lkdGg7XG5cbiAgICAgICAgaWYgKGxhc3RfbGluZS53aWR0aCA+IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsYXN0X2xpbmUud2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5pc2ggKGxpbmUpe1xuICAgICAgICBpZiAobGluZSl7XG4gICAgICAgICAgICB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UgKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpIHtcbiAgICAgICAgLy8gV29yZCB3cmFwcGluZ1xuICAgICAgICAvLyBMaW5lIGJyZWFrcyBjYW4gYmUgY2F1c2VkIGJ5OlxuICAgICAgICAvLyAgLSBpbXBsaWNpdCBsaW5lIGJyZWFrIHdoZW4gYSBtYXhpbXVtIGNoYXJhY3RlciB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgcGVyIGxpbmUgKHRleHRfd3JhcClcbiAgICAgICAgLy8gIC0gZXhwbGljaXQgbGluZSBicmVhayBpbiB0aGUgbGFiZWwgdGV4dCAoXFxuKVxuICAgICAgICBsZXQgd29yZHM7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dF93cmFwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsgLy8gc3BsaXQgd29yZHMgb24gc3BhY2VzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3b3JkcyA9IFtzdHJdOyAvLyBubyBtYXggbGluZSB3b3JkIHdyYXBwaW5nIChidXQgbmV3IGxpbmVzIHdpbGwgc3RpbGwgYmUgaW4gZWZmZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG11bHRpbGluZSA9IG5ldyBNdWx0aUxpbmUoY3R4LCBtYXhfbGluZXMsIHRleHRfd3JhcCk7XG4gICAgICAgIGxldCBsaW5lID0gbXVsdGlsaW5lLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuXG4gICAgICAgIC8vIEZpcnN0IGl0ZXJhdGUgb24gc3BhY2UtYnJlYWsgZ3JvdXBzICh3aWxsIGJlIG9uZSBpZiBtYXggbGluZSBsZW5ndGggb2ZmKSwgdGhlbiBpdGVyYXRlIG9uIGxpbmUtYnJlYWsgZ3JvdXBzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1tpXS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG4gICAgICAgICAgICBsZXQgbmV3X2xpbmUgPSAoaSA9PT0gMCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3BhY2VkX3dvcmQgPSAobmV3X2xpbmUpID8gd29yZCA6ICcgJyArIHdvcmQ7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBhZGRpbmcgY3VycmVudCB3b3JkIHdvdWxkIG92ZXJmbG93LCBhZGQgYSBuZXcgbGluZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd29yZCAoaSA9PT0gMCkgYWx3YXlzIGFwcGVuZHNcbiAgICAgICAgICAgICAgICBpZiAodGV4dF93cmFwICYmIGkgPiAwICYmIGxpbmUuZXhjZWVkc1RleHR3cmFwKHNwYWNlZF93b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod29yZCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHNwYWNlZF93b3JkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBsaW5lIGJyZWFrcyBwcmVzZW50LCBhZGQgbmV3IGxpbmUgKHVubGVzcyBvbiBsYXN0IGxpbmUpXG4gICAgICAgICAgICAgICAgaWYgKG4gPCBicmVha3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gd29yZHMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgICAgbXVsdGlsaW5lLmZpbmlzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVsdGlsaW5lO1xuICAgIH1cbn1cblxuLy8gQSBQcml2YXRlIGNsYXNzIHVzZWQgYnkgTXVsdGlMaW5lIHRvIGNvbnRhaW4gdGhlIGxvZ2ljIGZvciBhIHNpbmdsZSBsaW5lXG4vLyBpbmNsdWRpbmcgY2hhcmFjdGVyIGNvdW50LCB3aWR0aCwgaGVpZ2h0IGFuZCB0ZXh0XG5jbGFzcyBMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoaGVpZ2h0ID0gMCwgdGV4dF93cmFwID0gMCl7XG4gICAgICAgIHRoaXMuY2hhcnMgPSAwO1xuICAgICAgICB0aGlzLnRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG4gICAgfVxuXG4gICAgYXBwZW5kICh0ZXh0KXtcbiAgICAgICAgdGhpcy5jaGFycyArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7XG4gICAgfVxuXG4gICAgZXhjZWVkc1RleHR3cmFwICh0ZXh0KXtcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoICsgdGhpcy5jaGFycyA+IHRoaXMudGV4dF93cmFwO1xuICAgIH1cbn1cbiIsIi8qIGdsb2JhbCBGb250RmFjZSAqL1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBGb250RmFjZU9ic2VydmVyIGZyb20gJ2ZvbnRmYWNlb2JzZXJ2ZXInO1xuXG5jb25zdCBGb250TWFuYWdlciA9IHtcblxuICAgIC8vIEZvbnQgZGV0ZWN0aW9uXG4gICAgZm9udHNfbG9hZGVkOiBQcm9taXNlLnJlc29sdmUoKSwgLy8gcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWVzdGVkIGZvbnRzIGhhdmUgYmVlbiBkZXRlY3RlZFxuXG4gICAgLy8gTG9hZCBzZXQgb2YgY3VzdG9tIGZvbnQgZmFjZXNcbiAgICAvLyBgZm9udHNgIGlzIGFuIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIGEgZm9udCBmYW1pbHkgbmFtZSwgYW5kIHRoZSB2YWx1ZSBpcyBvbmUgb3IgbW9yZSBmb250IGZhY2VcbiAgICAvLyBkZWZpbml0aW9ucy4gVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBzdWNoIG9iamVjdHMuXG4gICAgLy8gSWYgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlICdleHRlcm5hbCcgaXMgdXNlZCwgaXQgaW5kaWNhdGVzIHRoZSB0aGUgZm9udCB3aWxsIGJlIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLlxuICAgIGxvYWRGb250cyAoZm9udHMpIHtcbiAgICAgICAgaWYgKGZvbnRzKSB7XG4gICAgICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBmb250cykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHF1ZXVlLnB1c2godGhpcy5sb2FkRm9udEZhY2UoZmFtaWx5LCBmYWNlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZvbnRzW2ZhbWlseV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9udHNfbG9hZGVkID0gUHJvbWlzZS5hbGwocXVldWUuZmlsdGVyKHggPT4geCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRzX2xvYWRlZDtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCBhIHNpbmdsZSBmb250IGZhY2VcbiAgICAvLyBgZmFjZWAgY29udGFpbnMgdGhlIGZvbnQgZmFjZSBkZWZpbml0aW9uLCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGB3ZWlnaHRgLCBgc3R5bGVgLCBhbmQgYHVybGAuXG4gICAgLy8gSWYgdGhlIGB1cmxgIGlzIGRlZmluZWQsIHRoZSBmb250IGlzIGluamVjdGVkIGludG8gdGhlIGRvY3VtZW50IGFzIGEgQ1NTIGZvbnQtZmFjZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0J3MgdmFsdWUgaXMgdGhlIHNwZWNpYWwgc3RyaW5nICdleHRlcm5hbCcsIG9yIGlmIG5vIGB1cmxgIGlzIGRlZmluZWQsIHRoZW4gdGhlIGZvbnQgZmFjZVxuICAgIC8vIGlzIGFzc3VtZWQgaXMgYXNzdW1lZCB0byBiZWVuIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gICAgLy8gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb250IGZhY2UgaGFzIGxvYWRlZCwgb3IgdGltZXMgb3V0LlxuICAgIGxvYWRGb250RmFjZSAoZmFtaWx5LCBmYWNlKSB7XG4gICAgICAgIGlmIChmYWNlID09IG51bGwgfHwgKHR5cGVvZiBmYWNlICE9PSAnb2JqZWN0JyAmJiBmYWNlICE9PSAnZXh0ZXJuYWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7IGZhbWlseSB9O1xuICAgICAgICBsZXQgaW5qZWN0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBmYWNlKTtcblxuICAgICAgICAgICAgLy8gSWYgVVJMIGlzIGRlZmluZWQsIGluamVjdCBmb250IGludG8gZG9jdW1lbnRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFjZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5qZWN0ID0gdGhpcy5pbmplY3RGb250RmFjZShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIGZvbnQgdG8gbG9hZFxuICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgRm9udEZhY2VPYnNlcnZlcihmYW1pbHksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaW5qZWN0LnRoZW4oKCkgPT4gb2JzZXJ2ZXIubG9hZCgpKS50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZXMsIGZvbnQgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0cywgZm9udCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgTk9UIGF2YWlsYWJsZWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBhIGZvbnQgZmFjZSB2aWEgZWl0aGVyIHRoZSBuYXRpdmUgRm9udEZhY2UgQVBJLCBvciBDU1MgaW5qZWN0aW9uXG4gICAgLy8gVE9ETzogY29uc2lkZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZm9ybWF0IFVSTHMgcGVyIGZhY2UsIHVuaWNvZGUgcmFuZ2VzXG4gICAgaW5qZWN0Rm9udEZhY2UgKHsgZmFtaWx5LCB1cmwsIHdlaWdodCwgc3R5bGUgfSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZyA9ICh3aW5kb3cuRm9udEZhY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGJsb2IgVVJMcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEkgd2lsbCBiZSB1c2VkIG9yIG5vdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJICppcyogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgaXMgcmVhZCBpbnRvIGEgcmF3IGRhdGEgYXJyYXkuXG4gICAgICAgIC8vIE5COiBpdCdzIGluZWZmaWNpZW50IHRvIGJlIGNvbnZlcnRpbmcgYmxvYiBVUkxzIGludG8gdHlwZWQgYXJyYXlzIGhlcmUsIHNpbmNlIHRoZXkgb3JpZ2luYXRlZFxuICAgICAgICAvLyBhcyByYXcgZGF0YSAqYmVmb3JlKiB0aGV5IHdlcmUgY29udmVydGVkIGludG8gYmxvYiBVUkxzLiBIb3dldmVyLCB0aGlzIHByb2Nlc3Mgc2hvdWxkIGJlIGZhc3Qgc2luY2VcbiAgICAgICAgLy8gdGhlc2UgYXJlIG5hdGl2ZSBicm93c2VyIGZ1bmN0aW9ucyBhbmQgYWxsIGRhdGEgaXMgbG9jYWwgKG5vIG5ldHdvcmsgcmVxdWVzdCksIGFuZCBpdCBrZWVwcyB0aGVcbiAgICAgICAgLy8gbG9naWMgc3RyZWFtbGluZWQgYnkgYWxsb3dpbmcgdXMgdG8gY29udGludWUgdG8gdXNlIGEgVVJMLWJhc2VkIGludGVyZmFjZSBmb3IgYWxsIHNjZW5lIHJlc291cmNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJIGlzICpub3QqIHN1cHBvcnRlZCwgdGhlIGJsb2IgVVJMIGRhdGEgaXMgY29udmVydGVkIHRvIGEgYmFzZTY0IGRhdGEgVVJMLlxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBzZWN1cml0eSByZXN0cmljaW9ucyBpbiBzb21lIGJyb3dzZXJzLlxuICAgICAgICAvLyBBbHNvIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYnJhbXN0ZWluL2ZvbnRsb2FkZXIvYmxvYi81OThlOTM5OTExN2JkYzk0NmZmNzg2ZmEyYzUwMDdhNmJkN2QzYjllL3NyYy9mb250ZmFjZS5qcyNMMTQ1LUwxNTNcbiAgICAgICAgbGV0IHByZXByb2Nlc3MgPSBQcm9taXNlLnJlc29sdmUodXJsKTtcbiAgICAgICAgaWYgKHVybC5zbGljZSgwLCA1KSA9PT0gJ2Jsb2I6Jykge1xuICAgICAgICAgICAgcHJlcHJvY2VzcyA9IFV0aWxzLmlvKHVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7IC8vIHVzZSByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwnICsgYnRvYShzdHIpOyAvLyBiYXNlNjQgZW5jb2RlIGFzIGRhdGEgVVJMXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlcHJvY2Vzcy50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgRm9udEZhY2UgQVBJXG4gICAgICAgICAgICAgICAgbGV0IGZhY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgeyAvLyBhZGQgYXMgVVJMXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBgdXJsKCR7ZW5jb2RlVVJJKGRhdGEpfSlgLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7IC8vIGFkZCBhcyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gbmV3IEZvbnRGYWNlKGZhbWlseSwgZGF0YSwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoZmFjZSk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdBZGRpbmcgRm9udEZhY2UgdG8gZG9jdW1lbnQuZm9udHM6JywgZmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgQ1NTIGluamVjdGlvblxuICAgICAgICAgICAgICAgIGxldCBjc3MgPSBgXG4gICAgICAgICAgICAgICAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICcke2ZhbWlseX0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ICR7d2VpZ2h0IHx8ICdub3JtYWwnfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6ICR7c3R5bGUgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlX2VsKTtcbiAgICAgICAgICAgICAgICBzdHlsZV9lbC5zaGVldC5pbnNlcnRSdWxlKGNzcywgMCk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdJbmplY3RpbmcgQ1NTIGZvbnQgZmFjZTonLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvbnRNYW5hZ2VyO1xuIiwiLy8gVGV4dCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtQb2ludHN9IGZyb20gJy4uL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgTGFiZWxMaW5lIGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9saW5lJztcblxuZXhwb3J0IGxldCBUZXh0U3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvaW50cyk7XG5cbk9iamVjdC5hc3NpZ24oVGV4dFN0eWxlLCB7XG4gICAgbmFtZTogJ3RleHQnLFxuICAgIHN1cGVyOiBQb2ludHMsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiBmYWxzZSwgLy8gbm8gZmVhdHVyZSBzZWxlY3Rpb24gZm9yIHRleHQgYnkgZGVmYXVsdFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGUgKHBhcmVudCBjbGFzcykgcmVxdWlyZXMgdGV4dHVyaW5nIHRvIGJlIHR1cm5lZCBvblxuICAgICAgICAvLyAobGFiZWxzIGFyZSBhbHdheXMgZHJhd24gd2l0aCB0ZXh0dXJlcylcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUE9JTlRfVEVYVFVSRSA9IHRydWU7XG5cbiAgICAgICAgLy8gRGlzYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gZmFsc2U7XG5cbiAgICAgICAgLy8gTWFudWFsbHkgdW4tbXVsdGlwbHkgYWxwaGEsIGJlY2F1c2UgQ2FudmFzIHRleHQgcmFzdGVyaXphdGlvbiBpcyBwcmUtbXVsdGlwbGllZFxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9VTk1VTFRJUExZX0FMUEhBID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB0ZXh0IHdoZW4gdGlsZSBpcyB6b29taW5nIG91dCwgZS5nLiBhY3RpbmcgYXMgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVRfUkFURSA9IDI7IC8vIGZhZGUgYXQgMngsIGUuZy4gZnVsbHkgdHJhbnNwYXJlbnQgYXQgMC41IHpvb20gbGV2ZWwgYXdheVxuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0eXBlID0gZmVhdHVyZS5nZW9tZXRyeS50eXBlO1xuICAgICAgICBkcmF3LmNhbl9hcnRpY3VsYXRlID0gKHR5cGUgPT09IFwiTGluZVN0cmluZ1wiIHx8IHR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpO1xuXG4gICAgICAgIGxldCBxID0gdGhpcy5wYXJzZVRleHRGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuICAgICAgICBpZiAoIXEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHEuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHEuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHEubGF5b3V0LnZlcnRleCA9IGZhbHNlOyAvLyB2ZXJ0ZXggcGxhY2VtZW50IG9wdGlvbiBub3QgYXBwbGljYWJsZSB0byBzdGFuZGFsb25lIGxhYmVsc1xuXG4gICAgICAgIC8vIFF1ZXVlIHRoZSBmZWF0dXJlIGZvciBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaChxKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB3aXRoIGNvbGxpc2lvbiBtYW5hZ2VyXG4gICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLm5hbWUsIHRpbGUua2V5KTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBzdGFydERhdGEgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG4gICAgICAgIHJldHVybiBTdHlsZS5zdGFydERhdGEuY2FsbCh0aGlzLCB0aWxlKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgdGhpcy5xdWV1ZXNbdGlsZS5rZXldKS5cbiAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCBsYWJlbHMpKS5cbiAgICAgICAgICAgIHRoZW4oKHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBzdHlsaW5nIG9iamVjdCBleHBlY3RlZCBieSBTdHlsZSBjbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb2dpY2FsIHNpemVzIG9mIGVhY2ggc2VnbWVudCBpbnRvIGFuIGFycmF5IGZvciB0aGUgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubWFwKGZ1bmN0aW9uKHNpemUpeyByZXR1cm4gc2l6ZS5sb2dpY2FsX3NpemU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby50ZXhjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXS50ZXhjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMudV90ZXh0dXJlID0gdGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRleHR1cmUpOyAvLyBhc3NpZ24gdGV4dHVyZSBvd25lcnNoaXAgdG8gdGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHMgdXAgY2FjaGluZyBmb3IgZHJhdyBwcm9wZXJ0aWVzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdyk7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgZmVhdHVyZV9sYWJlbHM7XG4gICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgIHZhciBzaXplcyA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUuY29sbGlzaW9uX3NpemU7IH0pO1xuICAgICAgICAgICAgICAgIGZxLmxheW91dC5zcGFjZV93aWR0aCA9IHRleHRfaW5mby5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc2l6ZXMsIGZxLmZlYXR1cmUuZ2VvbWV0cnksIGZxLmxheW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHModGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemUsIGZxLmZlYXR1cmUuZ2VvbWV0cnksIGZxLmxheW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVfbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZxbCA9IE9iamVjdC5jcmVhdGUoZnEpO1xuICAgICAgICAgICAgICAgIGZxbC5sYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGRzIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBnZW9tZXRyeVxuICAgIGJ1aWxkTGFiZWxzIChzaXplLCBnZW9tZXRyeSwgbGF5b3V0KSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMobGluZXNbaV0sIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9pbnRcIikge1xuICAgICAgICAgICAgbGV0IHBvaW50cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludHNbaV0sIHNpemUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBsaW5lIGdlb21ldHJ5XG4gICAgYnVpbGRMaW5lTGFiZWxzIChsaW5lLCBzaXplLCBsYXlvdXQsIGxhYmVscykge1xuICAgICAgICBsZXQgc3ViZGl2ID0gTWF0aC5taW4obGF5b3V0LnN1YmRpdiwgbGluZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKHN1YmRpdiA+IDEpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBtdWx0aXBsZSBsYWJlbHMgZm9yIGxpbmUsIHdpdGggZWFjaCBhbGxvdHRlZCBhIHJhbmdlIG9mIHNlZ21lbnRzXG4gICAgICAgICAgICAvLyBpbiB3aGljaCBpdCB3aWxsIGF0dGVtcHQgdG8gcGxhY2VcbiAgICAgICAgICAgIGxldCBzZWdfcGVyX2RpdiA9IChsaW5lLmxlbmd0aCAtIDEpIC8gc3ViZGl2O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJkaXY7IGkrKykge1xuICAgICAgICAgICAgICAgIGxheW91dC5zZWdtZW50X3N0YXJ0ID0gTWF0aC5mbG9vcihpICogc2VnX3Blcl9kaXYpO1xuICAgICAgICAgICAgICAgIGxheW91dC5zZWdtZW50X2VuZCA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIHNlZ19wZXJfZGl2KTtcblxuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IG51bGw7XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpO1xuICAgICAgICAgICAgaWYgKCFsYWJlbC50aHJvd19hd2F5KXtcbiAgICAgICAgICAgICAgICBsZXQgY2hvc2VuX2xhYmVsID0gcGxhY2VtZW50U3RyYXRlZ3kobGFiZWwpO1xuICAgICAgICAgICAgICAgIGlmIChjaG9zZW5fbGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChjaG9zZW5fbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSk7XG5cbmNvbnN0IFRBUkdFVF9TVFJBSUdIVCA9IDAuNDsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIHN0cmFpZ2h0IGxhYmVscyAobGFiZWwgbGVuZ3RoIC8gbGluZSBsZW5ndGgpXG5jb25zdCBUQVJHRVRfS0lOS0VEID0gMC41OyAvLyBPcHRpbWlzdGljIHRhcmdldCByYXRpbyBmb3Iga2lua2VkIGxhYmVscyAobGFiZWwgbGVuZ3RoIC8gbGluZSBsZW5ndGgpXG5cbi8vIFBsYWNlIGxhYmVscyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBzdHJhdGVneTpcbi8vIC0gY2hvb3NlIHRoZSBiZXN0IHN0cmFpZ2h0IGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIHN0cmFpZ2h0IGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIG9wdGltaXN0aWMga2lua2VkIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyBpdHMgaW50ZXJuYWwgKGxlc3Mgb3B0aW1pc3RpYykgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IGtpbmtlZCBsYWJlbHMgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGRvbid0IHBsYWNlIGEgbGFiZWxcbmZ1bmN0aW9uIHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKXtcbiAgICBsZXQgbGFiZWxzX3N0cmFpZ2h0ID0gW107XG4gICAgbGV0IGxhYmVsc19raW5rZWQgPSBbXTtcbiAgICBsZXQgYmVzdF9zdHJhaWdodF9maXRuZXNzID0gSW5maW5pdHk7XG4gICAgbGV0IGJlc3Rfa2lua2VkX2ZpdG5lc3MgPSBJbmZpbml0eTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgbGFiZWxzXG4gICAgd2hpbGUgKGxhYmVsICYmICFsYWJlbC50aHJvd19hd2F5KSB7XG4gICAgICAgIGlmIChsYWJlbC5raW5rX2luZGV4ID4gMCl7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBhcnRpY3VsYXRlZCBsYWJlbCBpcyBhYm92ZSBsb3dlc3QgY3V0b2ZmXG4gICAgICAgICAgICBpZiAobGFiZWwuZml0bmVzcyA8IGJlc3Rfa2lua2VkX2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfa2lua2VkX2ZpdG5lc3MgPSBsYWJlbC5maXRuZXNzO1xuICAgICAgICAgICAgICAgIGxhYmVsc19raW5rZWQudW5zaGlmdChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBzdHJhaWdodCBsYWJlbCBpcyBhYm92ZSBsb3dlc3Qgc3RyYWlnaHQgY3V0b2ZmXG4gICAgICAgICAgICBpZiAobGFiZWwuZml0bmVzcyA8IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyl7XG4gICAgICAgICAgICAgICAgYmVzdF9zdHJhaWdodF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfc3RyYWlnaHQudW5zaGlmdChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYWJlbCA9IExhYmVsTGluZS5uZXh0TGFiZWwobGFiZWwpO1xuICAgIH1cblxuICAgIGxldCBiZXN0X3N0cmFpZ2h0ID0gbGFiZWxzX3N0cmFpZ2h0WzBdO1xuICAgIGxldCBiZXN0X2tpbmtlZCA9IGxhYmVsc19raW5rZWRbMF07XG5cbiAgICBpZiAobGFiZWxzX3N0cmFpZ2h0Lmxlbmd0aCAmJiBiZXN0X3N0cmFpZ2h0LmZpdG5lc3MgPCBUQVJHRVRfU1RSQUlHSFQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qgc3RyYWlnaHQgc2VnbWVudCBpZiBpdCBpcyBhYm92ZSB0aGUgc3RyaWN0ZXIgc3RyYWlnaHQgY3V0b2ZmXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0O1xuICAgIH1cbiAgICBlbHNlIGlmIChsYWJlbHNfa2lua2VkLmxlbmd0aCAmJiBiZXN0X2tpbmtlZC5maXRuZXNzIDwgVEFSR0VUX0tJTktFRCl7XG4gICAgICAgIC8vIHJldHVybiB0aGUgYmVzdCBraW5rZWQgc2VnbWVudCBpZiBpdCBpcyBhYm92ZSB0aGUgc3RyaWN0ZXIga2lua2VkIGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9raW5rZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIGJlc3Qgb2Ygd2hhdCdzIGxlZnQgKGlmIGFueSlcbiAgICAgICAgcmV0dXJuIGJlc3Rfc3RyYWlnaHQgfHwgYmVzdF9raW5rZWQ7XG4gICAgfVxufVxuXG5UZXh0U3R5bGUudGV4dHVyZV9pZCA9IDA7IC8vIG5hbWVzcGFjZXMgcGVyLXRpbGUgbGFiZWwgdGV4dHVyZXNcbiIsIi8vIFRleHQgbGFiZWwgcmVuZGVyaW5nIG1ldGhvZHMsIGNhbiBiZSBtaXhlZCBpbnRvIGEgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IFRleHRTZXR0aW5ncyBmcm9tICcuLi90ZXh0L3RleHRfc2V0dGluZ3MnO1xuaW1wb3J0IENhbnZhc1RleHQgZnJvbSAnLi4vdGV4dC9jYW52YXNfdGV4dCc7XG5cbi8vIG5hbWVzcGFjZXMgbGFiZWwgdGV4dHVyZXMgKGVuc3VyZXMgbmV3IHRleHR1cmUgbmFtZSB3aGVuIGEgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcylcbmxldCB0ZXh0X3RleHR1cmVfaWQgPSAwO1xuXG5leHBvcnQgY29uc3QgVGV4dExhYmVscyA9IHtcblxuICAgIHJlc2V0VGV4dCAoKSB7XG4gICAgICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHMgPSB7fTsgLy8gdW5pcXVlIHRleHRzLCBncm91cGVkIGJ5IHRpbGUsIGJ5IHN0eWxlXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZnJlZVRleHQgKHRpbGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICBwYXJzZVRleHRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKSB7XG4gICAgICAgIC8vIENvbXB1dGUgbGFiZWwgdGV4dFxuICAgICAgICBsZXQgdGV4dCA9IHRoaXMucGFyc2VUZXh0U291cmNlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHRleHQgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0ZXh0IHN0eWxlIGFuZCBsYXlvdXQgc2V0dGluZ3MgZm9yIHRoaXMgZmVhdHVyZSBsYWJlbFxuICAgICAgICBsZXQgbGF5b3V0ID0gdGhpcy5jb21wdXRlVGV4dExheW91dCh7fSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCk7XG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gVGV4dFNldHRpbmdzLmNvbXB1dGUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IFRleHRTZXR0aW5ncy5rZXkodGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gZmlyc3QgbGFiZWwgaW4gdGlsZSwgb3Igd2l0aCB0aGlzIHN0eWxlP1xuICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldIHx8IHt9O1xuICAgICAgICBsZXQgc2l6ZXMgPSB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gfHwge307XG5cbiAgICAgICAgLy8gdW5pcXVlIHRleHQgc3RyaW5ncywgZ3JvdXBlZCBieSB0ZXh0IGRyYXdpbmcgc3R5bGVcbiAgICAgICAgaWYgKCFzaXplc1t0ZXh0XSkge1xuICAgICAgICAgICAgLy8gZmlyc3QgbGFiZWwgd2l0aCB0aGlzIHRleHQvc3R5bGUvdGlsZSBjb21iaW5hdGlvbiwgbWFrZSBhIG5ldyBsYWJlbCBlbnRyeVxuICAgICAgICAgICAgc2l6ZXNbdGV4dF0gPSB7XG4gICAgICAgICAgICAgICAgdGV4dF9zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICByZWY6IDAgLy8gIyBvZiB0aW1lcyB0aGlzIHRleHQvc3R5bGUgY29tYm8gYXBwZWFycyBpbiB0aWxlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRyYXcsIHRleHQsIHRleHRfc2V0dGluZ3Nfa2V5LCBsYXlvdXRcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbGFiZWwgdGV4dCwgZGVmYXVsdCBpcyB2YWx1ZSBvZiBmZWF0dXJlLnByb3BlcnRpZXMubmFtZVxuICAgIC8vIC0gU3RyaW5nIHZhbHVlIGluZGljYXRlcyBhIGZlYXR1cmUgcHJvcGVydHkgbG9vay11cCwgZS5nLiBgc2hvcnRfbmFtZWAgbWVhbnMgdXNlIGZlYXR1cmUucHJvcGVydGllcy5zaG9ydF9uYW1lXG4gICAgLy8gLSBGdW5jdGlvbiB3aWxsIHVzZSB0aGUgcmV0dXJuIHZhbHVlIGFzIHRoZSBsYWJlbCB0ZXh0IChmb3IgY3VzdG9tIGxhYmVscylcbiAgICAvLyAtIEFycmF5IChvZiBzdHJpbmdzIGFuZC9vciBmdW5jdGlvbnMpIGRlZmluZXMgYSBsaXN0IG9mIGZhbGxiYWNrcywgZXZhbHVhdGVkIGFjY29yZGluZyB0byB0aGUgYWJvdmUgcnVsZXMsXG4gICAgLy8gICB3aXRoIHRoZSBmaXJzdCBub24tbnVsbCB2YWx1ZSB1c2VkIGFzIHRoZSBsYWJlbCB0ZXh0XG4gICAgLy8gICBlLmcuIGBbbmFtZTplcywgbmFtZTplbiwgbmFtZV1gIHByZWZlcnMgU3BhbmlzaCBuYW1lcywgZm9sbG93ZWQgYnkgRW5nbGlzaCwgYW5kIGxhc3QgdGhlIGRlZmF1bHQgbG9jYWwgbmFtZVxuICAgIHBhcnNlVGV4dFNvdXJjZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGV4dDtcbiAgICAgICAgbGV0IHNvdXJjZSA9IGRyYXcudGV4dF9zb3VyY2UgfHwgJ25hbWUnO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZS5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlW3NdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3NvdXJjZVtzXV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW3NdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBzb3VyY2Vbc10oY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaWYgd2UgZm91bmQgYSB0ZXh0IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3NvdXJjZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGV4dCA9IHNvdXJjZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuXG4gICAgcHJlcGFyZVRleHRMYWJlbHMgKHRpbGUsIGNvbGxpc2lvbl9ncm91cCwgcXVldWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGV4dHNbdGlsZS5rZXldfHx7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IGNhbGwgdG8gbWFpbiB0aHJlYWQsIGFzayBmb3IgdGV4dCBwaXhlbCBzaXplc1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycuY2FsY1RleHRTaXplcycsIHRoaXMudGV4dHNbdGlsZS5rZXldKS50aGVuKHRleHRzID0+IHtcblxuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFN0eWxlICR7dGhpcy5uYW1lfTogc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNhbGNUZXh0U2l6ZXMoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0ZXh0cztcbiAgICAgICAgICAgIGlmICghdGV4dHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVGV4dExhYmVscyh0aWxlLmtleSwgcXVldWUpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHMgKHRpbGUsIGNvbGxpc2lvbl9ncm91cCwgbGFiZWxzKSB7XG4gICAgICAgIGlmICghbGFiZWxzKSB7XG4gICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZSh7fSwgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBDb2xsaXNpb24uY29sbGlkZShsYWJlbHMsIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpLnRoZW4obGFiZWxzID0+IHtcbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY29sbGlkZSgpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHRzID0gdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgICAgICAgICB0aGlzLmN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpO1xuXG4gICAgICAgICAgICAvLyBzZXQgYWxpZ25tZW50c1xuICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldICYmIHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuICAgICAgICAgICAgICAgIGlmICghdGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ24gPSB0ZXh0X2luZm8uYWxpZ24gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzZWNvbmQgY2FsbCB0byBtYWluIHRocmVhZCwgZm9yIHJhc3Rlcml6aW5nIHRoZSBzZXQgb2YgdGV4dHNcbiAgICAgICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5yYXN0ZXJpemVUZXh0cycsIHRpbGUua2V5LCB0ZXh0cykudGhlbigoeyB0ZXh0cywgdGV4dHVyZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtcmFzdGVyaXplVGV4dHMoKWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgdW51c2VkIHRleHQvc3R5bGUgY29tYmluYXRpb25zIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJhc3Rlcml6YXRpb25cbiAgICBjdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKSB7XG4gICAgICAgIC8vIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggdGV4dC9zdHlsZSBjb21iaW5hdGlvbiBpcyB1c2VkXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxzW2ldO1xuICAgICAgICAgICAgdGV4dHNbbGFiZWwudGV4dF9zZXR0aW5nc19rZXldW2xhYmVsLnRleHRdLnJlZisrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRleHQvc3R5bGUgY29tYmluYXRpb25zIHRoYXQgaGF2ZSBubyB2aXNpYmxlIGxhYmVsc1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0c1tzdHlsZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBubyBsYWJlbHMgZm9yIHRoaXMgdGV4dFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0c1tzdHlsZV1bdGV4dF0ucmVmIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdW3RleHRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAvLyBubyBsYWJlbHMgZm9yIHRoaXMgc3R5bGVcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZXh0c1tzdHlsZV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggdGV4dCBzdHJpbmcsXG4gICAgLy8gd2VyZSBpdCB0byBiZSByZW5kZXJlZC4gVGhpcyBpbmZvIGlzIHRoZW4gdXNlZCB0byBwZXJmb3JtIGluaXRpYWwgbGFiZWwgY3VsbGluZywgKmJlZm9yZSpcbiAgICAvLyBsYWJlbHMgYXJlIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgIGNhbGNUZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcy50ZXh0U2l6ZXModGV4dHMpO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNyZWF0ZSBhdGxhcyBvZiBsYWJlbHMgZm9yIGEgdGlsZVxuICAgIHJhc3Rlcml6ZVRleHRzICh0aWxlX2tleSwgdGV4dHMpIHtcbiAgICAgICAgbGV0IGNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIGNhbnZhcy5jbGVhclRleGNvb3JkQ2FjaGUodGlsZV9rZXkpO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBjYW52YXMuc2V0VGV4dHVyZVRleHRQb3NpdGlvbnModGV4dHMsIHRoaXMubWF4X3RleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRleHQgc3VtbWFyeSBmb3IgdGlsZSAke3RpbGVfa2V5fTogZml0cyBpbiAke3RleHR1cmVfc2l6ZVswXX14JHt0ZXh0dXJlX3NpemVbMV19cHhgKTtcblxuICAgICAgICAvLyBmaXRzIGluIG1heCB0ZXh0dXJlIHNpemU/XG4gICAgICAgIGlmICh0ZXh0dXJlX3NpemVbMF0gPCB0aGlzLm1heF90ZXh0dXJlX3NpemUgJiYgdGV4dHVyZV9zaXplWzFdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgY2FudmFzIHNpemUgJiByYXN0ZXJpemUgYWxsIHRoZSB0ZXh0IHN0cmluZ3Mgd2UgbmVlZFxuICAgICAgICAgICAgY2FudmFzLnJlc2l6ZSguLi50ZXh0dXJlX3NpemUpO1xuICAgICAgICAgICAgY2FudmFzLnJhc3Rlcml6ZSh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgW1xuICAgICAgICAgICAgICAgIGBMYWJlbCBhdGxhcyBmb3IgdGlsZSAke3RpbGVfa2V5fSBpcyAke3RleHR1cmVfc2l6ZVswXX14JHt0ZXh0dXJlX3NpemVbMV19cHgsIGAsXG4gICAgICAgICAgICAgICAgYGJ1dCBtYXggR0wgdGV4dHVyZSBzaXplIGlzICR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXgke3RoaXMubWF4X3RleHR1cmVfc2l6ZX1weGBdLmpvaW4oJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHRleHR1cmVcbiAgICAgICAgbGV0IHQgPSAnbGFiZWxzLScgKyB0aWxlX2tleSArICctJyArICh0ZXh0X3RleHR1cmVfaWQrKyk7XG4gICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGNhbnZhcy5jYW52YXMsXG4gICAgICAgICAgICBmaWx0ZXJpbmc6ICdsaW5lYXInLFxuICAgICAgICAgICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBUZXh0dXJlLnJldGFpbih0KTtcblxuICAgICAgICByZXR1cm4geyB0ZXh0cywgdGV4dHVyZTogdCB9OyAvLyB0ZXh0dXJlIGlzIHJldHVybmVkIGJ5IG5hbWUgKG5vdCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgcHJlcHJvY2Vzc1RleHQgKGRyYXcpIHtcbiAgICAgICAgLy8gRm9udCBzZXR0aW5ncyBhcmUgcmVxdWlyZWRcbiAgICAgICAgaWYgKCFkcmF3IHx8ICFkcmF3LmZvbnQgfHwgdHlwZW9mIGRyYXcuZm9udCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbG9yc1xuICAgICAgICBkcmF3LmZvbnQuZmlsbCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LmZpbGwpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS5jb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGZvbnQgYW5kIHRleHQgc3Ryb2tlIHNpemVzXG4gICAgICAgIGRyYXcuZm9udC5weF9zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc2l6ZSwgQ2FudmFzVGV4dC5mb250UGl4ZWxTaXplKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS53aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLndpZHRoLCBwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5idWZmZXIgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuYnVmZmVyLCB2ID0+IChBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2LCB2XSkubWFwKHBhcnNlRmxvYXQpIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcGVhdCBydWxlc1xuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBBZGRpdGlvbmFsIHRleHQtc3BlY2lmaWMgbGF5b3V0IHNldHRpbmdzXG4gICAgY29tcHV0ZVRleHRMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuXG4gICAgICAgIC8vIGNvbW1vbiBzZXR0aW5ncyB3L3BvaW50c1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmNvbXB1dGVMYXlvdXQobGF5b3V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IHRydWU7XG4gICAgICAgIGxheW91dC5tb3ZlX2ludG9fdGlsZSA9IChkcmF3Lm1vdmVfaW50b190aWxlICE9IG51bGwpID8gZHJhdy5tb3ZlX2ludG9fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gcmVwZWF0IG1pbmltdW0gZGlzdGFuY2VcbiAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgPSBHZW8udGlsZV9zaXplO1xuICAgICAgICB9XG4gICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyByZXBlYXQgZ3JvdXAga2V5XG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG5cbiAgICAgICAgLy8gTWF4IG51bWJlciBvZiBzdWJkaXZpc2lvbnMgdG8gdHJ5XG4gICAgICAgIGxheW91dC5zdWJkaXYgPSB0aWxlLm92ZXJ6b29tMjtcblxuICAgICAgICBsYXlvdXQuYWxpZ24gPSBkcmF3LmFsaWduO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIHNldHRpbmdzLm1heF9saW5lcyxcbiAgICAgICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICBdLmpvaW4oJy8nKTtcbiAgICB9LFxuXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgc3R5bGU6ICdub3JtYWwnLFxuICAgICAgICB3ZWlnaHQ6IG51bGwsXG4gICAgICAgIHNpemU6ICcxMnB4JyxcbiAgICAgICAgcHhfc2l6ZTogMTIsXG4gICAgICAgIGZhbWlseTogJ0hlbHZldGljYScsXG4gICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgIHRleHRfd3JhcDogMTUsXG4gICAgICAgIG1heF9saW5lczogNSxcbiAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICBzdHJva2U6IG51bGwsXG4gICAgICAgIHN0cm9rZV93aWR0aDogMFxuICAgIH0sXG5cbiAgICBjb21wdXRlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCBzdHlsZSA9IHt9O1xuXG4gICAgICAgIGRyYXcuZm9udCA9IGRyYXcuZm9udCB8fCB0aGlzLmRlZmF1bHRzO1xuXG4gICAgICAgIC8vIExpbmVTdHJpbmcgbGFiZWxzIGNhbiBhcnRpY3VsYXRlIHdoaWxlIHBvaW50IGxhYmVscyBjYW5ub3QuIE5lZWRlZCBmb3IgZnV0dXJlIHRleHR1cmUgY29vcmRpbmF0ZSBjYWxjdWxhdGlvbnMuXG4gICAgICAgIHN0eWxlLmNhbl9hcnRpY3VsYXRlID0gZHJhdy5jYW5fYXJ0aWN1bGF0ZTtcblxuICAgICAgICAvLyBVc2UgZmlsbCBpZiBzcGVjaWZpZWQsIG9yIGRlZmF1bHRcbiAgICAgICAgc3R5bGUuZmlsbCA9IChkcmF3LmZvbnQuZmlsbCAmJiBVdGlscy50b0NTU0NvbG9yKFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5KGRyYXcuZm9udC5maWxsLCBjb250ZXh0KSkpIHx8IHRoaXMuZGVmYXVsdHMuZmlsbDtcblxuICAgICAgICAvLyBGb250IHByb3BlcnRpZXMgYXJlIG1vZGVsZWQgYWZ0ZXIgQ1NTIG5hbWVzOlxuICAgICAgICAvLyAtIGZhbWlseTogSGVsdmV0aWNhLCBGdXR1cmEsIGV0Yy5cbiAgICAgICAgLy8gLSBzaXplOiBpbiBwdCwgcHgsIG9yIGVtXG4gICAgICAgIC8vIC0gc3R5bGU6IG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG4gICAgICAgIC8vIC0gd2VpZ2h0OiBub3JtYWwsIGJvbGQsIGV0Yy5cbiAgICAgICAgLy8gLSB0cmFuc2Zvcm06IGNhcGl0YWxpemUsIHVwcGVyY2FzZSwgbG93ZXJjYXNlXG4gICAgICAgIHN0eWxlLnN0eWxlID0gZHJhdy5mb250LnN0eWxlIHx8IHRoaXMuZGVmYXVsdHMuc3R5bGU7XG4gICAgICAgIHN0eWxlLndlaWdodCA9IGRyYXcuZm9udC53ZWlnaHQgfHwgdGhpcy5kZWZhdWx0cy53ZWlnaHQ7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuZmFtaWx5KSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSBkcmF3LmZvbnQuZmFtaWx5O1xuICAgICAgICAgICAgaWYgKHN0eWxlLmZhbWlseSAhPT0gdGhpcy5kZWZhdWx0cy5mYW1pbHkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5mYW1pbHkgKz0gJywgJyArIHRoaXMuZGVmYXVsdHMuZmFtaWx5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUuZmFtaWx5ID0gdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBkcmF3LmZvbnQudHJhbnNmb3JtO1xuXG4gICAgICAgIC8vIG9yaWdpbmFsIHNpemUgKG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgICAgICBzdHlsZS5zaXplID0gZHJhdy5mb250LnNpemUgfHwgdGhpcy5kZWZhdWx0cy5zaXplO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZWQgcGl4ZWwgc2l6ZVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnB4X3NpemU7XG5cbiAgICAgICAgLy8gVXNlIHN0cm9rZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS5jb2xvcikge1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlID0gVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnN0cm9rZSk7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2Vfd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5mb250X2NzcyA9IHRoaXMuZm9udENTUyhzdHlsZSk7XG5cbiAgICAgICAgLy8gV29yZCB3cmFwIGFuZCB0ZXh0IGFsaWdubWVudFxuICAgICAgICAvLyBOb3QgYSBmb250IHByb3BlcnRpZXMsIGJ1dCBhZmZlY3QgYXRsYXMgb2YgdW5pcXVlIHRleHQgdGV4dHVyZXNcbiAgICAgICAgbGV0IHRleHRfd3JhcCA9IGRyYXcudGV4dF93cmFwOyAvLyB1c2UgZXhwbGljaXRseSBzZXQgdmFsdWVcblxuICAgICAgICBpZiAodGV4dF93cmFwID09IG51bGwgJiYgR2VvLmdlb21ldHJ5VHlwZShmZWF0dXJlLmdlb21ldHJ5LnR5cGUpICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIHBvaW50IGxhYmVscyAoZm9yIHBvaW50IGFuZCBwb2x5Z29uIGZlYXR1cmVzKSBoYXZlIHdvcmQgd3JhcCBvbiB3L2RlZmF1bHQgbWF4IGxlbmd0aCxcbiAgICAgICAgICAgIC8vIGxpbmUgbGFiZWxzIGRlZmF1bHQgb2ZmXG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0dGluZyB0byAndHJ1ZScgY2F1c2VzIGRlZmF1bHQgd3JhcCB2YWx1ZSB0byBiZSB1c2VkXG4gICAgICAgIGlmICh0ZXh0X3dyYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRleHRfd3JhcCA9IHRoaXMuZGVmYXVsdHMudGV4dF93cmFwO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcblxuICAgICAgICAvLyBtYXhfbGluZXMgc2V0dGluZyB0byB0cnVuY2F0ZSB2ZXJ5IGxvbmcgbGFiZWxzIHdpdGggYW4gZWxsaXBzaXNcbiAgICAgICAgc3R5bGUubWF4X2xpbmVzID0gZHJhdy5tYXhfbGluZXMgfHwgdGhpcy5kZWZhdWx0cy5tYXhfbGluZXM7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBDU1Mtc3R5bGUgZm9udCBzdHJpbmcgKHRvIHNldCBDYW52YXMgZHJhdyBzdGF0ZSlcbiAgICBmb250Q1NTICh7IHN0eWxlLCB3ZWlnaHQsIHB4X3NpemUsIGZhbWlseSB9KSB7XG4gICAgICAgIHJldHVybiBbc3R5bGUsIHdlaWdodCwgcHhfc2l6ZSArICdweCcsIGZhbWlseV1cbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KSAvLyByZW1vdmUgbnVsbCBwcm9wc1xuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlIHtcblxuICAgIC8qKlxuICAgICAgICBUaWxlXG4gICAgICAgIEBjb25zdHJ1Y3RvclxuICAgICAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOlxuICAgICAgICBjb29yZHM6IG9iamVjdCB3aXRoIHt4LCB5LCB6fSBwcm9wZXJ0aWVzIGlkZW50aWZ5aW5nIHRpbGUgY29vcmRpbmF0ZSBsb2NhdGlvblxuICAgICAgICB3b3JrZXI6IHdlYiB3b3JrZXIgdG8gaGFuZGxlIHRpbGUgY29uc3RydWN0aW9uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlLCB3b3JrZXIsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJveHlfZm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucHJveGllZF9hcyA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmRlYnVnID0ge307XG5cbiAgICAgICAgdGhpcy5jb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbShjb29yZHMsIHRoaXMuc291cmNlLm1heF96b29tKTtcbiAgICAgICAgdGhpcy5zdHlsZV96b29tID0gc3R5bGVfem9vbTsgLy8gem9vbSBsZXZlbCB0byBiZSB1c2VkIGZvciBzdHlsaW5nXG4gICAgICAgIHRoaXMub3Zlcnpvb20gPSBNYXRoLm1heCh0aGlzLnN0eWxlX3pvb20gLSB0aGlzLmNvb3Jkcy56LCAwKTsgLy8gbnVtYmVyIG9mIGxldmVscyBvZiBvdmVyem9vbWluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tMiA9IE1hdGgucG93KDIsIHRoaXMub3Zlcnpvb20pO1xuICAgICAgICB0aGlzLmtleSA9IFRpbGUua2V5KHRoaXMuY29vcmRzLCB0aGlzLnNvdXJjZSwgdGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5taW4gPSBHZW8ubWV0ZXJzRm9yVGlsZSh0aGlzLmNvb3Jkcyk7XG4gICAgICAgIHRoaXMubWF4ID0gR2VvLm1ldGVyc0ZvclRpbGUoe3g6IHRoaXMuY29vcmRzLnggKyAxLCB5OiB0aGlzLmNvb3Jkcy55ICsgMSwgejogdGhpcy5jb29yZHMueiB9KSxcbiAgICAgICAgdGhpcy5zcGFuID0geyB4OiAodGhpcy5tYXgueCAtIHRoaXMubWluLngpLCB5OiAodGhpcy5tYXgueSAtIHRoaXMubWluLnkpIH07XG4gICAgICAgIHRoaXMuYm91bmRzID0geyBzdzogeyB4OiB0aGlzLm1pbi54LCB5OiB0aGlzLm1heC55IH0sIG5lOiB7IHg6IHRoaXMubWF4LngsIHk6IHRoaXMubWluLnkgfSB9O1xuICAgICAgICB0aGlzLmNlbnRlcl9kaXN0ID0gMDtcblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxID0gdGhpcy5tZXRlcnNfcGVyX3BpeGVsICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB0aGlzLnVuaXRzX3Blcl9waXhlbCA9IEdlby51bml0c19wZXJfcGl4ZWwgLyB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG4gICAgICAgIHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tID0gR2VvLnVuaXRzUGVyTWV0ZXIodGhpcy5jb29yZHMueikgKiB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG5cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTsgLy8gcmVuZGVyYWJsZSBWQk8gbWVzaGVzIGtleWVkIGJ5IHN0eWxlXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgdGhhdCB0aGUgdGlsZSBvd25zIChsYWJlbHMsIGV0Yy4pXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBtIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIFRleHR1cmUucmVsZWFzZSh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5idWlsZFRpbGUnLCB7IHRpbGU6IHRoaXMuYnVpbGRBc01lc3NhZ2UoKSB9KS5jYXRjaChlID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiB3b3JrZXIgdG8gY2FuY2VsIGxvYWRpbmdcbiAgICAgICAgU3RhdGljIG1ldGhvZCBiZWNhdXNlIHRoZSB3b3JrZXIgb25seSBoYXMgb2JqZWN0IHJlcHJlc2VudGF0aW9ucyBvZiB0aWxlIGRhdGEsIHRoZXJlIGlzIG5vXG4gICAgICAgIHRpbGUgaW5zdGFuY2UgY3JlYXRlZCB5ZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEgJiYgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGdlb21ldHJ5IGZvciB0aWxlIC0gY2FsbGVkIGJ5IHdlYiB3b3JrZXJcbiAgICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRpbGUga2V5cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBtYWluIHRocmVhZCAoc28gdGhhdCB3ZSBjYW4gbWluaW1pemUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHdvcmtlciBhbmQgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIGJ1aWxkR2VvbWV0cnkgKHRpbGUsIHsgc2NlbmVfaWQsIGxheWVycywgc3R5bGVzLCBnbG9iYWwgfSkge1xuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aWxlLmRlYnVnLmZlYXR1cmVzID0gMDtcblxuICAgICAgICBsZXQgZGF0YSA9IHRpbGUuc291cmNlX2RhdGE7XG5cbiAgICAgICAgQ29sbGlzaW9uLnN0YXJ0VGlsZSh0aWxlLmtleSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBsYXllclxuICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2xheWVyX25hbWVdO1xuICAgICAgICAgICAgLy8gU2tpcCBsYXllcnMgd2l0aCBubyBkYXRhIHNvdXJjZSBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8ICFsYXllci5jb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBMYXllciAke2xheWVyX25hbWV9IHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZW9tZXRyeSBkYXRhIHNvdXJjZSBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNvdXJjZSBuYW1lcyBkb24ndCBtYXRjaFxuICAgICAgICAgICAgaWYgKGxheWVyLmNvbmZpZy5kYXRhLnNvdXJjZSAhPT0gdGlsZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZm9yIG9uZSBvciBtb3JlIGxheWVycyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllcnMgPSBUaWxlLmdldERhdGFGb3JTb3VyY2UoZGF0YSwgbGF5ZXIuY29uZmlnLmRhdGEsIGxheWVyX25hbWUpO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgZmVhdHVyZXMgaW4gbGF5ZXJcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZV9sYXllcnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlX2xheWVyID0gc291cmNlX2xheWVyc1tzXTtcbiAgICAgICAgICAgICAgICBsZXQgZ2VvbSA9IHNvdXJjZV9sYXllci5nZW9tO1xuICAgICAgICAgICAgICAgIGlmICghZ2VvbSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IGdlb20uZmVhdHVyZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBnZW9tLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBmZWF0dXJlcyB3L28gZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53aW5kaW5nID0gdGlsZS5kZWZhdWx0X3dpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc291cmNlID0gdGlsZS5zb3VyY2U7ICAgICAgICAvLyBhZGQgZGF0YSBzb3VyY2UgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVyID0gc291cmNlX2xheWVyLmxheWVyOyAgLy8gYWRkIGRhdGEgc291cmNlIGxheWVyIG5hbWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZHJhdyBncm91cHMgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllci5idWlsZERyYXdHcm91cHMoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGRyYXcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGRyYXdfZ3JvdXBzW2dyb3VwX25hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBncm91cF9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3N0eWxlX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlICcke3N0eWxlX25hbWV9JyBub3QgZm91bmQsIHNraXBwaW5nIGxheWVyICcke2xheWVyX25hbWV9JzpgLCBncm91cCwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGF5ZXJzID0gZ3JvdXAubGF5ZXJzOyAgLy8gYWRkIG1hdGNoaW5nIGRyYXcgbGF5ZXJzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ3JvdXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpIC0gdGlsZS5kZWJ1Zy5yZW5kZXJpbmc7XG5cbiAgICAgICAgLy8gU2VuZCBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCBhcyB0aGV5IGZpbmlzaCBidWlsZGluZywgaW4gdHdvIGdyb3VwczogY29sbGlzaW9uIHZzLiBub24tY29sbGlzaW9uXG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFN0eWxlTWFuYWdlci5zdHlsZXNGb3JUaWxlKHRpbGUua2V5LCBzdHlsZXMpLm1hcChzID0+IHN0eWxlc1tzXSk7XG4gICAgICAgIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+IHN0eWxlLmNvbGxpc2lvbiA/ICdjb2xsaXNpb24nIDogJ25vbi1jb2xsaXNpb24nKTtcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUubmFtZSk7IC8vIGNhbGwgZm9yIGVhY2ggc3R5bGVcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gJ3N0eWxlcycpOyAvLyBhbGwgc3R5bGVzIGluIHNpbmdsZSBjYWxsIChwcmV2aW91cyBiZWhhdmlvcilcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzaF9kYXRhW3NdLnRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMubWVzaF9kYXRhOyAvLyBUT0RPOiBtaWdodCB3YW50IHRvIHByZXNlcnZlIHRoaXMgZm9yIHJlYnVpbGRpbmcgZ2VvbWV0cmllcyB3aGVuIHN0eWxlcy9ldGMuIGNoYW5nZT9cblxuICAgICAgICAvLyBBZGQgbmV3IHRpbGUgZGF0YVxuICAgICAgICBpZiAocHJvZ3Jlc3Muc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5tZXNoZXMgPSBtZXNoZXM7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gdGV4dHVyZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lc2hlcyA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXNoZXMsIG1lc2hlcyk7XG4gICAgICAgICAgICB0ZXh0dXJlcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHR1cmVzLmluZGV4T2YodCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHVyZXMucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZXMgPSB0aWxlLm1lc2hfZGF0YVtzXS50ZXh0dXJlcztcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbGVhc2luZyB0ZXh0dXJlICR7dH0gZm9yIHRpbGUgJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSByZWxhdGl2ZSB0byB2aWV3XG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuY29vcmRzO1xuICAgICAgICBpZiAoY29vcmRzLnogIT09IHRoaXMudmlldy5jZW50ZXIudGlsZS56KSB7XG4gICAgICAgICAgICBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCB0aGlzLnZpZXcuY2VudGVyLnRpbGUueik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gY29vcmRzLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBjb29yZHMueSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFzIGEgcHJveHkgdGlsZSBmb3IgYW5vdGhlciB0aWxlXG4gICAgc2V0UHJveHlGb3IgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IHRoaXMucHJveHlfZm9yIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAxOyAvLyBkcmF3IHByb3hpZXMgYSBoYWxmLWxheWVyIGJhY2sgKG9yZGVyIGlzIHNjYWxlZCAyeCB0byBhdm9pZCBpbnRlZ2VyIHRydW5jYXRpb24pXG4gICAgICAgICAgICB0aWxlLnByb3hpZWRfYXMgPSAodGlsZS5zdHlsZV96b29tID4gdGhpcy5zdHlsZV96b29tID8gJ2NoaWxkJyA6ICdwYXJlbnQnKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb3h5IHRpbGVzIG9ubHkgbmVlZCB0byByZW5kZXIgYSBzcGVjaWZpYyBzdHlsZSBpZiBhbnkgb2YgdGhlIHRpbGVzIHRoZXkgYXJlIHByb3h5aW5nICpmb3IqXG4gICAgLy8gaGF2ZW4ndCBmaW5pc2hlZCBsb2FkaW5nIHRoYXQgc3R5bGUgeWV0LiBJZiBhbGwgcHJveGllZCB0aWxlcyAqaGF2ZSogZGF0YSBmb3IgdGhhdCBzdHlsZSwgdGhlbiBpdCdzXG4gICAgLy8gc2FmZSB0byBoaWRlIHRoZSBwcm94eSB0aWxlJ3MgdmVyc2lvbi5cbiAgICBzaG91bGRQcm94eUZvclN0eWxlIChzdHlsZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMucHJveHlfZm9yIHx8IHRoaXMucHJveHlfZm9yLnNvbWUodCA9PiB0Lm1lc2hlc1tzdHlsZV0gPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1vZGVsIG1hdHJpeCBhbmQgdGlsZSB1bmlmb3Jtc1xuICAgIHNldHVwUHJvZ3JhbSAoeyBtb2RlbCwgbW9kZWwzMiB9LCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUgb3JpZ2luXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnNGZ2JywgJ3VfdGlsZV9vcmlnaW4nLCBbdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5zdHlsZV96b29tLCB0aGlzLmNvb3Jkcy56XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aWxlX3Byb3h5X2RlcHRoJywgdGhpcy5wcm94eV9kZXB0aCk7XG5cbiAgICAgICAgLy8gTW9kZWwgLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHdvcmxkIHNwYWNlIChtZXRlcnMsIGFic29sdXRlIG1lcmNhdG9yIHBvc2l0aW9uKVxuICAgICAgICBtYXQ0LmlkZW50aXR5KG1vZGVsKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobW9kZWwsIG1vZGVsLCB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW4ueCwgdGhpcy5taW4ueSwgMCkpO1xuICAgICAgICBtYXQ0LnNjYWxlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMuc3Bhbi54IC8gR2VvLnRpbGVfc2NhbGUsIC0xICogdGhpcy5zcGFuLnkgLyBHZW8udGlsZV9zY2FsZSwgMSkpOyAvLyBzY2FsZSB0aWxlIGxvY2FsIGNvb3JkcyB0byBtZXRlcnNcbiAgICAgICAgbWF0NC5jb3B5KG1vZGVsMzIsIG1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbCcsIG1vZGVsMzIpO1xuXG4gICAgICAgIC8vIEZhZGUgaW4gbGFiZWxzIGFjY29yZGluZyB0byBwcm94eSBzdGF0dXMsIGF2b2lkaW5nIFwiZmxpY2tlcmluZ1wiIHdoZXJlXG4gICAgICAgIC8vIGxhYmVscyBxdWlja2x5IGdvIGZyb20gaW52aXNpYmxlIGJhY2sgdG8gdmlzaWJsZVxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3VfZmFkZV9pbicsIHRoaXMucHJveGllZF9hcyAhPT0gJ2NoaWxkJyk7XG4gICAgfVxuXG4gICAgLy8gU2xpY2UgYSBzdWJzZXQgb2Yga2V5cyBvdXQgb2YgYSB0aWxlXG4gICAgLy8gSW5jbHVkZXMgYSBtaW5pbXVtIHNldCBvZiBwcmUtZGVmaW5lZCBrZXlzIGZvciBsb2FkIHN0YXRlLCBkZWJ1Zy4gZXRjLlxuICAgIC8vIFdlIHVzZSB0aGlzIHRvIHNlbmQgYSBzdWJzZXQgb2YgdGhlIHRpbGUgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQsIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5IGRhdGEgdHJhbnNmZXJcbiAgICAvLyAoZS5nLiB2ZXJ5IGxhcmdlIGl0ZW1zIGxpa2UgZmVhdHVyZSBnZW9tZXRyeSBhcmUgbm90IG5lZWRlZCBvbiB0aGUgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIHNsaWNlICh0aWxlLCBrZXlzKSB7XG4gICAgICAgIGxldCBrZWVwID0gW1xuICAgICAgICAgICAgJ2tleScsXG4gICAgICAgICAgICAnbG9hZGluZycsXG4gICAgICAgICAgICAnbG9hZGVkJyxcbiAgICAgICAgICAgICdnZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAnZGVidWcnXG4gICAgICAgIF07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZWVwLnB1c2goLi4ua2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCB0aGUgdGlsZSBzdWJzZXRcbiAgICAgICAgdmFyIHRpbGVfc3Vic2V0ID0ge307XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZWVwKSB7XG4gICAgICAgICAgICB0aWxlX3N1YnNldFtrZXldID0gdGlsZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVfc3Vic2V0O1xuICAgIH1cblxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvdGhlcikge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBvdGhlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaW50RGVidWcgKCkge1xuICAgICAgICBsb2coJ2RlYnVnJywgYFRpbGU6IGRlYnVnIGZvciAke3RoaXMua2V5fTogWyAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnKX0gXWApO1xuICAgIH1cblxufVxuXG5UaWxlLmNvb3JkX2NoaWxkcmVuID0ge307IC8vIG9ubHkgYWxsb2NhdGUgY2hpbGRyZW4gY29vcmRpbmF0ZXMgb25jZSBwZXIgY29vcmRpbmF0ZVxuIiwiaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBUaWxlUHlyYW1pZCBmcm9tICcuL3RpbGVfcHlyYW1pZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBzY2VuZSwgdmlldyB9KSB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMgPSBbXTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgY29vcmRzIG9mIHRpbGVfY29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3Jkc1tjb29yZHMua2V5XSA9IGNvb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2libGUgY29vcmRzIGNoYW5nZWRcbiAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhIG5ldyB2aWV3IG1hbmFnZXIgb2JqZWN0XG4gICAgICAgIGxldCBuZXdfY29vcmRzID0gT2JqZWN0LmtleXModGhpcy52aXNpYmxlX2Nvb3Jkcyk7XG4gICAgICAgIGxldCBjb29yZHNfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocHJldl9jb29yZHMubGVuZ3RoICE9PSBuZXdfY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29vcmRzX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldl9jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgbmV3X2Nvb3Jkcy5zb3J0KCk7XG4gICAgICAgICAgICBpZiAoIXByZXZfY29vcmRzLmV2ZXJ5KChjLCBpKSA9PiBuZXdfY29vcmRzW2ldID09PSBjKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVTdGF0ZXMgKCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUXVldWVkQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm94eVRpbGVzKCk7XG4gICAgICAgIHRoaXMudmlldy5wcnVuZVRpbGVzRm9yVmlldygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3h5VGlsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBwcm94aWVzXG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB0aWxlLnNldFByb3h5Rm9yKG51bGwpKTtcblxuICAgICAgICBsZXQgcHJveHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuem9vbV9kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0ICYmIHRpbGUuY29vcmRzLnogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gdGhpcy5weXJhbWlkLmdldEFuY2VzdG9yKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcygpIHtcbiAgICAgICAgbGV0IHRpbGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW3RdO1xuICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiB0aWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVzO1xuICAgIH1cblxuICAgIGlzTG9hZGluZ1Zpc2libGVUaWxlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLnNvbWUoayA9PiB0aGlzLnRpbGVzW2tdLnZpc2libGUgJiYgIXRoaXMudGlsZXNba10uYnVpbHQpO1xuICAgIH1cblxuICAgIC8vIFF1ZXVlIGEgdGlsZSBmb3IgbG9hZFxuICAgIHF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzW3RoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGhdID0gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHF1ZXVlZCB0aWxlc1xuICAgIGxvYWRRdWV1ZWRDb29yZGluYXRlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgcXVldWVkIHRpbGVzIGZyb20gY2VudGVyIHRpbGVcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYS54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYS55KTtcbiAgICAgICAgICAgIGxldCBiZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYi54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYi55KTtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMuZm9yRWFjaChjb29yZHMgPT4gdGhpcy5sb2FkQ29vcmRpbmF0ZShjb29yZHMpKTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGlsZXMgdG8gY292ZXIgYSBnaXZlbiBsb2dpY2FsIHRpbGUgY29vcmRpbmF0ZVxuICAgIGxvYWRDb29yZGluYXRlKGNvb3Jkcykge1xuICAgICAgICAvLyBTa2lwIGlmIG5vdCBhdCBjdXJyZW50IHNjZW5lIHpvb21cbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG5lY2Vzc2FyeSB0aWxlcyBmb3IgZWFjaCBzb3VyY2VcbiAgICAgICAgZm9yIChsZXQgcyBpbiB0aGlzLnNjZW5lLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNjZW5lLnNvdXJjZXNbc107XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIHNvdXJjZSBzaG91bGQgYnVpbGQgdGhpcyB0aWxlXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgfHwgIXNvdXJjZS5pbmNsdWRlc1RpbGUoY29vcmRzLCB0aGlzLnZpZXcudGlsZV96b29tKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQga2V5ID0gVGlsZS5rZXkoY29vcmRzLCBzb3VyY2UsIHRoaXMudmlldy50aWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5oYXNUaWxlKGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGlsZSA9IFRpbGUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlcjogdGhpcy5zY2VuZS5uZXh0V29ya2VyKCksXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMudmlldy5zdHlsZVpvb20oY29vcmRzLnopLFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLnZpZXdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMua2VlcFRpbGUodGlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFRpbGUodGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGFuZCBidWlsZCBhIGxpc3Qgb2YgdGlsZXNcbiAgICBidWlsZFRpbGVzKHRpbGVzKSB7XG4gICAgICAgIFRpbGUuc29ydCh0aWxlcykuZm9yRWFjaCh0aWxlID0+IHRoaXMuYnVpbGRUaWxlKHRpbGUpKTtcbiAgICAgICAgdGhpcy5jaGVja0J1aWxkUXVldWUoKTtcbiAgICB9XG5cbiAgICBidWlsZFRpbGUodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVCdWlsZFN0YXJ0KHRpbGUua2V5KTtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICB0aWxlLnVwZGF0ZSgpO1xuICAgICAgICB0aWxlLmJ1aWxkKHRoaXMuc2NlbmUuZ2VuZXJhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nIGZvciBhIHNpbmdsZSB0aWxlIChpbml0aWFsIGxvYWQsIG9yIHJlYnVpbGQpXG4gICAgYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkKHsgdGlsZSwgcHJvZ3Jlc3MgfSkge1xuICAgICAgICAvLyBSZW1vdmVkIHRoaXMgdGlsZSBkdXJpbmcgbG9hZD9cbiAgICAgICAgaWYgKHRoaXMudGlsZXNbdGlsZS5rZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgZGlzY2FyZGVkIHRpbGUgJHt0aWxlLmtleX0gaW4gVGlsZU1hbmFnZXIuYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkIGJlY2F1c2UgcHJldmlvdXNseSByZW1vdmVkYCk7XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCdWlsdCB3aXRoIGFuIG91dGRhdGVkIHNjZW5lIGNvbmZpZ3VyYXRpb24/XG4gICAgICAgIGVsc2UgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5zY2VuZS5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIGJ1aWx0IHdpdGggYCArXG4gICAgICAgICAgICAgICAgYHNjZW5lIGNvbmZpZyBnZW4gJHt0aWxlLmdlbmVyYXRpb259LCBjdXJyZW50ICR7dGhpcy5zY2VuZS5nZW5lcmF0aW9ufWApO1xuICAgICAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyBkZWVwIHRvIHNlYXJjaCBmb3IgZGVzY2VuZGFudCBwcm94eSB0aWxlc1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzLmdldChzb3VyY2UubmFtZSkpO1xuICAgIH1cblxuICAgIGFkZFRpbGUodGlsZSkge1xuICAgICAgICAvLyBBZGQgdGFyZ2V0IHRpbGVcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgbGV0IGNvb3JkID0gdGhpcy5jb29yZHNba2V5XTtcbiAgICAgICAgaWYgKCFjb29yZCkge1xuICAgICAgICAgICAgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29yZC5zb3VyY2VzKSB7XG4gICAgICAgICAgICBjb29yZC5zb3VyY2VzID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29yZC5zb3VyY2VzLmdldCh0aWxlLnNvdXJjZS5uYW1lKSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlcy5zZXQodGlsZS5zb3VyY2UubmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb29yZC5zb3VyY2VzLmdldCh0aWxlLnNvdXJjZS5uYW1lKS5zZXQodGlsZS5zdHlsZV96b29tLCB0aWxlKTtcblxuICAgICAgICAvLyBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IHVwID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb29yZHNbdXAua2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW3VwLmtleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldLmRlc2NlbmRhbnRzKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKHRpbGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRhcmdldCB0aWxlXG4gICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKHRpbGUuY29vcmRzLCB0aWxlLnNvdXJjZSk7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG5cbiAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgc291cmNlX3RpbGVzLmRlbGV0ZSh0aWxlLnN0eWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNvdXJjZVxuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2tleV0uc291cmNlcy5kZWxldGUodGlsZS5zb3VyY2UubmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2tleV0uc291cmNlcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2tleV0uZGVzY2VuZGFudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB3aG9sZSBjb29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IGRvd24gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHopO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XSAmJiB0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzLS07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cyA9PT0gMCAmJiAhdGhpcy5jb29yZHNbZG93bi5rZXldLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2Rvd24ua2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbmNlc3RvciAoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSB9KSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPiBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNvb3Jkcywgc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSAtIDE7IHogPj0gc291cmNlLm1heF96b29tOyB6LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcy5oYXMoeikgJiYgc291cmNlX3RpbGVzLmdldCh6KS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VfdGlsZXMuZ2V0KHopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVfem9vbSA9IHNvdXJjZS5tYXhfem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGVzIGF0IG5leHQgem9vbSB1cFxuICAgICAgICBzdHlsZV96b29tLS07XG4gICAgICAgIGxldCBwYXJlbnQgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCBjb29yZHMueiAtIDEpO1xuICAgICAgICBsZXQgcGFyZW50X3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhwYXJlbnQsIHNvdXJjZSk7XG4gICAgICAgIGlmIChwYXJlbnRfdGlsZXMgJiYgcGFyZW50X3RpbGVzLmhhcyhzdHlsZV96b29tKSAmJiBwYXJlbnRfdGlsZXMuZ2V0KHN0eWxlX3pvb20pLmxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudF90aWxlcy5nZXQoc3R5bGVfem9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGZpbmQgYW5jZXN0b3IsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgIC8vIFRPRE86IG1heCBkZXB0aCBsZXZlbHMgdG8gY2hlY2tcbiAgICAgICAgaWYgKHBhcmVudC56ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jZXN0b3IoeyBjb29yZHM6IHBhcmVudCwgc3R5bGVfem9vbSwgc291cmNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVzY2VuZGFudHMgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPj0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlYXJjaF9tYXhfem9vbSA9IE1hdGgubWF4KEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20sIHN0eWxlX3pvb20gKyB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSArIDE7IHogPD0gc2VhcmNoX21heF96b29tOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcy5oYXMoeikgJiYgc291cmNlX3RpbGVzLmdldCh6KS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goc291cmNlX3RpbGVzLmdldCh6KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gZG93blxuICAgICAgICBpZiAodGhpcy5jb29yZHNbY29vcmRzLmtleV0gJiYgdGhpcy5jb29yZHNbY29vcmRzLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICBzdHlsZV96b29tKys7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjaGlsZCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRfdGlsZXMgJiYgY2hpbGRfdGlsZXMuaGFzKHN0eWxlX3pvb20pICYmIGNoaWxkX3RpbGVzLmdldChzdHlsZV96b29tKS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChjaGlsZF90aWxlcy5nZXQoc3R5bGVfem9vbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBjaGlsZCwgdHJ5IG5leHQgbGV2ZWxcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoICYmIGNoaWxkLnogPD0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goLi4udGhpcy5nZXREZXNjZW5kYW50cyh7IGNvb3JkczogY2hpbGQsIHNvdXJjZSwgc3R5bGVfem9vbSB9LCBsZXZlbCArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgfVxuXG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZHJhd3MgYSBibHVlIHJlY3RhbmdsZSBib3JkZXIgYXJvdW5kIHRoZSBjb2xsaXNpb24gYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX2NvbGxpc2lvbl9ib3hlczogZmFsc2UsXG4gICAgLy8gZHJhd3MgYSBncmVlbiByZWN0YW5nbGUgYm9yZGVyIHdpdGhpbiB0aGUgdGV4dHVyZSBib3ggb2YgYSBsYWJlbFxuICAgIGRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlczogZmFsc2UsXG4gICAgLy8gc3VwcHJlc2VzIGZhZGUtaW4gb2YgbGFiZWxzXG4gICAgc3VwcHJlc3NfbGFiZWxfZmFkZV9pbjogZmFsc2Vcbn07XG4iLCJcblxuZXhwb3J0IGNsYXNzIE1ldGhvZE5vdEltcGxlbWVudGVkIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lICAgID0gJ01ldGhvZE5vdEltcGxlbWVudGVkJztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gJ01ldGhvZCAnICsgbWV0aG9kTmFtZSArICcgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcyc7XG4gICAgfVxufVxuIiwiLy8gUGFydGlhbCBpbXBvcnQgb2YgZ2wtbWF0cml4IHZpYSBtb2R1bGFyaXplZCBzdGFjay1nbCBmb3Jrc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc3RhY2tnbFxuXG4vLyB2ZWMzXG5cbi8vIFN1YnN0aXR1dGUgNjQtYml0IHZlcnNpb25cbi8vIFdlIG5lZWQgdGhlIGV4dHJhIHByZWNpc2lvbiB3aGVuIG11bHRpcGx5aW5nIG1hdHJpY2VzIHcvbWVyY2F0b3IgcHJvamVjdGVkIHZhbHVlc1xuY29uc3QgdmVjMyA9IHtcbiAgICBmcm9tVmFsdWVzICh4LCB5LCB6KSB7XG4gICAgICAgIHZhciBvdXQgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xuICAgICAgICBvdXRbMF0gPSB4O1xuICAgICAgICBvdXRbMV0gPSB5O1xuICAgICAgICBvdXRbMl0gPSB6O1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn07XG5cblxuLy8gbWF0M1xuXG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0M19ub3JtYWxGcm9tTWF0NH0gZnJvbSAnZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX2ludmVydH0gZnJvbSAnZ2wtbWF0My9pbnZlcnQnO1xuXG5jb25zdCBtYXQzID0ge1xuICAgIG5vcm1hbEZyb21NYXQ0OiBtYXQzX25vcm1hbEZyb21NYXQ0LFxuICAgIGludmVydDogbWF0M19pbnZlcnRcbn07XG5cblxuLy8gbWF0NFxuXG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9tdWx0aXBseX0gZnJvbSAnZ2wtbWF0NC9tdWx0aXBseSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF90cmFuc2xhdGV9IGZyb20gJ2dsLW1hdDQvdHJhbnNsYXRlJztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3NjYWxlfSBmcm9tICdnbC1tYXQ0L3NjYWxlJztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3BlcnNwZWN0aXZlfSBmcm9tICdnbC1tYXQ0L3BlcnNwZWN0aXZlJztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X2xvb2tBdH0gZnJvbSAnZ2wtbWF0NC9sb29rQXQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfaWRlbnRpdHl9IGZyb20gJ2dsLW1hdDQvaWRlbnRpdHknO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfY29weX0gZnJvbSAnZ2wtbWF0NC9jb3B5JztcblxuY29uc3QgbWF0NCA9IHtcbiAgICBtdWx0aXBseTogbWF0NF9tdWx0aXBseSxcbiAgICB0cmFuc2xhdGU6IG1hdDRfdHJhbnNsYXRlLFxuICAgIHNjYWxlOiBtYXQ0X3NjYWxlLFxuICAgIHBlcnNwZWN0aXZlOiBtYXQ0X3BlcnNwZWN0aXZlLFxuICAgIGxvb2tBdDogbWF0NF9sb29rQXQsXG4gICAgaWRlbnRpdHk6IG1hdDRfaWRlbnRpdHksXG4gICAgY29weTogbWF0NF9jb3B5XG59O1xuXG5cbmV4cG9ydCB7dmVjMywgbWF0MywgbWF0NH07XG4iLCJpbXBvcnQgdmVyc2lvbiBmcm9tICcuL3ZlcnNpb24nO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vd29ya2VyX2Jyb2tlcic7XG5cbmNvbnN0IExFVkVMUyA9IHtcbiAgICBzaWxlbnQ6IC0xLFxuICAgIGVycm9yOiAwLFxuICAgIHdhcm46IDEsXG4gICAgaW5mbzogMixcbiAgICBkZWJ1ZzogMyxcbiAgICB0cmFjZTogNFxufTtcblxuY29uc3QgbWV0aG9kcyA9IHt9O1xuXG5mdW5jdGlvbiBtZXRob2RGb3JMZXZlbCAobGV2ZWwpIHtcbiAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgbWV0aG9kc1tsZXZlbF0gPSBtZXRob2RzW2xldmVsXSB8fCAoY29uc29sZVtsZXZlbF0gPyBjb25zb2xlW2xldmVsXSA6IGNvbnNvbGUubG9nKS5iaW5kKGNvbnNvbGUpO1xuICAgICAgICByZXR1cm4gbWV0aG9kc1tsZXZlbF07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2cgKG1zZ19sZXZlbCwgLi4ubXNnKSB7XG4gICAgaWYgKExFVkVMU1ttc2dfbGV2ZWxdIDw9IExFVkVMU1tsb2cubGV2ZWxdKSB7XG4gICAgICAgIGlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgICAgICAgICAvLyBQcm94eSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdfbG9nUHJveHknLCBtc2dfbGV2ZWwsIC4uLm1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbG9nZ2VyID0gbWV0aG9kRm9yTGV2ZWwobXNnX2xldmVsKTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgdG8gY29uc29sZSAob24gbWFpbiB0aHJlYWQpXG4gICAgICAgICAgICBpZiAobXNnLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYFRhbmdyYW0gJHt2ZXJzaW9ufSBbJHttc2dfbGV2ZWx9XTogJHttc2dbMF19YCwgLi4ubXNnLnNsaWNlKDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxubG9nLmxldmVsID0gJ2luZm8nO1xubG9nLndvcmtlcnMgPSBudWxsO1xuXG5sb2cuc2V0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICBsb2cubGV2ZWwgPSBsZXZlbDtcblxuICAgIGlmIChUaHJlYWQuaXNfbWFpbiAmJiBBcnJheS5pc0FycmF5KGxvZy53b3JrZXJzKSkge1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UobG9nLndvcmtlcnMsICdfbG9nU2V0TGV2ZWxQcm94eScsIGxldmVsKTtcbiAgICB9XG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBsb2cuc2V0V29ya2VycyA9IGZ1bmN0aW9uICh3b3JrZXJzKSB7XG4gICAgICAgIGxvZy53b3JrZXJzID0gd29ya2VycztcbiAgICB9O1xuXG5cbn1cblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnX2xvZ1Byb3h5JywgbG9nKTsgICAgICAgICAgICAgICAgICAgLy8gcHJveHkgbG9nIG1lc3NhZ2VzIGZyb20gd29ya2VyIHRvIG1haW4gdGhyZWFkXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nU2V0TGV2ZWxQcm94eScsIGxvZy5zZXRMZXZlbCk7ICAvLyBwcm94eSBsb2cgbGV2ZWwgc2V0dGluZyBmcm9tIG1haW4gdG8gd29ya2VyIHRocmVhZFxuIiwiLyogZ2xvYmFsIE1lZGlhUmVjb3JkZXIgKi9cbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZWRpYUNhcHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0Q2FudmFzIChjYW52YXMpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNjcmVlbnNob3QsIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2NyZWVuc2hvdCBkYXRhIHdoZW4gYXZhaWxhYmxlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlX3NjcmVlbnNob3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlOyAvLyBvbmx5IGNhcHR1cmUgb25lIHNjcmVlbnNob3QgYXQgYSB0aW1lXG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaWxsIHJlc29sdmUgb25jZSByZW5kZXJpbmcgaXMgY29tcGxldGUgYW5kIHJlbmRlciBidWZmZXIgaXMgY2FwdHVyZWRcbiAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0ge307XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nLCBjYXB0dXJlcyByZW5kZXIgYnVmZmVyIGFuZCByZXNvbHZlcyBwcm9taXNlIHdpdGggdGhlIGltYWdlIGRhdGFcbiAgICBjb21wbGV0ZVNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCBkYXRhIFVSTCwgY29udmVydCB0byBibG9iXG4gICAgICAgICAgICAvLyBTdHJpcCBob3N0L21pbWV0eXBlL2V0Yy4sIGNvbnZlcnQgYmFzZTY0IHRvIGJpbmFyeSB3aXRob3V0IFVURi04IG1hbmdsaW5nXG4gICAgICAgICAgICAvLyBBZGFwdGVkIGZyb206IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3VuY29uZWQvNDM3MDgyMlxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhdG9iKHVybC5zbGljZSgyMikpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIHdpdGggc2NyZWVuc2hvdCBkYXRhXG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucmVzb2x2ZSh7IHVybCwgYmxvYiwgdHlwZTogJ3BuZycgfSk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnRzIGNhcHR1cmluZyBhIHZpZGVvIHN0cmVhbSBmcm9tIHRoZSBjYW52YXNcbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lk1lZGlhUmVjb3JkZXIgIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuY2FudmFzIHx8IHR5cGVvZiB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSAoQ2FudmFzLmNhcHR1cmVTdHJlYW0gYW5kL29yIE1lZGlhUmVjb3JkZXIgQVBJcykgbm90IHN1cHBvcnRlZCBieSBicm93c2VyJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy52aWRlb19jYXB0dXJlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzLCBjYWxsIFNjZW5lLnN0b3BWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY2FwdHVyZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNhcCA9IHRoaXMudmlkZW9fY2FwdHVyZSA9IHt9O1xuICAgICAgICAgICAgY2FwLmNodW5rcyA9IFtdO1xuICAgICAgICAgICAgY2FwLnN0cmVhbSA9IHRoaXMuY2FudmFzLmNhcHR1cmVTdHJlYW0oKTtcbiAgICAgICAgICAgIGNhcC5vcHRpb25zID0geyBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nIH07IC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgZm9ybWF0IG9wdGlvbnNcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKGNhcC5zdHJlYW0sIGNhcC5vcHRpb25zKTtcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgIGNhcC5jaHVua3MucHVzaChldmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIHJlY29yZGluZz8gQ3JlYXRlIHRoZSBmaW5hbCBjYXB0dXJlIGZpbGUgYmxvYlxuICAgICAgICAgICAgICAgIGlmIChjYXAucmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKGNhcC5jaHVua3MsIHsgdHlwZTogY2FwLm9wdGlvbnMubWltZVR5cGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBVdGlscy5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSByZW1vdmUgYWxsIHN0cmVhbSB0cmFja3MsIGFuZCBzZXQgb2JqZWN0cyB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja3MgPSBjYXAuc3RyZWFtLmdldFRyYWNrcygpO1xuICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXAuc3RyZWFtLnJlbW92ZVRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhcC5yZXNvbHZlKHsgdXJsLCBibG9iLCB0eXBlOiAnd2VibScgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsICdTY2VuZSB2aWRlbyBjYXB0dXJlIGZhaWxlZCcsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGNhcHR1cmluZyBhIHZpZGVvIHN0cmVhbSBmcm9tIHRoZSBjYW52YXMsIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmlkZW8gd2hlbiBhdmFpbGFibGVcbiAgICBzdG9wVmlkZW9DYXB0dXJlICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvX2NhcHR1cmUpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdObyBzY2VuZSB2aWRlbyBjYXB0dXJlIGluIHByb2dyZXNzLCBjYWxsIFNjZW5lLnN0YXJ0VmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIGZpbmFsIHN0cmVhbSBpcyBhdmFpbGFibGVcbiAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdG9wIHJlY29yZGluZ1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUubWVkaWFfcmVjb3JkZXIuc3RvcCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZTtcbiAgICB9XG5cbn1cbiIsIi8vIERlZXAvcmVjdXJzaXZlIG1lcmdlIG9mIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGludG8gYSBkZXN0aW5hdGlvbiBvYmplY3RcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyAoZGVzdCwgLi4uc291cmNlcykge1xuICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbc107XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIHRoZSBzb3VyY2UgaW50byB0aGUgZGVzdGluYXRpb24gaWYgaXQgaXMgYSBhIG5vbi1udWxsIGtleS92YWx1ZSBvYmplY3RcbiAgICAgICAgICAgIC8vIChlLmcuIGRvbid0IG1lcmdlIGFycmF5cywgdGhvc2UgYXJlIHRyZWF0ZWQgYXMgc2NhbGFyIHZhbHVlczsgbnVsbCB2YWx1ZXMgd2lsbCBvdmVyd3JpdGUvZXJhc2VcbiAgICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBkZXN0aW5hdGlvbiB2YWx1ZSlcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChkZXN0W2tleV0gIT09IG51bGwgJiYgdHlwZW9mIGRlc3Rba2V5XSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGVzdFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSBtZXJnZU9iamVjdHMoZGVzdFtrZXldLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSBtZXJnZU9iamVjdHMoe30sIHZhbHVlKTsgLy8gZGVzdGluYXRpb24gbm90IGFuIG9iamVjdCwgb3ZlcndyaXRlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBwcmV2aW91cyBkZXN0aW5hdGlvbiB2YWx1ZSBpZiB0aGUgc291cmNlIHByb3BlcnR5IGlzOiBhIHNjYWxhciAobnVtYmVyL3N0cmluZyksXG4gICAgICAgICAgICAvLyBhbiBhcnJheSwgb3IgYSBudWxsIHZhbHVlXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVzdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVbmRlZmluZWQgc291cmNlIHByb3BlcnRpZXMgYXJlIGlnbm9yZWRcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufVxuIiwiaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPQkIge1xuXG4gICAgY29uc3RydWN0b3IgKHgsIHksIGEsIHcsIGgpIHtcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBbdywgaF07XG4gICAgICAgIHRoaXMuYW5nbGUgPSBhO1xuICAgICAgICB0aGlzLmNlbnRyb2lkID0gW3gsIHldO1xuICAgICAgICB0aGlzLnF1YWQgPSBbXTtcbiAgICAgICAgdGhpcy5heGVzID0gW107XG5cbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBtb3ZlIChweCwgcHkpIHtcbiAgICBcdHRoaXMuY2VudHJvaWQgPSBbcHgsIHB5XTtcblxuICAgIFx0dGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBnZXRFeHRlbnQgKCkge1xuICAgIFx0bGV0IGluZiA9IDFlNjtcbiAgICBcdGxldCBhYWJiID0gW2luZiwgaW5mLCAtaW5mLCAtaW5mXTtcblxuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGFhYmJbMF0gPSBNYXRoLm1pbih0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMF0pO1xuICAgICAgICAgICAgYWFiYlsxXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVsxXSwgYWFiYlsxXSk7XG4gICAgICAgICAgICBhYWJiWzJdID0gTWF0aC5tYXgodGhpcy5xdWFkW2ldWzBdLCBhYWJiWzJdKTtcbiAgICAgICAgICAgIGFhYmJbM10gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMV0sIGFhYmJbM10pO1xuICAgIFx0fVxuXG4gICAgXHRyZXR1cm4gYWFiYjtcbiAgICB9XG5cbiAgICBwZXJwQXhlcyAoKSB7XG4gICAgXHR0aGlzLmF4ZXNbMF0gPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5zdWIodGhpcy5xdWFkWzJdLCB0aGlzLnF1YWRbM10pKTtcbiAgICBcdHRoaXMuYXhlc1sxXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFsxXSkpO1xuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgXHRsZXQgeCA9IFsgTWF0aC5jb3ModGhpcy5hbmdsZSksIE1hdGguc2luKHRoaXMuYW5nbGUpXTtcbiAgICBcdGxldCB5ID0gWy1NYXRoLnNpbih0aGlzLmFuZ2xlKSwgTWF0aC5jb3ModGhpcy5hbmdsZSldO1xuXG4gICAgXHR4ID0gVmVjdG9yLm11bHQoeCwgdGhpcy5kaW1lbnNpb25bMF0gLyAyLjApO1xuICAgIFx0eSA9IFZlY3Rvci5tdWx0KHksIHRoaXMuZGltZW5zaW9uWzFdIC8gMi4wKTtcblxuICAgIFx0dGhpcy5xdWFkWzBdID0gVmVjdG9yLnN1YihWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gbG93ZXItbGVmdFxuICAgIFx0dGhpcy5xdWFkWzFdID0gVmVjdG9yLnN1YihWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gbG93ZXItcmlnaHRcbiAgICBcdHRoaXMucXVhZFsyXSA9IFZlY3Rvci5hZGQoVmVjdG9yLmFkZCh0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIHVwZXItcmlnaHRcbiAgICBcdHRoaXMucXVhZFszXSA9IFZlY3Rvci5hZGQoVmVjdG9yLnN1Yih0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIHVwZXItbGVmdFxuXG4gICAgXHR0aGlzLnBlcnBBeGVzKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHByb2plY3RUb0F4aXMgKG9iYiwgYXhpcykge1xuICAgIFx0bGV0IGluZiA9IDFlNjtcbiAgICBcdGxldCBtaW4gPSBpbmY7XG4gICAgXHRsZXQgbWF4ID0gLWluZjtcblxuICAgIFx0bGV0IHF1YWQgPSBvYmIucXVhZDtcblxuICAgIFx0Ly8gZm9yIGVhY2ggYXhpcywgcHJvamVjdCBvYmIgcXVhZCB0byBpdCBhbmQgZmluZCBtaW4gYW5kIG1heCB2YWx1ZXNcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgZCA9ICBWZWN0b3IuZG90KHF1YWRbaV0sIGF4aXMpO1xuICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBkKTtcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZCk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBbbWluLCBtYXhdO1xuICAgIH1cblxuICAgIHN0YXRpYyBheGlzQ29sbGlkZSAob2JiX2EsIG9iYl9iLCBheGVzKSB7XG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgIFx0XHRsZXQgYV9wcm9qID0gT0JCLnByb2plY3RUb0F4aXMob2JiX2EsIGF4ZXNbaV0pO1xuICAgIFx0XHRsZXQgYl9wcm9qID0gT0JCLnByb2plY3RUb0F4aXMob2JiX2IsIGF4ZXNbaV0pO1xuXG4gICAgXHRcdGlmIChiX3Byb2pbMF0gPiBhX3Byb2pbMV0gfHwgYl9wcm9qWzFdIDwgYV9wcm9qWzBdKSB7XG4gICAgXHRcdFx0cmV0dXJuIGZhbHNlO1xuICAgIFx0XHR9XG4gICAgXHR9XG4gICAgXHRyZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJzZWN0KG9iYl9hLCBvYmJfYikge1xuICAgIFx0cmV0dXJuIE9CQi5heGlzQ29sbGlkZShvYmJfYSwgb2JiX2IsIG9iYl9hLmF4ZXMpICYmIE9CQi5heGlzQ29sbGlkZShvYmJfYSwgb2JiX2IsIG9iYl9iLmF4ZXMpO1xuICAgIH1cblxufVxuXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJzY3JpYmVNaXhpbiAodGFyZ2V0KSB7XG5cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcblxuICAgICAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZUFsbCgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFzU3Vic2NyaWJlcnNGb3IoZXZlbnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbn1cbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIE1hcmsgdGhyZWFkIGFzIG1haW4gb3Igd29ya2VyXG5jb25zdCBUaHJlYWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgVGhyZWFkO1xuXG50cnkge1xuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQgIT09IEhUTUxEb2N1bWVudCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IGZhbHNlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gdHJ1ZTtcbiAgICB9XG59XG5jYXRjaCAoZSkge1xuICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IHRydWU7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSBmYWxzZTtcblxuICAgICAgICAvLyBQYXRjaCBmb3IgM3JkIHBhcnR5IGxpYnMgdGhhdCByZXF1aXJlIHRoZXNlIGdsb2JhbHMgdG8gYmUgcHJlc2VudC4gU3BlY2lmaWNhbGx5LCBGb250RmFjZU9ic2VydmVyLlxuICAgICAgICAvLyBCcml0dGxlIHNvbHV0aW9uIGJ1dCBhbGxvd3MgdGhhdCBsaWJyYXJ5IHRvIGxvYWQgb24gd29ya2VyIHRocmVhZHMuXG4gICAgICAgIHNlbGYud2luZG93ID0geyBkb2N1bWVudDoge30gfTtcbiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYud2luZG93LmRvY3VtZW50O1xuICAgIH1cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzXG4vKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxudmFyIFV0aWxzO1xuZXhwb3J0IGRlZmF1bHQgVXRpbHMgPSB7fTtcblxuLy8gQWRkIGEgYmFzZSBVUkwgZm9yIHNjaGVtZWxlc3Mgb3IgcHJvdG9jb2wtbGVzcyBVUkxzXG4vLyBEZWZhdWx0cyB0byBhZGRpbmcgY3VycmVudCB3aW5kb3cgcHJvdG9jb2wgYW5kIGJhc2UsIG9yIGFkZHMgYSBjdXN0b20gYmFzZSBpZiBzcGVjaWZpZWRcbi8vIE1heWJlIHVzZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcyBpZiBtb3JlIHJvYnVzdCBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZFxuVXRpbHMuYWRkQmFzZVVSTCA9IGZ1bmN0aW9uICh1cmwsIGJhc2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NoZW1lbGVzcywgYWRkIHByb3RvY29sXG4gICAgaWYgKHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpIHtcbiAgICAgICAgdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgdXJsO1xuICAgIH1cbiAgICAvLyBObyBodHRwKHMpIG9yIGRhdGEsIGFkZCBiYXNlXG4gICAgZWxzZSBpZiAodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPCAwKSB7XG4gICAgICAgIHZhciByZWxhdGl2ZSA9ICh1cmxbMF0gIT09ICcvJyk7XG4gICAgICAgIHZhciBiYXNlX2luZm87XG4gICAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7IC8vIHVzZSBhIHRlbXBvcmFyeSBlbGVtZW50IHRvIHBhcnNlIFVSTFxuICAgICAgICAgICAgYmFzZV9pbmZvLmhyZWYgPSBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IFV0aWxzLnBhdGhGb3JVUkwoYmFzZV9pbmZvLmhyZWYpO1xuICAgICAgICAgICAgdXJsID0gcGF0aCArIHVybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVhc3kgd2F5XG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VfaW5mby5vcmlnaW4gKyAnLycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYXJkIHdheSAoSUUxMSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW4gPSB1cmwubWF0Y2goL14oKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTpcXC9cXC9bXlxcL10qXFwvKS8pO1xuICAgICAgICAgICAgICAgIG9yaWdpbiA9IChvcmlnaW4gJiYgb3JpZ2luLmxlbmd0aCA+IDEpID8gb3JpZ2luWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgdXJsID0gb3JpZ2luICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59O1xuXG5VdGlscy5wYXRoRm9yVVJMID0gZnVuY3Rpb24gKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuc2VhcmNoKC9eKGRhdGF8YmxvYik6LykgPT09IC0xKSB7XG4gICAgICAgIGxldCBxcyA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChxcyA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIHFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNoID0gdXJsLmluZGV4T2YoJyMnKTtcbiAgICAgICAgaWYgKGhhc2ggPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBoYXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSkgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5cblV0aWxzLmlzUmVsYXRpdmVVUkwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICEodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPiAtMSB8fCB1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKTtcbn07XG5cbi8vIFJlc29sdmVzICcuLycgYW5kICcuLi8nIGNvbXBvbmVudHMgZnJvbSByZWxhdGl2ZSBwYXRoLCB0byBnZXQgYSBcImZsYXR0ZW5lZFwiIHBhdGhcblV0aWxzLmZsYXR0ZW5SZWxhdGl2ZVVSTCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBsZXQgZGlycyA9ICh1cmwgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgZm9yIChsZXQgZCA9IDE7IGQgPCBkaXJzLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGlmIChkaXJzW2RdID09PSAnLicpIHtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQsIDEpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcnNbZF0gPT09ICcuLicpIHtcbiAgICAgICAgICAgIGQgPSBkICsgMDtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQtMSwgMik7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnMuam9pbignLycpO1xufTtcblxuVXRpbHMuZXh0ZW5zaW9uRm9yVVJMID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHVybCA9IHVybC5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGxldCBsYXN0X2RvdCA9IHVybC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0X2RvdCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGxhc3RfZG90ICsgMSk7XG4gICAgfVxufTtcblxuLy8gQWRkIGEgc2V0IG9mIHF1ZXJ5IHN0cmluZyBwYXJhbXMgdG8gYSBVUkxcbi8vIHBhcmFtczogaGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnNcblV0aWxzLmFkZFBhcmFtc1RvVVJMID0gZnVuY3Rpb24gKHVybCwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICB2YXIgcXNfaW5kZXggPSB1cmwuaW5kZXhPZignPycpO1xuICAgIHZhciBoYXNoX2luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcblxuICAgIC8vIFNhdmUgYW5kIHRyaW0gaGFzaFxuICAgIHZhciBoYXNoID0gJyc7XG4gICAgaWYgKGhhc2hfaW5kZXggPiAtMSkge1xuICAgICAgICBoYXNoID0gdXJsLnNsaWNlKGhhc2hfaW5kZXgpO1xuICAgICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaF9pbmRleCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcXVlcnkgc3RyaW5nXG4gICAgaWYgKHFzX2luZGV4ID09PSAtMSkge1xuICAgICAgICBxc19pbmRleCA9IHVybC5sZW5ndGg7XG4gICAgICAgIHVybCArPSAnPyc7XG4gICAgfVxuICAgIHFzX2luZGV4Kys7IC8vIGFkdmFuY2VkIHBhc3QgJz8nXG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmcgcGFyYW1zXG4gICAgdmFyIHVybF9wYXJhbXMgPSAnJztcbiAgICBmb3IgKHZhciBwIGluIHBhcmFtcykge1xuICAgICAgICB1cmxfcGFyYW1zICs9IGAke3B9PSR7cGFyYW1zW3BdfSZgO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBuZXcgcXVlcnkgc3RyaW5nIHBhcmFtcyBhbmQgcmVzdG9yZSBoYXNoXG4gICAgLy8gTk9URTogZG9lc24ndCByZXBsYWNlIGFueSB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50IG9uIHF1ZXJ5IHN0cmluZywganVzdCBpbnNlcnRzIGR1cGUgdmFsdWVzXG4gICAgdXJsID0gdXJsLnNsaWNlKDAsIHFzX2luZGV4KSArIHVybF9wYXJhbXMgKyB1cmwuc2xpY2UocXNfaW5kZXgpICsgaGFzaDtcblxuICAgIHJldHVybiB1cmw7XG59O1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cbi8vIFBvbHlmaWxsIChmb3IgU2FmYXJpIGNvbXBhdGliaWxpdHkpXG5VdGlscy5fY3JlYXRlT2JqZWN0VVJMID0gdW5kZWZpbmVkO1xuVXRpbHMuY3JlYXRlT2JqZWN0VVJMID0gZnVuY3Rpb24gKHVybCkge1xuICAgIGlmIChVdGlscy5fY3JlYXRlT2JqZWN0VVJMID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgVXRpbHMuX2NyZWF0ZU9iamVjdFVSTCA9ICh3aW5kb3cuVVJMICYmIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKSB8fCAod2luZG93LndlYmtpdFVSTCAmJiB3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBVdGlscy5fY3JlYXRlT2JqZWN0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBVdGlscy5fY3JlYXRlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCAob3IgdmVuZG9yIHByZWZpeCkgbm90IGZvdW5kLCB1bmFibGUgdG8gY3JlYXRlIGxvY2FsIGJsb2IgVVJMc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFV0aWxzLl9jcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLl9jcmVhdGVPYmplY3RVUkwodXJsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufTtcblxuVXRpbHMuaW8gPSBmdW5jdGlvbiAodXJsLCB0aW1lb3V0ID0gNjAwMDAsIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JywgbWV0aG9kID0gJ0dFVCcsIGhlYWRlcnMgPSB7fSkge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHJlcXVlc3QudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlO1xuICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKFsndGV4dCcsICdqc29uJ10uaW5kZXhPZihyZXF1ZXN0LnJlc3BvbnNlVHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1JlcXVlc3QgZXJyb3Igd2l0aCBhIHN0YXR1cyBvZiAnICsgcmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldnQpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChFcnJvcignVGhlcmUgd2FzIGEgbmV0d29yayBlcnJvcicgKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IChldnQpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChFcnJvcigndGltZW91dCAnKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCAncmVxdWVzdCcsIHtcbiAgICAgICAgdmFsdWU6IHJlcXVlc3RcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xufTtcblxuVXRpbHMucGFyc2VSZXNvdXJjZSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8ganN5YW1sICdqc29uJyBvcHRpb24gYWxsb3dzIGR1cGxpY2F0ZSBrZXlzXG4gICAgICAgIC8vIEtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBzaG91bGQgY29uc2lkZXIgbWlncmF0aW5nIHRvIHJlcXVpcmluZ1xuICAgICAgICAvLyB1bmlxdWUga2V5cywgYXMgdGhpcyBpcyBZQU1MIHNwZWMuIEJ1dCBUYW5ncmFtIEVTIGN1cnJlbnRseSBhY2NlcHRzIGR1cGUga2V5cyBhcyB3ZWxsLFxuICAgICAgICAvLyBzbyBzaG91bGQgY29uc2lkZXIgaG93IGJlc3QgdG8gdW5pZnkuXG4gICAgICAgIGRhdGEgPSB5YW1sLnNhZmVMb2FkKGJvZHksIHsganNvbjogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufTtcblxuVXRpbHMubG9hZFJlc291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgVXRpbHMuaW8oc291cmNlKS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBVdGlscy5wYXJzZVJlc291cmNlKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBOZWVkZWQgZm9yIG9sZGVyIGJyb3dzZXJzIHRoYXQgc3RpbGwgc3VwcG9ydCBXZWJHTCAoU2FmYXJpIDYgZXRjLilcblV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIDEwMDAgLzYwKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gU3RyaW5naWZ5IGFuIG9iamVjdCBpbnRvIEpTT04sIGJ1dCBjb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG5VdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrLCB2KSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59O1xuXG4vLyBSZWN1cnNpdmVseSBwYXJzZSBhbiBvYmplY3QsIGF0dGVtcHRpbmcgdG8gY29udmVydCBzdHJpbmcgcHJvcGVydGllcyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMgYmFjayBpbnRvIGZ1bmN0aW9uc1xuVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zID0gZnVuY3Rpb24ob2JqLCB3cmFwKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqID0gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihvYmosIHdyYXApO1xuICAgIH1cbiAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgb2JqW3BdID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKG9ialtwXSwgd3JhcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIENvbnZlcnQgc3RyaW5nIGJhY2sgaW50byBhIGZ1bmN0aW9uXG5VdGlscy5zdHJpbmdUb0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsLCB3cmFwKSB7XG4gICAgLy8gUGFyc2UgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBib2R5XG4gICAgbGV0IGZtYXRjaCA9XG4gICAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgdmFsLm1hdGNoKC9eXFxzKmZ1bmN0aW9uW14oXSpcXCgoW14pXSopXFwpXFxzKj9cXHsoW1xcc1xcU10qKVxcfSQvbSk7XG5cbiAgICBpZiAoZm1hdGNoICYmIGZtYXRjaC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3JjID0gZm1hdGNoWzJdO1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBmbWF0Y2hbMV0ubGVuZ3RoID4gMCAmJiBmbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5sZW5ndGggPiAwID8gYXJncyA6IFsnY29udGV4dCddOyAvLyBkZWZhdWx0IHRvIHNpbmdsZSAnY29udGV4dCcgYXJndW1lbnRcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCB3cmFwKHNyYykpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgc3JjKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGZhbGwtYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBpZiBwYXJzaW5nIGZhaWxlZFxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gRGVmYXVsdCB0byBhbGxvd2luZyBoaWdoIHBpeGVsIGRlbnNpdHlcbi8vIFJldHVybnMgdHJ1ZSBpZiBkaXNwbGF5IGRlbnNpdHkgY2hhbmdlZFxuVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gdHJ1ZTtcblV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXYgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gKFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbiAgICByZXR1cm4gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICE9PSBwcmV2O1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xufVxuXG4vLyBHZXQgVVJMIHRoYXQgdGhlIGN1cnJlbnQgc2NyaXB0IHdhcyBsb2FkZWQgZnJvbVxuLy8gSWYgY3VycmVudFNjcmlwdCBpcyBub3QgYXZhaWxhYmxlLCBsb29wcyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIHNlYXJjaGluZyBmb3IgYSBsaXN0IG9mIHByb3ZpZGVkIHBhdGhzXG4vLyBlLmcuIFV0aWxzLmZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5VdGlscy5maW5kQ3VycmVudFVSTCA9IGZ1bmN0aW9uICguLi5wYXRocykge1xuICAgIC8vIEZpbmQgY3VycmVudGx5IGV4ZWN1dGluZyBzY3JpcHRcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcbiAgICBpZiAoc2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBzY3JpcHQuc3JjO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkge1xuICAgICAgICAvLyBGYWxsYmFjayBvbiBsb29waW5nIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgaWYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgICAgICBmb3IgKHZhciBzPTA7IHMgPCBzY3JpcHRzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbc10uc3JjLmluZGV4T2YocGF0aCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHRzW3NdLnNyYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBVc2VkIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBwb3dlci1vZi0yIGFuZCBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuLy8gVmlhOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuVXRpbHMuaXNQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMDtcbn07XG5cblV0aWxzLm5leHRQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGguY2VpbChNYXRoLmxvZzIodmFsdWUpKSk7XG59O1xuXG4vLyBJbnRlcnBvbGF0ZSAneCcgYWxvbmcgYSBzZXJpZXMgb2YgY29udHJvbCBwb2ludHNcbi8vICdwb2ludHMnIGlzIGFuIGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzIGluIHRoZSBmb3JtIFt4LCB5XVxuLy9cbi8vIEV4YW1wbGU6XG4vLyAgICAgQ29udHJvbCBwb2ludHM6XG4vLyAgICAgICAgIFswLCA1XTogIHdoZW4geD0wLCB5PTVcbi8vICAgICAgICAgWzQsIDEwXTogd2hlbiB4PTQsIHk9MTBcbi8vXG4vLyAgICAgVXRpbHMuaW50ZXJwb2xhdGUoMiwgW1swLCA1XSwgWzQsIDEwXV0pO1xuLy8gICAgIC0+IGNvbXB1dGVzIHg9MiwgaGFsZndheSBiZXR3ZWVuIHg9MCBhbmQgeD00OiAoMTAgLSA1KSAvIDIgKzVcbi8vICAgICAtPiByZXR1cm5zIDcuNVxuLy9cbi8vIFRPRE86IGFkZCBvdGhlciBpbnRlcnBvbGF0aW9uIG1ldGhvZHMgYmVzaWRlcyBsaW5lYXJcbi8vXG5VdGlscy5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgsIHBvaW50cywgdHJhbnNmb3JtKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHJlc2VtYmxlIGEgbGlzdCBvZiBjb250cm9sIHBvaW50cywganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBvaW50cykgfHwgIUFycmF5LmlzQXJyYXkocG9pbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2ludHMubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cblxuICAgIHZhciB4MSwgeDIsIGQsIHksIHkxLCB5MjtcblxuICAgIC8vIE1pbiBib3VuZHNcbiAgICBpZiAoeCA8PSBwb2ludHNbMF1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1swXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWF4IGJvdW5kc1xuICAgIGVsc2UgaWYgKHggPj0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaW5kIHdoaWNoIGNvbnRyb2wgcG9pbnRzIHggaXMgYmV0d2VlblxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoeCA+PSBwb2ludHNbaV1bMF0gJiYgeCA8IHBvaW50c1tpKzFdWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZWFyIGludGVycG9sYXRpb25cbiAgICAgICAgICAgICAgICB4MSA9IHBvaW50c1tpXVswXTtcbiAgICAgICAgICAgICAgICB4MiA9IHBvaW50c1tpKzFdWzBdO1xuXG4gICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgdmFsdWVzXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocG9pbnRzW2ldWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHBvaW50c1tpXVsxXS5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV1bY10gLSBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgdmFsdWVcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXSAtIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHk7XG59O1xuXG4vLyBJdGVyYXRvcnMgKEVTNiBnZW5lcmF0b3JzKVxuXG4vLyBJdGVyYXRvciBmb3Iga2V5L3ZhbHVlIHBhaXJzIG9mIGFuIG9iamVjdFxuVXRpbHMuZW50cmllcyA9IGZ1bmN0aW9uKiAob2JqKSB7XG4gICAgZm9yICh2YXIga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgeWllbGQgW2tleSwgb2JqW2tleV1dO1xuICAgIH1cbn07XG5cbi8vIEl0ZXJhdG9yIGZvciB2YWx1ZXMgb2YgYW4gb2JqZWN0XG5VdGlscy52YWx1ZXMgPSBmdW5jdGlvbiogKG9iaikge1xuICAgIGZvciAodmFyIGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgIHlpZWxkIG9ialtrZXldO1xuICAgIH1cbn07XG5cbi8vIFJlY3Vyc2l2ZSBpdGVyYXRvcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCwgbm8gbWF0dGVyIGhvdyBkZWVwbHkgbmVzdGVkXG4vLyBUT0RPOiBmaXggZm9yIGNpcmN1bGFyIHN0cnVjdHVyZXNcblV0aWxzLnJlY3Vyc2VFbnRyaWVzID0gZnVuY3Rpb24qIChvYmopIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgIGlmIChvYmpba2V5XSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgb2JqW2tleV0sIG9ial07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBVdGlscy5yZWN1cnNlRW50cmllcyhvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5VdGlscy5yZWN1cnNlVmFsdWVzID0gZnVuY3Rpb24qIChvYmopIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgIGlmIChvYmpba2V5XSkge1xuICAgICAgICAgICAgeWllbGQgb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBVdGlscy5yZWN1cnNlVmFsdWVzKG9ialtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblV0aWxzLnJhZFRvRGVnID0gZnVuY3Rpb24gKHJhZGlhbnMpIHtcbiAgICByZXR1cm4gcmFkaWFucyAqIDE4MCAvIE1hdGguUEk7XG59O1xuXG5VdGlscy50b0NTU0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgaWYgKGNvbG9yWzNdID09PSAxKSB7IC8vIGZ1bGwgb3BhY2l0eVxuICAgICAgICByZXR1cm4gYHJnYigke2NvbG9yLnNsaWNlKDAsIDMpLm1hcChjID0+IE1hdGgucm91bmQoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIC8vIFJHQiBpcyBiZXR3ZWVuIFswLCAyNTVdIG9wYWNpdHkgaXMgYmV0d2VlbiBbMCwgMV1cbiAgICByZXR1cm4gYHJnYmEoJHtjb2xvci5tYXAoKGMsIGkpID0+IChpIDwgMyAmJiBNYXRoLnJvdW5kKGMgKiAyNTUpKSB8fCBjKS5qb2luKCcsICcpfSlgO1xufTtcblxuVXRpbHMucG9pbnRJblRpbGUgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnRbMF0gPj0gMCAmJsKgcG9pbnRbMV0gPiAtR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMF0gPCBHZW8udGlsZV9zY2FsZSAmJiBwb2ludFsxXSA8PSAwO1xufTtcblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NjE2NDYxL2dlbmVyYXRlLWEtaGFzaC1mcm9tLXN0cmluZy1pbi1qYXZhc2NyaXB0LWpxdWVyeVxuVXRpbHMuaGFzaFN0cmluZyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBsZXQgaGFzaCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxldCBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgICBoYXNoIHw9IDA7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufTtcblxuVXRpbHMuZGVib3VuY2UgPSBmdW5jdGlvbiAoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMsXG4gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSB7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCJsZXQgZnMgPSByZXF1aXJlKCdmcycpO1xubGV0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vLi4vcGFja2FnZS5qc29uJywgJ3V0ZjgnKSk7XG5sZXQgdmVyc2lvbjtcbmV4cG9ydCBkZWZhdWx0IHZlcnNpb24gPSAndicgKyBwa2cudmVyc2lvbjtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIFdvcmtlckJyb2tlciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiB3ZWIgd29ya2VycyBhbmQgdGhlIG1haW4gdGhyZWFkLCBhbGxvd2luZyBmb3Igc2ltcGxlclxuLy8gYXN5bmMgY29kZSB2aWEgcHJvbWlzZXMuIEV4YW1wbGUgdXNhZ2U6XG4vL1xuLy8gSW4gd2ViIHdvcmtlciwgcmVnaXN0ZXIgc2VsZiBhcyBhIGNhbGxhYmxlIFwidGFyZ2V0XCIsIGFuZCBkZWZpbmUgYSBtZXRob2Q6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcbi8vXG4vLyAgICAgc2VsZi5zcXVhcmUgPSBmdW5jdGlvbiAoeCkge1xuLy8gICAgICAgICByZXR1cm4geCAqIHg7XG4vLyAgICAgfTtcbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgaW52b2tlIHRoYXQgbWV0aG9kIGFuZCByZWNlaXZlIHRoZSByZXN1bHQgKGlmIGFueSkgYXMgYSBwcm9taXNlLlxuLy9cbi8vICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKC4uLik7XG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFdvcmtlcih3b3JrZXIpO1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5zcXVhcmUnLCA1KS50aGVuKGZ1bmN0aW9uKHkpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coeSk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyAyNVxuLy9cbi8vIEFzeW5jIGNvZGU6XG4vL1xuLy8gRm9yIHN5bmNocm9ub3VzIGNvZGUgdGhhdCBtdXN0IHBhc3MgYSByZXR1cm4gdmFsdWUgdG8gdGhlIG1haW4gdGhyZWFkLCB0aGUgZnVuY3Rpb24gY2FuIHNpbXBseVxuLy8gcmV0dXJuIGFuIGltbWVkaWF0ZSB2YWx1ZSAoc2VlIGV4YW1wbGUgYWJvdmUpLiBGb3IgY2FzZXMgd2hlcmUgdGhlIHdvcmtlciBtZXRob2QgbmVlZHMgdG8gcnVuXG4vLyBhc3luY2hyb25vdXMgY29kZSwgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSBwcm9taXNlLCBhbmQgdGhlIHJlc29sdmVkIG9yIHJlamVjdGVkIHZhbHVlIHdpbGxcbi8vIGJlIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgd2hlbiB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQuXG4vL1xuLy8gRXJyb3IgaGFuZGxpbmc6XG4vL1xuLy8gSWYgdGhlIHdvcmtlciBtZXRob2QgZWl0aGVyIHRocm93cyBhbiBlcnJvciwgb3IgcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCwgaXQgd2lsbCBiZVxuLy8gc2VudCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCBhcyBhIHByb21pc2UgcmVqZWN0aW9uLiBUaGVzZSB0d28gZXhhbXBsZXMgYXJlIGVxdWl2YWxlbnQ6XG4vL1xuLy8gICAgIEluIHdvcmtlciwgdGhyb3dpbmcgYW4gZXJyb3I6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgaW4gd29ya2VyIScpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiB3b3JrZXIsIHJldHVybmluZyBhIHJlamVjdGVkIHByb21pc2U6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKSk7XG4vLyAgICAgICAgIH07XG4vL1xuLy8gICAgIEluIG1haW4gdGhyZWFkLCBib3RoIGVycm9ycyBhcmUgcmVjZWl2ZWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbjpcbi8vXG4vLyAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLmJyb2tlbicpLnRoZW4oXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3VjY2VzcyEnKTtcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlamVjdGVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbihlcnJvcikge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciEnLCBlcnJvcik7XG4vLyAgICAgICAgICAgICB9KTtcbi8vXG4vLyAgICAgICAgIC0+IHByaW50cyAnZXJyb3IhIGVycm9yIGluIHdvcmtlcidcbi8vXG4vLyBDYWxsaW5nIGZyb20gd29ya2VyIHRvIG1haW4gdGhyZWFkOlxuLy9cbi8vIFRoZSBzYW1lIHN0eWxlIG9mIGNhbGxzIGNhbiBiZSBtYWRlICpmcm9tKiBhIHdlYiB3b3JrZXIsIHRvIHRoZSBtYWluIHRocmVhZC4gVGhlIEFQSSBpcyB0aGUgc2FtZVxuLy8gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50LCAnd29ya2VyJywgaXMgbm90IG5lZWRlZCBmb3IgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCksXG4vLyBzaW5jZSB0aGUgbWFpbiB0aHJlYWQgaXMgdGhlIGltcGxpY2l0IHRhcmdldC5cbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgZGVmaW5lIGEgbWV0aG9kIGFuZCByZWdpc3RlciBpdDpcbi8vXG4vLyAgICAgdmFyIGdlb21ldHJ5ID0ge1xuLy8gICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uKHgsIHkpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4vLyAgICAgICAgIH1cbi8vICAgICB9O1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdnZW9tZXRyeScsIGdlb21ldHJ5KTtcbi8vXG4vLyBJbiB3b3JrZXIgdGhyZWFkKTpcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdnZW9tZXRyeS5sZW5ndGgnLCAzLCA0KS50aGVuKGZ1bmN0aW9uKGQpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coZCk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyA1XG4vL1xuXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG52YXIgV29ya2VyQnJva2VyO1xuZXhwb3J0IGRlZmF1bHQgV29ya2VyQnJva2VyID0ge307XG5cbi8vIEdsb2JhbCBsaXN0IG9mIGFsbCB3b3JrZXIgbWVzc2FnZXNcbi8vIFVuaXF1ZWx5IHRyYWNrcyBldmVyeSBjYWxsIG1hZGUgYmV0d2VlbiBtYWluIHRocmVhZCBhbmQgYSB3b3JrZXJcbnZhciBtZXNzYWdlX2lkID0gMDtcbnZhciBtZXNzYWdlcyA9IHt9O1xuXG4vLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBjYWxscyBmcm9tIG90aGVyIHRocmVhZFxudmFyIHRhcmdldHMgPSB7fTtcbldvcmtlckJyb2tlci5hZGRUYXJnZXQgPSBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0c1tuYW1lXSA9IHRhcmdldDtcbn07XG5cbi8vIEdpdmVuIGEgZG90LW5vdGF0aW9uLXN0eWxlIG1ldGhvZCBuYW1lLCBlLmcuICdPYmplY3Qub2JqZWN0Lm1ldGhvZCcsXG4vLyBmaW5kIHRoZSBvYmplY3QgdG8gY2FsbCB0aGUgbWV0aG9kIG9uIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB0YXJnZXRzXG5mdW5jdGlvbiBmaW5kVGFyZ2V0IChtZXRob2QpIHtcbiAgICB2YXIgY2hhaW4gPSBbXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hhaW4gPSBtZXRob2Quc3BsaXQoJy4nKTtcbiAgICAgICAgbWV0aG9kID0gY2hhaW4ucG9wKCk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldCA9IHRhcmdldHM7XG5cbiAgICBmb3IgKGxldCBtPTA7IG0gPCBjaGFpbi5sZW5ndGg7IG0rKykge1xuICAgICAgICBpZiAodGFyZ2V0W2NoYWluW21dXSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2NoYWluW21dXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWV0aG9kLCB0YXJnZXRdO1xufVxuXG4vLyBNYWluIHRocmVhZDpcbi8vIC0gU2VuZCBtZXNzYWdlcyB0byB3b3JrZXJzLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuLy8gLSBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBNYWluVGhyZWFkICgpIHtcblxuICAgIHZhciB3b3JrZXJfaWQgPSAwO1xuICAgIHZhciB3b3JrZXJzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gYSB3b3JrZXIsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZVxuICAgIC8vIEFyZ3VtZW50czpcbiAgICAvLyAgIC0gd29ya2VyOiBvbmUgb3IgbW9yZSB3ZWIgd29ya2VyIGluc3RhbmNlcyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIChzaW5nbGUgdmFsdWUgb3IgYXJyYXkpXG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgaW4gdGhlIHdvcmtlclxuICAgIC8vICAgLSBtZXNzYWdlOiBzcHJlYWQgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gICAgLy8gUmV0dXJuczpcbiAgICAvLyAgIC0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgaWYgdGhlIHdvcmtlciBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAod29ya2VyLCBtZXRob2QsIC4uLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSB3b3JrZXIgc3BlY2lmaWVkLCBwb3N0IHRvIG11bHRpcGxlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHdvcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB3b3JrZXIubWFwKHcgPT4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHcsIG1ldGhvZCwgLi4ubWVzc2FnZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgc3RhdGUgb2YgdGhpcyBtZXNzYWdlXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV9pZF0gPSB7IG1ldGhvZCwgbWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlWzBdIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gbWVzc2FnZVswXS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdHlwZTogJ21haW5fc2VuZCcsICAgICAgLy8gbWFyayBtZXNzYWdlIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgZnVuY3Rpb24gb2YgdGhpcyBuYW1lIHdpdGhpbiB0aGUgd29ya2VyXG4gICAgICAgICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBheWxvYWRcbiAgICAgICAgfTtcblxuICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGEgd29ya2VyIHRvIGNvbW11bmljYXRlIHdpdGggLSBlYWNoIHdvcmtlciBtdXN0IGJlIHJlZ2lzdGVyZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWRcbiAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICBpZiAoISh3b3JrZXIgaW5zdGFuY2VvZiBXb3JrZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgYWRkIG5vbi1Xb3JrZXIgb2JqZWN0YCwgd29ya2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHJlZ2lzdGVyZWQgd29ya2Vyc1xuICAgICAgICB3b3JrZXJzLnNldCh3b3JrZXIsIHdvcmtlcl9pZCsrKTtcblxuICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlck1haW5UaHJlYWRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGNvbWluZyBiYWNrIGZyb20gdGhlIHdvcmtlciwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9yZXBseScpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgaW5pdGlhdGluZyBhIGNhbGwgZnJvbSB0aGUgd29ya2VyLCBkaXNwYXRjaCB0aGVtLFxuICAgICAgICAgICAgLy8gYW5kIHNlbmQgYW55IHJldHVybiB2YWx1ZSBiYWNrIHRvIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gKHR5cGVvZiB0YXJnZXRbbWV0aG9kX25hbWVdID09PSAnZnVuY3Rpb24nKSAmJiB0YXJnZXRbbWV0aG9kX25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugb2JqZWN0IGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0LCBlcnJvcjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2VuZCByZXR1cm4gdmFsdWUgdG8gd29ya2VyXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEFzeW5jIHJlc3VsdFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSByZXN1bHQudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBXb3JrZXJCcm9rZXIucmVtb3ZlV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICBpZiAoIXdvcmtlcnMuaGFzKHdvcmtlcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCByZW1vdmUgdW5yZWdpc3RlcmVkIG9iamVjdGAsIHdvcmtlcik7XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrZXJzLmRlbGV0ZSh3b3JrZXIpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgZXZlbnQgaGFuZGxlcnMgZnJvbSB3b3JrZXIgYXMgd2VsbD9cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmdcbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VfaWQ7XG4gICAgfTtcblxufVxuXG4vLyBXb3JrZXIgdGhyZWFkczpcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cFdvcmtlclRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gICAtIG1lc3NhZ2U6IGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSBtYWluIHRocmVhZCBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAobWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfc2VuZCcsICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBtZXRob2Qgb2YgdGhpcyBuYW1lIG9uIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyV29ya2VyVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9yZXBseScpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgZGlzcGF0Y2ggdGhlbSwgYW5kIHNlbmQgYmFjayBhIHJlcGx5XG4gICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgd29ya2VyIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IGJlY2F1c2Ugd29ya2VyIGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG4vLyBTcGVjaWFsIHZhbHVlIHdyYXBwZXIsIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBmaW5kIGFuZCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGluIHRoZSBtZXNzYWdlXG5Xb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMgPSBmdW5jdGlvbiAoLi4udmFsdWUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm4gbmV3IFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyguLi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudHJhbnNmZXJhYmxlcyA9IGZpbmRUcmFuc2ZlcmFibGVzKHRoaXMudmFsdWUpO1xufTtcblxuLy8gQnVpbGQgYSBsaXN0IG9mIHRyYW5zZmVyYWJsZSBvYmplY3RzIGZyb20gYSBzb3VyY2Ugb2JqZWN0XG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBpbmZvIGFib3V0IGVhY2ggdHJhbnNmZXJhYmxlOlxuLy8gICAtIG9iamVjdDogdGhlIGFjdHVhbCB0cmFuc2ZlcmFibGUgb2JqZWN0XG4vLyAgIC0gcGFyZW50OiB0aGUgcGFyZW50IG9iamVjdCB0aGF0IHRoZSB0cmFuc2ZlcmFibGUgaXMgYSBwcm9wZXJ0eSBvZiAoaWYgYW55KVxuLy8gICAtIHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgdHJhbnNmZXJhYmxlIG9uIHRoZSBwYXJlbnQgb2JqZWN0IChpZiBhbnkpXG4vLyBUT0RPOiBhZGQgb3B0aW9uIGluIGNhc2UgeW91IERPTidUIHdhbnQgdG8gdHJhbnNmZXIgb2JqZWN0c1xuZnVuY3Rpb24gZmluZFRyYW5zZmVyYWJsZXMoc291cmNlLCBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0eSA9IG51bGwsIGxpc3QgPSBbXSkge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIC8vIENoZWNrIGVhY2ggYXJyYXkgZWxlbWVudFxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoeCwgaSkgPT4gZmluZFRyYW5zZmVyYWJsZXMoeCwgc291cmNlLCBpLCBsaXN0KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIElzIHRoZSBvYmplY3QgYSB0cmFuc2ZlcmFibGUgYXJyYXkgYnVmZmVyP1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9yIGxvb2tzIGxpa2UgYSB0eXBlZCBhcnJheSAoaGFzIGFuIGFycmF5IGJ1ZmZlciBwcm9wZXJ0eSk/XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UuYnVmZmVyLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBlYWNoIHByb3BlcnR5XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2VbcHJvcF0sIHNvdXJjZSwgcHJvcCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIFJlbW92ZSBuZXV0ZXJlZCB0cmFuc2ZlcmFibGVzIGZyb20gcGFyZW50IG9iamVjdHMsIGFzIHRoZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBhZnRlciB0cmFuc2ZlclxuZnVuY3Rpb24gZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0cmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYW5zZmVyYWJsZXMuZmlsdGVyKHQgPT4gdC5wYXJlbnQgJiYgdC5wcm9wZXJ0eSkuZm9yRWFjaCh0ID0+IGRlbGV0ZSB0LnBhcmVudFt0LnByb3BlcnR5XSk7XG59XG5cbi8vIE1lc3NhZ2UgcGF5bG9hZCBjYW4gYmUgc3RyaW5naWZpZWQgZm9yIGZhc3RlciB0cmFuc2ZlciwgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0c1xuZnVuY3Rpb24gbWF5YmVFbmNvZGUgKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gUGFyc2Ugc3RyaW5naWZpZWQgbWVzc2FnZSBwYXlsb2FkXG5mdW5jdGlvbiBtYXliZURlY29kZSAoZGF0YSkge1xuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xufVxuXG4vLyBTZXR1cCB0aGlzIHRocmVhZCBhcyBhcHByb3ByaWF0ZVxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgc2V0dXBNYWluVGhyZWFkKCk7XG59XG5cbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgc2V0dXBXb3JrZXJUaHJlYWQoKTtcbn1cbiIsIi8qKiogVmVjdG9yIGZ1bmN0aW9ucyAtIHZlY3RvcnMgcHJvdmlkZWQgYXMgW3gsIHksIHpdIGFycmF5cyAqKiovXG5cbnZhciBWZWN0b3I7XG5leHBvcnQgZGVmYXVsdCBWZWN0b3IgPSB7fTtcblxuVmVjdG9yLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG5WZWN0b3IubmVnID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldICogLTE7XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuLy8gQWRkaXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5hZGQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gKyB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBTdWJzdHJhY3Rpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5zdWIgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSAtIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cblZlY3Rvci5zaWduZWRfYXJlYSA9IGZ1bmN0aW9uICh2MSwgdjIsIHYzKSB7XG4gICAgcmV0dXJuICh2MlswXS12MVswXSkqKHYzWzFdLXYxWzFdKSAtICh2M1swXS12MVswXSkqKHYyWzFdLXYxWzFdKTtcbn07XG5cbi8vIE11bHRpcGxpY2F0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IubXVsdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBsZW4gPSB2MS5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBpZiAodHlwZW9mIHYyID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBNdWxpdHBseSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGlwbHkgdHdvIHZlY3RvcnNcbiAgICAgICAgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBEaXZpc2lvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRpdiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBpO1xuICAgIGlmKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpe1xuICAgICAgICAvLyBEaXZpZGUgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpdmlkZSB0byB2ZWN0b3JzXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIEdldCAyRCBwZXJwZW5kaWN1bGFyXG5WZWN0b3IucGVycCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gWyB2MlsxXSAtIHYxWzFdLFxuICAgICAgICAgICAgIHYxWzBdIC0gdjJbMF0gXTtcbn07XG5cbi8vIEdldCAyRCB2ZWN0b3Igcm90YXRlZFxuVmVjdG9yLnJvdCA9IGZ1bmN0aW9uICh2LCBhKSB7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhKTtcbiAgICB2YXIgcyA9IE1hdGguc2luKGEpO1xuICAgIHJldHVybiBbdlswXSAqIGMgLSB2WzFdICogcyxcbiAgICAgICAgICAgIHZbMF0gKiBzICsgdlsxXSAqIGNdO1xufTtcblxuLy8gR2V0IDJEIGhlYWRpbmcgYW5nbGVcblZlY3Rvci5hbmdsZSA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LHgpO1xufTtcblxuLy8gR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcblZlY3Rvci5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihBLCBCKXtcbiAgICB2YXIgZGVsdGEgPSBWZWN0b3IuZG90KEEsIEIpO1xuICAgIGlmIChkZWx0YSA8IC0xKSB7XG4gICAgICAgIGRlbHRhID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmFjb3MoZGVsdGEpO1xufTtcblxuLy8gQ29tcGFyZSB0d28gcG9pbnRzXG5WZWN0b3IuaXNFcXVhbCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbGVuID0gdjEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHYxW2ldICE9PSB2MltpXSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoIHNxdWFyZWRcblZlY3Rvci5sZW5ndGhTcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aFxuVmVjdG9yLmxlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3IubGVuZ3RoU3EodikpO1xufTtcblxuLy8gTm9ybWFsaXplIGEgdmVjdG9yXG5WZWN0b3Iubm9ybWFsaXplID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkLCB2WzJdIC8gZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFswLCAwLCAwXTtcbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcblxuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgfVxuXG59XG4iXX0= diff --git a/dist/tangram.min.js b/dist/tangram.min.js index 916071653..cf2f4bd59 100644 --- a/dist/tangram.min.js +++ b/dist/tangram.min.js @@ -1,19 +1,20 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Tangram=e()}}(function(){var e;return function t(e,r,n){function i(a,s){if(!r[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=r[a]={exports:{}};e[a][0].call(c.exports,function(t){var r=e[a][1][t];return i(r?r:t)},c,c.exports,t,e,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;ac){for(var t=0,r=s.length-u;r>t;t++)s[t]=s[t+u];s.length-=u,u=0}}s.length=0,u=0,l=!1}function i(e){var t=1,r=new f(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}function o(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var a,s=[],l=!1,u=0,c=1024,f=e.MutationObserver||e.WebKitMutationObserver;a="function"==typeof f?i(n):o(n),r.requestFlush=a,r.makeRequestCallFromTimer=o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(e,t){t.exports={"default":e("core-js/library/fn/array/from"),__esModule:!0}},{"core-js/library/fn/array/from":42}],4:[function(e,t){t.exports={"default":e("core-js/library/fn/get-iterator"),__esModule:!0}},{"core-js/library/fn/get-iterator":43}],5:[function(e,t){t.exports={"default":e("core-js/library/fn/is-iterable"),__esModule:!0}},{"core-js/library/fn/is-iterable":44}],6:[function(e,t){t.exports={"default":e("core-js/library/fn/json/stringify"),__esModule:!0}},{"core-js/library/fn/json/stringify":45}],7:[function(e,t){t.exports={"default":e("core-js/library/fn/map"),__esModule:!0}},{"core-js/library/fn/map":46}],8:[function(e,t){t.exports={"default":e("core-js/library/fn/math/log2"),__esModule:!0}},{"core-js/library/fn/math/log2":47}],9:[function(e,t){t.exports={"default":e("core-js/library/fn/object/assign"),__esModule:!0}},{"core-js/library/fn/object/assign":48}],10:[function(e,t){t.exports={"default":e("core-js/library/fn/object/create"),__esModule:!0}},{"core-js/library/fn/object/create":49}],11:[function(e,t){t.exports={"default":e("core-js/library/fn/object/define-property"),__esModule:!0}},{"core-js/library/fn/object/define-property":50}],12:[function(e,t){t.exports={"default":e("core-js/library/fn/object/freeze"),__esModule:!0}},{"core-js/library/fn/object/freeze":51}],13:[function(e,t){t.exports={"default":e("core-js/library/fn/object/get-own-property-descriptor"),__esModule:!0}},{"core-js/library/fn/object/get-own-property-descriptor":52}],14:[function(e,t){t.exports={"default":e("core-js/library/fn/object/get-prototype-of"),__esModule:!0}},{"core-js/library/fn/object/get-prototype-of":53}],15:[function(e,t){t.exports={"default":e("core-js/library/fn/object/keys"),__esModule:!0}},{"core-js/library/fn/object/keys":54}],16:[function(e,t){t.exports={"default":e("core-js/library/fn/object/set-prototype-of"),__esModule:!0}},{"core-js/library/fn/object/set-prototype-of":55}],17:[function(e,t){t.exports={"default":e("core-js/library/fn/promise"),__esModule:!0}},{"core-js/library/fn/promise":56}],18:[function(e,t){t.exports={"default":e("core-js/library/fn/set"),__esModule:!0}},{"core-js/library/fn/set":57}],19:[function(e,t){t.exports={"default":e("core-js/library/fn/symbol"),__esModule:!0}},{"core-js/library/fn/symbol":58}],20:[function(e,t){t.exports={"default":e("core-js/library/fn/symbol/iterator"),__esModule:!0}},{"core-js/library/fn/symbol/iterator":59}],21:[function(e,t,r){"use strict";r.__esModule=!0,r.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},{}],22:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}r.__esModule=!0;var i=e("../core-js/object/define-property"),o=n(i);r.default=function(){function e(e,t){for(var r=0;rt;++t)l[t]=e[t],u[e.charCodeAt(t)]=t;u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63}function i(e){var t,r,n,i,o,a,s=e.length;if(s%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[s-2]?2:"="===e[s-1]?1:0,a=new c(3*s/4-o),n=o>0?s-4:s;var l=0;for(t=0,r=0;n>t;t+=4,r+=3)i=u[e.charCodeAt(t)]<<18|u[e.charCodeAt(t+1)]<<12|u[e.charCodeAt(t+2)]<<6|u[e.charCodeAt(t+3)],a[l++]=i>>16&255,a[l++]=i>>8&255,a[l++]=255&i;return 2===o?(i=u[e.charCodeAt(t)]<<2|u[e.charCodeAt(t+1)]>>4,a[l++]=255&i):1===o&&(i=u[e.charCodeAt(t)]<<10|u[e.charCodeAt(t+1)]<<4|u[e.charCodeAt(t+2)]>>2,a[l++]=i>>8&255,a[l++]=255&i),a}function o(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function a(e,t,r){for(var n,i=[],a=t;r>a;a+=3)n=(e[a]<<16)+(e[a+1]<<8)+e[a+2],i.push(o(n));return i.join("")}function s(e){for(var t,r=e.length,n=r%3,i="",o=[],s=16383,u=0,c=r-n;c>u;u+=s)o.push(a(e,u,u+s>c?c:u+s));return 1===n?(t=e[r-1],i+=l[t>>2],i+=l[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=l[t>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")}r.toByteArray=i,r.fromByteArray=s;var l=[],u=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array;n()},{}],32:[function(e,t,r){"use strict";"use restrict";function n(e){var t=32;return e&=-e,e&&t--,65535&e&&(t-=16),16711935&e&&(t-=8),252645135&e&&(t-=4),858993459&e&&(t-=2),1431655765&e&&(t-=1),t}var i=32;r.INT_BITS=i,r.INT_MAX=2147483647,r.INT_MIN=-1<0)-(0>e)},r.abs=function(e){var t=e>>i-1;return(e^t)-t},r.min=function(e,t){return t^(e^t)&-(t>e)},r.max=function(e,t){return e^(e^t)&-(t>e)},r.isPow2=function(e){return!(e&e-1||!e)},r.log2=function(e){var t,r;return t=(e>65535)<<4,e>>>=t,r=(e>255)<<3,e>>>=r,t|=r,r=(e>15)<<2,e>>>=r,t|=r,r=(e>3)<<1,e>>>=r,t|=r,t|e>>1},r.log10=function(e){return e>=1e9?9:e>=1e8?8:e>=1e7?7:e>=1e6?6:e>=1e5?5:e>=1e4?4:e>=1e3?3:e>=100?2:e>=10?1:0},r.popCount=function(e){return e-=e>>>1&1431655765,e=(858993459&e)+(e>>>2&858993459),16843009*(e+(e>>>4)&252645135)>>>24},r.countTrailingZeros=n,r.nextPow2=function(e){return e+=0===e,--e,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e+1},r.prevPow2=function(e){return e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e-(e>>>1)},r.parity=function(e){return e^=e>>>16,e^=e>>>8,e^=e>>>4,e&=15,27030>>>e&1};var o=new Array(256);!function(e){for(var t=0;256>t;++t){var r=t,n=t,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;e[t]=n<>>8&255]<<16|o[e>>>16&255]<<8|o[e>>>24&255]},r.interleave2=function(e,t){return e&=65535,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t&=65535,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1},r.deinterleave2=function(e,t){return e=e>>>t&1431655765,e=858993459&(e|e>>>1),e=252645135&(e|e>>>2),e=16711935&(e|e>>>4),e=65535&(e|e>>>16),e<<16>>16},r.interleave3=function(e,t,r){return e&=1023,e=4278190335&(e|e<<16),e=251719695&(e|e<<8),e=3272356035&(e|e<<4),e=1227133513&(e|e<<2),t&=1023,t=4278190335&(t|t<<16),t=251719695&(t|t<<8),t=3272356035&(t|t<<4),t=1227133513&(t|t<<2),e|=t<<1,r&=1023,r=4278190335&(r|r<<16),r=251719695&(r|r<<8),r=3272356035&(r|r<<4),r=1227133513&(r|r<<2),e|r<<2},r.deinterleave3=function(e,t){return e=e>>>t&1227133513,e=3272356035&(e|e>>>2),e=251719695&(e|e>>>4),e=4278190335&(e|e>>>8),e=1023&(e|e>>>16),e<<22>>22},r.nextCombination=function(e){var t=e|e-1;return t+1|(~t&-~t)-1>>>n(e)+1}},{}],33:[function(e,t){"use strict";function r(e,t){for(var r=0;e>r;++r)if(!(t[r]<=t[r+e]))return!0;return!1}function n(e,t,n,i){for(var o=0,a=0,s=0,l=e.length;l>s;++s){var u=e[s];if(!r(t,u)){for(var c=0;2*t>c;++c)n[o++]=u[c];i[a++]=s}}return a}function i(e,t,r,i){var o=e.length,u=t.length;if(!(0>=o||0>=u)){var c=e[0].length>>>1;if(!(0>=c)){var f,h=a.mallocDouble(2*c*o),d=a.mallocInt32(o);if(o=n(e,c,h,d),o>0){if(1===c&&i)s.init(o),f=s.sweepComplete(c,r,0,o,h,d,0,o,h,d);else{var p=a.mallocDouble(2*c*u),m=a.mallocInt32(u);u=n(t,c,p,m),u>0&&(s.init(o+u),f=1===c?s.sweepBipartite(c,r,0,o,h,d,0,u,p,m):l(c,r,i,o,h,d,u,p,m),a.free(p),a.free(m))}a.free(h),a.free(d)}return f}}}function o(e,t,r){var n;switch(arguments.length){case 1:return n=[],i(e,e,function(e,t){n.push([e,t])},!0),n;case 2:if("function"==typeof t){var o=t;return i(e,e,o,!0)}return n=[],i(e,t,function(e,t){n.push([e,t])},!1),n;case 3:return i(e,t,r,!1);default:throw new Error("box-intersect: Invalid arguments")}}t.exports=o;var a=e("typedarray-pool"),s=e("./lib/sweep"),l=e("./lib/intersect")},{"./lib/intersect":35,"./lib/sweep":39,"typedarray-pool":284}],34:[function(e,t,r){"use strict";function n(e,t,r){var n="bruteForce"+(e?"Red":"Blue")+(t?"Flip":"")+(r?"Full":""),i=["function ",n,"(",w.join(),"){","var ",u,"=2*",o,";"],l="for(var i="+c+","+p+"="+u+"*"+c+";i<"+f+";++i,"+p+"+="+u+"){var x0="+h+"["+a+"+"+p+"],x1="+h+"["+a+"+"+p+"+"+o+"],xi="+d+"[i];",k="for(var j="+m+","+y+"="+u+"*"+m+";j<"+_+";++j,"+y+"+="+u+"){var y0="+g+"["+a+"+"+y+"],"+(r?"y1="+g+"["+a+"+"+y+"+"+o+"],":"")+"yi="+v+"[j];";return e?i.push(l,x,":",k):i.push(k,x,":",l),i.push(r?"if(y1"+_+"-"+m+"){"),e?(t(!0,!1),a.push("}else{"),t(!1,!1)):(a.push("if("+l+"){"),t(!0,!0),a.push("}else{"),t(!0,!1),a.push("}}else{if("+l+"){"),t(!1,!0),a.push("}else{"),t(!1,!1),a.push("}")),a.push("}}return "+r);var s=i.join("")+a.join(""),u=new Function(s);return u()}var o="d",a="ax",s="vv",l="fp",u="es",c="rs",f="re",h="rb",d="ri",p="rp",m="bs",_="be",g="bb",v="bi",y="bp",b="rv",x="Q",w=[o,a,s,c,f,h,d,m,_,g,v];r.partial=i(!1),r.full=i(!0)},{}],35:[function(e,t){"use strict";function r(e,t){var r=8*l.log2(t+1)*(e+1)|0,n=l.nextPow2(A*r);S.lengthR&&(s.free(R),R=s.mallocDouble(i))}function n(e,t,r,n,i,o,a,s,l){var u=A*e;S[u]=t,S[u+1]=r,S[u+2]=n,S[u+3]=i,S[u+4]=o,S[u+5]=a;var c=T*e;R[c]=s,R[c+1]=l}function i(e,t,r,n,i,o,a,s,l,u,c){var f=2*e,h=l*f,d=u[h+t];e:for(var p=i,m=i*f;o>p;++p,m+=f){var _=a[m+t],g=a[m+t+e];if(!(_>d||d>g||n&&d===_)){for(var v=s[p],y=t+1;e>y;++y){var _=a[m+y],g=a[m+y+e],b=u[h+y],x=u[h+y+e];if(b>g||_>x)continue e}var w;if(w=n?r(c,v):r(v,c),void 0!==w)return w}}}function o(e,t,r,n,i,o,a,s,l,u){var c=2*e,f=s*c,h=l[f+t];e:for(var d=n,p=n*c;i>d;++d,p+=c){var m=a[d];if(m!==u){var _=o[p+t],g=o[p+t+e];if(!(_>h||h>g)){for(var v=t+1;e>v;++v){var _=o[p+v],g=o[p+v+e],y=l[f+v],b=l[f+v+e];if(y>g||_>b)continue e}var x=r(m,u);if(void 0!==x)return x}}}}function a(e,t,a,s,l,u,p,E,j){r(e,s+p);var M,z=0,C=2*e;for(n(z++,0,0,s,0,p,a?16:0,-1/0,1/0),a||n(z++,0,0,p,0,s,1,-1/0,1/0);z>0;){z-=1;var P=z*A,L=S[P],N=S[P+1],O=S[P+2],I=S[P+3],F=S[P+4],U=S[P+5],D=z*T,B=R[D],G=R[D+1],V=1&U,W=!!(16&U),q=l,Z=u,H=E,X=j;if(V&&(q=E,Z=j,H=l,X=u),!(2&U&&(O=b(e,L,N,O,q,Z,G),N>=O)||4&U&&(N=x(e,L,N,O,q,Z,B),N>=O))){var Y=O-N,J=F-I;if(W){if(g>e*Y*(Y+J)){if(M=h.scanComplete(e,L,t,N,O,q,Z,I,F,H,X),void 0!==M)return M;continue}}else{if(e*Math.min(Y,J)e*Y*J){if(M=h.scanBipartite(e,L,t,V,N,O,q,Z,I,F,H,X),void 0!==M)return M;continue}}var K=v(e,L,N,O,q,Z,B,G);if(K>N)if(m>e*(K-N)){if(M=f(e,L+1,t,N,K,q,Z,I,F,H,X),void 0!==M)return M}else if(L===e-2){if(M=V?h.sweepBipartite(e,t,I,F,H,X,N,K,q,Z):h.sweepBipartite(e,t,N,K,q,Z,I,F,H,X),void 0!==M)return M}else n(z++,L+1,N,K,I,F,V,-1/0,1/0),n(z++,L+1,I,F,N,K,1^V,-1/0,1/0);if(O>K){var $=d(e,L,I,F,H,X),Q=H[C*$+L],et=y(e,L,$,F,H,X,Q);if(F>et&&n(z++,L,K,O,et,F,(4|V)+(W?16:0),Q,G),$>I&&n(z++,L,K,O,I,$,(2|V)+(W?16:0),B,Q),$+1===et){if(M=W?o(e,L,t,K,O,q,Z,$,H,X[$]):i(e,L,t,V,K,O,q,Z,$,H,X[$]),void 0!==M)return M}else if(et>$){var tt;if(W){if(tt=w(e,L,K,O,q,Z,Q),tt>K){var rt=y(e,L,K,tt,q,Z,Q);if(L===e-2){if(rt>K&&(M=h.sweepComplete(e,t,K,rt,q,Z,$,et,H,X),void 0!==M))return M;if(tt>rt&&(M=h.sweepBipartite(e,t,rt,tt,q,Z,$,et,H,X),void 0!==M))return M}else rt>K&&n(z++,L+1,K,rt,$,et,16,-1/0,1/0),tt>rt&&(n(z++,L+1,rt,tt,$,et,0,-1/0,1/0),n(z++,L+1,$,et,rt,tt,1,-1/0,1/0))}}else tt=V?k(e,L,K,O,q,Z,Q):w(e,L,K,O,q,Z,Q),tt>K&&(L===e-2?M=V?h.sweepBipartite(e,t,$,et,H,X,K,tt,q,Z):h.sweepBipartite(e,t,K,tt,q,Z,$,et,H,X):(n(z++,L+1,K,tt,$,et,V,-1/0,1/0),n(z++,L+1,$,et,K,tt,1^V,-1/0,1/0)))}}}}}t.exports=a;var s=e("typedarray-pool"),l=e("bit-twiddle"),u=e("./brute"),c=u.partial,f=u.full,h=e("./sweep"),d=e("./median"),p=e("./partition"),m=128,_=1<<22,g=1<<22,v=p("!(lo>=p0)&&!(p1>=hi)",["p0","p1"]),y=p("lo===p0",["p0"]),b=p("lol;++l,s+=a)for(var u=i[s],c=l,f=a*(l-1);c>r&&i[f+t]>u;--c,f-=a){for(var h=f,d=f+a,p=0;a>p;++p,++h,++d){var m=i[h];i[h]=i[d],i[d]=m}var _=o[c];o[c]=o[c-1],o[c-1]=_}}function n(e,t,n,i,s,l){if(n+1>=i)return n;for(var u=n,c=i,f=i+n>>>1,h=2*e,d=f,p=s[h*f+t];c>u;){if(a>c-u){r(e,t,u,c,s,l),p=s[h*f+t];break}var m=c-u,_=Math.random()*m+u|0,g=s[h*_+t],v=Math.random()*m+u|0,y=s[h*v+t],b=Math.random()*m+u|0,x=s[h*b+t];y>=g?x>=y?(d=v,p=y):g>=x?(d=_,p=g):(d=b,p=x):y>=x?(d=v,p=y):x>=g?(d=_,p=g):(d=b,p=x);for(var w=h*(c-1),k=h*d,A=0;h>A;++A,++w,++k){var T=s[w];s[w]=s[k],s[k]=T}var E=l[c-1];l[c-1]=l[d],l[d]=E,d=o(e,t,u,c-1,s,l,p);for(var w=h*(c-1),k=h*d,A=0;h>A;++A,++w,++k){var T=s[w];s[w]=s[k],s[k]=T}var E=l[c-1];if(l[c-1]=l[d],l[d]=E,d>f){for(c=d-1;c>u&&s[h*(c-1)+t]===p;)c-=1;c+=1}else{if(!(f>d))break;for(u=d+1;c>u&&s[h*u+t]===p;)u+=1}}return o(e,t,n,f,s,l,s[h*f+t])}t.exports=n;var i=e("./partition"),o=i("lo=0&&i.push("lo=e[k+n]"),e.indexOf("hi")>=0&&i.push("hi=e[k+o]"),r.push(n.replace("_",i.join()).replace("$",e)),Function.apply(void 0,r)}t.exports=r;var n="for(var j=2*a,k=j*c,l=k,m=c,n=b,o=a+b,p=c;d>p;++p,k+=j){var _;if($)if(m===p)m+=1,l+=j;else{for(var s=0;j>s;++s){var t=e[k+s];e[k+s]=e[l],e[l++]=t}var u=f[p];f[p]=f[m],f[m++]=u}}return m"},{}],38:[function(e,t){"use strict";function r(e,t){4*f>=t?n(0,t-1,e):c(0,t-1,e)}function n(e,t,r){for(var n=2*(e+1),i=e+1;t>=i;++i){for(var o=r[n++],a=r[n++],s=i,l=n-2;s-->e;){var u=r[l-2],c=r[l-1];if(o>u)break;if(u===o&&a>c)break;r[l]=u,r[l+1]=c,l-=2}r[l]=o,r[l+1]=a}}function i(e,t,r){e*=2,t*=2;var n=r[e],i=r[e+1];r[e]=r[t],r[e+1]=r[t+1],r[t]=n,r[t+1]=i}function o(e,t,r){e*=2,t*=2,r[e]=r[t],r[e+1]=r[t+1]}function a(e,t,r,n){e*=2,t*=2,r*=2;var i=n[e],o=n[e+1];n[e]=n[t],n[e+1]=n[t+1],n[t]=n[r],n[t+1]=n[r+1],n[r]=i,n[r+1]=o}function s(e,t,r,n,i){e*=2,t*=2,i[e]=i[t],i[t]=r,i[e+1]=i[t+1],i[t+1]=n}function l(e,t,r){e*=2,t*=2;var n=r[e],i=r[t];return i>n?!1:n===i?r[e+1]>r[t+1]:!0}function u(e,t,r,n){e*=2;var i=n[e];return t>i?!0:i===t?n[e+1]>1,_=m-h,g=m+h,v=d,y=_,b=m,x=g,w=p,k=e+1,A=t-1,T=0;l(v,y,r)&&(T=v,v=y,y=T),l(x,w,r)&&(T=x,x=w,w=T),l(v,b,r)&&(T=v,v=b,b=T),l(y,b,r)&&(T=y,y=b,b=T),l(v,x,r)&&(T=v,v=x,x=T),l(b,x,r)&&(T=b,b=x,x=T),l(y,w,r)&&(T=y,y=w,w=T),l(y,b,r)&&(T=y,y=b,b=T),l(x,w,r)&&(T=x,x=w,w=T);for(var E=r[2*y],S=r[2*y+1],R=r[2*x],j=r[2*x+1],M=2*v,z=2*b,C=2*w,P=2*d,L=2*m,N=2*p,O=0;2>O;++O){var I=r[M+O],F=r[z+O],U=r[C+O];r[P+O]=I,r[L+O]=F,r[N+O]=U}o(_,e,r),o(g,t,r);for(var D=k;A>=D;++D)if(u(D,E,S,r))D!==k&&i(D,k,r),++k;else if(!u(D,R,j,r))for(;;){if(u(A,R,j,r)){u(A,E,S,r)?(a(D,k,A,r),++k,--A):(i(D,A,r),--A);break}if(--A=k-2-e?n(e,k-2,r):c(e,k-2,r),f>=t-(A+2)?n(A+2,t,r):c(A+2,t,r),f>=A-k?n(k,A,r):c(k,A,r)}t.exports=r;var f=32},{}],39:[function(e,t){"use strict";function r(e){var t=c.nextPow2(e);p.lengthk;++k){var A=s[k],T=y*k;b[v++]=a[T+x],b[v++]=-(A+1),b[v++]=a[T+w],b[v++]=A}for(var k=l;u>k;++k){var A=d[k]+h,E=y*k;b[v++]=c[E+x],b[v++]=-A,b[v++]=c[E+w],b[v++]=A}var S=v>>>1;f(b,S);for(var R=0,j=0,k=0;S>k;++k){var M=0|b[2*k+1];if(M>=h)M=M-h|0,n(_,g,j--,M);else if(M>=0)n(p,m,R--,M);else if(-h>=M){M=-M-h|0;for(var z=0;R>z;++z){var C=t(p[z],M);if(void 0!==C)return C}i(_,g,j++,M)}else{M=-M-1|0;for(var z=0;j>z;++z){var C=t(M,_[z]);if(void 0!==C)return C}i(p,m,R++,M)}}}function a(e,t,r,o,a,s,l,u,c,h){for(var d=0,x=2*e,w=e-1,k=x-1,A=r;o>A;++A){var T=s[A]+1<<1,E=x*A;b[d++]=a[E+w],b[d++]=-T,b[d++]=a[E+k],b[d++]=T}for(var A=l;u>A;++A){var T=h[A]+1<<1,S=x*A;b[d++]=c[S+w],b[d++]=1|-T,b[d++]=c[S+k],b[d++]=1|T}var R=d>>>1;f(b,R);for(var j=0,M=0,z=0,A=0;R>A;++A){var C=0|b[2*A+1],P=1&C;if(R-1>A&&C>>1===b[2*A+3]>>1&&(P=2,A+=1),0>C){for(var L=-(C>>1)-1,N=0;z>N;++N){var O=t(v[N],L);if(void 0!==O)return O}if(0!==P)for(var N=0;j>N;++N){var O=t(p[N],L);if(void 0!==O)return O}if(1!==P)for(var N=0;M>N;++N){var O=t(_[N],L);if(void 0!==O)return O}0===P?i(p,m,j++,L):1===P?i(_,g,M++,L):2===P&&i(v,y,z++,L)}else{var L=(C>>1)-1;0===P?n(p,m,j--,L):1===P?n(_,g,M--,L):2===P&&n(v,y,z--,L)}}}function s(e,t,r,o,a,s,l,u,c,d,_,g){var v=0,y=2*e,x=t,w=t+e,k=1,A=1;o?A=h:k=h;for(var T=a;s>T;++T){var E=T+k,S=y*T;b[v++]=l[S+x],b[v++]=-E,b[v++]=l[S+w],b[v++]=E}for(var T=c;d>T;++T){var E=T+A,R=y*T;b[v++]=_[R+x],b[v++]=-E}var j=v>>>1;f(b,j);for(var M=0,T=0;j>T;++T){var z=0|b[2*T+1];if(0>z){var E=-z,C=!1;if(E>=h?(C=!o,E-=h):(C=!!o,E-=1),C)i(p,m,M++,E);else{var P=g[E],L=y*E,N=_[L+t+1],O=_[L+t+1+e];e:for(var I=0;M>I;++I){var F=p[I],U=y*F;if(!(OD;++D)if(_[L+D+e]v;++v){var y=v+h,x=m*v;b[d++]=o[x+_],b[d++]=-y,b[d++]=o[x+g],b[d++]=y}for(var v=s;l>v;++v){var y=v+1,w=m*v;b[d++]=u[w+_],b[d++]=-y}var k=d>>>1;f(b,k);for(var A=0,v=0;k>v;++v){var T=0|b[2*v+1];if(0>T){var y=-T;if(y>=h)p[A++]=y-h;else{y-=1;var E=c[y],S=m*y,R=u[S+t+1],j=u[S+t+1+e];e:for(var M=0;A>M;++M){var z=p[M],C=a[z];if(C===E)break;var P=m*z;if(!(jL;++L)if(u[S+L+e]=0;--M)if(p[M]===y){for(var L=M+1;A>L;++L)p[L-1]=p[L];break}--A}}}t.exports={init:r,sweepBipartite:o,sweepComplete:a,scanBipartite:s,scanComplete:l};var u=e("typedarray-pool"),c=e("bit-twiddle"),f=e("./sort"),h=1<<28,d=1024,p=u.mallocInt32(d),m=u.mallocInt32(d),_=u.mallocInt32(d),g=u.mallocInt32(d),v=u.mallocInt32(d),y=u.mallocInt32(d),b=u.mallocDouble(8*d)},{"./sort":38,"bit-twiddle":32,"typedarray-pool":284}],40:[function(){},{}],41:[function(e,t,r){(function(t){"use strict";function n(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(t){return!1}}function i(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()=t?o(e,t):void 0!==r?"string"==typeof n?o(e,t).fill(r,n):o(e,t).fill(r):o(e,t)}function c(e,t){if(l(t),e=o(e,0>t?0:0|m(t)),!a.TYPED_ARRAY_SUPPORT)for(var r=0;t>r;++r)e[r]=0;return e}function f(e,t,r){if(("string"!=typeof r||""===r)&&(r="utf8"),!a.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|g(t,r);e=o(e,n);var i=e.write(t,r);return i!==n&&(e=e.slice(0,i)),e}function h(e,t){var r=0|m(t.length);e=o(e,r);for(var n=0;r>n;n+=1)e[n]=255&t[n];return e}function d(e,t,r,n){if(t.byteLength,0>r||t.byteLength=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function _(e){return+e!=e&&(e=0),a.alloc(+e)}function g(e,t){if(a.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(e).length;default:if(n)return q(e).length;t=(""+t).toLowerCase(),n=!0}}function v(e,t,r){var n=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,t>=r)return"";for(e||(e="utf8");;)switch(e){case"hex":return P(this,t,r);case"utf8":case"utf-8":return j(this,t,r);case"ascii":return z(this,t,r);case"latin1":case"binary":return C(this,t,r);case"base64":return R(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function y(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:-2147483648>r&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(0>r){if(!i)return-1;r=0}if("string"==typeof t&&(t=a.from(t,n)),a.isBuffer(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t=255&t,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){function o(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,s=e.length,l=t.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,l/=2,r/=2}var u;if(i){var c=-1;for(u=r;s>u;u++)if(o(e,u)===o(t,-1===c?0:u-c)){if(-1===c&&(c=u),u-c+1===l)return c*a}else-1!==c&&(u-=u-c),c=-1}else for(r+l>s&&(r=s-l),u=r;u>=0;u--){for(var f=!0,h=0;l>h;h++)if(o(e,u+h)!==o(t,h)){f=!1;break}if(f)return u}return-1}function w(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;n>a;++a){var s=parseInt(t.substr(2*a,2),16);if(isNaN(s))return a;e[r+a]=s}return a}function k(e,t,r,n){return Y(q(t,e.length-r),e,r,n)}function A(e,t,r,n){return Y(Z(t),e,r,n)}function T(e,t,r,n){return A(e,t,r,n)}function E(e,t,r,n){return Y(X(t),e,r,n)}function S(e,t,r,n){return Y(H(t,e.length-r),e,r,n)}function R(e,t,r){return K.fromByteArray(0===t&&r===e.length?e:e.slice(t,r))}function j(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;r>i;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(r>=i+s){var l,u,c,f;switch(s){case 1:128>o&&(a=o);break;case 2:l=e[i+1],128===(192&l)&&(f=(31&o)<<6|63&l,f>127&&(a=f));break;case 3:l=e[i+1],u=e[i+2],128===(192&l)&&128===(192&u)&&(f=(15&o)<<12|(63&l)<<6|63&u,f>2047&&(55296>f||f>57343)&&(a=f));break;case 4:l=e[i+1],u=e[i+2],c=e[i+3],128===(192&l)&&128===(192&u)&&128===(192&c)&&(f=(15&o)<<18|(63&l)<<12|(63&u)<<6|63&c,f>65535&&1114112>f&&(a=f))}}null===a?(a=65533,s=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=s}return M(n)}function M(e){var t=e.length;if(et>=t)return String.fromCharCode.apply(String,e);for(var r="",n=0;t>n;)r+=String.fromCharCode.apply(String,e.slice(n,n+=et));return r}function z(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(127&e[i]);return n}function C(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(e[i]);return n}function P(e,t,r){var n=e.length;(!t||0>t)&&(t=0),(!r||0>r||r>n)&&(r=n);for(var i="",o=t;r>o;++o)i+=W(e[o]);return i}function L(e,t,r){for(var n=e.slice(t,r),i="",o=0;oe)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function O(e,t,r,n,i,o){if(!a.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||o>t)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function I(e,t,r,n){0>t&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);o>i;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function F(e,t,r,n){0>t&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);o>i;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function U(e,t,r,n){if(r+n>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function D(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(e,t,r,n,52,8),r+8}function G(e){if(e=V(e).replace(tt,""),e.length<2)return"";for(;e.length%4!==0;)e+="=";return e}function V(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"") -}function W(e){return 16>e?"0"+e.toString(16):e.toString(16)}function q(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],a=0;n>a;++a){if(r=e.charCodeAt(a),r>55295&&57344>r){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(56320>r){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,128>r){if((t-=1)<0)break;o.push(r)}else if(2048>r){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(65536>r){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(e){for(var t=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function X(e){return K.toByteArray(G(e))}function Y(e,t,r,n){for(var i=0;n>i&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function J(e){return e!==e}var K=e("base64-js"),$=e("ieee754"),Q=e("isarray");r.Buffer=a,r.SlowBuffer=_,r.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),a.poolSize=8192,a._augment=function(e){return e.__proto__=a.prototype,e},a.from=function(e,t,r){return s(null,e,t,r)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(e,t,r){return u(null,e,t,r)},a.allocUnsafe=function(e){return c(null,e)},a.allocUnsafeSlow=function(e){return c(null,e)},a.isBuffer=function(e){return!(null==e||!e._isBuffer)},a.compare=function(e,t){if(!a.isBuffer(e)||!a.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);o>i;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return n>r?-1:r>n?1:0},a.isEncoding=function(e){switch(String(e).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!0;default:return!1}},a.concat=function(e,t){if(!Q(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return a.alloc(0);var r;if(void 0===t)for(t=0,r=0;rt;t+=2)y(this,t,t+1);return this},a.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;e>t;t+=4)y(this,t,t+3),y(this,t+1,t+2);return this},a.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;e>t;t+=8)y(this,t,t+7),y(this,t+1,t+6),y(this,t+2,t+5),y(this,t+3,t+4);return this},a.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?j(this,0,e):v.apply(this,arguments)},a.prototype.equals=function(e){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:0===a.compare(this,e)},a.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},a.prototype.compare=function(e,t,r,n,i){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),0>t||r>e.length||0>n||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,s=r-t,l=Math.min(o,s),u=this.slice(n,i),c=e.slice(t,r),f=0;l>f;++f)if(u[f]!==c[f]){o=u[f],s=c[f];break}return s>o?-1:o>s?1:0},a.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},a.prototype.indexOf=function(e,t,r){return b(this,e,t,r,!0)},a.prototype.lastIndexOf=function(e,t,r){return b(this,e,t,r,!1)},a.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t=0|t,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(0>r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return k(this,e,t,r);case"ascii":return A(this,e,t,r);case"latin1":case"binary":return T(this,e,t,r);case"base64":return E(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var et=4096;a.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),e>t&&(t=e);var n;if(a.TYPED_ARRAY_SUPPORT)n=this.subarray(e,t),n.__proto__=a.prototype;else{var i=t-e;n=new a(i,void 0);for(var o=0;i>o;++o)n[o]=this[o+e]}return n},a.prototype.readUIntLE=function(e,t,r){e=0|e,t=0|t,r||N(e,t,this.length);for(var n=this[e],i=1,o=0;++o0&&(i*=256);)n+=this[e+--t]*i;return n},a.prototype.readUInt8=function(e,t){return t||N(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||N(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||N(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||N(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||N(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,r){e=0|e,t=0|t,r||N(e,t,this.length);for(var n=this[e],i=1,o=0;++o=i&&(n-=Math.pow(2,8*t)),n},a.prototype.readIntBE=function(e,t,r){e=0|e,t=0|t,r||N(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},a.prototype.readInt8=function(e,t){return t||N(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},a.prototype.readInt16LE=function(e,t){t||N(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt16BE=function(e,t){t||N(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt32LE=function(e,t){return t||N(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||N(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||N(e,4,this.length),$.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||N(e,4,this.length),$.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||N(e,8,this.length),$.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||N(e,8,this.length),$.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t=0|t,r=0|r,!n){var i=Math.pow(2,8*r)-1;O(this,e,t,r,i,0)}var o=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+o]=e/a&255;return t+r},a.prototype.writeUInt8=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):I(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):I(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);O(this,e,t,r,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++oe&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},a.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);O(this,e,t,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)0>e&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},a.prototype.writeInt8=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),0>e&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):I(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):I(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,r){return e=+e,t=0|t,r||O(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,r){return D(this,e,t,!0,r)},a.prototype.writeFloatBE=function(e,t,r){return D(this,e,t,!1,r)},a.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},a.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},a.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(0>t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-tr&&n>t)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(1e3>o||!a.TYPED_ARRAY_SUPPORT)for(i=0;o>i;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},a.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);256>i&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!a.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e=255&e);if(0>t||this.length=r)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;r>o;++o)this[o]=e;else{var s=a.isBuffer(e)?e:q(new a(e,n).toString()),l=s.length;for(o=0;r-t>o;++o)this[o+t]=s[o%l]}return this};var tt=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":31,ieee754:186,isarray:189}],42:[function(e,t){e("../../modules/es6.string.iterator"),e("../../modules/es6.array.from"),t.exports=e("../../modules/_core").Array.from},{"../../modules/_core":74,"../../modules/es6.array.from":142,"../../modules/es6.string.iterator":157}],43:[function(e,t){e("../modules/web.dom.iterable"),e("../modules/es6.string.iterator"),t.exports=e("../modules/core.get-iterator")},{"../modules/core.get-iterator":140,"../modules/es6.string.iterator":157,"../modules/web.dom.iterable":163}],44:[function(e,t){e("../modules/web.dom.iterable"),e("../modules/es6.string.iterator"),t.exports=e("../modules/core.is-iterable")},{"../modules/core.is-iterable":141,"../modules/es6.string.iterator":157,"../modules/web.dom.iterable":163}],45:[function(e,t){var r=e("../../modules/_core"),n=r.JSON||(r.JSON={stringify:JSON.stringify});t.exports=function(){return n.stringify.apply(n,arguments)}},{"../../modules/_core":74}],46:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.map"),e("../modules/es7.map.to-json"),t.exports=e("../modules/_core").Map},{"../modules/_core":74,"../modules/es6.map":144,"../modules/es6.object.to-string":154,"../modules/es6.string.iterator":157,"../modules/es7.map.to-json":159,"../modules/web.dom.iterable":163}],47:[function(e,t){e("../../modules/es6.math.log2"),t.exports=e("../../modules/_core").Math.log2},{"../../modules/_core":74,"../../modules/es6.math.log2":145}],48:[function(e,t){e("../../modules/es6.object.assign"),t.exports=e("../../modules/_core").Object.assign},{"../../modules/_core":74,"../../modules/es6.object.assign":146}],49:[function(e,t){e("../../modules/es6.object.create");var r=e("../../modules/_core").Object;t.exports=function(e,t){return r.create(e,t)}},{"../../modules/_core":74,"../../modules/es6.object.create":147}],50:[function(e,t){e("../../modules/es6.object.define-property");var r=e("../../modules/_core").Object;t.exports=function(e,t,n){return r.defineProperty(e,t,n)}},{"../../modules/_core":74,"../../modules/es6.object.define-property":148}],51:[function(e,t){e("../../modules/es6.object.freeze"),t.exports=e("../../modules/_core").Object.freeze},{"../../modules/_core":74,"../../modules/es6.object.freeze":149}],52:[function(e,t){e("../../modules/es6.object.get-own-property-descriptor");var r=e("../../modules/_core").Object;t.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)}},{"../../modules/_core":74,"../../modules/es6.object.get-own-property-descriptor":150}],53:[function(e,t){e("../../modules/es6.object.get-prototype-of"),t.exports=e("../../modules/_core").Object.getPrototypeOf},{"../../modules/_core":74,"../../modules/es6.object.get-prototype-of":151}],54:[function(e,t){e("../../modules/es6.object.keys"),t.exports=e("../../modules/_core").Object.keys},{"../../modules/_core":74,"../../modules/es6.object.keys":152}],55:[function(e,t){e("../../modules/es6.object.set-prototype-of"),t.exports=e("../../modules/_core").Object.setPrototypeOf},{"../../modules/_core":74,"../../modules/es6.object.set-prototype-of":153}],56:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.promise"),t.exports=e("../modules/_core").Promise},{"../modules/_core":74,"../modules/es6.object.to-string":154,"../modules/es6.promise":155,"../modules/es6.string.iterator":157,"../modules/web.dom.iterable":163}],57:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.set"),e("../modules/es7.set.to-json"),t.exports=e("../modules/_core").Set},{"../modules/_core":74,"../modules/es6.object.to-string":154,"../modules/es6.set":156,"../modules/es6.string.iterator":157,"../modules/es7.set.to-json":160,"../modules/web.dom.iterable":163}],58:[function(e,t){e("../../modules/es6.symbol"),e("../../modules/es6.object.to-string"),e("../../modules/es7.symbol.async-iterator"),e("../../modules/es7.symbol.observable"),t.exports=e("../../modules/_core").Symbol},{"../../modules/_core":74,"../../modules/es6.object.to-string":154,"../../modules/es6.symbol":158,"../../modules/es7.symbol.async-iterator":161,"../../modules/es7.symbol.observable":162}],59:[function(e,t){e("../../modules/es6.string.iterator"),e("../../modules/web.dom.iterable"),t.exports=e("../../modules/_wks-ext").f("iterator")},{"../../modules/_wks-ext":137,"../../modules/es6.string.iterator":157,"../../modules/web.dom.iterable":163}],60:[function(e,t){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],61:[function(e,t){t.exports=function(){}},{}],62:[function(e,t){t.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},{}],63:[function(e,t){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":94}],64:[function(e,t){var r=e("./_for-of");t.exports=function(e,t){var n=[];return r(e,!1,n.push,n,t),n}},{"./_for-of":84}],65:[function(e,t){var r=e("./_to-iobject"),n=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,o,a){var s,l=r(t),u=n(l.length),c=i(a,u);if(e&&o!=o){for(;u>c;)if(s=l[c++],s!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===o)return e||c||0;return!e&&-1}}},{"./_to-index":129,"./_to-iobject":131,"./_to-length":132}],66:[function(e,t){var r=e("./_ctx"),n=e("./_iobject"),i=e("./_to-object"),o=e("./_to-length"),a=e("./_array-species-create");t.exports=function(e,t){var s=1==e,l=2==e,u=3==e,c=4==e,f=6==e,h=5==e||f,d=t||a;return function(t,a,p){for(var m,_,g=i(t),v=n(g),y=r(a,p,3),b=o(v.length),x=0,w=s?d(t,b):l?d(t,0):void 0;b>x;x++)if((h||x in v)&&(m=v[x],_=y(m,x,g),e))if(s)w[x]=_;else if(_)switch(e){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(c)return!1;return f?-1:u||c?c:w}}},{"./_array-species-create":68,"./_ctx":76,"./_iobject":91,"./_to-length":132,"./_to-object":133}],67:[function(e,t){var r=e("./_is-object"),n=e("./_is-array"),i=e("./_wks")("species");t.exports=function(e){var t;return n(e)&&(t=e.constructor,"function"!=typeof t||t!==Array&&!n(t.prototype)||(t=void 0),r(t)&&(t=t[i],null===t&&(t=void 0))),void 0===t?Array:t}},{"./_is-array":93,"./_is-object":94,"./_wks":138}],68:[function(e,t){var r=e("./_array-species-constructor");t.exports=function(e,t){return new(r(e))(t)}},{"./_array-species-constructor":67}],69:[function(e,t){var r=e("./_cof"),n=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),o=function(e,t){try{return e[t]}catch(r){}};t.exports=function(e){var t,a,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(a=o(t=Object(e),n))?a:i?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},{"./_cof":70,"./_wks":138}],70:[function(e,t){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],71:[function(e,t){"use strict";var r=e("./_object-dp").f,n=e("./_object-create"),i=e("./_redefine-all"),o=e("./_ctx"),a=e("./_an-instance"),s=e("./_defined"),l=e("./_for-of"),u=e("./_iter-define"),c=e("./_iter-step"),f=e("./_set-species"),h=e("./_descriptors"),d=e("./_meta").fastKey,p=h?"_s":"size",m=function(e,t){var r,n=d(t);if("F"!==n)return e._i[n];for(r=e._f;r;r=r.n)if(r.k==t)return r};t.exports={getConstructor:function(e,t,u,c){var f=e(function(e,r){a(e,f,t,"_i"),e._i=n(null),e._f=void 0,e._l=void 0,e[p]=0,void 0!=r&&l(r,u,e[c],e)});return i(f.prototype,{clear:function(){for(var e=this,t=e._i,r=e._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete t[r.i];e._f=e._l=void 0,e[p]=0},"delete":function(e){var t=this,r=m(t,e);if(r){var n=r.n,i=r.p;delete t._i[r.i],r.r=!0,i&&(i.n=n),n&&(n.p=i),t._f==r&&(t._f=n),t._l==r&&(t._l=i),t[p]--}return!!r},forEach:function(e){a(this,f,"forEach");for(var t,r=o(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(r(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!m(this,e)}}),h&&r(f.prototype,"size",{get:function(){return s(this[p])}}),f},def:function(e,t,r){var n,i,o=m(e,t);return o?o.v=r:(e._l=o={i:i=d(t,!0),k:t,v:r,p:n=e._l,n:void 0,r:!1},e._f||(e._f=o),n&&(n.n=o),e[p]++,"F"!==i&&(e._i[i]=o)),e},getEntry:m,setStrong:function(e,t,r){u(e,t,function(e,t){this._t=e,this._k=t,this._l=void 0},function(){for(var e=this,t=e._k,r=e._l;r&&r.r;)r=r.p;return e._t&&(e._l=r=r?r.n:e._t._f)?"keys"==t?c(0,r.k):"values"==t?c(0,r.v):c(0,[r.k,r.v]):(e._t=void 0,c(1))},r?"entries":"values",!r,!0),f(t)}}},{"./_an-instance":62,"./_ctx":76,"./_defined":77,"./_descriptors":78,"./_for-of":84,"./_iter-define":97,"./_iter-step":99,"./_meta":103,"./_object-create":106,"./_object-dp":107,"./_redefine-all":119,"./_set-species":122}],72:[function(e,t){var r=e("./_classof"),n=e("./_array-from-iterable");t.exports=function(e){return function(){if(r(this)!=e)throw TypeError(e+"#toJSON isn't generic");return n(this)}}},{"./_array-from-iterable":64,"./_classof":69}],73:[function(e,t){"use strict";var r=e("./_global"),n=e("./_export"),i=e("./_meta"),o=e("./_fails"),a=e("./_hide"),s=e("./_redefine-all"),l=e("./_for-of"),u=e("./_an-instance"),c=e("./_is-object"),f=e("./_set-to-string-tag"),h=e("./_object-dp").f,d=e("./_array-methods")(0),p=e("./_descriptors");t.exports=function(e,t,m,_,g,v){var y=r[e],b=y,x=g?"set":"add",w=b&&b.prototype,k={};return p&&"function"==typeof b&&(v||w.forEach&&!o(function(){(new b).entries().next()}))?(b=t(function(t,r){u(t,b,e,"_c"),t._c=new y,void 0!=r&&l(r,g,t[x],t)}),d("add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON".split(","),function(e){var t="add"==e||"set"==e;e in w&&(!v||"clear"!=e)&&a(b.prototype,e,function(r,n){if(u(this,b,e),!t&&v&&!c(r))return"get"==e?void 0:!1;var i=this._c[e](0===r?0:r,n);return t?this:i})}),"size"in w&&h(b.prototype,"size",{get:function(){return this._c.size}})):(b=_.getConstructor(t,e,g,x),s(b.prototype,m),i.NEED=!0),f(b,e),k[e]=b,n(n.G+n.W+n.F,k),v||_.setStrong(b,e,g),b}},{"./_an-instance":62,"./_array-methods":66,"./_descriptors":78,"./_export":82,"./_fails":83,"./_for-of":84,"./_global":85,"./_hide":87,"./_is-object":94,"./_meta":103,"./_object-dp":107,"./_redefine-all":119,"./_set-to-string-tag":123}],74:[function(e,t){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],75:[function(e,t){"use strict";var r=e("./_object-dp"),n=e("./_property-desc");t.exports=function(e,t,i){t in e?r.f(e,t,n(0,i)):e[t]=i}},{"./_object-dp":107,"./_property-desc":118}],76:[function(e,t){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":60}],77:[function(e,t){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],78:[function(e,t){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":83}],79:[function(e,t){var r=e("./_is-object"),n=e("./_global").document,i=r(n)&&r(n.createElement);t.exports=function(e){return i?n.createElement(e):{}}},{"./_global":85,"./_is-object":94}],80:[function(e,t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],81:[function(e,t){var r=e("./_object-keys"),n=e("./_object-gops"),i=e("./_object-pie");t.exports=function(e){var t=r(e),o=n.f;if(o)for(var a,s=o(e),l=i.f,u=0;s.length>u;)l.call(e,a=s[u++])&&t.push(a);return t}},{"./_object-gops":112,"./_object-keys":115,"./_object-pie":116}],82:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_ctx"),o=e("./_hide"),a="prototype",s=function(e,t,l){var u,c,f,h=e&s.F,d=e&s.G,p=e&s.S,m=e&s.P,_=e&s.B,g=e&s.W,v=d?n:n[t]||(n[t]={}),y=v[a],b=d?r:p?r[t]:(r[t]||{})[a];d&&(l=t);for(u in l)c=!h&&b&&void 0!==b[u],c&&u in v||(f=c?b[u]:l[u],v[u]=d&&"function"!=typeof b[u]?l[u]:_&&c?i(f,r):g&&b[u]==f?function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t[a]=e[a],t}(f):m&&"function"==typeof f?i(Function.call,f):f,m&&((v.virtual||(v.virtual={}))[u]=f,e&s.R&&y&&!y[u]&&o(y,u,f)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},{"./_core":74,"./_ctx":76,"./_global":85,"./_hide":87}],83:[function(e,t){t.exports=function(e){try{return!!e()}catch(t){return!0}}},{}],84:[function(e,t,r){var n=e("./_ctx"),i=e("./_iter-call"),o=e("./_is-array-iter"),a=e("./_an-object"),s=e("./_to-length"),l=e("./core.get-iterator-method"),u={},c={},r=t.exports=function(e,t,r,f,h){var d,p,m,_,g=h?function(){return e}:l(e),v=n(r,f,t?2:1),y=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(o(g)){for(d=s(e.length);d>y;y++)if(_=t?v(a(p=e[y])[0],p[1]):v(e[y]),_===u||_===c)return _}else for(m=g.call(e);!(p=m.next()).done;)if(_=i(m,v,p.value,t),_===u||_===c)return _};r.BREAK=u,r.RETURN=c},{"./_an-object":63,"./_ctx":76,"./_is-array-iter":92,"./_iter-call":95,"./_to-length":132,"./core.get-iterator-method":139}],85:[function(e,t){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],86:[function(e,t){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],87:[function(e,t){var r=e("./_object-dp"),n=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,i){return r.f(e,t,n(1,i))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":78,"./_object-dp":107,"./_property-desc":118}],88:[function(e,t){t.exports=e("./_global").document&&document.documentElement},{"./_global":85}],89:[function(e,t){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":78,"./_dom-create":79,"./_fails":83}],90:[function(e,t){t.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],91:[function(e,t){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":70}],92:[function(e,t){var r=e("./_iterators"),n=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[n]===e)}},{"./_iterators":100,"./_wks":138}],93:[function(e,t){var r=e("./_cof");t.exports=Array.isArray||function(e){return"Array"==r(e)}},{"./_cof":70}],94:[function(e,t){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],95:[function(e,t){var r=e("./_an-object");t.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(o){var a=e["return"];throw void 0!==a&&r(a.call(e)),o}}},{"./_an-object":63}],96:[function(e,t){"use strict";var r=e("./_object-create"),n=e("./_property-desc"),i=e("./_set-to-string-tag"),o={};e("./_hide")(o,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,a){e.prototype=r(o,{next:n(1,a)}),i(e,t+" Iterator")}},{"./_hide":87,"./_object-create":106,"./_property-desc":118,"./_set-to-string-tag":123,"./_wks":138}],97:[function(e,t){"use strict";var r=e("./_library"),n=e("./_export"),i=e("./_redefine"),o=e("./_hide"),a=e("./_has"),s=e("./_iterators"),l=e("./_iter-create"),u=e("./_set-to-string-tag"),c=e("./_object-gpo"),f=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",m="values",_=function(){return this};t.exports=function(e,t,g,v,y,b,x){l(g,t,v);var w,k,A,T=function(e){if(!h&&e in j)return j[e];switch(e){case p:return function(){return new g(this,e)};case m:return function(){return new g(this,e)}}return function(){return new g(this,e)}},E=t+" Iterator",S=y==m,R=!1,j=e.prototype,M=j[f]||j[d]||y&&j[y],z=M||T(y),C=y?S?T("entries"):z:void 0,P="Array"==t?j.entries||M:M;if(P&&(A=c(P.call(new e)),A!==Object.prototype&&(u(A,E,!0),r||a(A,f)||o(A,f,_))),S&&M&&M.name!==m&&(R=!0,z=function(){return M.call(this)}),r&&!x||!h&&!R&&j[f]||o(j,f,z),s[t]=z,s[E]=_,y)if(w={values:S?z:T(m),keys:b?z:T(p),entries:C},x)for(k in w)k in j||i(j,k,w[k]);else n(n.P+n.F*(h||R),t,w);return w}},{"./_export":82,"./_has":86,"./_hide":87,"./_iter-create":96,"./_iterators":100,"./_library":102,"./_object-gpo":113,"./_redefine":120,"./_set-to-string-tag":123,"./_wks":138}],98:[function(e,t){var r=e("./_wks")("iterator"),n=!1;try{var i=[7][r]();i["return"]=function(){n=!0},Array.from(i,function(){throw 2})}catch(o){}t.exports=function(e,t){if(!t&&!n)return!1;var i=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:i=!0}},o[r]=function(){return a},e(o)}catch(s){}return i}},{"./_wks":138}],99:[function(e,t){t.exports=function(e,t){return{value:t,done:!!e}}},{}],100:[function(e,t){t.exports={}},{}],101:[function(e,t){var r=e("./_object-keys"),n=e("./_to-iobject");t.exports=function(e,t){for(var i,o=n(e),a=r(o),s=a.length,l=0;s>l;)if(o[i=a[l++]]===t)return i}},{"./_object-keys":115,"./_to-iobject":131}],102:[function(e,t){t.exports=!0},{}],103:[function(e,t){var r=e("./_uid")("meta"),n=e("./_is-object"),i=e("./_has"),o=e("./_object-dp").f,a=0,s=Object.isExtensible||function(){return!0},l=!e("./_fails")(function(){return s(Object.preventExtensions({}))}),u=function(e){o(e,r,{value:{i:"O"+ ++a,w:{}}})},c=function(e,t){if(!n(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!s(e))return"F";if(!t)return"E";u(e)}return e[r].i},f=function(e,t){if(!i(e,r)){if(!s(e))return!0;if(!t)return!1;u(e)}return e[r].w},h=function(e){return l&&d.NEED&&s(e)&&!i(e,r)&&u(e),e},d=t.exports={KEY:r,NEED:!1,fastKey:c,getWeak:f,onFreeze:h}},{"./_fails":83,"./_has":86,"./_is-object":94,"./_object-dp":107,"./_uid":135}],104:[function(e,t){var r=e("./_global"),n=e("./_task").set,i=r.MutationObserver||r.WebKitMutationObserver,o=r.process,a=r.Promise,s="process"==e("./_cof")(o);t.exports=function(){var e,t,l,u=function(){var r,n;for(s&&(r=o.domain)&&r.exit();e;){n=e.fn,e=e.next;try{n()}catch(i){throw e?l():t=void 0,i}}t=void 0,r&&r.enter()};if(s)l=function(){o.nextTick(u)};else if(i){var c=!0,f=document.createTextNode("");new i(u).observe(f,{characterData:!0}),l=function(){f.data=c=!c}}else if(a&&a.resolve){var h=a.resolve();l=function(){h.then(u)}}else l=function(){n.call(r,u)};return function(r){var n={fn:r,next:void 0};t&&(t.next=n),e||(e=n,l()),t=n}}},{"./_cof":70,"./_global":85,"./_task":128}],105:[function(e,t){"use strict";var r=e("./_object-keys"),n=e("./_object-gops"),i=e("./_object-pie"),o=e("./_to-object"),a=e("./_iobject"),s=Object.assign;t.exports=!s||e("./_fails")(function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach(function(e){t[e]=e}),7!=s({},e)[r]||Object.keys(s({},t)).join("")!=n})?function(e){for(var t=o(e),s=arguments.length,l=1,u=n.f,c=i.f;s>l;)for(var f,h=a(arguments[l++]),d=u?r(h).concat(u(h)):r(h),p=d.length,m=0;p>m;)c.call(h,f=d[m++])&&(t[f]=h[f]);return t}:s},{"./_fails":83,"./_iobject":91,"./_object-gops":112,"./_object-keys":115,"./_object-pie":116,"./_to-object":133}],106:[function(e,t){var r=e("./_an-object"),n=e("./_object-dps"),i=e("./_enum-bug-keys"),o=e("./_shared-key")("IE_PROTO"),a=function(){},s="prototype",l=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",a=">";for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+a+"document.F=Object"+o+"/script"+a),t.close(),l=t.F;n--;)delete l[s][i[n]]; -return l()};t.exports=Object.create||function(e,t){var i;return null!==e?(a[s]=r(e),i=new a,a[s]=null,i[o]=e):i=l(),void 0===t?i:n(i,t)}},{"./_an-object":63,"./_dom-create":79,"./_enum-bug-keys":80,"./_html":88,"./_object-dps":108,"./_shared-key":124}],107:[function(e,t,r){var n=e("./_an-object"),i=e("./_ie8-dom-define"),o=e("./_to-primitive"),a=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=o(t,!0),n(r),i)try{return a(e,t,r)}catch(s){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":63,"./_descriptors":78,"./_ie8-dom-define":89,"./_to-primitive":134}],108:[function(e,t){var r=e("./_object-dp"),n=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){n(e);for(var o,a=i(t),s=a.length,l=0;s>l;)r.f(e,o=a[l++],t[o]);return e}},{"./_an-object":63,"./_descriptors":78,"./_object-dp":107,"./_object-keys":115}],109:[function(e,t,r){var n=e("./_object-pie"),i=e("./_property-desc"),o=e("./_to-iobject"),a=e("./_to-primitive"),s=e("./_has"),l=e("./_ie8-dom-define"),u=Object.getOwnPropertyDescriptor;r.f=e("./_descriptors")?u:function(e,t){if(e=o(e),t=a(t,!0),l)try{return u(e,t)}catch(r){}return s(e,t)?i(!n.f.call(e,t),e[t]):void 0}},{"./_descriptors":78,"./_has":86,"./_ie8-dom-define":89,"./_object-pie":116,"./_property-desc":118,"./_to-iobject":131,"./_to-primitive":134}],110:[function(e,t){var r=e("./_to-iobject"),n=e("./_object-gopn").f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(e){try{return n(e)}catch(t){return o.slice()}};t.exports.f=function(e){return o&&"[object Window]"==i.call(e)?a(e):n(r(e))}},{"./_object-gopn":111,"./_to-iobject":131}],111:[function(e,t,r){var n=e("./_object-keys-internal"),i=e("./_enum-bug-keys").concat("length","prototype");r.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},{"./_enum-bug-keys":80,"./_object-keys-internal":114}],112:[function(e,t,r){r.f=Object.getOwnPropertySymbols},{}],113:[function(e,t){var r=e("./_has"),n=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=n(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},{"./_has":86,"./_shared-key":124,"./_to-object":133}],114:[function(e,t){var r=e("./_has"),n=e("./_to-iobject"),i=e("./_array-includes")(!1),o=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var a,s=n(e),l=0,u=[];for(a in s)a!=o&&r(s,a)&&u.push(a);for(;t.length>l;)r(s,a=t[l++])&&(~i(u,a)||u.push(a));return u}},{"./_array-includes":65,"./_has":86,"./_shared-key":124,"./_to-iobject":131}],115:[function(e,t){var r=e("./_object-keys-internal"),n=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,n)}},{"./_enum-bug-keys":80,"./_object-keys-internal":114}],116:[function(e,t,r){r.f={}.propertyIsEnumerable},{}],117:[function(e,t){var r=e("./_export"),n=e("./_core"),i=e("./_fails");t.exports=function(e,t){var o=(n.Object||{})[e]||Object[e],a={};a[e]=t(o),r(r.S+r.F*i(function(){o(1)}),"Object",a)}},{"./_core":74,"./_export":82,"./_fails":83}],118:[function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],119:[function(e,t){var r=e("./_hide");t.exports=function(e,t,n){for(var i in t)n&&e[i]?e[i]=t[i]:r(e,i,t[i]);return e}},{"./_hide":87}],120:[function(e,t){t.exports=e("./_hide")},{"./_hide":87}],121:[function(e,t){var r=e("./_is-object"),n=e("./_an-object"),i=function(e,t){if(n(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,r,n){try{n=e("./_ctx")(Function.call,e("./_object-gopd").f(Object.prototype,"__proto__").set,2),n(t,[]),r=!(t instanceof Array)}catch(o){r=!0}return function(e,t){return i(e,t),r?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:i}},{"./_an-object":63,"./_ctx":76,"./_is-object":94,"./_object-gopd":109}],122:[function(e,t){"use strict";var r=e("./_global"),n=e("./_core"),i=e("./_object-dp"),o=e("./_descriptors"),a=e("./_wks")("species");t.exports=function(e){var t="function"==typeof n[e]?n[e]:r[e];o&&t&&!t[a]&&i.f(t,a,{configurable:!0,get:function(){return this}})}},{"./_core":74,"./_descriptors":78,"./_global":85,"./_object-dp":107,"./_wks":138}],123:[function(e,t){var r=e("./_object-dp").f,n=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,o){e&&!n(e=o?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":86,"./_object-dp":107,"./_wks":138}],124:[function(e,t){var r=e("./_shared")("keys"),n=e("./_uid");t.exports=function(e){return r[e]||(r[e]=n(e))}},{"./_shared":125,"./_uid":135}],125:[function(e,t){var r=e("./_global"),n="__core-js_shared__",i=r[n]||(r[n]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":85}],126:[function(e,t){var r=e("./_an-object"),n=e("./_a-function"),i=e("./_wks")("species");t.exports=function(e,t){var o,a=r(e).constructor;return void 0===a||void 0==(o=r(a)[i])?t:n(o)}},{"./_a-function":60,"./_an-object":63,"./_wks":138}],127:[function(e,t){var r=e("./_to-integer"),n=e("./_defined");t.exports=function(e){return function(t,i){var o,a,s=String(n(t)),l=r(i),u=s.length;return 0>l||l>=u?e?"":void 0:(o=s.charCodeAt(l),55296>o||o>56319||l+1===u||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):o:e?s.slice(l,l+2):(o-55296<<10)+(a-56320)+65536)}}},{"./_defined":77,"./_to-integer":130}],128:[function(e,t){var r,n,i,o=e("./_ctx"),a=e("./_invoke"),s=e("./_html"),l=e("./_dom-create"),u=e("./_global"),c=u.process,f=u.setImmediate,h=u.clearImmediate,d=u.MessageChannel,p=0,m={},_="onreadystatechange",g=function(){var e=+this;if(m.hasOwnProperty(e)){var t=m[e];delete m[e],t()}},v=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return m[++p]=function(){a("function"==typeof e?e:Function(e),t)},r(p),p},h=function(e){delete m[e]},"process"==e("./_cof")(c)?r=function(e){c.nextTick(o(g,e,1))}:d?(n=new d,i=n.port2,n.port1.onmessage=v,r=o(i.postMessage,i,1)):u.addEventListener&&"function"==typeof postMessage&&!u.importScripts?(r=function(e){u.postMessage(e+"","*")},u.addEventListener("message",v,!1)):r=_ in l("script")?function(e){s.appendChild(l("script"))[_]=function(){s.removeChild(this),g.call(e)}}:function(e){setTimeout(o(g,e,1),0)}),t.exports={set:f,clear:h}},{"./_cof":70,"./_ctx":76,"./_dom-create":79,"./_global":85,"./_html":88,"./_invoke":90}],129:[function(e,t){var r=e("./_to-integer"),n=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),0>e?n(e+t,0):i(e,t)}},{"./_to-integer":130}],130:[function(e,t){var r=Math.ceil,n=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},{}],131:[function(e,t){var r=e("./_iobject"),n=e("./_defined");t.exports=function(e){return r(n(e))}},{"./_defined":77,"./_iobject":91}],132:[function(e,t){var r=e("./_to-integer"),n=Math.min;t.exports=function(e){return e>0?n(r(e),9007199254740991):0}},{"./_to-integer":130}],133:[function(e,t){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":77}],134:[function(e,t){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":94}],135:[function(e,t){var r=0,n=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},{}],136:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_library"),o=e("./_wks-ext"),a=e("./_object-dp").f;t.exports=function(e){var t=n.Symbol||(n.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||a(t,e,{value:o.f(e)})}},{"./_core":74,"./_global":85,"./_library":102,"./_object-dp":107,"./_wks-ext":137}],137:[function(e,t,r){r.f=e("./_wks")},{"./_wks":138}],138:[function(e,t){var r=e("./_shared")("wks"),n=e("./_uid"),i=e("./_global").Symbol,o="function"==typeof i,a=t.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:n)("Symbol."+e))};a.store=r},{"./_global":85,"./_shared":125,"./_uid":135}],139:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){return void 0!=e?e[n]||e["@@iterator"]||i[r(e)]:void 0}},{"./_classof":69,"./_core":74,"./_iterators":100,"./_wks":138}],140:[function(e,t){var r=e("./_an-object"),n=e("./core.get-iterator-method");t.exports=e("./_core").getIterator=function(e){var t=n(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return r(t.call(e))}},{"./_an-object":63,"./_core":74,"./core.get-iterator-method":139}],141:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").isIterable=function(e){var t=Object(e);return void 0!==t[n]||"@@iterator"in t||i.hasOwnProperty(r(t))}},{"./_classof":69,"./_core":74,"./_iterators":100,"./_wks":138}],142:[function(e){"use strict";var t=e("./_ctx"),r=e("./_export"),n=e("./_to-object"),i=e("./_iter-call"),o=e("./_is-array-iter"),a=e("./_to-length"),s=e("./_create-property"),l=e("./core.get-iterator-method");r(r.S+r.F*!e("./_iter-detect")(function(e){Array.from(e)}),"Array",{from:function(e){var r,u,c,f,h=n(e),d="function"==typeof this?this:Array,p=arguments.length,m=p>1?arguments[1]:void 0,_=void 0!==m,g=0,v=l(h);if(_&&(m=t(m,p>2?arguments[2]:void 0,2)),void 0==v||d==Array&&o(v))for(r=a(h.length),u=new d(r);r>g;g++)s(u,g,_?m(h[g],g):h[g]);else for(f=v.call(h),u=new d;!(c=f.next()).done;g++)s(u,g,_?i(f,m,[c.value,g],!0):c.value);return u.length=g,u}})},{"./_create-property":75,"./_ctx":76,"./_export":82,"./_is-array-iter":92,"./_iter-call":95,"./_iter-detect":98,"./_to-length":132,"./_to-object":133,"./core.get-iterator-method":139}],143:[function(e,t){"use strict";var r=e("./_add-to-unscopables"),n=e("./_iter-step"),i=e("./_iterators"),o=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{"./_add-to-unscopables":61,"./_iter-define":97,"./_iter-step":99,"./_iterators":100,"./_to-iobject":131}],144:[function(e,t){"use strict";var r=e("./_collection-strong");t.exports=e("./_collection")("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(this,e);return t&&t.v},set:function(e,t){return r.def(this,0===e?0:e,t)}},r,!0)},{"./_collection":73,"./_collection-strong":71}],145:[function(e){var t=e("./_export");t(t.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},{"./_export":82}],146:[function(e){var t=e("./_export");t(t.S+t.F,"Object",{assign:e("./_object-assign")})},{"./_export":82,"./_object-assign":105}],147:[function(e){var t=e("./_export");t(t.S,"Object",{create:e("./_object-create")})},{"./_export":82,"./_object-create":106}],148:[function(e){var t=e("./_export");t(t.S+t.F*!e("./_descriptors"),"Object",{defineProperty:e("./_object-dp").f})},{"./_descriptors":78,"./_export":82,"./_object-dp":107}],149:[function(e){var t=e("./_is-object"),r=e("./_meta").onFreeze;e("./_object-sap")("freeze",function(e){return function(n){return e&&t(n)?e(r(n)):n}})},{"./_is-object":94,"./_meta":103,"./_object-sap":117}],150:[function(e){var t=e("./_to-iobject"),r=e("./_object-gopd").f;e("./_object-sap")("getOwnPropertyDescriptor",function(){return function(e,n){return r(t(e),n)}})},{"./_object-gopd":109,"./_object-sap":117,"./_to-iobject":131}],151:[function(e){var t=e("./_to-object"),r=e("./_object-gpo");e("./_object-sap")("getPrototypeOf",function(){return function(e){return r(t(e))}})},{"./_object-gpo":113,"./_object-sap":117,"./_to-object":133}],152:[function(e){var t=e("./_to-object"),r=e("./_object-keys");e("./_object-sap")("keys",function(){return function(e){return r(t(e))}})},{"./_object-keys":115,"./_object-sap":117,"./_to-object":133}],153:[function(e){var t=e("./_export");t(t.S,"Object",{setPrototypeOf:e("./_set-proto").set})},{"./_export":82,"./_set-proto":121}],154:[function(e,t,r){arguments[4][40][0].apply(r,arguments)},{dup:40}],155:[function(e){"use strict";var t,r,n,i=e("./_library"),o=e("./_global"),a=e("./_ctx"),s=e("./_classof"),l=e("./_export"),u=e("./_is-object"),c=e("./_a-function"),f=e("./_an-instance"),h=e("./_for-of"),d=e("./_species-constructor"),p=e("./_task").set,m=e("./_microtask")(),_="Promise",g=o.TypeError,v=o.process,y=o[_],v=o.process,b="process"==s(v),x=function(){},w=!!function(){try{var t=y.resolve(1),r=(t.constructor={})[e("./_wks")("species")]=function(e){e(x,x)};return(b||"function"==typeof PromiseRejectionEvent)&&t.then(x)instanceof r}catch(n){}}(),k=function(e,t){return e===t||e===y&&t===n},A=function(e){var t;return u(e)&&"function"==typeof(t=e.then)?t:!1},T=function(e){return k(y,e)?new E(e):new r(e)},E=r=function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw g("Bad Promise constructor");t=e,r=n}),this.resolve=c(t),this.reject=c(r)},S=function(e){try{e()}catch(t){return{error:t}}},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;m(function(){for(var n=e._v,i=1==e._s,o=0,a=function(t){var r,o,a=i?t.ok:t.fail,s=t.resolve,l=t.reject,u=t.domain;try{a?(i||(2==e._h&&z(e),e._h=1),a===!0?r=n:(u&&u.enter(),r=a(n),u&&u.exit()),r===t.promise?l(g("Promise-chain cycle")):(o=A(r))?o.call(r,s,l):s(r)):l(n)}catch(c){l(c)}};r.length>o;)a(r[o++]);e._c=[],e._n=!1,t&&!e._h&&j(e)})}},j=function(e){p.call(o,function(){var t,r,n,i=e._v;if(M(e)&&(t=S(function(){b?v.emit("unhandledRejection",i,e):(r=o.onunhandledrejection)?r({promise:e,reason:i}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",i)}),e._h=b||M(e)?2:1),e._a=void 0,t)throw t.error})},M=function(e){if(1==e._h)return!1;for(var t,r=e._a||e._c,n=0;r.length>n;)if(t=r[n++],t.fail||!M(t.promise))return!1;return!0},z=function(e){p.call(o,function(){var t;b?v.emit("rejectionHandled",e):(t=o.onrejectionhandled)&&t({promise:e,reason:e._v})})},C=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),R(t,!0))},P=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw g("Promise can't be resolved itself");(t=A(e))?m(function(){var n={_w:r,_d:!1};try{t.call(e,a(P,n,1),a(C,n,1))}catch(i){C.call(n,i)}}):(r._v=e,r._s=1,R(r,!1))}catch(n){C.call({_w:r,_d:!1},n)}}};w||(y=function(e){f(this,y,_,"_h"),c(e),t.call(this);try{e(a(P,this,1),a(C,this,1))}catch(r){C.call(this,r)}},t=function(){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},t.prototype=e("./_redefine-all")(y.prototype,{then:function(e,t){var r=T(d(this,y));return r.ok="function"==typeof e?e:!0,r.fail="function"==typeof t&&t,r.domain=b?v.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&R(this,!1),r.promise},"catch":function(e){return this.then(void 0,e)}}),E=function(){var e=new t;this.promise=e,this.resolve=a(P,e,1),this.reject=a(C,e,1)}),l(l.G+l.W+l.F*!w,{Promise:y}),e("./_set-to-string-tag")(y,_),e("./_set-species")(_),n=e("./_core")[_],l(l.S+l.F*!w,_,{reject:function(e){var t=T(this),r=t.reject;return r(e),t.promise}}),l(l.S+l.F*(i||!w),_,{resolve:function(e){if(e instanceof y&&k(e.constructor,this))return e;var t=T(this),r=t.resolve;return r(e),t.promise}}),l(l.S+l.F*!(w&&e("./_iter-detect")(function(e){y.all(e)["catch"](x)})),_,{all:function(e){var t=this,r=T(t),n=r.resolve,i=r.reject,o=S(function(){var r=[],o=0,a=1;h(e,!1,function(e){var s=o++,l=!1;r.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,r[s]=e,--a||n(r))},i)}),--a||n(r)});return o&&i(o.error),r.promise},race:function(e){var t=this,r=T(t),n=r.reject,i=S(function(){h(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},{"./_a-function":60,"./_an-instance":62,"./_classof":69,"./_core":74,"./_ctx":76,"./_export":82,"./_for-of":84,"./_global":85,"./_is-object":94,"./_iter-detect":98,"./_library":102,"./_microtask":104,"./_redefine-all":119,"./_set-species":122,"./_set-to-string-tag":123,"./_species-constructor":126,"./_task":128,"./_wks":138}],156:[function(e,t){"use strict";var r=e("./_collection-strong");t.exports=e("./_collection")("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(this,e=0===e?0:e,e)}},r)},{"./_collection":73,"./_collection-strong":71}],157:[function(e){"use strict";var t=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,r=this._t,n=this._i;return n>=r.length?{value:void 0,done:!0}:(e=t(r,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":97,"./_string-at":127}],158:[function(e){"use strict";var t=e("./_global"),r=e("./_has"),n=e("./_descriptors"),i=e("./_export"),o=e("./_redefine"),a=e("./_meta").KEY,s=e("./_fails"),l=e("./_shared"),u=e("./_set-to-string-tag"),c=e("./_uid"),f=e("./_wks"),h=e("./_wks-ext"),d=e("./_wks-define"),p=e("./_keyof"),m=e("./_enum-keys"),_=e("./_is-array"),g=e("./_an-object"),v=e("./_to-iobject"),y=e("./_to-primitive"),b=e("./_property-desc"),x=e("./_object-create"),w=e("./_object-gopn-ext"),k=e("./_object-gopd"),A=e("./_object-dp"),T=e("./_object-keys"),E=k.f,S=A.f,R=w.f,j=t.Symbol,M=t.JSON,z=M&&M.stringify,C="prototype",P=f("_hidden"),L=f("toPrimitive"),N={}.propertyIsEnumerable,O=l("symbol-registry"),I=l("symbols"),F=l("op-symbols"),U=Object[C],D="function"==typeof j,B=t.QObject,G=!B||!B[C]||!B[C].findChild,V=n&&s(function(){return 7!=x(S({},"a",{get:function(){return S(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=E(U,t);n&&delete U[t],S(e,t,r),n&&e!==U&&S(U,t,n)}:S,W=function(e){var t=I[e]=x(j[C]);return t._k=e,t},q=D&&"symbol"==typeof j.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof j},Z=function(e,t,n){return e===U&&Z(F,t,n),g(e),t=y(t,!0),g(n),r(I,t)?(n.enumerable?(r(e,P)&&e[P][t]&&(e[P][t]=!1),n=x(n,{enumerable:b(0,!1)})):(r(e,P)||S(e,P,b(1,{})),e[P][t]=!0),V(e,t,n)):S(e,t,n)},H=function(e,t){g(e);for(var r,n=m(t=v(t)),i=0,o=n.length;o>i;)Z(e,r=n[i++],t[r]);return e},X=function(e,t){return void 0===t?x(e):H(x(e),t)},Y=function(e){var t=N.call(this,e=y(e,!0));return this===U&&r(I,e)&&!r(F,e)?!1:t||!r(this,e)||!r(I,e)||r(this,P)&&this[P][e]?t:!0},J=function(e,t){if(e=v(e),t=y(t,!0),e!==U||!r(I,t)||r(F,t)){var n=E(e,t);return!n||!r(I,t)||r(e,P)&&e[P][t]||(n.enumerable=!0),n}},K=function(e){for(var t,n=R(v(e)),i=[],o=0;n.length>o;)r(I,t=n[o++])||t==P||t==a||i.push(t);return i},$=function(e){for(var t,n=e===U,i=R(n?F:v(e)),o=[],a=0;i.length>a;)r(I,t=i[a++])&&(n?r(U,t):!0)&&o.push(I[t]);return o};D||(j=function(){if(this instanceof j)throw TypeError("Symbol is not a constructor!");var e=c(arguments.length>0?arguments[0]:void 0),t=function(n){this===U&&t.call(F,n),r(this,P)&&r(this[P],e)&&(this[P][e]=!1),V(this,e,b(1,n))};return n&&G&&V(U,e,{configurable:!0,set:t}),W(e)},o(j[C],"toString",function(){return this._k}),k.f=J,A.f=Z,e("./_object-gopn").f=w.f=K,e("./_object-pie").f=Y,e("./_object-gops").f=$,n&&!e("./_library")&&o(U,"propertyIsEnumerable",Y,!0),h.f=function(e){return W(f(e))}),i(i.G+i.W+i.F*!D,{Symbol:j});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),et=0;Q.length>et;)f(Q[et++]);for(var Q=T(f.store),et=0;Q.length>et;)d(Q[et++]);i(i.S+i.F*!D,"Symbol",{"for":function(e){return r(O,e+="")?O[e]:O[e]=j(e)},keyFor:function(e){if(q(e))return p(O,e);throw TypeError(e+" is not a symbol!")},useSetter:function(){G=!0},useSimple:function(){G=!1}}),i(i.S+i.F*!D,"Object",{create:X,defineProperty:Z,defineProperties:H,getOwnPropertyDescriptor:J,getOwnPropertyNames:K,getOwnPropertySymbols:$}),M&&i(i.S+i.F*(!D||s(function(){var e=j();return"[null]"!=z([e])||"{}"!=z({a:e})||"{}"!=z(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!q(e)){for(var t,r,n=[e],i=1;arguments.length>i;)n.push(arguments[i++]);return t=n[1],"function"==typeof t&&(r=t),(r||!_(t))&&(t=function(e,t){return r&&(t=r.call(this,e,t)),q(t)?void 0:t}),n[1]=t,z.apply(M,n)}}}),j[C][L]||e("./_hide")(j[C],L,j[C].valueOf),u(j,"Symbol"),u(Math,"Math",!0),u(t.JSON,"JSON",!0)},{"./_an-object":63,"./_descriptors":78,"./_enum-keys":81,"./_export":82,"./_fails":83,"./_global":85,"./_has":86,"./_hide":87,"./_is-array":93,"./_keyof":101,"./_library":102,"./_meta":103,"./_object-create":106,"./_object-dp":107,"./_object-gopd":109,"./_object-gopn":111,"./_object-gopn-ext":110,"./_object-gops":112,"./_object-keys":115,"./_object-pie":116,"./_property-desc":118,"./_redefine":120,"./_set-to-string-tag":123,"./_shared":125,"./_to-iobject":131,"./_to-primitive":134,"./_uid":135,"./_wks":138,"./_wks-define":136,"./_wks-ext":137}],159:[function(e){var t=e("./_export");t(t.P+t.R,"Map",{toJSON:e("./_collection-to-json")("Map")})},{"./_collection-to-json":72,"./_export":82}],160:[function(e){var t=e("./_export");t(t.P+t.R,"Set",{toJSON:e("./_collection-to-json")("Set")})},{"./_collection-to-json":72,"./_export":82}],161:[function(e){e("./_wks-define")("asyncIterator")},{"./_wks-define":136}],162:[function(e){e("./_wks-define")("observable")},{"./_wks-define":136}],163:[function(e){e("./es6.array.iterator");for(var t=e("./_global"),r=e("./_hide"),n=e("./_iterators"),i=e("./_wks")("toStringTag"),o=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],a=0;5>a;a++){var s=o[a],l=t[s],u=l&&l.prototype;u&&!u[i]&&r(u,i,s),n[s]=n.Array}},{"./_global":85,"./_hide":87,"./_iterators":100,"./_wks":138,"./es6.array.iterator":143}],164:[function(e,t,r){(function(e){function t(e){return Array.isArray?Array.isArray(e):"[object Array]"===_(e)}function n(e){return"boolean"==typeof e}function i(e){return null===e}function o(e){return null==e}function a(e){return"number"==typeof e}function s(e){return"string"==typeof e}function l(e){return"symbol"==typeof e}function u(e){return void 0===e}function c(e){return"[object RegExp]"===_(e)}function f(e){return"object"==typeof e&&null!==e}function h(e){return"[object Date]"===_(e)}function d(e){return"[object Error]"===_(e)||e instanceof Error}function p(e){return"function"==typeof e}function m(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function _(e){return Object.prototype.toString.call(e)}r.isArray=t,r.isBoolean=n,r.isNull=i,r.isNullOrUndefined=o,r.isNumber=a,r.isString=s,r.isSymbol=l,r.isUndefined=u,r.isRegExp=c,r.isObject=f,r.isDate=h,r.isError=d,r.isFunction=p,r.isPrimitive=m,r.isBuffer=e.isBuffer}).call(this,{isBuffer:e("../../is-buffer/index.js")})},{"../../is-buffer/index.js":188}],165:[function(e,t,r){function n(e){return e=Math.round(e),0>e?0:e>255?255:e}function i(e){return 0>e?0:e>1?1:e}function o(e){return n("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function a(e){return i("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function s(e,t,r){return 0>r?r+=1:r>1&&(r-=1),1>6*r?e+(t-e)*r*6:1>2*r?t:2>3*r?e+(t-e)*(2/3-r)*6:e}function l(e){var t=e.replace(/ /g,"").toLowerCase();if(t in u)return u[t].slice();if("#"===t[0]){if(4===t.length){var r=parseInt(t.substr(1),16);return r>=0&&4095>=r?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===t.length){var r=parseInt(t.substr(1),16);return r>=0&&16777215>=r?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var i=t.indexOf("("),l=t.indexOf(")");if(-1!==i&&l+1===t.length){var c=t.substr(0,i),f=t.substr(i+1,l-(i+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=a(f.pop());case"rgb":return 3!==f.length?null:[o(f[0]),o(f[1]),o(f[2]),h];case"hsla":if(4!==f.length)return null;h=a(f.pop());case"hsl":if(3!==f.length)return null;var d=(parseFloat(f[0])%360+360)%360/360,p=a(f[1]),m=a(f[2]),_=.5>=m?m*(p+1):m+p-m*p,g=2*m-_;return[n(255*s(g,_,d+1/3)),n(255*s(g,_,d)),n(255*s(g,_,d-1/3)),h];default:return null}}return null}var u={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{r.parseCSSColor=l}catch(c){}},{}],166:[function(e,t){"use strict";function r(e,t,n){var i=0|e[n];if(0>=i)return[];var o,a=new Array(i);if(n===e.length-1)for(o=0;i>o;++o)a[o]=t;else for(o=0;i>o;++o)a[o]=r(e,t,n+1);return a}function n(e,t){var r,n;for(r=new Array(e),n=0;e>n;++n)r[n]=t;return r}function i(e,t){switch("undefined"==typeof t&&(t=0),typeof e){case"number":if(e>0)return n(0|e,t);break;case"object":if("number"==typeof e.length)return r(e,t,0)}return[]}t.exports=i},{}],167:[function(e,t){"use strict";function r(e,t,r){r=r||2;var i=t&&t.length,a=i?t[0]*r:e.length,s=n(e,0,a,r,!0),l=[];if(!s)return l;var u,f,h,d,p,m,_;if(i&&(s=c(e,t,s,r)),e.length>80*r){u=h=e[0],f=d=e[1];for(var g=r;a>g;g+=r)p=e[g],m=e[g+1],u>p&&(u=p),f>m&&(f=m),p>h&&(h=p),m>d&&(d=m);_=Math.max(h-u,d-f)}return o(s,l,r,u,f,_),l}function n(e,t,r,n,i){var o,a;if(i===M(e,t,r,n)>0)for(o=t;r>o;o+=n)a=S(o,e[o],e[o+1],a);else for(o=r-n;o>=t;o-=n)a=S(o,e[o],e[o+1],a);return a&&x(a,a.next)&&(R(a),a=a.next),a}function i(e,t){if(!e)return e;t||(t=e);var r,n=e;do if(r=!1,n.steiner||!x(n,n.next)&&0!==b(n.prev,n,n.next))n=n.next;else{if(R(n),n=t=n.prev,n===n.next)return null;r=!0}while(r||n!==t);return t}function o(e,t,r,n,c,f,h){if(e){!h&&f&&p(e,n,c,f);for(var d,m,_=e;e.prev!==e.next;)if(d=e.prev,m=e.next,f?s(e,n,c,f):a(e))t.push(d.i/r),t.push(e.i/r),t.push(m.i/r),R(e),e=m.next,_=m.next;else if(e=m,e===_){h?1===h?(e=l(e,t,r),o(e,t,r,n,c,f,2)):2===h&&u(e,t,r,n,c,f):o(i(e),t,r,n,c,f,1);break}}}function a(e){var t=e.prev,r=e,n=e.next;if(b(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(v(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&b(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function s(e,t,r,n){var i=e.prev,o=e,a=e.next;if(b(i,o,a)>=0)return!1;for(var s=i.xo.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,c=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,f=_(s,l,t,r,n),h=_(u,c,t,r,n),d=e.nextZ;d&&d.z<=h;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(d=e.prevZ;d&&d.z>=f;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.prevZ}return!0}function l(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!x(i,o)&&w(i,n,n.next,o)&&A(i,o)&&A(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),R(n),R(n.next),n=e=o),n=n.next}while(n!==e);return n}function u(e,t,r,n,a,s){var l=e;do{for(var u=l.next.next;u!==l.prev;){if(l.i!==u.i&&y(l,u)){var c=E(l,u);return l=i(l,l.next),c=i(c,c.next),o(l,t,r,n,a,s),void o(c,t,r,n,a,s)}u=u.next}l=l.next}while(l!==e)}function c(e,t,r,o){var a,s,l,u,c,d=[];for(a=0,s=t.length;s>a;a++)l=t[a]*o,u=s-1>a?t[a+1]*o:e.length,c=n(e,l,u,o,!1),c===c.next&&(c.steiner=!0),d.push(g(c));for(d.sort(f),a=0;a=n.next.y){var s=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(i>=s&&s>a){if(a=s,s===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&v(f>o?i:a,o,c,f,f>o?a:i,o,n.x,n.y)&&(l=Math.abs(o-n.y)/(i-n.x),(h>l||l===h&&n.x>r.x)&&A(n,e)&&(r=n,h=l)),n=n.next;return r}function p(e,t,r,n){var i=e;do null===i.z&&(i.z=_(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,m(i)}function m(e){var t,r,n,i,o,a,s,l,u=1;do{for(r=e,e=null,o=null,a=0;r;){for(a++,n=r,s=0,t=0;u>t&&(s++,n=n.nextZ,n);t++);for(l=u;s>0||l>0&&n;)0===s?(i=n,n=n.nextZ,l--):0!==l&&n?r.z<=n.z?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--):(i=r,r=r.nextZ,s--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,u*=2}while(a>1);return e}function _(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1 -}function g(e){var t=e,r=e;do t.x=0&&(e-a)*(n-s)-(r-a)*(t-s)>=0&&(r-a)*(o-s)-(i-a)*(n-s)>=0}function y(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!k(e,t)&&A(e,t)&&A(t,e)&&T(e,t)}function b(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,r,n){return x(e,t)&&x(r,n)||x(e,n)&&x(r,t)?!0:b(e,t,r)>0!=b(e,t,n)>0&&b(r,n,e)>0!=b(r,n,t)>0}function k(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&w(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function A(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function T(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e);return n}function E(e,t){var r=new j(e.i,e.x,e.y),n=new j(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function S(e,t,r,n){var i=new j(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function j(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function M(e,t,r,n){for(var i=0,o=t,a=r-n;r>o;o+=n)i+=(e[a]-e[o])*(e[o+1]+e[a+1]),a=o;return i}t.exports=r,r.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,a=Math.abs(M(e,0,o,r));if(i)for(var s=0,l=t.length;l>s;s++){var u=t[s]*r,c=l-1>s?t[s+1]*r:e.length;a-=Math.abs(M(e,u,c,r))}var f=0;for(s=0;sa;a++)r.vertices.push(e[i][o][a]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],168:[function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function a(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,s,l,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],a(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(o(r))for(s=Array.prototype.slice.call(arguments,1),u=r.slice(),i=u.length,l=0;i>l;l++)u[l].apply(this,s);return!0},r.prototype.addListener=function(e,t){var i;if(!n(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,n(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=a(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,a,s;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],a=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(s=a;s-->0;)if(r[s]===t||r[s].listener&&r[s].listener===t){i=s;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],169:[function(e,t){!function(){function e(e,t){c?e.addEventListener("scroll",t,!1):e.attachEvent("scroll",t)}function r(e){document.body?e():c?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||e()})}function n(e){this.a=document.createElement("div"),this.a.setAttribute("aria-hidden","true"),this.a.appendChild(document.createTextNode(e)),this.b=document.createElement("span"),this.c=document.createElement("span"),this.h=document.createElement("span"),this.f=document.createElement("span"),this.g=-1,this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;",this.b.appendChild(this.h),this.c.appendChild(this.f),this.a.appendChild(this.b),this.a.appendChild(this.c)}function i(e,t){e.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+t+";"}function o(e){var t=e.a.offsetWidth,r=t+100;return e.f.style.width=r+"px",e.c.scrollLeft=r,e.b.scrollLeft=e.b.scrollWidth+100,e.g!==t?(e.g=t,!0):!1}function a(t,r){function n(){var e=i;o(e)&&null!==e.a.parentNode&&r(e.g)}var i=t;e(t.b,n),e(t.c,n),o(t)}function s(e,t){var r=t||{};this.family=e,this.style=r.style||"normal",this.weight=r.weight||"normal",this.stretch=r.stretch||"normal"}function l(){if(null===h){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(t){}h=""!==e.style.font}return h}function u(e,t){return[e.style,e.weight,l()?e.stretch:"","100px",t].join(" ")}var c=!!document.addEventListener,f=null,h=null,d=!!window.FontFace;s.prototype.load=function(e,t){var o=this,s=e||"BESbswy",l=t||3e3,c=(new Date).getTime();return new Promise(function(e,t){if(d){var h=new Promise(function(e,t){function r(){(new Date).getTime()-c>=l?t():document.fonts.load(u(o,o.family),s).then(function(t){1<=t.length?e():setTimeout(r,25)},function(){t()})}r()}),p=new Promise(function(e,t){setTimeout(t,l)});Promise.race([p,h]).then(function(){e(o)},function(){t(o)})}else r(function(){function r(){var t;(t=-1!=_&&-1!=g||-1!=_&&-1!=v||-1!=g&&-1!=v)&&((t=_!=g&&_!=v&&g!=v)||(null===f&&(t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),f=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))),t=f&&(_==y&&g==y&&v==y||_==b&&g==b&&v==b||_==x&&g==x&&v==x)),t=!t),t&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),e(o))}function h(){if((new Date).getTime()-c>=l)null!==w.parentNode&&w.parentNode.removeChild(w),t(o);else{var e=document.hidden;(!0===e||void 0===e)&&(_=d.a.offsetWidth,g=p.a.offsetWidth,v=m.a.offsetWidth,r()),k=setTimeout(h,50)}}var d=new n(s),p=new n(s),m=new n(s),_=-1,g=-1,v=-1,y=-1,b=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",i(d,u(o,"sans-serif")),i(p,u(o,"serif")),i(m,u(o,"monospace")),w.appendChild(d.a),w.appendChild(p.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,b=p.a.offsetWidth,x=m.a.offsetWidth,h(),a(d,function(e){_=e,r()}),i(d,u(o,'"'+o.family+'",sans-serif')),a(p,function(e){g=e,r()}),i(p,u(o,'"'+o.family+'",serif')),a(m,function(e){v=e,r()}),i(m,u(o,'"'+o.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=s.prototype.load,"undefined"!=typeof t&&(t.exports=window.FontFaceObserver)}()},{}],170:[function(e,t){"use strict";function r(e,t,r,o,a,s,l,u){if(r/=t,o/=t,l>=r&&o>=u)return e;if(l>o||r>u)return null;for(var c=[],f=0;f=r&&o>=d)c.push(p);else if(!(h>o||r>d)){var g=1===_?n(m,r,o,a):i(m,r,o,a,s,3===_);g.length&&c.push({geometry:g,type:_,tags:e[f].tags||null,min:p.min,max:p.max})}}return c.length?c:null}function n(e,t,r,n){for(var i=[],o=0;o=t&&r>=s&&i.push(a)}return i}function i(e,t,r,n,i,a){for(var s=[],l=0;lc;c++)u=p||m[c],p=m[c+1],h=d||u[n],d=p[n],t>h?d>r?(y.push(i(u,p,t),i(u,p,r)),a||(y=o(s,y,_,g))):d>=t&&y.push(i(u,p,t)):h>r?t>d?(y.push(i(u,p,r),i(u,p,t)),a||(y=o(s,y,_,g))):r>=d&&y.push(i(u,p,r)):(y.push(u),t>d?(y.push(i(u,p,t)),a||(y=o(s,y,_,g))):d>r&&(y.push(i(u,p,r)),a||(y=o(s,y,_,g))));u=m[v-1],h=u[n],h>=t&&r>=h&&y.push(u),f=y[y.length-1],a&&f&&(y[0][0]!==f[0]||y[0][1]!==f[1])&&y.push(y[0]),o(s,y,_,g)}return s}function o(e,t,r,n){return t.length&&(t.area=r,t.dist=n,e.push(t)),[]}t.exports=r},{}],171:[function(e,t){"use strict";function r(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;in?-1:n>1?1:n,[r,n,0]}function s(e){for(var t,r,n=0,i=0,o=0;o1)return!1;var a=i.geometry[0].length;if(5!==a)return!1;for(var s=0;a>s;s++){var l=o(i.geometry[0][s],t,e.z2,e.x,e.y);if(l[0]!==-r&&l[0]!==t+r||l[1]!==-r&&l[1]!==t+r)return!1}return!0}t.exports=r;var f=e("./convert"),h=e("./clip"),d=e("./wrap"),p=e("./tile");n.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},n.prototype.splitTile=function(e,t,r,n,i,o,u){for(var f=[e,t,r,n],d=this.options,m=d.debug;f.length;){n=f.pop(),r=f.pop(),t=f.pop(),e=f.pop();var _=1<1&&console.time("creation"),v=this.tiles[g]=p(e,_,r,n,y,t===d.maxZoom),this.tileCoords.push({z:t,x:r,y:n}),m)){m>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,v.numFeatures,v.numPoints,v.numSimplified),console.timeEnd("creation"));var b="z"+t;this.stats[b]=(this.stats[b]||0)+1,this.total++}if(v.source=e,d.solidChildren||!c(v,d.extent,d.buffer)){if(i){if(t===d.maxZoom||t===i)continue;var x=1<1&&console.time("clipping");var w,k,A,T,E,S,R=.5*d.buffer/d.extent,j=.5-R,M=.5+R,z=1+R;w=k=A=T=null,E=h(e,_,r-R,r+M,0,s,v.min[0],v.max[0]),S=h(e,_,r+j,r+z,0,s,v.min[0],v.max[0]),E&&(w=h(E,_,n-R,n+M,1,l,v.min[1],v.max[1]),k=h(E,_,n+j,n+z,1,l,v.min[1],v.max[1])),S&&(A=h(S,_,n-R,n+M,1,l,v.min[1],v.max[1]),T=h(S,_,n+j,n+z,1,l,v.min[1],v.max[1])),m>1&&console.timeEnd("clipping"),w&&f.push(w,t+1,2*r,2*n),k&&f.push(k,t+1,2*r,2*n+1),A&&f.push(A,t+1,2*r+1,2*n),T&&f.push(T,t+1,2*r+1,2*n+1)}}},n.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,s=n.debug,l=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var f,h=e,d=t,p=r;!f&&h>0;)h--,d=Math.floor(d/2),p=Math.floor(p/2),f=this.tiles[a(h,d,p)];if(!f)return null;if(s>1&&console.log("found parent tile z%d-%d-%d",h,d,p),f.source){if(c(f,o,n.buffer))return i(f,o);s>1&&console.time("drilling down"),this.splitTile(f.source,h,d,p,e,t,r),s>1&&console.timeEnd("drilling down")}return this.tiles[u]?i(this.tiles[u],o):null}},{"./clip":170,"./convert":171,"./tile":174,"./wrap":175}],173:[function(e,t){"use strict";function r(e,t){var r,i,o,a,s=t*t,l=e.length,u=0,c=l-1,f=[];for(e[u][2]=1,e[c][2]=1;c;){for(i=0,r=u+1;c>r;r++)o=n(e[r],e[u],e[c]),o>i&&(a=r,i=o);i>s?(e[a][2]=i,f.push(u),f.push(a),u=a):(c=f.pop(),u=f.pop())}}function n(e,t,r){var n=t[0],i=t[1],o=r[0],a=r[1],s=e[0],l=e[1],u=o-n,c=a-i;if(0!==u||0!==c){var f=((s-n)*u+(l-i)*c)/(u*u+c*c);f>1?(n=o,i=a):f>0&&(n+=u*f,i+=c*f)}return u=s-n,c=l-i,u*u+c*c}t.exports=r},{}],174:[function(e,t){"use strict";function r(e,t,r,i,o,a){for(var s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:t,transformed:!1,min:[2,1],max:[-1,0]},l=0;ls.max[0]&&(s.max[0]=c[0]),c[1]>s.max[1]&&(s.max[1]=c[1])}return s}function n(e,t,r,n){var i,o,a,s,l=t.geometry,u=t.type,c=[],f=r*r;if(1===u)for(i=0;if)&&(h.push(s),e.numSimplified++),e.numPoints++;c.push(h)}else e.numPoints+=a.length;c.length&&e.features.push({geometry:c,type:u,tags:t.tags||null})}t.exports=r},{}],175:[function(e,t){"use strict";function r(e,t,r){var i=e,a=o(e,1,-1-t,t,0,r,-1,2),s=o(e,1,1-t,2+t,0,r,-1,2);return(a||s)&&(i=o(e,1,-t,1+t,0,r,-1,2),a&&(i=n(a,1).concat(i)),s&&(i=i.concat(n(s,-1)))),i}function n(e,t){for(var r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-c)-1,d>>=-c,c+=s;c>0;o=256*o+e[t+f],f+=h,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=n;c>0;a=256*a+e[t+f],f+=h,c-=8);if(0===o)o=1-u;else{if(o===l)return a?0/0:1/0*(d?-1:1);a+=Math.pow(2,n),o-=u}return(d?-1:1)*a*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var a,s,l,u=8*o-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,m=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||1/0===t?(s=isNaN(t)?1:0,a=c):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),t+=a+f>=1?h/l:h*Math.pow(2,1-f),t*l>=2&&(a++,l/=2),a+f>=c?(s=0,a=c):a+f>=1?(s=(t*l-1)*Math.pow(2,i),a+=f):(s=t*Math.pow(2,f-1)*Math.pow(2,i),a=0));i>=8;e[r+d]=255&s,d+=p,s/=256,i-=8);for(a=a<0;e[r+d]=255&a,d+=p,a/=256,u-=8);e[r+d-p]|=128*m}},{}],187:[function(e,t){t.exports="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},{}],188:[function(e,t){function r(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function n(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&r(e.slice(0,0))}t.exports=function(e){return null!=e&&(r(e)||n(e)||!!e._isBuffer)}},{}],189:[function(e,t){var r={}.toString;t.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},{}],190:[function(e,t){"use strict";var r=e("./lib/js-yaml.js");t.exports=r},{"./lib/js-yaml.js":191}],191:[function(e,t){"use strict";function r(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}var n=e("./js-yaml/loader");t.exports.Type=e("./js-yaml/type"),t.exports.Schema=e("./js-yaml/schema"),t.exports.FAILSAFE_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.JSON_SCHEMA=e("./js-yaml/schema/json"),t.exports.CORE_SCHEMA=e("./js-yaml/schema/core"),t.exports.DEFAULT_SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_FULL_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.load=n.load,t.exports.loadAll=n.loadAll,t.exports.safeLoad=n.safeLoad,t.exports.safeLoadAll=n.safeLoadAll,t.exports.YAMLException=e("./js-yaml/exception"),t.exports.MINIMAL_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.scan=r("scan"),t.exports.parse=r("parse"),t.exports.compose=r("compose"),t.exports.addConstructor=r("addConstructor")},{"./js-yaml/exception":193,"./js-yaml/loader":194,"./js-yaml/schema":196,"./js-yaml/schema/core":197,"./js-yaml/schema/default_full":198,"./js-yaml/schema/default_safe":199,"./js-yaml/schema/failsafe":200,"./js-yaml/schema/json":201,"./js-yaml/type":202}],192:[function(e,t){"use strict";function r(e){return"undefined"==typeof e||null===e}function n(e){return"object"==typeof e&&null!==e}function i(e){return Array.isArray(e)?e:r(e)?[]:[e]}function o(e,t){var r,n,i,o;if(t)for(o=Object.keys(t),r=0,n=o.length;n>r;r+=1)i=o[r],e[i]=t[i];return e}function a(e,t){var r,n="";for(r=0;t>r;r+=1)n+=e;return n}function s(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}t.exports.isNothing=r,t.exports.isObject=n,t.exports.toArray=i,t.exports.repeat=a,t.exports.isNegativeZero=s,t.exports.extend=o},{}],193:[function(e,t){"use strict";function r(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=r},{}],194:[function(e,t){"use strict";function r(e){return 10===e||13===e}function n(e){return 9===e||32===e}function i(e){return 9===e||32===e||10===e||13===e}function o(e){return 44===e||91===e||93===e||123===e||125===e}function a(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function s(e){return 120===e?2:117===e?4:85===e?8:0}function l(e){return e>=48&&57>=e?e-48:-1}function u(e){return 48===e?"\x00":97===e?"":98===e?"\b":116===e?" ":9===e?" ":110===e?"\n":118===e?" ":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function c(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||V,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new D(t,new B(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function p(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function m(e,t,r,n){var i,o,a,s;if(r>t){if(s=e.input.slice(t,r),n)for(i=0,o=s.length;o>i;i+=1)a=s.charCodeAt(i),9===a||a>=32&&1114111>=a||d(e,"expected valid JSON character");else $.test(s)&&d(e,"the stream contains non-printable characters");e.result+=s}}function _(e,t,r,n){var i,o,a,s;for(U.isObject(r)||d(e,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(r),a=0,s=i.length;s>a;a+=1)o=i[a],W.call(t,o)||(t[o]=r[o],n[o]=!0)}function g(e,t,r,n,i,o){var a,s;if(i=String(i),null===t&&(t={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(o))for(a=0,s=o.length;s>a;a+=1)_(e,t,o[a],r);else _(e,t,o,r);else e.json||W.call(r,i)||!W.call(t,i)||d(e,"duplicated mapping key"),t[i]=o,delete r[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function y(e,t,i){for(var o=0,a=e.input.charCodeAt(e.position);0!==a;){for(;n(a);)a=e.input.charCodeAt(++e.position);if(t&&35===a)do a=e.input.charCodeAt(++e.position);while(10!==a&&13!==a&&0!==a);if(!r(a))break;for(v(e),a=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===a;)e.lineIndent++,a=e.input.charCodeAt(++e.position)}return-1!==i&&0!==o&&e.lineIndent1&&(e.result+=U.repeat("\n",t-1))}function w(e,t,a){var s,l,u,c,f,h,d,p,_,g=e.kind,v=e.result;if(_=e.input.charCodeAt(e.position),i(_)||o(_)||35===_||38===_||42===_||33===_||124===_||62===_||39===_||34===_||37===_||64===_||96===_)return!1;if((63===_||45===_)&&(l=e.input.charCodeAt(e.position+1),i(l)||a&&o(l)))return!1;for(e.kind="scalar",e.result="",u=c=e.position,f=!1;0!==_;){if(58===_){if(l=e.input.charCodeAt(e.position+1),i(l)||a&&o(l))break}else if(35===_){if(s=e.input.charCodeAt(e.position-1),i(s))break}else{if(e.position===e.lineStart&&b(e)||a&&o(_))break;if(r(_)){if(h=e.line,d=e.lineStart,p=e.lineIndent,y(e,!1,-1),e.lineIndent>=t){f=!0,_=e.input.charCodeAt(e.position);continue}e.position=c,e.line=h,e.lineStart=d,e.lineIndent=p;break}}f&&(m(e,u,c,!1),x(e,e.line-h),u=c=e.position,f=!1),n(_)||(c=e.position+1),_=e.input.charCodeAt(++e.position)}return m(e,u,c,!1),e.result?!0:(e.kind=g,e.result=v,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(m(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else r(n)?(m(e,i,o,!0),x(e,y(e,!1,t)),i=o=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);d(e,"unexpected end of the stream within a single quoted scalar")}function A(e,t){var n,i,o,l,u,f;if(f=e.input.charCodeAt(e.position),34!==f)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(f=e.input.charCodeAt(e.position));){if(34===f)return m(e,n,e.position,!0),e.position++,!0;if(92===f){if(m(e,n,e.position,!0),f=e.input.charCodeAt(++e.position),r(f))y(e,!1,t);else if(256>f&&nt[f])e.result+=it[f],e.position++;else if((u=s(f))>0){for(o=u,l=0;o>0;o--)f=e.input.charCodeAt(++e.position),(u=a(f))>=0?l=(l<<4)+u:d(e,"expected hexadecimal character");e.result+=c(l),e.position++}else d(e,"unknown escape sequence");n=i=e.position}else r(f)?(m(e,n,i,!0),x(e,y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}d(e,"unexpected end of the stream within a double quoted scalar")}function T(e,t){var r,n,o,a,s,l,u,c,f,h,p,m=!0,_=e.tag,v=e.anchor,b={};if(p=e.input.charCodeAt(e.position),91===p)a=93,u=!1,n=[];else{if(123!==p)return!1;a=125,u=!0,n={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=n),p=e.input.charCodeAt(++e.position);0!==p;){if(y(e,!0,t),p=e.input.charCodeAt(e.position),p===a)return e.position++,e.tag=_,e.anchor=v,e.kind=u?"mapping":"sequence",e.result=n,!0;m||d(e,"missed comma between flow collection entries"),f=c=h=null,s=l=!1,63===p&&(o=e.input.charCodeAt(e.position+1),i(o)&&(s=l=!0,e.position++,y(e,!0,t))),r=e.line,C(e,t,q,!1,!0),f=e.tag,c=e.result,y(e,!0,t),p=e.input.charCodeAt(e.position),!l&&e.line!==r||58!==p||(s=!0,p=e.input.charCodeAt(++e.position),y(e,!0,t),C(e,t,q,!1,!0),h=e.result),u?g(e,n,b,f,c,h):n.push(s?g(e,null,b,f,c,h):c),y(e,!0,t),p=e.input.charCodeAt(e.position),44===p?(m=!0,p=e.input.charCodeAt(++e.position)):m=!1 -}d(e,"unexpected end of the stream within a flow collection")}function E(e,t){var i,o,a,s,u=Y,c=!1,f=t,h=0,p=!1;if(s=e.input.charCodeAt(e.position),124===s)o=!1;else{if(62!==s)return!1;o=!0}for(e.kind="scalar",e.result="";0!==s;)if(s=e.input.charCodeAt(++e.position),43===s||45===s)Y===u?u=43===s?K:J:d(e,"repeat of a chomping mode identifier");else{if(!((a=l(s))>=0))break;0===a?d(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?d(e,"repeat of an indentation width identifier"):(f=t+a-1,c=!0)}if(n(s)){do s=e.input.charCodeAt(++e.position);while(n(s));if(35===s)do s=e.input.charCodeAt(++e.position);while(!r(s)&&0!==s)}for(;0!==s;){for(v(e),e.lineIndent=0,s=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),r(s))h++;else{if(e.lineIndentt)&&0!==o)d(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(C(e,t,X,!0,a)&&(v?m=e.result:_=e.result),v||(g(e,f,h,p,m,_),p=m=_=null),y(e,!0,-1),l=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==l)d(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentl;l+=1)if(c=e.implicitTypes[l],c.resolve(e.result)){e.result=c.construct(e.result),e.tag=c.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else W.call(e.typeMap,e.tag)?(c=e.typeMap[e.tag],null!==e.result&&c.kind!==e.kind&&d(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+c.kind+'", not "'+e.kind+'"'),c.resolve(e.result)?(e.result=c.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):d(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||_}function P(e){var t,o,a,s,l=e.position,u=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(s=e.input.charCodeAt(e.position))&&(y(e,!0,-1),s=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==s));){for(u=!0,s=e.input.charCodeAt(++e.position),t=e.position;0!==s&&!i(s);)s=e.input.charCodeAt(++e.position);for(o=e.input.slice(t,e.position),a=[],o.length<1&&d(e,"directive name must not be less than one character in length");0!==s;){for(;n(s);)s=e.input.charCodeAt(++e.position);if(35===s){do s=e.input.charCodeAt(++e.position);while(0!==s&&!r(s));break}if(r(s))break;for(t=e.position;0!==s&&!i(s);)s=e.input.charCodeAt(++e.position);a.push(e.input.slice(t,e.position))}0!==s&&v(e),W.call(at,o)?at[o](e,o,a):p(e,'unknown document directive "'+o+'"')}return y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,y(e,!0,-1)):u&&d(e,"directives end mark is expected"),C(e,e.lineIndent-1,X,!1,!0),y(e,!0,-1),e.checkLineBreaks&&Q.test(e.input.slice(l,e.position))&&p(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&b(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,y(e,!0,-1))):void(e.positionn;n+=1)t(o[n])}function O(e,t){var r=L(e,t);if(0===r.length)return void 0;if(1===r.length)return r[0];throw new D("expected a single document in the stream, but found more")}function I(e,t,r){N(e,t,U.extend({schema:G},r))}function F(e,t){return O(e,U.extend({schema:G},t))}for(var U=e("./common"),D=e("./exception"),B=e("./mark"),G=e("./schema/default_safe"),V=e("./schema/default_full"),W=Object.prototype.hasOwnProperty,q=1,Z=2,H=3,X=4,Y=1,J=2,K=3,$=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Q=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,tt=/^(?:!|!!|![a-z\-]+!)$/i,rt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,nt=new Array(256),it=new Array(256),ot=0;256>ot;ot++)nt[ot]=u(ot)?1:0,it[ot]=u(ot);var at={YAML:function(e,t,r){var n,i,o;null!==e.version&&d(e,"duplication of %YAML directive"),1!==r.length&&d(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]),null===n&&d(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&d(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=2>o,1!==o&&2!==o&&p(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&d(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],tt.test(n)||d(e,"ill-formed tag handle (first argument) of the TAG directive"),W.call(e.tagMap,n)&&d(e,'there is a previously declared suffix for "'+n+'" tag handle'),rt.test(i)||d(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};t.exports.loadAll=N,t.exports.load=O,t.exports.safeLoadAll=I,t.exports.safeLoad=F},{"./common":192,"./exception":193,"./mark":195,"./schema/default_full":198,"./schema/default_safe":199}],195:[function(e,t){"use strict";function r(e,t,r,n,i){this.name=e,this.buffer=t,this.position=r,this.line=n,this.column=i}var n=e("./common");r.prototype.getSnippet=function(e,t){var r,i,o,a,s;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",i=this.position;i>0&&-1==="\x00\r\n…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>t/2-1){r=" ... ",i+=5;break}for(o="",a=this.position;at/2-1){o=" ... ",a-=5;break}return s=this.buffer.slice(i,a),n.repeat(" ",e)+r+s+o+"\n"+n.repeat(" ",e+this.position-i+r.length)+"^"},r.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(r+=":\n"+t)),r},t.exports=r},{"./common":192}],196:[function(e,t){"use strict";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,r){t.tag===e.tag&&i.push(r)}),n.push(e)}),n.filter(function(e,t){return-1===i.indexOf(t)})}function n(){function e(e){n[e.tag]=e}var t,r,n={};for(t=0,r=arguments.length;r>t;t+=1)arguments[t].forEach(e);return n}function i(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new a("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=r(this,"implicit",[]),this.compiledExplicit=r(this,"explicit",[]),this.compiledTypeMap=n(this.compiledImplicit,this.compiledExplicit)}var o=e("./common"),a=e("./exception"),s=e("./type");i.DEFAULT=null,i.create=function(){var e,t;switch(arguments.length){case 1:e=i.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new a("Wrong number of arguments for Schema.create function")}if(e=o.toArray(e),t=o.toArray(t),!e.every(function(e){return e instanceof i}))throw new a("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!t.every(function(e){return e instanceof s}))throw new a("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new i({include:e,explicit:t})},t.exports=i},{"./common":192,"./exception":193,"./type":202}],197:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./json")]})},{"../schema":196,"./json":201}],198:[function(e,t){"use strict";var r=e("../schema");t.exports=r.DEFAULT=new r({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":196,"../type/js/function":207,"../type/js/regexp":208,"../type/js/undefined":209,"./default_safe":199}],199:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":196,"../type/binary":203,"../type/merge":211,"../type/omap":213,"../type/pairs":214,"../type/set":216,"../type/timestamp":218,"./core":197}],200:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":196,"../type/map":210,"../type/seq":215,"../type/str":217}],201:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":196,"../type/bool":204,"../type/float":205,"../type/int":206,"../type/null":212,"./failsafe":200}],202:[function(e,t){"use strict";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(r){e[r].forEach(function(e){t[String(e)]=r})}),t}function n(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new i('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),-1===a.indexOf(this.kind))throw new i('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var i=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],a=["scalar","sequence","mapping"];t.exports=n},{"./exception":193}],203:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t,r,n=0,i=e.length,o=l;for(r=0;i>r;r++)if(t=o.indexOf(e.charAt(r)),!(t>64)){if(0>t)return!1;n+=6}return n%8===0}function n(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,o=l,s=0,u=[];for(t=0;i>t;t++)t%4===0&&t&&(u.push(s>>16&255),u.push(s>>8&255),u.push(255&s)),s=s<<6|o.indexOf(n.charAt(t));return r=i%4*6,0===r?(u.push(s>>16&255),u.push(s>>8&255),u.push(255&s)):18===r?(u.push(s>>10&255),u.push(s>>2&255)):12===r&&u.push(s>>4&255),a?new a(u):u}function i(e){var t,r,n="",i=0,o=e.length,a=l;for(t=0;o>t;t++)t%3===0&&t&&(n+=a[i>>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]),i=(i<<8)+e[t];return r=o%3,0===r?(n+=a[i>>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]):2===r?(n+=a[i>>10&63],n+=a[i>>4&63],n+=a[i<<2&63],n+=a[64]):1===r&&(n+=a[i>>2&63],n+=a[i<<4&63],n+=a[64],n+=a[64]),n}function o(e){return a&&a.isBuffer(e)}var a=e("buffer").Buffer,s=e("../type"),l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new s("tag:yaml.org,2002:binary",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../type":202,buffer:40}],204:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)}function n(e){return"true"===e||"True"===e||"TRUE"===e}function i(e){return"[object Boolean]"===Object.prototype.toString.call(e)}var o=e("../type");t.exports=new o("tag:yaml.org,2002:bool",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":202}],205:[function(e,t){"use strict";function r(e){return null===e?!1:l.test(e)?!0:!1}function n(e){var t,r,n,i;return t=e.replace(/_/g,"").toLowerCase(),r="-"===t[0]?-1:1,i=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?0/0:t.indexOf(":")>=0?(t.split(":").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,n=1,i.forEach(function(e){t+=e*n,n*=60}),r*t):r*parseFloat(t,10)}function i(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(a.isNegativeZero(e))return"-0.0";return r=e.toString(10),u.test(r)?r.replace("e",".e"):r}function o(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!==0||a.isNegativeZero(e))}var a=e("../common"),s=e("../type"),l=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),u=/^[-+]?[0-9]+e/;t.exports=new s("tag:yaml.org,2002:float",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i,defaultStyle:"lowercase"})},{"../common":192,"../type":202}],206:[function(e,t){"use strict";function r(e){return e>=48&&57>=e||e>=65&&70>=e||e>=97&&102>=e}function n(e){return e>=48&&55>=e}function i(e){return e>=48&&57>=e}function o(e){if(null===e)return!1;var t,o=e.length,a=0,s=!1;if(!o)return!1;if(t=e[a],("-"===t||"+"===t)&&(t=e[++a]),"0"===t){if(a+1===o)return!0;if(t=e[++a],"b"===t){for(a++;o>a;a++)if(t=e[a],"_"!==t){if("0"!==t&&"1"!==t)return!1;s=!0}return s}if("x"===t){for(a++;o>a;a++)if(t=e[a],"_"!==t){if(!r(e.charCodeAt(a)))return!1;s=!0}return s}for(;o>a;a++)if(t=e[a],"_"!==t){if(!n(e.charCodeAt(a)))return!1;s=!0}return s}for(;o>a;a++)if(t=e[a],"_"!==t){if(":"===t)break;if(!i(e.charCodeAt(a)))return!1;s=!0}return s?":"!==t?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(a)):!1}function a(e){var t,r,n=e,i=1,o=[];return-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),t=n[0],("-"===t||"+"===t)&&("-"===t&&(i=-1),n=n.slice(1),t=n[0]),"0"===n?0:"0"===t?"b"===n[1]?i*parseInt(n.slice(2),2):"x"===n[1]?i*parseInt(n,16):i*parseInt(n,8):-1!==n.indexOf(":")?(n.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),n=0,r=1,o.forEach(function(e){n+=e*r,r*=60}),i*n):i*parseInt(n,10)}function s(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1===0&&!l.isNegativeZero(e)}var l=e("../common"),u=e("../type");t.exports=new u("tag:yaml.org,2002:int",{kind:"scalar",resolve:o,construct:a,predicate:s,represent:{binary:function(e){return"0b"+e.toString(2)},octal:function(e){return"0"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return"0x"+e.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":192,"../type":202}],207:[function(e,t){"use strict";function r(e){if(null===e)return!1;try{var t="("+e+")",r=a.parse(t,{range:!0});return"Program"!==r.type||1!==r.body.length||"ExpressionStatement"!==r.body[0].type||"FunctionExpression"!==r.body[0].expression.type?!1:!0}catch(n){return!1}}function n(e){var t,r="("+e+")",n=a.parse(r,{range:!0}),i=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=n.body[0].expression.body.range,new Function(i,r.slice(t[0]+1,t[1]-1))}function i(e){return e.toString()}function o(e){return"[object Function]"===Object.prototype.toString.call(e)}var a;try{var s=e;a=s("esprima")}catch(l){"undefined"!=typeof window&&(a=window.esprima)}var u=e("../../type");t.exports=new u("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":202}],208:[function(e,t){"use strict";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),n="";if("/"===t[0]){if(r&&(n=r[1]),n.length>3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0}function n(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)}function i(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}function o(e){return"[object RegExp]"===Object.prototype.toString.call(e)}var a=e("../../type");t.exports=new a("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":202}],209:[function(e,t){"use strict";function r(){return!0}function n(){return void 0}function i(){return""}function o(e){return"undefined"==typeof e}var a=e("../../type");t.exports=new a("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":202}],210:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":202}],211:[function(e,t){"use strict";function r(e){return"<<"===e||null===e}var n=e("../type");t.exports=new n("tag:yaml.org,2002:merge",{kind:"scalar",resolve:r})},{"../type":202}],212:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)}function n(){return null}function i(e){return null===e}var o=e("../type");t.exports=new o("tag:yaml.org,2002:null",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":202}],213:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,s,l=[],u=e;for(t=0,r=u.length;r>t;t+=1){if(n=u[t],s=!1,"[object Object]"!==a.call(n))return!1;for(i in n)if(o.call(n,i)){if(s)return!1;s=!0}if(!s)return!1;if(-1!==l.indexOf(i))return!1;l.push(i)}return!0}function n(e){return null!==e?e:[]}var i=e("../type"),o=Object.prototype.hasOwnProperty,a=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:r,construct:n})},{"../type":202}],214:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,a,s=e;for(a=new Array(s.length),t=0,r=s.length;r>t;t+=1){if(n=s[t],"[object Object]"!==o.call(n))return!1;if(i=Object.keys(n),1!==i.length)return!1;a[t]=[i[0],n[i[0]]]}return!0}function n(e){if(null===e)return[];var t,r,n,i,o,a=e;for(o=new Array(a.length),t=0,r=a.length;r>t;t+=1)n=a[t],i=Object.keys(n),o[t]=[i[0],n[i[0]]];return o}var i=e("../type"),o=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:r,construct:n})},{"../type":202}],215:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":202}],216:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r=e;for(t in r)if(o.call(r,t)&&null!==r[t])return!1;return!0}function n(e){return null!==e?e:{}}var i=e("../type"),o=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:r,construct:n})},{"../type":202}],217:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":202}],218:[function(e,t){"use strict";function r(e){return null===e?!1:null===a.exec(e)?!1:!0}function n(e){var t,r,n,i,o,s,l,u,c,f,h=0,d=null;if(t=a.exec(e),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,n,i));if(o=+t[4],s=+t[5],l=+t[6],t[7]){for(h=t[7].slice(0,3);h.length<3;)h+="0";h=+h}return t[9]&&(u=+t[10],c=+(t[11]||0),d=6e4*(60*u+c),"-"===t[9]&&(d=-d)),f=new Date(Date.UTC(r,n,i,o,s,l,h)),d&&f.setTime(f.getTime()-d),f}function i(e){return e.toISOString()}var o=e("../type"),a=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$");t.exports=new o("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:r,construct:n,instanceOf:Date,represent:i})},{"../type":202}],219:[function(e,t,r){"use strict";var n=(e("./utils"),e("./support")),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";r.decode=function(e){var t,r,o,a,s,l,u,c=0,f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");var h=3*e.length/4;e.charAt(e.length-1)===i.charAt(64)&&h--,e.charAt(e.length-2)===i.charAt(64)&&h--;var d;for(d=n.uint8array?new Uint8Array(h):new Array(h);c>4,r=(15&s)<<4|l>>2,o=(3&l)<<6|u,d[f++]=t,64!==l&&(d[f++]=r),64!==u&&(d[f++]=o);return d}},{"./support":245,"./utils":247}],220:[function(e,t){"use strict";function r(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}var n=e("./external"),i=e("./stream/DataWorker"),o=e("./stream/DataLengthProbe"),a=e("./stream/Crc32Probe"),o=e("./stream/DataLengthProbe");r.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},r.createWorkerFrom=function(e,t,r){return e.pipe(new a).pipe(new o("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new o("compressedSize")).withStreamInfo("compression",t)},t.exports=r},{"./external":224,"./stream/Crc32Probe":240,"./stream/DataLengthProbe":241,"./stream/DataWorker":242}],221:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\x00\x00",uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":225,"./stream/GenericWorker":243}],222:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var i=a,o=n+r;e=-1^e;for(var s=n;o>s;s++)e=e>>>8^i[255&(e^t[s])];return-1^e}function i(e,t,r,n){var i=a,o=n+r;e=-1^e;for(var s=n;o>s;s++)e=e>>>8^i[255&(e^t.charCodeAt(s))];return-1^e}var o=e("./utils"),a=r();t.exports=function(e,t){if("undefined"==typeof e||!e.length)return 0;var r="string"!==o.getTypeOf(e);return r?n(0|t,e,e.length,0):i(0|t,e,e.length,0)}},{"./utils":247}],223:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],224:[function(e,t){"use strict";t.exports={Promise:window.Promise}},{}],225:[function(e,t,r){"use strict";function n(e,t){s.call(this,"FlateWorker/"+e),this._pako=new o[e]({raw:!0,level:t.level||-1}),this.meta={};var r=this;this._pako.onData=function(e){r.push({data:e,meta:r.meta})}}var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,o=e("pako"),a=e("./utils"),s=e("./stream/GenericWorker"),l=i?"uint8array":"array";r.magic="\b\x00",a.inherits(n,s),n.prototype.processChunk=function(e){this.meta=e.meta,this._pako.push(a.transformTo(l,e.data),!1)},n.prototype.flush=function(){s.prototype.flush.call(this),this._pako.push([],!0)},n.prototype.cleanUp=function(){s.prototype.cleanUp.call(this),this._pako=null},r.compressWorker=function(e){return new n("Deflate",e)},r.uncompressWorker=function(){return new n("Inflate",{})}},{"./stream/GenericWorker":243,"./utils":247,pako:252}],226:[function(e,t){"use strict";function r(){if(!(this instanceof r))return new r;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files={},this.comment=null,this.root="",this.clone=function(){var e=new r;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}r.prototype=e("./object"),r.prototype.loadAsync=e("./load"),r.support=e("./support"),r.defaults=e("./defaults"),r.loadAsync=function(e,t){return(new r).loadAsync(e,t)},r.external=e("./external"),t.exports=r},{"./defaults":223,"./external":224,"./load":227,"./object":231,"./support":245}],227:[function(e,t){"use strict";function r(e){return new i.Promise(function(t,r){var n=e.decompressed.getContentWorker().pipe(new s);n.on("error",function(e){r(e)}).on("end",function(){n.streamInfo.crc32!==e.decompressed.crc32?r(new Error("Corrupted zip : CRC32 mismatch")):t()}).resume()})}var n=e("./utils"),i=e("./external"),o=e("./utf8"),n=e("./utils"),a=e("./zipEntries"),s=e("./stream/Crc32Probe"),l=e("./nodejsUtils");t.exports=function(e,t){var s=this;return t=n.extend(t||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:o.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")):n.prepareContent("the loaded zip file",e,!0,t.optimizedBinaryString,t.base64).then(function(e){var r=new a(t);return r.load(e),r}).then(function(e){var n=[i.Promise.resolve(e)],o=e.files;if(t.checkCRC32)for(var a=0;a0?e.substring(0,t):""},h=function(e){return"/"!==e.slice(-1)&&(e+="/"),e},d=function(e,t){return t="undefined"!=typeof t?t:o.createFolders,e=h(e),this.files[e]||c.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},p={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(e){var t,r,n;for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],r=t.slice(this.root.length,t.length),r&&t.slice(0,this.root.length)===this.root&&e(r,n))},filter:function(e){var t=[];return this.forEach(function(r,n){e(r,n)&&t.push(n)}),t},file:function(e,t,n){if(1===arguments.length){if(r(e)){var i=e;return this.filter(function(e,t){return!t.dir&&i.test(e)})}var o=this.files[this.root+e];return o&&!o.dir?o:null}return e=this.root+e,c.call(this,e,t,n),this},folder:function(e){if(!e)return this;if(r(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,n=d.call(this,t),i=this.clone();return i.root=n.name,i}};t.exports=p},{"./compressedObject":220,"./defaults":223,"./nodejs/NodejsStreamInputAdapter":228,"./nodejsUtils":230,"./stream/GenericWorker":243,"./utils":247,"./zipObject":250}],232:[function(e,t){"use strict";function r(e){n.call(this,e);for(var t=0;t=0;--o)if(this.data[o]===t&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},r.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),o=this.readData(4);return t===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":247,"./DataReader":233}],233:[function(e,t){"use strict";function r(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}var n=e("../utils");r.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.lengthe)throw new Error("End of data reached (data length = "+this.length+", asked index = "+e+"). Corrupted zip ?")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC((e>>25&127)+1980,(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=r},{"../utils":247}],234:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./Uint8ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":247,"./Uint8ArrayReader":236}],235:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./DataReader"),i=e("../utils");i.inherits(r,n),r.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},r.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},r.prototype.readAndCheckSignature=function(e){var t=this.readData(4);return e===t},r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":247,"./DataReader":233}],236:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":247,"./ArrayReader":232}],237:[function(e,t){"use strict";var r=e("../utils"),n=e("../support"),i=e("./ArrayReader"),o=e("./StringReader"),a=e("./NodeBufferReader"),s=e("./Uint8ArrayReader");t.exports=function(e){var t=r.getTypeOf(e);return r.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new a(e):n.uint8array?new s(r.transformTo("uint8array",e)):new i(r.transformTo("array",e)):new o(e)}},{"../support":245,"../utils":247,"./ArrayReader":232,"./NodeBufferReader":234,"./StringReader":235,"./Uint8ArrayReader":236}],238:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],239:[function(e,t){"use strict";function r(e){n.call(this,"ConvertWorker to "+e),this.destType=e}var n=e("./GenericWorker"),i=e("../utils");i.inherits(r,n),r.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=r},{"../utils":247,"./GenericWorker":243}],240:[function(e,t){"use strict";function r(){n.call(this,"Crc32Probe")}var n=e("./GenericWorker"),i=e("../crc32"),o=e("../utils");o.inherits(r,n),r.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=r},{"../crc32":222,"../utils":247,"./GenericWorker":243}],241:[function(e,t){"use strict";function r(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}var n=e("../utils"),i=e("./GenericWorker");n.inherits(r,i),r.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=r},{"../utils":247,"./GenericWorker":243}],242:[function(e,t){"use strict";function r(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}var n=e("../utils"),i=e("./GenericWorker"),o=16384;n.inherits(r,i),r.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},r.prototype.resume=function(){return i.prototype.resume.call(this)?(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0):!1},r.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},r.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=o,t=null,r=Math.min(this.max,this.index+e);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,r);break;case"uint8array":t=this.data.subarray(this.index,r);break;case"array":case"nodebuffer":t=this.data.slice(this.index,r)}return this.index=r,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=r},{"../utils":247,"./GenericWorker":243}],243:[function(e,t){"use strict";function r(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return this.isFinished?!1:(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=r},{}],244:[function(e,t){(function(r){"use strict";function n(e,t,r){switch(e){case"blob":return s.newBlob(s.transformTo("arraybuffer",t),r);case"base64":return c.encode(t);default:return s.transformTo(e,t)}}function i(e,t){var n,i=0,o=null,a=0;for(n=0;nc;c++)u[c]=c>=252?6:c>=248?5:c>=240?4:c>=224?3:c>=192?2:1;u[254]=u[254]=1;var f=function(e){var t,r,n,i,o,s=e.length,l=0;for(i=0;s>i;i++)r=e.charCodeAt(i),55296===(64512&r)&&s>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),l+=128>r?1:2048>r?2:65536>r?3:4;for(t=a.uint8array?new Uint8Array(l):new Array(l),o=0,i=0;l>o;i++)r=e.charCodeAt(i),55296===(64512&r)&&s>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),128>r?t[o++]=r:2048>r?(t[o++]=192|r>>>6,t[o++]=128|63&r):65536>r?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},h=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+u[e[r]]>t?r:t},d=function(e){var t,r,n,i,a=e.length,s=new Array(2*a);for(r=0,t=0;a>t;)if(n=e[t++],128>n)s[r++]=n;else if(i=u[n],i>4)s[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;i>1&&a>t;)n=n<<6|63&e[t++],i--;i>1?s[r++]=65533:65536>n?s[r++]=n:(n-=65536,s[r++]=55296|n>>10&1023,s[r++]=56320|1023&n)}return s.length!==r&&(s.subarray?s=s.subarray(0,r):s.length=r),o.applyFromCharCode(s)};r.utf8encode=function(e){return a.nodebuffer?s.newBuffer(e,"utf-8"):f(e)},r.utf8decode=function(e){return a.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):(e=o.transformTo(a.uint8array?"uint8array":"array",e),d(e))},o.inherits(n,l),n.prototype.processChunk=function(e){var t=o.transformTo(a.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(a.uint8array){var n=t;t=new Uint8Array(n.length+this.leftOver.length),t.set(this.leftOver,0),t.set(n,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var i=h(t),s=t;i!==t.length&&(a.uint8array?(s=t.subarray(0,i),this.leftOver=t.subarray(i,t.length)):(s=t.slice(0,i),this.leftOver=t.slice(i,t.length))),this.push({data:r.utf8decode(s),meta:e.meta})},n.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=n,o.inherits(i,l),i.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=i},{"./nodejsUtils":230,"./stream/GenericWorker":243,"./support":245,"./utils":247}],247:[function(e,t,r){"use strict";function n(e){var t=null;return t=l.uint8array?new Uint8Array(e.length):new Array(e.length),o(e,t)}function i(e){return e}function o(e,t){for(var r=0;r1;)try{return d.stringifyByChunk(e,n,t)}catch(o){t=Math.floor(t/2)}return d.stringifyByChar(e)}function s(e,t){for(var r=0;r=o)return String.fromCharCode.apply(null,e);for(;o>i;)n.push("array"===t||"nodebuffer"===t?String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,o))):String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,o)))),i+=r;return n.join("")},stringifyByChar:function(e){for(var t="",r=0;rt?"0":"")+t.toString(16).toUpperCase();return n},r.delay=function(e,t,r){f(function(){e.apply(r||null,t||[])})},r.inherits=function(e,t){var r=function(){};r.prototype=t.prototype,e.prototype=new r},r.extend=function(){var e,t,r={};for(e=0;ei;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;ee){var t=!this.isSignature(0,o.LOCAL_FILE_HEADER);throw new Error(t?"Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html":"Corrupted zip : can't find end of central directory")}this.reader.setIndex(e);var r=e;if(this.checkSignature(o.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,e=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),0>e)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(e),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,o.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip : can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var n=this.centralDirOffset+this.centralDirSize;this.zip64&&(n+=20,n+=12+this.zip64EndOfCentralSize);var a=r-n;if(a>0)this.isSignature(r,o.CENTRAL_FILE_HEADER)||(this.reader.zero=a);else if(0>a)throw new Error("Corrupted zip: missing "+Math.abs(a)+" bytes.")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=r},{"./reader/readerFor":237,"./signature":238,"./support":245,"./utf8":246,"./utils":247,"./zipEntry":249}],249:[function(e,t){"use strict";function r(e,t){this.options=e,this.loadOptions=t}var n=e("./reader/readerFor"),i=e("./utils"),o=e("./compressedObject"),a=e("./crc32"),s=e("./utf8"),l=e("./compressions"),u=e("./support"),c=0,f=3,h=function(e){for(var t in l)if(l.hasOwnProperty(t)&&l[t].magic===e)return l[t];return null};r.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(t=h(this.compressionMethod),null===t)throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=16&this.externalFileAttributes?!0:!1,e===c&&(this.dosPermissions=63&this.externalFileAttributes),e===f&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index0?u(t.map(function(e){return _(e,r)}),"||"):"true"}function f(e,t,r){return t&&t.length>0?u(t.map(function(e){return _(e,r)}),"&&"):"true"}function h(e,t,r){return"!"+n(_(t,r).join(" && "))}function d(e,t,r){return"!"+n(c(null,t,r))}function p(e,t){return n(o(e)+(t?" != ":" == ")+"null")}function m(e,t,r){var i=[],a=r&&"function"==typeof r.rangeTransform&&r.rangeTransform;if(t.max){var s=a?a(t.max):t.max;i.push(""+o(e)+" < "+s)}if(t.min){var l=a?l=a(t.min):t.min;i.push(""+o(e)+" >= "+l)}return n(i.join(" && "))}function _(e,t){var r=[];if("function"==typeof e)return[n(e.toString()+"(context)")];if(Array.isArray(e))return[c(null,e,t)];if(null==e)return["true"];for(var i=Object.keys(e),o=0;o0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=s.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==m)throw new Error(c[r]);if(t.header&&s.deflateSetHeader(this.strm,t.header),t.dictionary){var i;if(i="string"==typeof t.dictionary?u.string2buf(t.dictionary):"[object ArrayBuffer]"===h.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,r=s.deflateSetDictionary(this.strm,i),r!==m)throw new Error(c[r]);this._dict_set=!0}}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}function a(e,t){return t=t||{},t.gzip=!0,i(e,t)}var s=e("./zlib/deflate"),l=e("./utils/common"),u=e("./utils/strings"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=Object.prototype.toString,d=0,p=4,m=0,_=1,g=2,v=-1,y=0,b=8;n.prototype.push=function(e,t){var r,n,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:t===!0?p:d,i.input="string"==typeof e?u.string2buf(e):"[object ArrayBuffer]"===h.call(e)?new Uint8Array(e):e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new l.Buf8(o),i.next_out=0,i.avail_out=o),r=s.deflate(i,n),r!==_&&r!==m)return this.onEnd(r),this.ended=!0,!1;(0===i.avail_out||0===i.avail_in&&(n===p||n===g))&&this.onData("string"===this.options.to?u.buf2binstring(l.shrinkBuf(i.output,i.next_out)):l.shrinkBuf(i.output,i.next_out))}while((i.avail_in>0||0===i.avail_out)&&r!==_);return n===p?(r=s.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===m):n===g?(this.onEnd(m),i.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===m&&(this.result="string"===this.options.to?this.chunks.join(""):l.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=n,r.deflate=i,r.deflateRaw=o,r.gzip=a},{"./utils/common":255,"./utils/strings":256,"./zlib/deflate":260,"./zlib/messages":265,"./zlib/zstream":267}],254:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=s.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=a.inflateInit2(this.strm,t.windowBits);if(r!==u.Z_OK)throw new Error(c[r]);this.header=new h,a.inflateGetHeader(this.strm,this.header)}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}var a=e("./zlib/inflate"),s=e("./utils/common"),l=e("./utils/strings"),u=e("./zlib/constants"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=e("./zlib/gzheader"),d=Object.prototype.toString;n.prototype.push=function(e,t){var r,n,i,o,c,f,h=this.strm,p=this.options.chunkSize,m=this.options.dictionary,_=!1;if(this.ended)return!1;n=t===~~t?t:t===!0?u.Z_FINISH:u.Z_NO_FLUSH,h.input="string"==typeof e?l.binstring2buf(e):"[object ArrayBuffer]"===d.call(e)?new Uint8Array(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new s.Buf8(p),h.next_out=0,h.avail_out=p),r=a.inflate(h,u.Z_NO_FLUSH),r===u.Z_NEED_DICT&&m&&(f="string"==typeof m?l.string2buf(m):"[object ArrayBuffer]"===d.call(m)?new Uint8Array(m):m,r=a.inflateSetDictionary(this.strm,f)),r===u.Z_BUF_ERROR&&_===!0&&(r=u.Z_OK,_=!1),r!==u.Z_STREAM_END&&r!==u.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===u.Z_STREAM_END||0===h.avail_in&&(n===u.Z_FINISH||n===u.Z_SYNC_FLUSH))&&("string"===this.options.to?(i=l.utf8border(h.output,h.next_out),o=h.next_out-i,c=l.buf2string(h.output,i),h.next_out=o,h.avail_out=p-o,o&&s.arraySet(h.output,h.output,i,o,0),this.onData(c)):this.onData(s.shrinkBuf(h.output,h.next_out))),0===h.avail_in&&0===h.avail_out&&(_=!0)}while((h.avail_in>0||0===h.avail_out)&&r!==u.Z_STREAM_END);return r===u.Z_STREAM_END&&(n=u.Z_FINISH),n===u.Z_FINISH?(r=a.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===u.Z_OK):n===u.Z_SYNC_FLUSH?(this.onEnd(u.Z_OK),h.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===u.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):s.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=n,r.inflate=i,r.inflateRaw=o,r.ungzip=i},{"./utils/common":255,"./utils/strings":256,"./zlib/constants":258,"./zlib/gzheader":261,"./zlib/inflate":263,"./zlib/messages":265,"./zlib/zstream":267}],255:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)return void e.set(t.subarray(r,r+n),i);for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){var t,r,n,i,o,a;for(n=0,t=0,r=e.length;r>t;t++)n+=e[t].length;for(a=new Uint8Array(n),i=0,t=0,r=e.length;r>t;t++)o=e[t],a.set(o,i),i+=o.length;return a}},o={arraySet:function(e,t,r,n,i){for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,o))},r.setTyped(n)},{}],256:[function(e,t,r){"use strict";function n(e,t){if(65537>t&&(e.subarray&&a||!e.subarray&&o))return String.fromCharCode.apply(null,i.shrinkBuf(e,t));for(var r="",n=0;t>n;n++)r+=String.fromCharCode(e[n]);return r}var i=e("./common"),o=!0,a=!0;try{String.fromCharCode.apply(null,[0])}catch(s){o=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(s){a=!1}for(var l=new i.Buf8(256),u=0;256>u;u++)l[u]=u>=252?6:u>=248?5:u>=240?4:u>=224?3:u>=192?2:1;l[254]=l[254]=1,r.string2buf=function(e){var t,r,n,o,a,s=e.length,l=0;for(o=0;s>o;o++)r=e.charCodeAt(o),55296===(64512&r)&&s>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),l+=128>r?1:2048>r?2:65536>r?3:4;for(t=new i.Buf8(l),a=0,o=0;l>a;o++)r=e.charCodeAt(o),55296===(64512&r)&&s>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),128>r?t[a++]=r:2048>r?(t[a++]=192|r>>>6,t[a++]=128|63&r):65536>r?(t[a++]=224|r>>>12,t[a++]=128|r>>>6&63,t[a++]=128|63&r):(t[a++]=240|r>>>18,t[a++]=128|r>>>12&63,t[a++]=128|r>>>6&63,t[a++]=128|63&r);return t},r.buf2binstring=function(e){return n(e,e.length)},r.binstring2buf=function(e){for(var t=new i.Buf8(e.length),r=0,n=t.length;n>r;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,i,o,a,s=t||e.length,u=new Array(2*s);for(i=0,r=0;s>r;)if(o=e[r++],128>o)u[i++]=o;else if(a=l[o],a>4)u[i++]=65533,r+=a-1;else{for(o&=2===a?31:3===a?15:7;a>1&&s>r;)o=o<<6|63&e[r++],a--;a>1?u[i++]=65533:65536>o?u[i++]=o:(o-=65536,u[i++]=55296|o>>10&1023,u[i++]=56320|1023&o)}return n(u,i)},r.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+l[e[r]]>t?r:t}},{"./common":255}],257:[function(e,t){"use strict";function r(e,t,r,n){for(var i=65535&e|0,o=e>>>16&65535|0,a=0;0!==r;){a=r>2e3?2e3:r,r-=a;do i=i+t[n++]|0,o=o+i|0;while(--a);i%=65521,o%=65521}return i|o<<16|0}t.exports=r},{}],258:[function(e,t){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],259:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var o=i,a=n+r;e^=-1;for(var s=n;a>s;s++)e=e>>>8^o[255&(e^t[s])];return-1^e}var i=r();t.exports=n},{}],260:[function(e,t,r){"use strict";function n(e,t){return e.msg=L[t],t}function i(e){return(e<<1)-(e>4?9:0)}function o(e){for(var t=e.length;--t>=0;)e[t]=0}function a(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(M.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function s(e,t){z._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,a(e.strm)}function l(e,t){e.pending_buf[e.pending++]=t}function u(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function c(e,t,r,n){var i=e.avail_in;return i>n&&(i=n),0===i?0:(e.avail_in-=i,M.arraySet(t,e.input,e.next_in,i,r),1===e.state.wrap?e.adler=C(e.adler,t,i,r):2===e.state.wrap&&(e.adler=P(e.adler,t,i,r)),e.next_in+=i,e.total_in+=i,i)}function f(e,t){var r,n,i=e.max_chain_length,o=e.strstart,a=e.prev_length,s=e.nice_match,l=e.strstart>e.w_size-ft?e.strstart-(e.w_size-ft):0,u=e.window,c=e.w_mask,f=e.prev,h=e.strstart+ct,d=u[o+a-1],p=u[o+a];e.prev_length>=e.good_match&&(i>>=2),s>e.lookahead&&(s=e.lookahead);do if(r=t,u[r+a]===p&&u[r+a-1]===d&&u[r]===u[o]&&u[++r]===u[o+1]){o+=2,r++;do;while(u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&u[++o]===u[++r]&&h>o);if(n=ct-(h-o),o=h-ct,n>a){if(e.match_start=t,a=n,n>=s)break;d=u[o+a-1],p=u[o+a]}}while((t=f[t&c])>l&&0!==--i);return a<=e.lookahead?a:e.lookahead}function h(e){var t,r,n,i,o,a=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=a+(a-ft)){M.arraySet(e.window,e.window,a,a,0),e.match_start-=a,e.strstart-=a,e.block_start-=a,r=e.hash_size,t=r;do n=e.head[--t],e.head[t]=n>=a?n-a:0;while(--r);r=a,t=r;do n=e.prev[--t],e.prev[t]=n>=a?n-a:0;while(--r);i+=a}if(0===e.strm.avail_in)break;if(r=c(e.strm,e.window,e.strstart+e.lookahead,i),e.lookahead+=r,e.lookahead+e.insert>=ut)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(h(e),0===e.lookahead&&t===N)return bt;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,s(e,!1),0===e.strm.avail_out))return bt;if(e.strstart-e.block_start>=e.w_size-ft&&(s(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(s(e,!0),0===e.strm.avail_out?wt:kt):e.strstart>e.block_start&&(s(e,!1),0===e.strm.avail_out)?bt:bt}function p(e,t){for(var r,n;;){if(e.lookahead=ut&&(e.ins_h=(e.ins_h<=ut)if(n=z._tr_tally(e,e.strstart-e.match_start,e.match_length-ut),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=ut){e.match_length--;do e.strstart++,e.ins_h=(e.ins_h<=ut&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=ut-1)),e.prev_length>=ut&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-ut,n=z._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-ut),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=(e.ins_h<=ut&&e.strstart>0&&(i=e.strstart-1,n=a[i],n===a[++i]&&n===a[++i]&&n===a[++i])){o=e.strstart+ct;do;while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&o>i);e.match_length=ct-(o-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=ut?(r=z._tr_tally(e,1,e.match_length-ut),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=z._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(s(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(s(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(s(e,!1),0===e.strm.avail_out)?bt:xt}function g(e,t){for(var r;;){if(0===e.lookahead&&(h(e),0===e.lookahead)){if(t===N)return bt;break}if(e.match_length=0,r=z._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(s(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(s(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(s(e,!1),0===e.strm.avail_out)?bt:xt}function v(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function y(e){e.window_size=2*e.w_size,o(e.head),e.max_lazy_match=j[e.level].max_lazy,e.good_match=j[e.level].good_length,e.nice_match=j[e.level].nice_length,e.max_chain_length=j[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=ut-1,e.match_available=0,e.ins_h=0}function b(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new M.Buf16(2*st),this.dyn_dtree=new M.Buf16(2*(2*ot+1)),this.bl_tree=new M.Buf16(2*(2*at+1)),o(this.dyn_ltree),o(this.dyn_dtree),o(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new M.Buf16(lt+1),this.heap=new M.Buf16(2*it+1),o(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new M.Buf16(2*it+1),o(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function x(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=K,t=e.state,t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?dt:vt,e.adler=2===t.wrap?0:1,t.last_flush=N,z._tr_init(t),D):n(e,G)}function w(e){var t=x(e);return t===D&&y(e.state),t}function k(e,t){return e&&e.state?2!==e.state.wrap?G:(e.state.gzhead=t,D):G}function A(e,t,r,i,o,a){if(!e)return G;var s=1;if(t===q&&(t=6),0>i?(s=0,i=-i):i>15&&(s=2,i-=16),1>o||o>Q||r!==$||8>i||i>15||0>t||t>9||0>a||a>Y)return n(e,G);8===i&&(i=9);var l=new b;return e.state=l,l.strm=e,l.wrap=s,l.gzhead=null,l.w_bits=i,l.w_size=1<U||0>t)return e?n(e,G):G;if(s=e.state,!e.output||!e.input&&0!==e.avail_in||s.status===yt&&t!==F)return n(e,0===e.avail_out?W:G);if(s.strm=e,r=s.last_flush,s.last_flush=t,s.status===dt)if(2===s.wrap)e.adler=0,l(s,31),l(s,139),l(s,8),s.gzhead?(l(s,(s.gzhead.text?1:0)+(s.gzhead.hcrc?2:0)+(s.gzhead.extra?4:0)+(s.gzhead.name?8:0)+(s.gzhead.comment?16:0)),l(s,255&s.gzhead.time),l(s,s.gzhead.time>>8&255),l(s,s.gzhead.time>>16&255),l(s,s.gzhead.time>>24&255),l(s,9===s.level?2:s.strategy>=H||s.level<2?4:0),l(s,255&s.gzhead.os),s.gzhead.extra&&s.gzhead.extra.length&&(l(s,255&s.gzhead.extra.length),l(s,s.gzhead.extra.length>>8&255)),s.gzhead.hcrc&&(e.adler=P(e.adler,s.pending_buf,s.pending,0)),s.gzindex=0,s.status=pt):(l(s,0),l(s,0),l(s,0),l(s,0),l(s,0),l(s,9===s.level?2:s.strategy>=H||s.level<2?4:0),l(s,At),s.status=vt);else{var h=$+(s.w_bits-8<<4)<<8,d=-1;d=s.strategy>=H||s.level<2?0:s.level<6?1:6===s.level?2:3,h|=d<<6,0!==s.strstart&&(h|=ht),h+=31-h%31,s.status=vt,u(s,h),0!==s.strstart&&(u(s,e.adler>>>16),u(s,65535&e.adler)),e.adler=1}if(s.status===pt)if(s.gzhead.extra){for(c=s.pending;s.gzindex<(65535&s.gzhead.extra.length)&&(s.pending!==s.pending_buf_size||(s.gzhead.hcrc&&s.pending>c&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),a(e),c=s.pending,s.pending!==s.pending_buf_size));)l(s,255&s.gzhead.extra[s.gzindex]),s.gzindex++;s.gzhead.hcrc&&s.pending>c&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),s.gzindex===s.gzhead.extra.length&&(s.gzindex=0,s.status=mt)}else s.status=mt;if(s.status===mt)if(s.gzhead.name){c=s.pending;do{if(s.pending===s.pending_buf_size&&(s.gzhead.hcrc&&s.pending>c&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),a(e),c=s.pending,s.pending===s.pending_buf_size)){f=1;break}f=s.gzindexc&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),0===f&&(s.gzindex=0,s.status=_t)}else s.status=_t;if(s.status===_t)if(s.gzhead.comment){c=s.pending;do{if(s.pending===s.pending_buf_size&&(s.gzhead.hcrc&&s.pending>c&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),a(e),c=s.pending,s.pending===s.pending_buf_size)){f=1;break}f=s.gzindexc&&(e.adler=P(e.adler,s.pending_buf,s.pending-c,c)),0===f&&(s.status=gt)}else s.status=gt;if(s.status===gt&&(s.gzhead.hcrc?(s.pending+2>s.pending_buf_size&&a(e),s.pending+2<=s.pending_buf_size&&(l(s,255&e.adler),l(s,e.adler>>8&255),e.adler=0,s.status=vt)):s.status=vt),0!==s.pending){if(a(e),0===e.avail_out)return s.last_flush=-1,D}else if(0===e.avail_in&&i(t)<=i(r)&&t!==F)return n(e,W);if(s.status===yt&&0!==e.avail_in)return n(e,W);if(0!==e.avail_in||0!==s.lookahead||t!==N&&s.status!==yt){var p=s.strategy===H?g(s,t):s.strategy===X?_(s,t):j[s.level].func(s,t);if((p===wt||p===kt)&&(s.status=yt),p===bt||p===wt)return 0===e.avail_out&&(s.last_flush=-1),D;if(p===xt&&(t===O?z._tr_align(s):t!==U&&(z._tr_stored_block(s,0,0,!1),t===I&&(o(s.head),0===s.lookahead&&(s.strstart=0,s.block_start=0,s.insert=0))),a(e),0===e.avail_out))return s.last_flush=-1,D}return t!==F?D:s.wrap<=0?B:(2===s.wrap?(l(s,255&e.adler),l(s,e.adler>>8&255),l(s,e.adler>>16&255),l(s,e.adler>>24&255),l(s,255&e.total_in),l(s,e.total_in>>8&255),l(s,e.total_in>>16&255),l(s,e.total_in>>24&255)):(u(s,e.adler>>>16),u(s,65535&e.adler)),a(e),s.wrap>0&&(s.wrap=-s.wrap),0!==s.pending?D:B)}function S(e){var t;return e&&e.state?(t=e.state.status,t!==dt&&t!==pt&&t!==mt&&t!==_t&&t!==gt&&t!==vt&&t!==yt?n(e,G):(e.state=null,t===vt?n(e,V):D)):G}function R(e,t){var r,n,i,a,s,l,u,c,f=t.length;if(!e||!e.state)return G;if(r=e.state,a=r.wrap,2===a||1===a&&r.status!==dt||r.lookahead)return G;for(1===a&&(e.adler=C(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===a&&(o(r.head),r.strstart=0,r.block_start=0,r.insert=0),c=new M.Buf8(r.w_size),M.arraySet(c,t,f-r.w_size,r.w_size,0),t=c,f=r.w_size),s=e.avail_in,l=e.next_in,u=e.input,e.avail_in=f,e.next_in=0,e.input=t,h(r);r.lookahead>=ut;){n=r.strstart,i=r.lookahead-(ut-1);do r.ins_h=(r.ins_h<_&&(m+=S[o++]<<_,_+=8,m+=S[o++]<<_,_+=8),x=g[m&y];t:for(;;){if(w=x>>>24,m>>>=w,_-=w,w=x>>>16&255,0===w)R[s++]=65535&x;else{if(!(16&w)){if(0===(64&w)){x=g[(65535&x)+(m&(1<_&&(m+=S[o++]<<_,_+=8),k+=m&(1<>>=w,_-=w),15>_&&(m+=S[o++]<<_,_+=8,m+=S[o++]<<_,_+=8),x=v[m&b];r:for(;;){if(w=x>>>24,m>>>=w,_-=w,w=x>>>16&255,!(16&w)){if(0===(64&w)){x=v[(65535&x)+(m&(1<_&&(m+=S[o++]<<_,_+=8,w>_&&(m+=S[o++]<<_,_+=8)),A+=m&(1<c){e.msg="invalid distance too far back",i.mode=r;break e}if(m>>>=w,_-=w,w=s-l,A>w){if(w=A-w,w>h&&i.sane){e.msg="invalid distance too far back",i.mode=r;break e}if(T=0,E=p,0===d){if(T+=f-w,k>w){k-=w;do R[s++]=p[T++];while(--w);T=s-A,E=R}}else if(w>d){if(T+=f+d-w,w-=d,k>w){k-=w;do R[s++]=p[T++];while(--w);if(T=0,k>d){w=d,k-=w;do R[s++]=p[T++];while(--w);T=s-A,E=R}}}else if(T+=d-w,k>w){k-=w;do R[s++]=p[T++];while(--w);T=s-A,E=R}for(;k>2;)R[s++]=E[T++],R[s++]=E[T++],R[s++]=E[T++],k-=3;k&&(R[s++]=E[T++],k>1&&(R[s++]=E[T++]))}else{T=s-A;do R[s++]=R[T++],R[s++]=R[T++],R[s++]=R[T++],k-=3;while(k>2);k&&(R[s++]=R[T++],k>1&&(R[s++]=R[T++]))}break}}break}}while(a>o&&u>s);k=_>>3,o-=k,_-=k<<3,m&=(1<<_)-1,e.next_in=o,e.next_out=s,e.avail_in=a>o?5+(a-o):5-(o-a),e.avail_out=u>s?257+(u-s):257-(s-u),i.hold=m,i.bits=_}},{}],263:[function(e,t,r){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function i(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new v.Buf16(320),this.work=new v.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=I,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new v.Buf32(mt),t.distcode=t.distdyn=new v.Buf32(_t),t.sane=1,t.back=-1,j):C}function a(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,o(e)):C}function s(e,t){var r,n;return e&&e.state?(n=e.state,0>t?(r=0,t=-t):(r=(t>>4)+1,48>t&&(t&=15)),t&&(8>t||t>15)?C:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,a(e))):C}function l(e,t){var r,n;return e?(n=new i,e.state=n,n.window=null,r=s(e,t),r!==j&&(e.state=null),r):C}function u(e){return l(e,vt)}function c(e){if(yt){var t;for(_=new v.Buf32(512),g=new v.Buf32(32),t=0;144>t;)e.lens[t++]=8;for(;256>t;)e.lens[t++]=9;for(;280>t;)e.lens[t++]=7;for(;288>t;)e.lens[t++]=8;for(w(A,e.lens,0,288,_,0,e.work,{bits:9}),t=0;32>t;)e.lens[t++]=5;w(T,e.lens,0,32,g,0,e.work,{bits:5}),yt=!1}e.lencode=_,e.lenbits=9,e.distcode=g,e.distbits=5}function f(e,t,r,n){var i,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(v.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(i=o.wsize-o.wnext,i>n&&(i=n),v.arraySet(o.window,t,r-n,i,o.wnext),n-=i,n?(v.arraySet(o.window,t,r-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whaved;){if(0===l)break e;l--,h+=i[a++]<>>8&255,r.check=b(r.check,St,2,0),h=0,d=0,r.mode=F;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=ht;break}if((15&h)!==O){e.msg="unknown compression method",r.mode=ht;break}if(h>>>=4,d-=4,wt=(15&h)+8,0===r.wbits)r.wbits=wt;else if(wt>r.wbits){e.msg="invalid window size",r.mode=ht;break}r.dmax=1<d;){if(0===l)break e;l--,h+=i[a++]<>8&1),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=U;case U:for(;32>d;){if(0===l)break e;l--,h+=i[a++]<>>8&255,St[2]=h>>>16&255,St[3]=h>>>24&255,r.check=b(r.check,St,4,0)),h=0,d=0,r.mode=D;case D:for(;16>d;){if(0===l)break e;l--,h+=i[a++]<>8),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=B;case B:if(1024&r.flags){for(;16>d;){if(0===l)break e;l--,h+=i[a++]<>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0}else r.head&&(r.head.extra=null);r.mode=G;case G:if(1024&r.flags&&(_=r.length,_>l&&(_=l),_&&(r.head&&(wt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),v.arraySet(r.head.extra,i,a,_,wt)),512&r.flags&&(r.check=b(r.check,i,_,a)),l-=_,a+=_,r.length-=_),r.length))break e;r.length=0,r.mode=V;case V:if(2048&r.flags){if(0===l)break e;_=0;do wt=i[a+_++],r.head&&wt&&r.length<65536&&(r.head.name+=String.fromCharCode(wt));while(wt&&l>_);if(512&r.flags&&(r.check=b(r.check,i,_,a)),l-=_,a+=_,wt)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=W;case W:if(4096&r.flags){if(0===l)break e;_=0;do wt=i[a+_++],r.head&&wt&&r.length<65536&&(r.head.comment+=String.fromCharCode(wt));while(wt&&l>_);if(512&r.flags&&(r.check=b(r.check,i,_,a)),l-=_,a+=_,wt)break e}else r.head&&(r.head.comment=null);r.mode=q;case q:if(512&r.flags){for(;16>d;){if(0===l)break e;l--,h+=i[a++]<>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=X;break;case Z:for(;32>d;){if(0===l)break e;l--,h+=i[a++]<>>=7&d,d-=7&d,r.mode=ut;break}for(;3>d;){if(0===l)break e;l--,h+=i[a++]<>>=1,d-=1,3&h){case 0:r.mode=J;break;case 1:if(c(r),r.mode=rt,t===R){h>>>=2,d-=2;break e}break;case 2:r.mode=Q;break;case 3:e.msg="invalid block type",r.mode=ht}h>>>=2,d-=2;break;case J:for(h>>>=7&d,d-=7&d;32>d;){if(0===l)break e;l--,h+=i[a++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=ht;break}if(r.length=65535&h,h=0,d=0,r.mode=K,t===R)break e;case K:r.mode=$;case $:if(_=r.length){if(_>l&&(_=l),_>u&&(_=u),0===_)break e;v.arraySet(o,i,a,_,s),l-=_,a+=_,u-=_,s+=_,r.length-=_;break}r.mode=X;break;case Q:for(;14>d;){if(0===l)break e;l--,h+=i[a++]<>>=5,d-=5,r.ndist=(31&h)+1,h>>>=5,d-=5,r.ncode=(15&h)+4,h>>>=4,d-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=ht; -break}r.have=0,r.mode=et;case et:for(;r.haved;){if(0===l)break e;l--,h+=i[a++]<>>=3,d-=3}for(;r.have<19;)r.lens[Rt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,At={bits:r.lenbits},kt=w(k,r.lens,0,19,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid code lengths set",r.mode=ht;break}r.have=0,r.mode=tt;case tt:for(;r.have>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=_t);){if(0===l)break e;l--,h+=i[a++]<vt)h>>>=_t,d-=_t,r.lens[r.have++]=vt;else{if(16===vt){for(Tt=_t+2;Tt>d;){if(0===l)break e;l--,h+=i[a++]<>>=_t,d-=_t,0===r.have){e.msg="invalid bit length repeat",r.mode=ht;break}wt=r.lens[r.have-1],_=3+(3&h),h>>>=2,d-=2}else if(17===vt){for(Tt=_t+3;Tt>d;){if(0===l)break e;l--,h+=i[a++]<>>=_t,d-=_t,wt=0,_=3+(7&h),h>>>=3,d-=3}else{for(Tt=_t+7;Tt>d;){if(0===l)break e;l--,h+=i[a++]<>>=_t,d-=_t,wt=0,_=11+(127&h),h>>>=7,d-=7}if(r.have+_>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=ht;break}for(;_--;)r.lens[r.have++]=wt}}if(r.mode===ht)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=ht;break}if(r.lenbits=9,At={bits:r.lenbits},kt=w(A,r.lens,0,r.nlen,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid literal/lengths set",r.mode=ht;break}if(r.distbits=6,r.distcode=r.distdyn,At={bits:r.distbits},kt=w(T,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,At),r.distbits=At.bits,kt){e.msg="invalid distances set",r.mode=ht;break}if(r.mode=rt,t===R)break e;case rt:r.mode=nt;case nt:if(l>=6&&u>=258){e.next_out=s,e.avail_out=u,e.next_in=a,e.avail_in=l,r.hold=h,r.bits=d,x(e,m),s=e.next_out,o=e.output,u=e.avail_out,a=e.next_in,i=e.input,l=e.avail_in,h=r.hold,d=r.bits,r.mode===X&&(r.back=-1);break}for(r.back=0;Et=r.lencode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=_t);){if(0===l)break e;l--,h+=i[a++]<>yt)],_t=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+_t);){if(0===l)break e;l--,h+=i[a++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=_t,d-=_t,r.back+=_t,r.length=vt,0===gt){r.mode=lt;break}if(32>){r.back=-1,r.mode=X;break}if(64>){e.msg="invalid literal/length code",r.mode=ht;break}r.extra=15>,r.mode=it;case it:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===l)break e;l--,h+=i[a++]<>>=r.extra,d-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=ot;case ot:for(;Et=r.distcode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=_t);){if(0===l)break e;l--,h+=i[a++]<>yt)],_t=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+_t);){if(0===l)break e;l--,h+=i[a++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=_t,d-=_t,r.back+=_t,64>){e.msg="invalid distance code",r.mode=ht;break}r.offset=vt,r.extra=15>,r.mode=at;case at:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===l)break e;l--,h+=i[a++]<>>=r.extra,d-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=ht;break}r.mode=st;case st:if(0===u)break e;if(_=m-u,r.offset>_){if(_=r.offset-_,_>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=ht;break}_>r.wnext?(_-=r.wnext,g=r.wsize-_):g=r.wnext-_,_>r.length&&(_=r.length),mt=r.window}else mt=o,g=s-r.offset,_=r.length;_>u&&(_=u),u-=_,r.length-=_;do o[s++]=mt[g++];while(--_);0===r.length&&(r.mode=nt);break;case lt:if(0===u)break e;o[s++]=r.length,u--,r.mode=nt;break;case ut:if(r.wrap){for(;32>d;){if(0===l)break e;l--,h|=i[a++]<d;){if(0===l)break e;l--,h+=i[a++]<=j;j++)B[j]=0;for(M=0;p>M;M++)B[t[d+M]]++;for(P=R,C=n;C>=1&&0===B[C];C--);if(P>C&&(P=C),0===C)return m[_++]=20971520,m[_++]=20971520,v.bits=1,0;for(z=1;C>z&&0===B[z];z++);for(z>P&&(P=z),O=1,j=1;n>=j;j++)if(O<<=1,O-=B[j],0>O)return-1;if(O>0&&(e===a||1!==C))return-1;for(G[1]=0,j=1;n>j;j++)G[j+1]=G[j]+B[j];for(M=0;p>M;M++)0!==t[d+M]&&(g[G[t[d+M]]++]=M);if(e===a?(U=V=g,A=19):e===s?(U=u,D-=257,V=c,W-=257,A=256):(U=f,V=h,A=-1),F=0,M=0,j=z,k=_,L=P,N=0,x=-1,I=1<i||e===l&&I>o)return 1;for(var q=0;;){q++,T=j-N,g[M]A?(E=V[W+g[M]],S=U[D+g[M]]):(E=96,S=0),y=1<>N)+b]=T<<24|E<<16|S|0;while(0!==b);for(y=1<>=1;if(0!==y?(F&=y-1,F+=y):F=0,M++,0===--B[j]){if(j===C)break;j=t[d+g[M]]}if(j>P&&(F&w)!==x){for(0===N&&(N=P),k+=z,L=j-N,O=1<L+N&&(O-=B[L+N],!(0>=O));)L++,O<<=1;if(I+=1<i||e===l&&I>o)return 1;x=F&w,m[x]=P<<24|L<<16|k-_|0}}return 0!==F&&(m[k+F]=j-N<<24|64<<16|0),v.bits=P,0}},{"../utils/common":255}],265:[function(e,t){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],266:[function(e,t,r){"use strict";function n(e){for(var t=e.length;--t>=0;)e[t]=0}function i(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function o(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function a(e){return 256>e?lt[e]:lt[256+(e>>>7)]}function s(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function l(e,t,r){e.bi_valid>Y-r?(e.bi_buf|=t<>Y-e.bi_valid,e.bi_valid+=r-Y):(e.bi_buf|=t<>>=1,r<<=1;while(--t>0);return r>>>1}function f(e){16===e.bi_valid?(s(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function h(e,t){var r,n,i,o,a,s,l=t.dyn_tree,u=t.max_code,c=t.stat_desc.static_tree,f=t.stat_desc.has_stree,h=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(o=0;X>=o;o++)e.bl_count[o]=0;for(l[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;H>r;r++)n=e.heap[r],o=l[2*l[2*n+1]+1]+1,o>p&&(o=p,m++),l[2*n+1]=o,n>u||(e.bl_count[o]++,a=0,n>=d&&(a=h[n-d]),s=l[2*n],e.opt_len+=s*(o+a),f&&(e.static_len+=s*(c[2*n+1]+a)));if(0!==m){do{for(o=p-1;0===e.bl_count[o];)o--;e.bl_count[o]--,e.bl_count[o+1]+=2,e.bl_count[p]--,m-=2}while(m>0);for(o=p;0!==o;o--)for(n=e.bl_count[o];0!==n;)i=e.heap[--r],i>u||(l[2*i+1]!==o&&(e.opt_len+=(o-l[2*i+1])*l[2*i],l[2*i+1]=o),n--)}}function d(e,t,r){var n,i,o=new Array(X+1),a=0;for(n=1;X>=n;n++)o[n]=a=a+r[n-1]<<1;for(i=0;t>=i;i++){var s=e[2*i+1];0!==s&&(e[2*i]=c(o[s]++,s))}}function p(){var e,t,r,n,o,a=new Array(X+1);for(r=0,n=0;G-1>n;n++)for(ct[n]=r,e=0;e<1<n;n++)for(ft[n]=o,e=0;e<1<>=7;q>n;n++)for(ft[n]=o<<7,e=0;e<1<=t;t++)a[t]=0;for(e=0;143>=e;)at[2*e+1]=8,e++,a[8]++;for(;255>=e;)at[2*e+1]=9,e++,a[9]++;for(;279>=e;)at[2*e+1]=7,e++,a[7]++;for(;287>=e;)at[2*e+1]=8,e++,a[8]++;for(d(at,W+1,a),e=0;q>e;e++)st[2*e+1]=5,st[2*e]=c(e,5);ht=new i(at,tt,V+1,W,X),dt=new i(st,rt,0,q,X),pt=new i(new Array(0),nt,0,Z,J)}function m(e){var t;for(t=0;W>t;t++)e.dyn_ltree[2*t]=0;for(t=0;q>t;t++)e.dyn_dtree[2*t]=0;for(t=0;Z>t;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*K]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function _(e){e.bi_valid>8?s(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function g(e,t,r,n){_(e),n&&(s(e,r),s(e,~r)),C.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}function v(e,t,r,n){var i=2*t,o=2*r;return e[i]r;r++)0!==o[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):o[2*r+1]=0;for(;e.heap_len<2;)i=e.heap[++e.heap_len]=2>u?++u:0,o[2*i]=1,e.depth[i]=0,e.opt_len--,s&&(e.static_len-=a[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;r>=1;r--)y(e,o,r);i=l;do r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],y(e,o,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,o[2*i]=o[2*r]+o[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,o[2*r+1]=o[2*n+1]=i,e.heap[1]=i++,y(e,o,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],h(e,t),d(o,u,e.bl_count)}function w(e,t,r){var n,i,o=-1,a=t[1],s=0,l=7,u=4;for(0===a&&(l=138,u=3),t[2*(r+1)+1]=65535,n=0;r>=n;n++)i=a,a=t[2*(n+1)+1],++ss?e.bl_tree[2*i]+=s:0!==i?(i!==o&&e.bl_tree[2*i]++,e.bl_tree[2*$]++):10>=s?e.bl_tree[2*Q]++:e.bl_tree[2*et]++,s=0,o=i,0===a?(l=138,u=3):i===a?(l=6,u=3):(l=7,u=4))}function k(e,t,r){var n,i,o=-1,a=t[1],s=0,c=7,f=4;for(0===a&&(c=138,f=3),n=0;r>=n;n++)if(i=a,a=t[2*(n+1)+1],!(++ss){do u(e,i,e.bl_tree);while(0!==--s)}else 0!==i?(i!==o&&(u(e,i,e.bl_tree),s--),u(e,$,e.bl_tree),l(e,s-3,2)):10>=s?(u(e,Q,e.bl_tree),l(e,s-3,3)):(u(e,et,e.bl_tree),l(e,s-11,7));s=0,o=i,0===a?(c=138,f=3):i===a?(c=6,f=3):(c=7,f=4)}}function A(e){var t;for(w(e,e.dyn_ltree,e.l_desc.max_code),w(e,e.dyn_dtree,e.d_desc.max_code),x(e,e.bl_desc),t=Z-1;t>=3&&0===e.bl_tree[2*it[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function T(e,t,r,n){var i;for(l(e,t-257,5),l(e,r-1,5),l(e,n-4,4),i=0;n>i;i++)l(e,e.bl_tree[2*it[i]+1],3);k(e,e.dyn_ltree,t-1),k(e,e.dyn_dtree,r-1)}function E(e){var t,r=4093624447;for(t=0;31>=t;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return L;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return N;for(t=32;V>t;t++)if(0!==e.dyn_ltree[2*t])return N;return L}function S(e){mt||(p(),mt=!0),e.l_desc=new o(e.dyn_ltree,ht),e.d_desc=new o(e.dyn_dtree,dt),e.bl_desc=new o(e.bl_tree,pt),e.bi_buf=0,e.bi_valid=0,m(e)}function R(e,t,r,n){l(e,(I<<1)+(n?1:0),3),g(e,t,r,!0)}function j(e){l(e,F<<1,3),u(e,K,at),f(e)}function M(e,t,r,n){var i,o,a=0;e.level>0?(e.strm.data_type===O&&(e.strm.data_type=E(e)),x(e,e.l_desc),x(e,e.d_desc),a=A(e),i=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,i>=o&&(i=o)):i=o=r+5,i>=r+4&&-1!==t?R(e,t,r,n):e.strategy===P||o===i?(l(e,(F<<1)+(n?1:0),3),b(e,at,st)):(l(e,(U<<1)+(n?1:0),3),T(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),b(e,e.dyn_ltree,e.dyn_dtree)),m(e),n&&_(e)}function z(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(ut[r]+V+1)]++,e.dyn_dtree[2*a(t)]++),e.last_lit===e.lit_bufsize-1}var C=e("../utils/common"),P=4,L=0,N=1,O=2,I=0,F=1,U=2,D=3,B=258,G=29,V=256,W=V+1+G,q=30,Z=19,H=2*W+1,X=15,Y=16,J=7,K=256,$=16,Q=17,et=18,tt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],rt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],nt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],it=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ot=512,at=new Array(2*(W+2));n(at);var st=new Array(2*q);n(st);var lt=new Array(ot);n(lt);var ut=new Array(B-D+1);n(ut);var ct=new Array(G);n(ct);var ft=new Array(q);n(ft);var ht,dt,pt,mt=!1;r._tr_init=S,r._tr_stored_block=R,r._tr_flush_block=M,r._tr_tally=z,r._tr_align=j},{"../utils/common":255}],267:[function(e,t){"use strict";function r(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=r},{}],268:[function(e,t){"use strict";function r(e){var t;e&&e.length&&(t=e,e=t.length);var r=new Uint8Array(e||0);return t&&r.set(t),r.readUInt32LE=i.readUInt32LE,r.writeUInt32LE=i.writeUInt32LE,r.readInt32LE=i.readInt32LE,r.writeInt32LE=i.writeInt32LE,r.readFloatLE=i.readFloatLE,r.writeFloatLE=i.writeFloatLE,r.readDoubleLE=i.readDoubleLE,r.writeDoubleLE=i.writeDoubleLE,r.toString=i.toString,r.write=i.write,r.slice=i.slice,r.copy=i.copy,r._isBuffer=!0,r}function n(e){for(var t,r,n=e.length,i=[],o=0;n>o;o++){if(t=e.charCodeAt(o),t>55295&&57344>t){if(!r){t>56319||o+1===n?i.push(239,191,189):r=t;continue}if(56320>t){i.push(239,191,189),r=t;continue}t=r-55296<<10|t-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>t?i.push(t):2048>t?i.push(t>>6|192,63&t|128):65536>t?i.push(t>>12|224,t>>6&63|128,63&t|128):i.push(t>>18|240,t>>12&63|128,t>>6&63|128,63&t|128)}return i}t.exports=r;var i,o,a,s=e("ieee754");i={readUInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},writeUInt32LE:function(e,t){this[t]=e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24},readInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+(this[e+3]<<24)},readFloatLE:function(e){return s.read(this,e,!0,23,4)},readDoubleLE:function(e){return s.read(this,e,!0,52,8)},writeFloatLE:function(e,t){return s.write(this,e,t,!0,23,4)},writeDoubleLE:function(e,t){return s.write(this,e,t,!0,52,8)},toString:function(e,t,r){var n="",i="";t=t||0,r=Math.min(this.length,r||this.length);for(var o=t;r>o;o++){var a=this[o];127>=a?(n+=decodeURIComponent(i)+String.fromCharCode(a),i=""):i+="%"+a.toString(16)}return n+=decodeURIComponent(i)},write:function(e,t){for(var r=e===o?a:n(e),i=0;i>3,o=this.pos;e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=this.buf.readUInt32LE(this.pos);return this.pos+=4,e},readSFixed32:function(){var e=this.buf.readInt32LE(this.pos);return this.pos+=4,e},readFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*p;return this.pos+=8,e},readSFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*p;return this.pos+=8,e},readFloat:function(){var e=this.buf.readFloatLE(this.pos);return this.pos+=4,e},readDouble:function(){var e=this.buf.readDoubleLE(this.pos);return this.pos+=8,e},readVarint:function(){var e,t,r,n,i,o,a=this.buf;if(r=a[this.pos++],128>r)return r;if(r=127&r,n=a[this.pos++],128>n)return r|n<<7;if(n=(127&n)<<7,i=a[this.pos++],128>i)return r|n|i<<14;if(i=(127&i)<<14,o=a[this.pos++],128>o)return r|n|i|o<<21;if(e=r|n|i|(127&o)<<21,t=a[this.pos++],e+=268435456*(127&t),128>t)return e;if(t=a[this.pos++],e+=34359738368*(127&t),128>t)return e;if(t=a[this.pos++],e+=4398046511104*(127&t),128>t)return e;if(t=a[this.pos++],e+=562949953421312*(127&t),128>t)return e;if(t=a[this.pos++],e+=72057594037927940*(127&t),128>t)return e;if(t=a[this.pos++],e+=0x8000000000000000*(127&t),128>t)return e;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var e=this.pos,t=this.readVarint();if(_>t)return t;for(var r=this.pos-2;255===this.buf[r];)r--;e>r&&(r=e),t=0;for(var n=0;r-e+1>n;n++){var i=127&~this.buf[e+n];t+=4>n?i<<7*n:i*Math.pow(2,7*n)}return-t-1},readSVarint:function(){var e=this.readVarint();return e%2===1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.buf.toString("utf8",this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.slice(this.pos,e);return this.pos=e,t},readPackedVarint:function(){for(var e=this.readVarint()+this.pos,t=[];this.pos127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t=e)this.realloc(1),this.buf[this.pos++]=e;else if(16383>=e)this.realloc(2),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127;else if(2097151>=e)this.realloc(3),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127;else if(268435455>=e)this.realloc(4),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127|128,this.buf[this.pos++]=e>>>21&127;else{for(var t=this.pos;e>=128;)this.realloc(1),this.buf[this.pos++]=255&e|128,e/=128;if(this.realloc(1),this.buf[this.pos++]=0|e,this.pos-t>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(e){this.writeVarint(0>e?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e);var t=d.byteLength(e);this.writeVarint(t),this.realloc(t),this.buf.write(e,this.pos),this.pos+=t},writeFloat:function(e){this.realloc(4),this.buf.writeFloatLE(e,this.pos),this.pos+=4},writeDouble:function(e){this.realloc(8),this.buf.writeDoubleLE(e,this.pos),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;t>r;r++)this.buf[this.pos++]=e[r]},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.pos++;var i=this.pos;t(r,this);var o=this.pos-i,a=127>=o?1:16383>=o?2:2097151>=o?3:268435455>=o?4:Math.ceil(Math.log(o)/(7*Math.LN2));if(a>1){this.realloc(a-1);for(var s=this.pos-1;s>=i;s--)this.buf[s+a-1]=this.buf[s]}this.pos=i-1,this.writeVarint(o),this.pos+=o},writePackedVarint:function(e,t){this.writeMessage(e,i,t)},writePackedSVarint:function(e,t){this.writeMessage(e,o,t)},writePackedBoolean:function(e,t){this.writeMessage(e,l,t)},writePackedFloat:function(e,t){this.writeMessage(e,a,t)},writePackedDouble:function(e,t){this.writeMessage(e,s,t)},writePackedFixed32:function(e,t){this.writeMessage(e,u,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,c,t)},writePackedFixed64:function(e,t){this.writeMessage(e,f,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,h,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./buffer":268}],270:[function(e,t){"use strict";function r(e,t){this.x=e,this.y=t}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,r=e.y-this.y;return t*t+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,r=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=r,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),r=Math.sin(e),n=t*this.x-r*this.y,i=r*this.x+t*this.y;return this.x=n,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(e){return e instanceof r?e:Array.isArray(e)?new r(e[0],e[1]):e}},{}],271:[function(e,t){(function(e){"use strict";function r(t,r,n,i){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var o,a,s=arguments.length;switch(s){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick(function(){t.call(null,r)});case 3:return e.nextTick(function(){t.call(null,r,n)});case 4:return e.nextTick(function(){t.call(null,r,n,i)});default:for(o=new Array(s-1),a=0;a1)for(var n=1;n0)if(t.ended&&!i){var s=new Error("stream.push() after EOF");e.emit("error",s)}else if(t.endEmitted&&i){var s=new Error("stream.unshift() after end event");e.emit("error",s)}else{var l;!t.decoder||i||n||(r=t.decoder.write(r),l=!t.objectMode&&0===r.length),i||(t.reading=!1),l||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,i?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&f(e))),d(e,t)}else i||(t.reading=!1);return a(t)}function a(e){return!e.ended&&(e.needReadable||e.length=N?e=N:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function l(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=s(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function u(e,t){var r=null;return S.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function c(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,f(e)}}function f(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(C("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?T(h,e):h(e)) -}function h(e){C("emit readable"),e.emit("readable"),y(e)}function d(e,t){t.readingMore||(t.readingMore=!0,T(p,e,t))}function p(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=i)r=o?n.join(""):1===n.length?n[0]:S.concat(n,i),n.length=0;else if(eu&&e>l;u++){var s=n[0],f=Math.min(e-l,s.length);o?r+=s.slice(0,f):s.copy(r,l,0,f),f0)throw new Error("endReadable called on non-empty stream");t.endEmitted||(t.ended=!0,T(w,t,e))}function w(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function k(e,t){for(var r=0,n=e.length;n>r;r++)t(e[r],r)}function A(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r]===t)return r;return-1}t.exports=i;var T=e("process-nextick-args"),E=e("isarray"),S=e("buffer").Buffer;i.ReadableState=n;var R,j=(e("events"),function(e,t){return e.listeners(t).length});!function(){try{R=e("stream")}catch(t){}finally{R||(R=e("events").EventEmitter)}}();var S=e("buffer").Buffer,M=e("core-util-is");M.inherits=e("inherits");var z=e("util"),C=void 0;C=z&&z.debuglog?z.debuglog("stream"):function(){};var P;M.inherits(i,R);var L,L;i.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding,t!==r.encoding&&(e=new S(e,t),t="")),o(this,r,e,t,!1)},i.prototype.unshift=function(e){var t=this._readableState;return o(this,t,e,"",!0)},i.prototype.isPaused=function(){return this._readableState.flowing===!1},i.prototype.setEncoding=function(t){return P||(P=e("string_decoder/").StringDecoder),this._readableState.decoder=new P(t),this._readableState.encoding=t,this};var N=8388608;i.prototype.read=function(e){C("read",e);var t=this._readableState,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return C("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?x(this):f(this),null;if(e=l(e,t),0===e&&t.ended)return 0===t.length&&x(this),null;var n=t.needReadable;C("need readable",n),(0===t.length||t.length-e0?b(e,t):null,null===i&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),r!==e&&t.ended&&0===t.length&&x(this),null!==i&&this.emit("data",i),i},i.prototype._read=function(){this.emit("error",new Error("not implemented"))},i.prototype.pipe=function(e,t){function n(e){C("onunpipe"),e===f&&o()}function i(){C("onend"),e.end()}function o(){C("cleanup"),e.removeListener("close",l),e.removeListener("finish",u),e.removeListener("drain",_),e.removeListener("error",s),e.removeListener("unpipe",n),f.removeListener("end",i),f.removeListener("end",o),f.removeListener("data",a),g=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||_()}function a(t){C("ondata");var r=e.write(t);!1===r&&(1!==h.pipesCount||h.pipes[0]!==e||1!==f.listenerCount("data")||g||(C("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++),f.pause())}function s(t){C("onerror",t),c(),e.removeListener("error",s),0===j(e,"error")&&e.emit("error",t)}function l(){e.removeListener("finish",u),c()}function u(){C("onfinish"),e.removeListener("close",l),c()}function c(){C("unpipe"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,C("pipe count=%d opts=%j",h.pipesCount,t);var d=(!t||t.end!==!1)&&e!==r.stdout&&e!==r.stderr,p=d?i:o;h.endEmitted?T(p):f.once("end",p),e.on("unpipe",n);var _=m(f);e.on("drain",_);var g=!1;return f.on("data",a),e._events&&e._events.error?E(e._events.error)?e._events.error.unshift(s):e._events.error=[s,e._events.error]:e.on("error",s),e.once("close",l),e.once("finish",u),e.emit("pipe",f),h.flowing||(C("pipe resume"),f.resume()),e},i.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;n>i;i++)r[i].emit("unpipe",this);return this}var o=A(t.pipes,e);return-1===o?this:(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},i.prototype.on=function(e,t){var r=R.prototype.on.call(this,e,t);if("data"===e&&!1!==this._readableState.flowing&&this.resume(),"readable"===e&&!this._readableState.endEmitted){var n=this._readableState;n.readableListening||(n.readableListening=!0,n.emittedReadable=!1,n.needReadable=!0,n.reading?n.length&&f(this,n):T(_,this))}return r},i.prototype.addListener=i.prototype.on,i.prototype.resume=function(){var e=this._readableState;return e.flowing||(C("resume"),e.flowing=!0,g(this,e)),this},i.prototype.pause=function(){return C("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(C("pause"),this._readableState.flowing=!1,this.emit("pause")),this},i.prototype.wrap=function(e){var t=this._readableState,r=!1,n=this;e.on("end",function(){if(C("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&n.push(e)}n.push(null)}),e.on("data",function(i){if(C("wrapped data"),t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var o=n.push(i);o||(r=!0,e.pause())}});for(var i in e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));var o=["error","close","destroy","pause","resume"];return k(o,function(t){e.on(t,n.emit.bind(n,t))}),n._read=function(t){C("wrapped _read",t),r&&(r=!1,e.resume())},n},i._fromList=b}).call(this,e("_process"))},{"./_stream_duplex":273,_process:272,buffer:41,"core-util-is":164,events:168,inherits:187,isarray:189,"process-nextick-args":271,"string_decoder/":281,util:40}],276:[function(e,t){"use strict";function r(e){this.afterTransform=function(t,r){return n(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function n(e,t,r){var n=e._transformState;n.transforming=!1;var i=n.writecb;if(!i)return e.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==r&&void 0!==r&&e.push(r),i(t);var o=e._readableState;o.reading=!1,(o.needReadable||o.length-1?setImmediate:k,T=e("buffer").Buffer;a.WritableState=o;var E=e("core-util-is");E.inherits=e("inherits");var S,R={deprecate:e("util-deprecate")};!function(){try{S=e("stream")}catch(t){}finally{S||(S=e("events").EventEmitter)}}();var T=e("buffer").Buffer;E.inherits(a,S);var j;o.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(o.prototype,"buffer",{get:R.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(e){}}();var j;a.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},a.prototype.write=function(e,t,r){var i=this._writableState,o=!1;return"function"==typeof t&&(r=t,t=null),T.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=n),i.ended?s(this,r):l(this,i,e,r)&&(i.pendingcb++,o=c(this,i,e,t,r)),o},a.prototype.cork=function(){var e=this._writableState;e.corked++},a.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||g(this,e))},a.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);this._writableState.defaultEncoding=e},a.prototype._write=function(e,t,r){r(new Error("not implemented"))},a.prototype._writev=null,a.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||x(this,n,r)}}).call(this,e("_process"))},{"./_stream_duplex":273,_process:272,buffer:41,"core-util-is":164,events:168,inherits:187,"process-nextick-args":271,"util-deprecate":285}],278:[function(e,t,r){var n=function(){try{return e("stream")}catch(t){}}();r=t.exports=e("./lib/_stream_readable.js"),r.Stream=n||r,r.Readable=r,r.Writable=e("./lib/_stream_writable.js"),r.Duplex=e("./lib/_stream_duplex.js"),r.Transform=e("./lib/_stream_transform.js"),r.PassThrough=e("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":273,"./lib/_stream_passthrough.js":274,"./lib/_stream_readable.js":275,"./lib/_stream_transform.js":276,"./lib/_stream_writable.js":277}],279:[function(e,t){(function(r){var n="object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this,i=n.regeneratorRuntime&&Object.getOwnPropertyNames(n).indexOf("regeneratorRuntime")>=0,o=i&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,t.exports=e("./runtime"),i)n.regeneratorRuntime=o;else try{delete n.regeneratorRuntime}catch(a){n.regeneratorRuntime=void 0}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./runtime":280}],280:[function(e,t){(function(e,r){!function(r){"use strict";function n(e,t,r,n){var i=Object.create((t||o).prototype),a=new p(n||[]);return i._invoke=f(e,r,a),i}function i(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(n){return{type:"throw",arg:n}}}function o(){}function a(){}function s(){}function l(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function u(e){this.arg=e}function c(t){function r(e,n,o,a){var s=i(t[e],t,n);if("throw"!==s.type){var l=s.arg,c=l.value;return c instanceof u?Promise.resolve(c.arg).then(function(e){r("next",e,o,a)},function(e){r("throw",e,o,a)}):Promise.resolve(c).then(function(e){l.value=e,o(l)},a)}a(s.arg)}function n(e,t){function n(){return new Promise(function(n,i){r(e,t,n,i)})}return o=o?o.then(n,n):n()}"object"==typeof e&&e.domain&&(r=e.domain.bind(r));var o;this._invoke=n}function f(e,t,r){var n=A;return function(o,a){if(n===E)throw new Error("Generator is already running");if(n===S){if("throw"===o)throw a;return _()}for(;;){var s=r.delegate;if(s){if("return"===o||"throw"===o&&s.iterator[o]===g){r.delegate=null;var l=s.iterator["return"];if(l){var u=i(l,s.iterator,a);if("throw"===u.type){o="throw",a=u.arg;continue}}if("return"===o)continue}var u=i(s.iterator[o],s.iterator,a);if("throw"===u.type){r.delegate=null,o="throw",a=u.arg;continue}o="next",a=g;var c=u.arg;if(!c.done)return n=T,c;r[s.resultName]=c.value,r.next=s.nextLoc,r.delegate=null}if("next"===o)r.sent=r._sent=a;else if("throw"===o){if(n===A)throw n=S,a;r.dispatchException(a)&&(o="next",a=g)}else"return"===o&&r.abrupt("return",a);n=E;var u=i(e,t,r);if("normal"===u.type){n=r.done?S:T;var c={value:u.arg,done:r.done};if(u.arg!==R)return c;r.delegate&&"next"===o&&(a=g)}else"throw"===u.type&&(n=S,o="throw",a=u.arg)}}}function h(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function p(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(h,this),this.reset(!0)}function m(e){if(e){var t=e[b];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function i(){for(;++r=0;--n){var i=this.tryEntries[n],o=i.completion;if("root"===i.tryLoc)return t("end");if(i.tryLoc<=this.prev){var a=v.call(i,"catchLoc"),s=v.call(i,"finallyLoc");if(a&&s){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&v.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),d(r),R}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;d(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:m(e),resultName:t,nextLoc:r},R}}}("object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:272}],281:[function(e,t,r){function n(e){if(e&&!l(e))throw new Error("Unknown encoding: "+e)}function i(e){return e.toString(this.encoding)}function o(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function a(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}var s=e("buffer").Buffer,l=s.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},u=r.StringDecoder=function(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),n(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=o;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=a;break;default:return void(this.write=i)}this.charBuffer=new s(6),this.charReceived=0,this.charLength=0};u.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&56319>=n)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,n=t.charCodeAt(i);if(n>=55296&&56319>=n){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),e.copy(this.charBuffer,0,0,o),t.substring(0,i)}return t},u.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},u.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;t+=n.slice(0,r).toString(i)}return t}},{buffer:41}],282:[function(e,t){"use stric";var r="\\/\\*",n="\\/\\*(?!\\*?\\!)",i="(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?",o=/(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm,a=/(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm,s=t.exports=function(e,t){return e?s.block(s.line(e,t),t):""};s.block=function(e,t){t=t||{};var o=new RegExp(r+i,"gm");return t.safe&&(o=new RegExp(n+i,"gm")),e?e.replace(o,""):""},s.line=function(e,t){t=t||{};var r=o;return t.safe&&(r=a),e?e.replace(r,""):""}},{}],283:[function(t,r){!function(){function t(e,t){function r(t){var r,n=e.arcs[0>t?~t:t],i=n[0];return e.transform?(r=[0,0],n.forEach(function(e){r[0]+=e[0],r[1]+=e[1]})):r=n[n.length-1],0>t?[r,i]:[i,r]}function n(e,t){for(var r in e){var n=e[r];delete t[n.start],delete n.start,delete n.end,n.forEach(function(e){i[0>e?~e:e]=1}),s.push(n)}}var i={},o={},a={},s=[],l=-1;return t.forEach(function(r,n){var i,o=e.arcs[0>r?~r:r];o.length<3&&!o[1][0]&&!o[1][1]&&(i=t[++l],t[l]=r,t[n]=i)}),t.forEach(function(e){var t,n,i=r(e),s=i[0],l=i[1];if(t=a[s])if(delete a[t.end],t.push(e),t.end=l,n=o[l]){delete o[n.start];var u=n===t?t:t.concat(n);o[u.start=t.start]=a[u.end=n.end]=u}else o[t.start]=a[t.end]=t;else if(t=o[l])if(delete o[t.start],t.unshift(e),t.start=s,n=a[s]){delete a[n.end];var c=n===t?t:n.concat(t);o[c.start=n.start]=a[c.end=t.end]=c}else o[t.start]=a[t.end]=t;else t=[e],o[t.start=s]=a[t.end=l]=t}),n(a,o),n(o,a),t.forEach(function(e){i[0>e?~e:e]||s.push([e])}),s}function i(e,r,n){function i(e){var t=0>e?~e:e;(c[t]||(c[t]=[])).push({i:e,g:u})}function o(e){e.forEach(i)}function a(e){e.forEach(o)}function s(e){"GeometryCollection"===e.type?e.geometries.forEach(s):e.type in f&&(u=e,f[e.type](e.arcs))}var l=[];if(arguments.length>1){var u,c=[],f={LineString:o,MultiLineString:a,Polygon:a,MultiPolygon:function(e){e.forEach(a)}};s(r),c.forEach(arguments.length<3?function(e){l.push(e[0].i)}:function(e){n(e[0].g,e[e.length-1].g)&&l.push(e[0].i)})}else for(var h=0,d=e.arcs.length;d>h;++h)l.push(h);return{type:"MultiLineString",arcs:t(e,l)}}function o(e,r){function i(e){e.forEach(function(t){t.forEach(function(t){(a[t=0>t?~t:t]||(a[t]=[])).push(e)})}),s.push(e)}function o(t){return d(l(e,{type:"Polygon",arcs:[t]}).coordinates[0])>0}var a={},s=[],u=[];return r.forEach(function(e){"Polygon"===e.type?i(e.arcs):"MultiPolygon"===e.type&&e.arcs.forEach(i)}),s.forEach(function(e){if(!e._){var t=[],r=[e];for(e._=1,u.push(t);e=r.pop();)t.push(e),e.forEach(function(e){e.forEach(function(e){a[0>e?~e:e].forEach(function(e){e._||(e._=1,r.push(e))})})})}}),s.forEach(function(e){delete e._}),{type:"MultiPolygon",arcs:u.map(function(r){var i=[];if(r.forEach(function(e){e.forEach(function(e){e.forEach(function(e){a[0>e?~e:e].length<2&&i.push(e)})})}),i=t(e,i),(n=i.length)>1)for(var s,l=o(r[0][0]),u=0;n>u;++u)if(l===o(i[u])){s=i[0],i[0]=i[u],i[u]=s;break}return i})}}function a(e,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return s(e,t)})}:s(e,t)}function s(e,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:l(e,t)};return null==t.id&&delete r.id,r}function l(e,t){function r(e,t){t.length&&t.pop();for(var r,n=c[0>e?~e:e],i=0,o=n.length;o>i;++i)t.push(r=n[i].slice()),l(r,i);0>e&&u(t,o)}function n(e){return e=e.slice(),l(e,0),e}function i(e){for(var t=[],n=0,i=e.length;i>n;++n)r(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function o(e){for(var t=i(e);t.length<4;)t.push(t[0].slice());return t}function a(e){return e.map(o)}function s(e){var t=e.type;return"GeometryCollection"===t?{type:t,geometries:e.geometries.map(s)}:t in f?{type:t,coordinates:f[t](e)}:null}var l=g(e.transform),c=e.arcs,f={Point:function(e){return n(e.coordinates)},MultiPoint:function(e){return e.coordinates.map(n)},LineString:function(e){return i(e.arcs)},MultiLineString:function(e){return e.arcs.map(i)},Polygon:function(e){return a(e.arcs)},MultiPolygon:function(e){return e.arcs.map(a)}};return s(t)}function u(e,t){for(var r,n=e.length,i=n-t;i<--n;)r=e[i],e[i++]=e[n],e[n]=r}function c(e,t){for(var r=0,n=e.length;n>r;){var i=r+n>>>1;e[i]e&&(e=~e);var r=i[e];r?r.push(t):i[e]=[t]})}function r(e,r){e.forEach(function(e){t(e,r)})}function n(e,t){"GeometryCollection"===e.type?e.geometries.forEach(function(e){n(e,t)}):e.type in a&&a[e.type](e.arcs,t)}var i={},o=e.map(function(){return[]}),a={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(e,t){e.forEach(function(e){r(e,t)})}};e.forEach(n);for(var s in i)for(var l=i[s],u=l.length,f=0;u>f;++f)for(var h=f+1;u>h;++h){var d,p=l[f],m=l[h];(d=o[p])[s=c(d,m)]!==m&&d.splice(s,0,m),(d=o[m])[s=c(d,p)]!==p&&d.splice(s,0,p)}return o}function h(e,t){function r(e){o.remove(e),e[1][2]=t(e),o.push(e)}var n=g(e.transform),i=v(e.transform),o=_();return t||(t=p),e.arcs.forEach(function(e){for(var a,s,l=[],u=0,c=0,f=e.length;f>c;++c)s=e[c],n(e[c]=[s[0],s[1],1/0],c);for(var c=1,f=e.length-1;f>c;++c)a=e.slice(c-1,c+2),a[1][2]=t(a),l.push(a),o.push(a);for(var c=0,f=l.length;f>c;++c)a=l[c],a.previous=l[c-1],a.next=l[c+1];for(;a=o.pop();){var h=a.previous,d=a.next;a[1][2]0;){var r=(t+1>>1)-1,i=n[r];if(m(e,i)>=0)break;n[i._=t]=i,n[e._=t=r]=e}}function t(e,t){for(;;){var r=t+1<<1,o=r-1,a=t,s=n[a];if(i>o&&m(n[o],s)<0&&(s=n[a=o]),i>r&&m(n[r],s)<0&&(s=n[a=r]),a===t)break;n[s._=t]=s,n[e._=t=a]=e}}var r={},n=[],i=0;return r.push=function(t){return e(n[t._=i]=t,i++),i},r.pop=function(){if(!(0>=i)){var e,r=n[0];return--i>0&&(e=n[i],t(n[e._=0]=e,0)),r}},r.remove=function(r){var o,a=r._;if(n[a]===r)return a!==--i&&(o=n[i],(m(o,r)<0?e:t)(n[o._=a]=o,a)),a},r}function g(e){if(!e)return y;var t,r,n=e.scale[0],i=e.scale[1],o=e.translate[0],a=e.translate[1];return function(e,s){s||(t=r=0),e[0]=(t+=e[0])*n+o,e[1]=(r+=e[1])*i+a}}function v(e){if(!e)return y;var t,r,n=e.scale[0],i=e.scale[1],o=e.translate[0],a=e.translate[1];return function(e,s){s||(t=r=0);var l=(e[0]-o)/n|0,u=(e[1]-a)/i|0;e[0]=l-t,e[1]=u-r,t=l,r=u}}function y(){}var b={version:"1.6.19",mesh:function(e){return l(e,i.apply(this,arguments))},meshArcs:i,merge:function(e){return l(e,o.apply(this,arguments))},mergeArcs:o,feature:a,neighbors:f,presimplify:h};"function"==typeof e&&e.amd?e(b):"object"==typeof r&&r.exports?r.exports=b:this.topojson=b}()},{}],284:[function(e,t,r){(function(t,n){"use strict";function i(e){if(e){var t=e.length||e.byteLength,r=v.log2(t);w[r].push(e)}}function o(e){i(e.buffer)}function a(e){var e=v.nextPow2(e),t=v.log2(e),r=w[t];return r.length>0?r.pop():new ArrayBuffer(e)}function s(e){return new Uint8Array(a(e),0,e)}function l(e){return new Uint16Array(a(2*e),0,e)}function u(e){return new Uint32Array(a(4*e),0,e)}function c(e){return new Int8Array(a(e),0,e)}function f(e){return new Int16Array(a(2*e),0,e)}function h(e){return new Int32Array(a(4*e),0,e)}function d(e){return new Float32Array(a(4*e),0,e)}function p(e){return new Float64Array(a(8*e),0,e)}function m(e){return b?new Uint8ClampedArray(a(e),0,e):s(e)}function _(e){return new DataView(a(e),0,e)}function g(e){e=v.nextPow2(e);var t=v.log2(e),r=k[t];return r.length>0?r.pop():new n(e)}var v=e("bit-twiddle"),y=e("dup");t.__TYPEDARRAY_POOL||(t.__TYPEDARRAY_POOL={UINT8:y([32,0]),UINT16:y([32,0]),UINT32:y([32,0]),INT8:y([32,0]),INT16:y([32,0]),INT32:y([32,0]),FLOAT:y([32,0]),DOUBLE:y([32,0]),DATA:y([32,0]),UINT8C:y([32,0]),BUFFER:y([32,0])});var b="undefined"!=typeof Uint8ClampedArray,x=t.__TYPEDARRAY_POOL;x.UINT8C||(x.UINT8C=y([32,0])),x.BUFFER||(x.BUFFER=y([32,0]));var w=x.DATA,k=x.BUFFER;r.free=function(e){if(n.isBuffer(e))k[v.log2(e.length)].push(e);else{if("[object ArrayBuffer]"!==Object.prototype.toString.call(e)&&(e=e.buffer),!e)return; -var t=e.length||e.byteLength,r=0|v.log2(t);w[r].push(e)}},r.freeUint8=r.freeUint16=r.freeUint32=r.freeInt8=r.freeInt16=r.freeInt32=r.freeFloat32=r.freeFloat=r.freeFloat64=r.freeDouble=r.freeUint8Clamped=r.freeDataView=o,r.freeArrayBuffer=i,r.freeBuffer=function(e){k[v.log2(e.length)].push(e)},r.malloc=function(e,t){if(void 0===t||"arraybuffer"===t)return a(e);switch(t){case"uint8":return s(e);case"uint16":return l(e);case"uint32":return u(e);case"int8":return c(e);case"int16":return f(e);case"int32":return h(e);case"float":case"float32":return d(e);case"double":case"float64":return p(e);case"uint8_clamped":return m(e);case"buffer":return g(e);case"data":case"dataview":return _(e);default:return null}return null},r.mallocArrayBuffer=a,r.mallocUint8=s,r.mallocUint16=l,r.mallocUint32=u,r.mallocInt8=c,r.mallocInt16=f,r.mallocInt32=h,r.mallocFloat32=r.mallocFloat=d,r.mallocFloat64=r.mallocDouble=p,r.mallocUint8Clamped=m,r.mallocDataView=_,r.mallocBuffer=g,r.clearCache=function(){for(var e=0;32>e;++e)x.UINT8[e].length=0,x.UINT16[e].length=0,x.UINT32[e].length=0,x.INT8[e].length=0,x.INT16[e].length=0,x.INT32[e].length=0,x.FLOAT[e].length=0,x.DOUBLE[e].length=0,x.UINT8C[e].length=0,w[e].length=0,k[e].length=0}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer)},{"bit-twiddle":32,buffer:41,dup:166}],285:[function(e,t){(function(e){function r(e,t){function r(){if(!i){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}if(n("noDeprecation"))return e;var i=!1;return r}function n(t){try{if(!e.localStorage)return!1}catch(r){return!1}var n=e.localStorage[t];return null==n?!1:"true"===String(n).toLowerCase()}t.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],286:[function(e,t){t.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},{}],287:[function(e,t,r){(function(t,n){function i(e,t){var n={seen:[],stylize:a};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),m(t)?n.showHidden=t:t&&r._extend(n,t),x(n.showHidden)&&(n.showHidden=!1),x(n.depth)&&(n.depth=2),x(n.colors)&&(n.colors=!1),x(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=o),l(n,e,n.depth)}function o(e,t){var r=i.styles[t];return r?"["+i.colors[r][0]+"m"+e+"["+i.colors[r][1]+"m":e}function a(e){return e}function s(e){var t={};return e.forEach(function(e){t[e]=!0}),t}function l(e,t,n){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==r.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return y(i)||(i=l(e,i,n)),i}var o=u(e,t);if(o)return o;var a=Object.keys(t),m=s(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(t)),T(t)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return c(t);if(0===a.length){if(E(t)){var _=t.name?": "+t.name:"";return e.stylize("[Function"+_+"]","special")}if(w(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(A(t))return e.stylize(Date.prototype.toString.call(t),"date");if(T(t))return c(t)}var g="",v=!1,b=["{","}"];if(p(t)&&(v=!0,b=["[","]"]),E(t)){var x=t.name?": "+t.name:"";g=" [Function"+x+"]"}if(w(t)&&(g=" "+RegExp.prototype.toString.call(t)),A(t)&&(g=" "+Date.prototype.toUTCString.call(t)),T(t)&&(g=" "+c(t)),0===a.length&&(!v||0==t.length))return b[0]+g+b[1];if(0>n)return w(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var k;return k=v?f(e,t,n,m,a):a.map(function(r){return h(e,t,n,m,r,v)}),e.seen.pop(),d(k,g,b)}function u(e,t){if(x(t))return e.stylize("undefined","undefined");if(y(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}return v(t)?e.stylize(""+t,"number"):m(t)?e.stylize(""+t,"boolean"):_(t)?e.stylize("null","null"):void 0}function c(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i){for(var o=[],a=0,s=t.length;s>a;++a)o.push(z(t,String(a))?h(e,t,r,n,String(a),!0):"");return i.forEach(function(i){i.match(/^\d+$/)||o.push(h(e,t,r,n,i,!0))}),o}function h(e,t,r,n,i,o){var a,s,u;if(u=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},u.get?s=u.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):u.set&&(s=e.stylize("[Setter]","special")),z(n,i)||(a="["+i+"]"),s||(e.seen.indexOf(u.value)<0?(s=_(r)?l(e,u.value,null):l(e,u.value,r-1),s.indexOf("\n")>-1&&(s=o?s.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+s.split("\n").map(function(e){return" "+e}).join("\n"))):s=e.stylize("[Circular]","special")),x(a)){if(o&&i.match(/^\d+$/))return s;a=JSON.stringify(""+i),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+s}function d(e,t,r){var n=0,i=e.reduce(function(e,t){return n++,t.indexOf("\n")>=0&&n++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1]:r[0]+t+" "+e.join(", ")+" "+r[1]}function p(e){return Array.isArray(e)}function m(e){return"boolean"==typeof e}function _(e){return null===e}function g(e){return null==e}function v(e){return"number"==typeof e}function y(e){return"string"==typeof e}function b(e){return"symbol"==typeof e}function x(e){return void 0===e}function w(e){return k(e)&&"[object RegExp]"===R(e)}function k(e){return"object"==typeof e&&null!==e}function A(e){return k(e)&&"[object Date]"===R(e)}function T(e){return k(e)&&("[object Error]"===R(e)||e instanceof Error)}function E(e){return"function"==typeof e}function S(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function R(e){return Object.prototype.toString.call(e)}function j(e){return 10>e?"0"+e.toString(10):e.toString(10)}function M(){var e=new Date,t=[j(e.getHours()),j(e.getMinutes()),j(e.getSeconds())].join(":");return[e.getDate(),N[e.getMonth()],t].join(" ")}function z(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var C=/%[sdj%]/g;r.format=function(e){if(!y(e)){for(var t=[],r=0;r=o)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return e}}),s=n[r];o>r;s=n[++r])a+=_(s)||!k(s)?" "+s:" "+i(s);return a},r.deprecate=function(e,i){function o(){if(!a){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),a=!0}return e.apply(this,arguments)}if(x(n.process))return function(){return r.deprecate(e,i).apply(this,arguments)};if(t.noDeprecation===!0)return e;var a=!1;return o};var P,L={};r.debuglog=function(e){if(x(P)&&(P=t.env.NODE_DEBUG||""),e=e.toUpperCase(),!L[e])if(new RegExp("\\b"+e+"\\b","i").test(P)){var n=t.pid;L[e]=function(){var t=r.format.apply(r,arguments);console.error("%s %d: %s",e,n,t)}}else L[e]=function(){};return L[e]},r.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},r.isArray=p,r.isBoolean=m,r.isNull=_,r.isNullOrUndefined=g,r.isNumber=v,r.isString=y,r.isSymbol=b,r.isUndefined=x,r.isRegExp=w,r.isObject=k,r.isDate=A,r.isError=T,r.isFunction=E,r.isPrimitive=S,r.isBuffer=e("./support/isBuffer");var N=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];r.log=function(){console.log("%s - %s",M(),r.format.apply(r,arguments))},r.inherits=e("inherits"),r._extend=function(e,t){if(!t||!k(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e}}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":286,_process:272,inherits:187}],288:[function(e,t){t.exports.VectorTile=e("./lib/vectortile.js"),t.exports.VectorTileFeature=e("./lib/vectortilefeature.js"),t.exports.VectorTileLayer=e("./lib/vectortilelayer.js")},{"./lib/vectortile.js":289,"./lib/vectortilefeature.js":290,"./lib/vectortilelayer.js":291}],289:[function(e,t){"use strict";function r(e,t){this.layers=e.readFields(n,{},t)}function n(e,t,r){if(3===e){var n=new i(r,r.readVarint()+r.pos);n.length&&(t[n.name]=n)}}var i=e("./vectortilelayer");t.exports=r},{"./vectortilelayer":291}],290:[function(e,t){"use strict";function r(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(n,this,t)}function n(e,t,r){1==e?t._id=r.readVarint():2==e?i(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function i(e,t){for(var r=e.readVarint()+e.pos;e.pos>3}if(i--,1===n||2===n)a+=e.readSVarint(),s+=e.readSVarint(),1===n&&(t&&l.push(t),t=[]),t.push(new o(a,s));else{if(7!==n)throw new Error("unknown command "+n);t.push(t[0].clone())}}return t&&l.push(t),l},r.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,n=0,i=0,o=0,a=1/0,s=-1/0,l=1/0,u=-1/0;e.pos>3}if(n--,1===r||2===r)i+=e.readSVarint(),o+=e.readSVarint(),a>i&&(a=i),i>s&&(s=i),l>o&&(l=o),o>u&&(u=o);else if(7!==r)throw new Error("unknown command "+r)}return[a,l,s,u]},r.prototype.toGeoJSON=function(e,t,n){for(var i=this.extent*Math.pow(2,n),o=this.extent*e,a=this.extent*t,s=this.loadGeometry(),l=r.types[this.type],u=0;u>3;t=1===n?e.readString():2===n?e.readFloat():3===n?e.readDouble():4===n?e.readVarint64():5===n?e.readVarint():6===n?e.readSVarint():7===n?e.readBoolean():null}return t}var o=e("./vectortilefeature.js");t.exports=r,r.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new o(this._pbf,t,this.extent,this._keys,this._values)}},{"./vectortilefeature.js":290}],292:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r){var n=l[0],i=l[1];return e[0]<=n.x+r&&t[0]<=n.x+r||e[0]>=i.x-r&&t[0]>=i.x-r||e[1]>=n.y-r&&t[1]>=n.y-r||e[1]<=i.y+r&&t[1]<=i.y+r?!0:!1}function o(e,t){t=t||0;var r=l[0],n=l[1];return e[0]<=r.x+t||e[0]>=n.x-t||e[1]>=r.y-t||e[1]<=n.y+t}Object.defineProperty(r,"__esModule",{value:!0}),r.default_uvs=r.tile_bounds=void 0,r.outsideTile=i,r.isCoordOutsideTile=o;{var a=e("../geo"),s=n(a),l=r.tile_bounds=[{x:0,y:0},{x:s.default.tile_scale,y:-s.default.tile_scale}];r.default_uvs=[0,0,1,1]}},{"../geo":297}],293:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r,n,i){var o=n.texcoord_index,l=n.position_index,u=n.shape_index,c=n.offset_index,f=i.quad,h=i.quad_normalize,d=i.offset,p=i.angle,m=i.shape_w,_=i.texcoord_scale,g=i.texcoord_normalize;h=h||1;var v=f[0]/2*h,y=f[1]/2*h,b=[[-v,-y],[v,-y],[v,y],[-v,y]],x=t.vertex_elements,w=t.vertex_count,k=void 0;if(o){g=g||1;var A=_||s.default_uvs,T=a.default(A,4),E=T[0],S=T[1],R=T[2],j=T[3];k=[[E,S],[R,S],[R,j],[E,j]]}for(var M=e.length,z=0;M>z;z++){for(var C=e[z],P=0;4>P;P++)o&&(r[o+0]=k[P][0]*g,r[o+1]=k[P][1]*g),r[l+0]=C[0],r[l+1]=C[1],r[u+0]=b[P][0],r[u+1]=b[P][1],r[u+2]=p,r[u+3]=m,r[c+0]=d[0],r[c+1]=d[1],t.addVertex(r);x.push(w+0),x.push(w+1),x.push(w+2),x.push(w+2),x.push(w+3),x.push(w+0),w+=4}}Object.defineProperty(r,"__esModule",{value:!0});var o=e("babel-runtime/helpers/slicedToArray"),a=n(o);r.buildQuadsForPoints=i;var s=e("./common")},{"./common":292,"babel-runtime/helpers/slicedToArray":27}],294:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r,n){var i=n.texcoord_index,o=n.texcoord_scale,s=n.texcoord_normalize,u=t.vertex_elements;if(i){s=s||1;var f=o||d.default_uvs,h=l.default(f,4),p=h[0],_=h[1],g=h[2],v=h[3]}for(var y=e.length,b=0;y>b;b++){var x=t.vertex_count,w=e[b];if(i)var k=c.default.findBoundingBox(w),A=l.default(k,4),T=A[0],E=A[1],S=A[2],R=A[3],j=S-T,M=R-E,z=(g-p)/j,C=(v-_)/M;for(var P=0;PC;C++)for(var P=e[C],L=0;L2&&r.push(e.slice(1)));if(c=A.default.normalize(A.default.perp(n,i)),y&&S.outsideTile(n,i,x)){var z=s(e,0,x);return void(z&&r.push(z))}g?(o=A.default.normalize(A.default.perp(e[e.length-2],n)),l(n,o,c,m,t)):(S.isCoordOutsideTile(n)||(v(n,T,c,_,!0,t),_!==j.butt&&(T+=.5*w*t.texcoord_width)),p(n,c,[1,T],t),p(n,A.default.neg(c),[0,T],t)),T+=w*A.default.length(A.default.sub(i,n));for(var C=1;C=2?e.slice(n):!1}function l(e,t,r,n,i){if(void 0===n||S.isCoordOutsideTile(e))p(e,r,[1,0],i),p(e,A.default.neg(r),[0,0],i);else{var o=0;n===M.miter?f(o,e,t,r,i.miter_len_sq,!0,i):h(n,o,e,t,r,!0,i)}}function u(e,t,r,n,i,o){if(S.isCoordOutsideTile(e))p(e,t,[1,i],o),p(e,A.default.neg(t),[0,i],o),d(1,o);else{var a=c(t,r);n===M.miter&&A.default.lengthSq(a)>o.miter_len_sq&&(n=M.bevel),n===M.miter?(p(e,a,[1,i],o),p(e,A.default.neg(a),[0,i],o),d(1,o)):(p(e,t,[1,i],o),p(e,A.default.neg(t),[0,i],o),d(1,o))}}function c(e,t){var r=A.default.normalize(A.default.add(e,t)),n=2/(1+Math.abs(A.default.dot(e,r)));return A.default.mult(r,n*n)}function f(e,t,r,n,i,o,a){var s=c(r,n);A.default.lengthSq(s)>i?h(M.miter,e,t,r,n,o,a):(p(t,s,[1,e],a),p(t,A.default.neg(s),[0,e],a),o||d(1,a))}function h(e,t,r,n,i,o,a){var s=c(n,i),l=i[0]*n[1]-i[1]*n[0]>0;l?(p(r,s,[1,t],a),p(r,A.default.neg(n),[0,t],a),o||d(1,a),e===M.bevel?g(r,A.default.neg(n),s,A.default.neg(i),[0,t],[1,t],[0,t],a):e===M.round&&_(r,A.default.neg(n),s,A.default.neg(i),[0,t],[1,t],[0,t],!1,a),p(r,s,[1,t],a),p(r,A.default.neg(i),[0,t],a)):(p(r,n,[1,t],a),p(r,A.default.neg(s),[0,t],a),o||d(1,a),e===M.bevel?g(r,n,A.default.neg(s),i,[1,t],[0,t],[1,t],a):e===M.round&&_(r,n,A.default.neg(s),i,[1,t],[0,t],[1,t],!1,a),p(r,i,[1,t],a),p(r,A.default.neg(s),[0,t],a))}function d(e,t){for(var r=t.vertex_data.vertex_elements,n=t.vertex_data.vertex_count,i=n-2*e-2,o=0;e>o;o++)r.push(i+2*o+2),r.push(i+2*o+1),r.push(i+2*o+0),r.push(i+2*o+2),r.push(i+2*o+3),r.push(i+2*o+1)}function p(e,t,r,n){var i=n.vertex_template,o=n.vertex_data;m(i,e,r,t,n),o.addVertex(i)}function m(e,t,r,n,i){e[0]=t[0],e[1]=t[1],i.texcoord_index&&r&&(e[i.texcoord_index+0]=r[0]*i.texcoord_normalize,e[i.texcoord_index+1]=r[1]*i.texcoord_normalize),i.scaling_index&&(e[i.scaling_index+0]=n[0]*i.scaling_normalize,e[i.scaling_index+1]=n[1]*i.scaling_normalize,e[i.scaling_index+2]=i.half_width)}function _(e,t,r,n,i,o,a,s,l){for(var u=t[0]*n[1]-t[1]*n[0],c=A.default.dot(t,n),f=Math.atan2(u,c);f>=Math.PI;)f-=2*Math.PI;var h=y(f,l.half_width);if(!(1>h)){var d=l.vertex_data.vertex_count,m=l.vertex_data.vertex_elements;p(e,r,o,l),p(e,t,i,l);var _=t;if(void 0!==l.texcoord_index){var g;if(s){g=[];var v=A.default.sub(i,o)}else{g=A.default.set(i);var b=A.default.div(A.default.sub(a,i),h)}}for(var x=f/h,w=0;h>w;w++)_=A.default.rot(_,x),void 0!==l.texcoord_index&&(s?(v=A.default.rot(v,x),g[0]=v[0]+o[0],g[1]=v[1]*l.texcoord_width*l.v_scale+o[1]):g=A.default.add(g,b)),p(e,_,g,l),m.push(d+w+(u>0?2:1)),m.push(d),m.push(d+w+(u>0?1:2))}}function g(e,t,r,n,i,o,a,s){var l=s.vertex_data.vertex_count;p(e,r,o,s),p(e,t,i,s),p(e,n,a,s);var u=t[0]*n[1]-t[1]*n[0]>0,c=s.vertex_data.vertex_elements;u?(c.push(l+2),c.push(l+0),c.push(l+1)):(c.push(l+1),c.push(l+0),c.push(l+2))}function v(e,t,r,n,i,o){var a=A.default.neg(r);switch(n){case j.square:var s;i?(s=[r[1],-r[0]],p(e,A.default.add(r,s),[1,t],o),p(e,A.default.add(a,s),[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,r,[1,t],o),p(e,a,[0,t],o)):(s=[-r[1],r[0]],p(e,r,[1,t],o),p(e,a,[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,A.default.add(r,s),[1,t],o),p(e,A.default.add(a,s),[0,t],o)),d(1,o);break;case j.round:var l,u,c,f,h;i?(l=r,u=a,void 0!==o.texcoord_index&&(t+=.5*o.texcoord_width*o.v_scale,c=[1,t],f=[0,t],h=[.5,t])):(l=a,u=r,void 0!==o.texcoord_index&&(c=[0,t],f=[1,t],h=[.5,t])),_(e,l,R,u,c,h,f,!0,o);break;case j.butt:return}}function y(e,t){0>e&&(e=-e);var r=t>2*z.MIN_FAN_WIDTH?w.default(t/z.MIN_FAN_WIDTH):1;return Math.ceil(e/Math.PI*r)}function b(e,t){for(var r=[],n=0;n180||-180>e)&&(e=((e+180)%360+360)%360-180),e},i.transformGeometry=function(e,t){null!=e&&("Point"===e.type?t(e.coordinates):"LineString"===e.type||"MultiPoint"===e.type?e.coordinates.forEach(t):"Polygon"===e.type||"MultiLineString"===e.type?e.coordinates.forEach(function(e){return e.forEach(t)}):"MultiPolygon"===e.type&&e.coordinates.forEach(function(e){e.forEach(function(e){return e.forEach(t)})}))},i.boxIntersect=function(e,t){return!(t.sw.x>e.ne.x||t.ne.xe.ne.y||t.ne.ya;a++){var s=e[0][a];s[0]r&&(r=s[0]),s[1]>i&&(i=s[1])}return[t,n,r,i]},i.geometryType=function(e){return"Polygon"===e||"MultiPolygon"===e?"polygon":"LineString"===e||"MultiLineString"===e?"line":"Point"===e||"MultiPoint"===e?"point":void 0},i.centroid=function(e){for(var t=0,r=0,n=0,i=e[0],o=i.length,a=0,s=o-1;o>a;s=a,a++){var l=i[a],u=i[s],c=l[1]*u[0]-u[1]*l[0];t+=(l[0]+u[0])*c,r+=(l[1]+u[1])*c,n+=3*c}return[t/n,r/n]},i.multiCentroid=function(e){for(var t=e.length,r=[0,0],n=0;nn;n++){var i=e[n],o=e[n+1];t+=i[0]*o[1]-o[0]*i[1]}return t+=e[r-1][0]*e[0][1]-e[0][0]*e[r-1][1]},i.polygonRingArea=function(e){return Math.abs(i.signedPolygonRingAreaSum(e))/2},i.polygonArea=function(e){return i.polygonRingArea(e[0])},i.multiPolygonArea=function(e){for(var t=0,r=0;r0?"CW":0>t?"CCW":void 0},i.enforceWinding=function(e,t){var r=void 0;if("Polygon"===e.type)r=[e.coordinates];else{if("MultiPolygon"!==e.type)return e;r=e.coordinates}for(var n=0;n=2&&o.length<=4?t.push({type:"vec"+o.length,method:o.length+"fv",name:r,value:o,key:i,uniforms:e}):o.length>4&&t.push({type:"float[]",method:"1fv",name:r+"[0]",value:o,key:i,uniforms:e});else if("string"==typeof o[0])for(n=0;n=2&&o[0].length<=4)for(n=0;n=2&&t.length<=4?r="vec"+t.length:(r="float",n=t.length):"string"==typeof t[0]&&(r="sampler2D",n=t.length):"boolean"==typeof t?r="bool":"string"==typeof t&&(r="sampler2D");var i="";return i+=r+" "+e,n&&(i+="["+n+"]"),i+=";\n"},a.defineUniform=function(e,t){return"uniform "+a.defineVariable(e,t)},a.isUniformDefined=function(e,t){var r=new RegExp("uniform[^;]+(?:{[\\s\\S]*})?[^;]*\\b"+e+"\\b","g");return t.match(r)?!0:!1},a.isSymbolReferenced=function(e,t){var r=new RegExp("\\b"+e+"\\b","g");return t.search(r)>=0?!0:!1},a.expandVec3=function(e){var t=arguments.length<=1||void 0===arguments[1]?1:arguments[1],r=void 0;return r=Array.isArray(e)&&2===e.length?[].concat(o.default(e),[t]).map(parseFloat):[e,e,e].map(parseFloat),r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0},a.expandVec4=function(e){var t=arguments.length<=1||void 0===arguments[1]?1:arguments[1],r=void 0;return r=Array.isArray(e)&&3===e.length?[].concat(o.default(e),[t]).map(parseFloat):[e,e,e,t].map(parseFloat),r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0}},{"babel-runtime/helpers/toConsumableArray":28}],302:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(r,"__esModule",{value:!0}),r.RenderState=void 0;var i=e("babel-runtime/core-js/json/stringify"),o=n(i),a=e("babel-runtime/helpers/classCallCheck"),s=n(a),l=e("babel-runtime/helpers/createClass"),u=n(l),c=r.RenderState=function(){function e(t,r){s.default(this,e),r(t),this.value=t,this.setup=r}return u.default(e,[{key:"set",value:function(e){o.default(this.value)!==o.default(e)&&(this.setup(e),this.value=e)}}]),e}(),f=function h(e){s.default(this,h),this.defaults={},this.defaults.culling=!0,this.defaults.culling_face=e.BACK,this.defaults.blending=!1,this.defaults.blending_src=e.ONE_MINUS_SRC_ALPHA,this.defaults.blending_dst=e.ONE_MINUS_SRC_ALPHA,this.defaults.blending_src_alpha=e.ONE,this.defaults.blending_dst_alpha=e.ONE_MINUS_SRC_ALPHA,this.defaults.depth_write=!0,this.defaults.depth_test=!0,e.depthFunc(e.LESS),this.culling=new c({cull:this.defaults.culling,face:this.defaults.culling_face},function(t){t.cull?(e.enable(e.CULL_FACE),e.cullFace(t.face)):e.disable(e.CULL_FACE)}),this.blending=new c({blend:this.defaults.blending,src:this.defaults.blending_src,dst:this.defaults.blending_dst,src_alpha:this.defaults.blending_src_alpha,dst_alpha:this.defaults.blending_dst_alpha},function(t){t.blend?(e.enable(e.BLEND),t.src_alpha&&t.dst_alpha?e.blendFuncSeparate(t.src,t.dst,t.src_alpha,t.dst_alpha):e.blendFunc(t.src,t.dst)):e.disable(e.BLEND)}),this.depth_write=new c({depth_write:this.defaults.depth_write},function(t){e.depthMask(t.depth_write)}),this.depth_test=new c({depth_test:this.defaults.depth_test},function(t){t.depth_test?e.enable(e.DEPTH_TEST):e.disable(e.DEPTH_TEST)})};r.default=f},{"babel-runtime/core-js/json/stringify":6,"babel-runtime/helpers/classCallCheck":21,"babel-runtime/helpers/createClass":22}],303:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(r,"__esModule",{value:!0});var i=e("babel-runtime/helpers/toConsumableArray"),o=n(i),a=e("babel-runtime/core-js/get-iterator"),s=n(a),l=e("babel-runtime/core-js/object/assign"),u=n(l),c=e("babel-runtime/helpers/classCallCheck"),f=n(c),h=e("babel-runtime/helpers/createClass"),d=n(h),p=e("../utils/log"),m=n(p),_=e("./glsl"),g=n(_),v=e("./texture"),y=n(v),b=e("./extensions"),x=n(b),w=e("strip-comments"),k=n(w),A=e("gl-shader-errors"),T=n(A),E=/^\s*#pragma.*$/gm,S=/\\\s*\n/gm,R=function(){function e(t,r,n,i){f.default(this,e),i=i||{},this.gl=t,this.program=null,this.compiled=!1,this.compiling=!1,this.error=null,this.defines=u.default({},i.defines||{}),this.blocks=u.default({},i.blocks||{}),this.block_scopes=u.default({},i.block_scopes||{}),this.extensions=i.extensions||[],this.dependent_uniforms=i.uniforms,this.uniforms={},this.attribs={},this.vertex_source=r,this.fragment_source=n,this.id=e.id++,e.programs[this.id]=this,this.name=i.name}return d.default(e,[{key:"destroy",value:function(){this.gl.useProgram(null),this.gl.deleteProgram(this.program),this.program=null,this.uniforms={},this.attribs={},delete e.programs[this.id],this.compiled=!1}},{key:"use",value:function(){this.compiled&&(e.current!==this&&this.gl.useProgram(this.program),e.current=this)}},{key:"compile",value:function(){if(this.compiling)throw new Error("ShaderProgram.compile(): skipping for "+this.id+" ("+this.name+") because already compiling");this.compiling=!0,this.compiled=!1,this.error=null,this.computed_vertex_source=this.vertex_source,this.computed_fragment_source=this.fragment_source;var t,r=this.checkExtensions(),n=this.buildDefineList(),i=this.buildShaderBlockList();for(var o in i){var a=i[o];if(a&&(!Array.isArray(a)||0!==a.length)){t=new RegExp("^\\s*#pragma\\s+tangram:\\s+"+o+"\\s*$","m");var l=this.computed_vertex_source.match(t),u=this.computed_fragment_source.match(t);if(null!=l||null!=u){var c="";a.forEach(function(e){var t=e.scope+", "+e.key+", "+e.num;c+="\n// tangram-block-start: "+t+"\n",c+=e.source,c+="\n// tangram-block-end: "+t+"\n"}),null!=l&&(this.computed_vertex_source=this.computed_vertex_source.replace(t,c)),null!=u&&(this.computed_fragment_source=this.computed_fragment_source.replace(t,c)),n["TANGRAM_BLOCK_"+o.replace(/[\s-]+/g,"_").toUpperCase()]=!0}}}this.computed_vertex_source=this.computed_vertex_source.replace(E,""),this.computed_fragment_source=this.computed_fragment_source.replace(E,""),this.ensureUniforms(this.dependent_uniforms);var f=this.name?this.name+" / id "+this.id:"id "+this.id,h="// Program: "+f+"\n",d="",p=this.gl.getShaderPrecisionFormat(this.gl.FRAGMENT_SHADER,this.gl.HIGH_FLOAT);d=p&&p.precision>0?"precision highp float;\n":"precision mediump float;\n",n.TANGRAM_VERTEX_SHADER=!0,n.TANGRAM_FRAGMENT_SHADER=!1,this.computed_vertex_source=h+d+e.buildDefineString(n)+this.computed_vertex_source,n.TANGRAM_VERTEX_SHADER=!1,n.TANGRAM_FRAGMENT_SHADER=!0,this.computed_fragment_source=e.buildExtensionString(r)+h+d+e.buildDefineString(n)+this.computed_fragment_source,this.computed_vertex_source=this.computed_vertex_source.replace(S,""),this.computed_fragment_source=this.computed_fragment_source.replace(S,"");try{this.program=e.updateProgram(this.gl,this.program,this.computed_vertex_source,this.computed_fragment_source),this.compiled=!0,this.compiling=!1}catch(m){if(this.program=null,this.compiled=!1,this.compiling=!1,this.error=m,"vertex"===m.type||"fragment"===m.type){this.shader_errors=m.errors;var _=!0,g=!1,v=void 0;try{for(var y,b=s.default(this.shader_errors);!(_=(y=b.next()).done);_=!0){var x=y.value;x.type=m.type,x.block=this.block(m.type,x.line)}}catch(w){g=!0,v=w}finally{try{!_&&b.return&&b.return()}finally{if(g)throw v}}}throw new Error("ShaderProgram.compile(): program "+this.id+" ("+this.name+") error:",m)}this.use(),this.refreshUniforms(),this.refreshAttributes()}},{key:"buildDefineList",value:function(){var t,r={};for(t in e.defines)r[t]=e.defines[t];for(t in this.defines)r[t]=this.defines[t];return r}},{key:"buildShaderBlockList",value:function(){var t=void 0,r={};for(t in e.blocks)if(r[t]=[],Array.isArray(e.blocks[t])){var n;(n=r[t]).push.apply(n,o.default(e.blocks[t].map(function(e,r){return{key:t,source:e,num:r,scope:"ShaderProgram"}})))}else r[t]=[{key:t,source:e.blocks[t],num:0,scope:"ShaderProgram"}];for(t in this.blocks)if(r[t]=r[t]||[],Array.isArray(this.blocks[t]))for(var i=this.block_scopes&&this.block_scopes[t]||[],a=null,s=0,l=0;l0&&(this.computed_vertex_source=i.join("\n")+this.computed_vertex_source),o.length>0&&(this.computed_fragment_source=o.join("\n")+this.computed_fragment_source)}}},{key:"setUniforms",value:function(e){var t=arguments.length<=1||void 0===arguments[1]?!0:arguments[1];if(this.compiled){t&&(this.texture_unit=0);for(var r=g.default.parseUniforms(e),n=0;ni&&i1?r={scope:a[1],name:a[2],num:a[3]}:(a=o.match(/\/\/ tangram-block-end: ([A-Za-z0-9_-]+), ([A-Za-z0-9_-]+), (\d+)/),a&&a.length>1&&(r=null)),r&&(r.line=null==r.line?-1:r.line+1,r.source=o)}return r}},{key:"checkExtensions",value:function(){var e=[],t=!0,r=!1,n=void 0;try{for(var i,o=s.default(this.extensions);!(t=(i=o.next()).done);t=!0){var a=i.value,l=x.default(this.gl,a),u="TANGRAM_EXTENSION_"+a;this.defines[u]=null!=l,l?e.push(a):m.default("debug","Could not enable extension '"+a+"'")}}catch(c){r=!0,n=c}finally{try{!t&&o.return&&o.return()}finally{if(r)throw n}}return e}}]),e}();r.default=R,R.id=0,R.programs={},R.current=null,R.defines={},R.blocks={},R.buildDefineString=function(e){var t="";for(var r in e)null!=e[r]&&e[r]!==!1&&(t+="boolean"==typeof e[r]&&e[r]===!0?"#define "+r+"\n":"number"==typeof e[r]&&Math.floor(e[r])===e[r]?"#define "+r+" "+e[r].toFixed(1)+"\n":"#define "+r+" "+e[r]+"\n");return t},R.buildExtensionString=function(e){e=e||[];var t="",r=!0,n=!1,i=void 0;try{for(var o,a=s.default(e);!(r=(o=a.next()).done);r=!0){var l=o.value;t+="#ifdef GL_"+l+"\n#extension GL_"+l+" : enable\n#endif\n"}}catch(u){n=!0,i=u}finally{try{!r&&a.return&&a.return()}finally{if(n)throw i}}return t},R.addBlock=function(e){var t;R.blocks[e]=R.blocks[e]||[];for(var r=arguments.length,n=Array(r>1?r-1:0),i=1;r>i;i++)n[i-1]=arguments[i];(t=R.blocks[e]).push.apply(t,n)},R.removeBlock=function(e){R.blocks[e]=[]},R.replaceBlock=function(e){R.removeBlock(e);for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;t>n;n++)r[n-1]=arguments[n];R.addBlock.apply(R,[e].concat(r))},R.updateProgram=function(e,t,r,n){try{var i=R.createShader(e,r,e.VERTEX_SHADER),o=R.createShader(e,n,e.FRAGMENT_SHADER)}catch(a){throw m.default("error",a.message),a}if(e.useProgram(null),null!=t)for(var s=e.getAttachedShaders(t),l=0;l0&&!r?void y.default("error","Texture '"+this.name+"': destroying texture with retain count of '"+this.retain_count+"'"):void(this.valid&&(this.gl.deleteTexture(this.texture),this.texture=null,delete this.data,this.data=null,delete e.textures[this.name],this.valid=!1,y.default("trace","destroying Texture "+this.name)))}},{key:"retain",value:function(){this.retain_count++}},{key:"release",value:function(){this.retain_count<=0&&y.default("error","Texture '"+this.name+"': releasing texture with retain count of '"+this.retain_count+"'"),this.retain_count--,this.retain_count<=0&&this.destroy()}},{key:"bind",value:function(){var t=arguments.length<=0||void 0===arguments[0]?0:arguments[0];this.valid&&(e.activeUnit!==t&&(this.gl.activeTexture(this.gl.TEXTURE0+t),e.activeUnit=t,e.boundTexture=null),e.boundTexture!==this.texture&&(this.gl.bindTexture(this.gl.TEXTURE_2D,this.texture),e.boundTexture=this.texture))}},{key:"load",value:function(e){var t=this;return e?(this.loading=null,"string"==typeof e.url?(this.config_type="url",this.setUrl(e.url,e)):e.element?(this.config_type="element",this.setElement(e.element,e)):e.data&&e.width&&e.height&&(this.config_type="data",this.setData(e.width,e.height,e.data,e)),this.loading=this.loading&&this.loading.then(function(){return t.calculateSprites(),t})||f.default.resolve(this),this.loading):this.loading||f.default.resolve(this)}},{key:"setUrl",value:function(t){var r=this,n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return this.valid?(e.base_url&&(t=x.default.addBaseURL(t,e.base_url)),this.url=t,this.source=this.url,this.source_type="url",this.loading=new f.default(function(t){var i=new Image;i.onload=function(){try{r.setElement(i,n)}catch(o){r.loaded=!1,y.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",o,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:o,texture:n})}r.loaded=!0,t(r)},i.onerror=function(i){r.loaded=!1,y.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",i,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:i,texture:n}),t(r)},x.default.isSafari()&&"data:"===r.source.slice(0,5)||(i.crossOrigin="anonymous"),i.src=r.source}),this.loading):void 0}},{key:"setData",value:function(e,t,r){var n=arguments.length<=3||void 0===arguments[3]?{}:arguments[3];return this.width=e,this.height=t,this.source=r,this.source_type="data",Array.isArray(this.source)&&(this.source=new Uint8Array(this.source)),this.update(n),this.setFiltering(n),this.loaded=!0,this.loading=f.default.resolve(this),this.loading}},{key:"setElement",value:function(t,r){var n=t;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLCanvasElement||t instanceof HTMLImageElement||t instanceof HTMLVideoElement)this.source=t,this.source_type="element",this.update(r),this.setFiltering(r);else{this.loaded=!1;var i="the 'element' parameter (`element: "+u.default(n)+"`) must be a CSS ";i+="selector string, or a , or