made with requirebin
Last active
May 26, 2016 16:34
-
-
Save maxhoffmann/6cbb9322be8891d5cb04845bb375f671 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const most = require('most'); | |
const stream = most.just(Array(170000)); | |
const dest = []; | |
stream.forEach(bigArray => | |
dest.push.apply(dest, bigArray) | |
); | |
console.log(dest); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setTimeout(function(){ | |
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
// shim for using process in browser | |
var process = module.exports = {}; | |
process.nextTick = (function () { | |
var canSetImmediate = typeof window !== 'undefined' | |
&& window.setImmediate; | |
var canMutationObserver = typeof window !== 'undefined' | |
&& window.MutationObserver; | |
var canPost = typeof window !== 'undefined' | |
&& window.postMessage && window.addEventListener | |
; | |
if (canSetImmediate) { | |
return function (f) { return window.setImmediate(f) }; | |
} | |
var queue = []; | |
if (canMutationObserver) { | |
var hiddenDiv = document.createElement("div"); | |
var observer = new MutationObserver(function () { | |
var queueList = queue.slice(); | |
queue.length = 0; | |
queueList.forEach(function (fn) { | |
fn(); | |
}); | |
}); | |
observer.observe(hiddenDiv, { attributes: true }); | |
return function nextTick(fn) { | |
if (!queue.length) { | |
hiddenDiv.setAttribute('yes', 'no'); | |
} | |
queue.push(fn); | |
}; | |
} | |
if (canPost) { | |
window.addEventListener('message', function (ev) { | |
var source = ev.source; | |
if ((source === window || source === null) && ev.data === 'process-tick') { | |
ev.stopPropagation(); | |
if (queue.length > 0) { | |
var fn = queue.shift(); | |
fn(); | |
} | |
} | |
}, true); | |
return function nextTick(fn) { | |
queue.push(fn); | |
window.postMessage('process-tick', '*'); | |
}; | |
} | |
return function nextTick(fn) { | |
setTimeout(fn, 0); | |
}; | |
})(); | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
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'); | |
}; | |
// TODO(shtylman) | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
},{}],2:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = LinkedList; | |
/** | |
* Doubly linked list | |
* @constructor | |
*/ | |
function LinkedList() { | |
this.head = null; | |
this.length = 0; | |
} | |
/** | |
* Add a node to the end of the list | |
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add | |
*/ | |
LinkedList.prototype.add = function(x) { | |
if(this.head !== null) { | |
this.head.prev = x; | |
x.next = this.head; | |
} | |
this.head = x; | |
++this.length; | |
}; | |
/** | |
* Remove the provided node from the list | |
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove | |
*/ | |
LinkedList.prototype.remove = function(x) { | |
--this.length; | |
if(x === this.head) { | |
this.head = this.head.next; | |
} | |
if(x.next !== null) { | |
x.next.prev = x.prev; | |
x.next = null; | |
} | |
if(x.prev !== null) { | |
x.prev.next = x.next; | |
x.prev = null; | |
} | |
}; | |
/** | |
* @returns {boolean} true iff there are no nodes in the list | |
*/ | |
LinkedList.prototype.isEmpty = function() { | |
return this.length === 0; | |
}; | |
/** | |
* Dispose all nodes | |
* @returns {Promise} promise that fulfills when all nodes have been disposed, | |
* or rejects if an error occurs while disposing | |
*/ | |
LinkedList.prototype.dispose = function() { | |
if(this.isEmpty()) { | |
return Promise.resolve(); | |
} | |
var promises = []; | |
var x = this.head; | |
this.head = null; | |
this.length = 0; | |
while(x !== null) { | |
promises.push(x.dispose()); | |
x = x.next; | |
} | |
return Promise.all(promises); | |
}; | |
},{}],3:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.isPromise = isPromise; | |
function isPromise(p) { | |
return p !== null && typeof p === 'object' && typeof p.then === 'function'; | |
} | |
},{}],4:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
// Based on https://github.com/petkaantonov/deque | |
module.exports = Queue; | |
function Queue(capPow2) { | |
this._capacity = capPow2||32; | |
this._length = 0; | |
this._head = 0; | |
} | |
Queue.prototype.push = function (x) { | |
var len = this._length; | |
this._checkCapacity(len + 1); | |
var i = (this._head + len) & (this._capacity - 1); | |
this[i] = x; | |
this._length = len + 1; | |
}; | |
Queue.prototype.shift = function () { | |
var head = this._head; | |
var x = this[head]; | |
this[head] = void 0; | |
this._head = (head + 1) & (this._capacity - 1); | |
this._length--; | |
return x; | |
}; | |
Queue.prototype.isEmpty = function() { | |
return this._length === 0; | |
}; | |
Queue.prototype.length = function () { | |
return this._length; | |
}; | |
Queue.prototype._checkCapacity = function (size) { | |
if (this._capacity < size) { | |
this._ensureCapacity(this._capacity << 1); | |
} | |
}; | |
Queue.prototype._ensureCapacity = function (capacity) { | |
var oldCapacity = this._capacity; | |
this._capacity = capacity; | |
var last = this._head + this._length; | |
if (last > oldCapacity) { | |
copy(this, 0, this, oldCapacity, last & (oldCapacity - 1)); | |
} | |
}; | |
function copy(src, srcIndex, dst, dstIndex, len) { | |
for (var j = 0; j < len; ++j) { | |
dst[j + dstIndex] = src[j + srcIndex]; | |
src[j + srcIndex] = void 0; | |
} | |
} | |
},{}],5:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Stream; | |
function Stream(source) { | |
this.source = source; | |
} | |
},{}],6:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var runSource = require('../runSource'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.scan = scan; | |
exports.reduce = reduce; | |
/** | |
* Create a stream containing successive reduce results of applying f to | |
* the previous reduce result and the current stream item. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @param {Stream} stream stream to scan | |
* @returns {Stream} new stream containing successive reduce results | |
*/ | |
function scan(f, initial, stream) { | |
return new Stream(new Scan(f, initial, stream.source)); | |
} | |
function Scan(f, z, source) { | |
this.source = source; | |
this.f = f; | |
this.value = z; | |
} | |
Scan.prototype.run = function(sink, scheduler) { | |
var d1 = scheduler.asap(PropagateTask.event(this.value, sink)); | |
var d2 = this.source.run(new ScanSink(this.f, this.value, sink), scheduler); | |
return dispose.all([d1, d2]); | |
}; | |
function ScanSink(f, z, sink) { | |
this.f = f; | |
this.value = z; | |
this.sink = sink; | |
} | |
ScanSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.value = f(this.value, x); | |
this.sink.event(t, this.value); | |
}; | |
ScanSink.prototype.error = Pipe.prototype.error; | |
ScanSink.prototype.end = Pipe.prototype.end; | |
/** | |
* Reduce a stream to produce a single result. Note that reducing an infinite | |
* stream will return a Promise that never fulfills, but that may reject if an error | |
* occurs. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @param {Stream} stream to reduce | |
* @returns {Promise} promise for the file result of the reduce | |
*/ | |
function reduce(f, initial, stream) { | |
return runSource.withDefaultScheduler(noop, new Reduce(f, initial, stream.source)); | |
} | |
function Reduce(f, z, source) { | |
this.source = source; | |
this.f = f; | |
this.value = z; | |
} | |
Reduce.prototype.run = function(sink, scheduler) { | |
return this.source.run(new ReduceSink(this.f, this.value, sink), scheduler); | |
}; | |
function ReduceSink(f, z, sink) { | |
this.f = f; | |
this.value = z; | |
this.sink = sink; | |
} | |
ReduceSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.value = f(this.value, x); | |
this.sink.event(t, this.value); | |
}; | |
ReduceSink.prototype.error = Pipe.prototype.error; | |
ReduceSink.prototype.end = function(t) { | |
this.sink.end(t, this.value); | |
}; | |
function noop() {} | |
},{"../Stream":5,"../disposable/dispose":34,"../runSource":44,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],7:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var combine = require('./combine').combine; | |
var apply = require('@most/prelude').apply; | |
exports.ap = ap; | |
/** | |
* Assume fs is a stream containing functions, and apply the latest function | |
* in fs to the latest value in xs. | |
* fs: --f---------g--------h------> | |
* xs: -a-------b-------c-------d--> | |
* ap(fs, xs): --fa-----fb-gb---gc--hc--hd-> | |
* @param {Stream} fs stream of functions to apply to the latest x | |
* @param {Stream} xs stream of values to which to apply all the latest f | |
* @returns {Stream} stream containing all the applications of fs to xs | |
*/ | |
function ap(fs, xs) { | |
return combine(apply, fs, xs); | |
} | |
},{"./combine":9,"@most/prelude":69}],8:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var streamOf = require('../source/core').of; | |
var continueWith = require('./continueWith').continueWith; | |
exports.concat = concat; | |
exports.cycle = cycle; | |
exports.cons = cons; | |
/** | |
* @param {*} x value to prepend | |
* @param {Stream} stream | |
* @returns {Stream} new stream with x prepended | |
*/ | |
function cons(x, stream) { | |
return concat(streamOf(x), stream); | |
} | |
/** | |
* @param {Stream} left | |
* @param {Stream} right | |
* @returns {Stream} new stream containing all events in left followed by all | |
* events in right. This *timeshifts* right to the end of left. | |
*/ | |
function concat(left, right) { | |
return continueWith(function() { | |
return right; | |
}, left); | |
} | |
/** | |
* @deprecated | |
* Tie stream into a circle, creating an infinite stream | |
* @param {Stream} stream | |
* @returns {Stream} new infinite stream | |
*/ | |
function cycle(stream) { | |
return continueWith(function cycleNext() { | |
return cycle(stream); | |
}, stream); | |
} | |
},{"../source/core":57,"./continueWith":11}],9:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var transform = require('./transform'); | |
var core = require('../source/core'); | |
var Pipe = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var dispose = require('../disposable/dispose'); | |
var base = require('@most/prelude'); | |
var invoke = require('../invoke'); | |
var map = base.map; | |
var tail = base.tail; | |
exports.combineArray = combineArray; | |
exports.combine = combine; | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
function combine(f /*, ...streams */) { | |
return combineArray(f, tail(arguments)); | |
} | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @param {[Stream]} streams most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
function combineArray(f, streams) { | |
var l = streams.length; | |
return l === 0 ? core.empty() | |
: l === 1 ? transform.map(f, streams[0]) | |
: new Stream(combineSources(f, streams)); | |
} | |
function combineSources(f, streams) { | |
return new Combine(f, map(getSource, streams)) | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Combine(f, sources) { | |
this.f = f; | |
this.sources = sources; | |
} | |
Combine.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l); | |
var sinks = new Array(l); | |
var mergeSink = new CombineSink(disposables, sinks, sink, this.f); | |
for(var indexSink, i=0; i<l; ++i) { | |
indexSink = sinks[i] = new IndexSink(i, mergeSink); | |
disposables[i] = this.sources[i].run(indexSink, scheduler); | |
} | |
return dispose.all(disposables); | |
}; | |
function CombineSink(disposables, sinks, sink, f) { | |
this.sink = sink; | |
this.disposables = disposables; | |
this.sinks = sinks; | |
this.f = f; | |
var l = sinks.length; | |
this.awaiting = l; | |
this.values = new Array(l); | |
this.hasValue = new Array(l); | |
for(var i = 0; i < l; ++i) { | |
this.hasValue[i] = false; | |
} | |
this.activeCount = sinks.length; | |
} | |
CombineSink.prototype.error = Pipe.prototype.error; | |
CombineSink.prototype.event = function(t, indexedValue) { | |
var i = indexedValue.index; | |
var awaiting = this._updateReady(i); | |
this.values[i] = indexedValue.value; | |
if(awaiting === 0) { | |
this.sink.event(t, invoke(this.f, this.values)); | |
} | |
}; | |
CombineSink.prototype._updateReady = function(index) { | |
if(this.awaiting > 0) { | |
if(!this.hasValue[index]) { | |
this.hasValue[index] = true | |
this.awaiting -= 1 | |
} | |
} | |
return this.awaiting; | |
} | |
CombineSink.prototype.end = function(t, indexedValue) { | |
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink); | |
if(--this.activeCount === 0) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
},{"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"./transform":29,"@most/prelude":69}],10:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var mergeMapConcurrently = require('./mergeConcurrently').mergeMapConcurrently; | |
exports.concatMap = concatMap; | |
/** | |
* Map each value in stream to a new stream, and concatenate them all | |
* stream: -a---b---cX | |
* f(a): 1-1-1-1X | |
* f(b): -2-2-2-2X | |
* f(c): -3-3-3-3X | |
* stream.concatMap(f): -1-1-1-1-2-2-2-2-3-3-3-3X | |
* @param {function(x:*):Stream} f function to map each value to a stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
function concatMap(f, stream) { | |
return mergeMapConcurrently(f, 1, stream); | |
} | |
},{"./mergeConcurrently":19}],11:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var isPromise = require('../Promise').isPromise; | |
exports.continueWith = continueWith; | |
function continueWith(f, stream) { | |
return new Stream(new ContinueWith(f, stream.source)); | |
} | |
function ContinueWith(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
ContinueWith.prototype.run = function(sink, scheduler) { | |
return new ContinueWithSink(this.f, this.source, sink, scheduler); | |
}; | |
function ContinueWithSink(f, source, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
ContinueWithSink.prototype.error = Sink.prototype.error; | |
ContinueWithSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.sink.event(t, x); | |
}; | |
ContinueWithSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
dispose.tryDispose(t, this.disposable, this.sink); | |
this._startNext(t, x, this.sink); | |
}; | |
ContinueWithSink.prototype._startNext = function(t, x, sink) { | |
try { | |
this.disposable = this._continue(this.f, x, sink); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
}; | |
ContinueWithSink.prototype._continue = function(f, x, sink) { | |
return f(x).source.run(sink, this.scheduler); | |
}; | |
ContinueWithSink.prototype.dispose = function() { | |
this.active = false; | |
return this.disposable.dispose(); | |
}; | |
},{"../Promise":3,"../Stream":5,"../disposable/dispose":34,"../sink/Pipe":53}],12:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.delay = delay; | |
/** | |
* @param {Number} delayTime milliseconds to delay each item | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing the same items, but delayed by ms | |
*/ | |
function delay(delayTime, stream) { | |
return delayTime <= 0 ? stream | |
: new Stream(new Delay(delayTime, stream.source)); | |
} | |
function Delay(dt, source) { | |
this.dt = dt; | |
this.source = source; | |
} | |
Delay.prototype.run = function(sink, scheduler) { | |
var delaySink = new DelaySink(this.dt, sink, scheduler); | |
return dispose.all([delaySink, this.source.run(delaySink, scheduler)]); | |
}; | |
function DelaySink(dt, sink, scheduler) { | |
this.dt = dt; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
} | |
DelaySink.prototype.dispose = function() { | |
var self = this; | |
this.scheduler.cancelAll(function(task) { | |
return task.sink === self.sink; | |
}); | |
}; | |
DelaySink.prototype.event = function(t, x) { | |
this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink)); | |
}; | |
DelaySink.prototype.end = function(t, x) { | |
this.scheduler.delay(this.dt, PropagateTask.end(x, this.sink)); | |
}; | |
DelaySink.prototype.error = Sink.prototype.error; | |
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],13:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var SafeSink = require('../sink/SafeSink'); | |
var Pipe = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var tryEvent = require('../source/tryEvent'); | |
var isPromise = require('../Promise').isPromise; | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.flatMapError = recoverWith; | |
exports.recoverWith = recoverWith; | |
exports.throwError = throwError; | |
/** | |
* If stream encounters an error, recover and continue with items from stream | |
* returned by f. | |
* @param {function(error:*):Stream} f function which returns a new stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream which will recover from an error by calling f | |
*/ | |
function recoverWith(f, stream) { | |
return new Stream(new RecoverWith(f, stream.source)); | |
} | |
/** | |
* Create a stream containing only an error | |
* @param {*} e error value, preferably an Error or Error subtype | |
* @returns {Stream} new stream containing only an error | |
*/ | |
function throwError(e) { | |
return new Stream(new ErrorSource(e)); | |
} | |
function ErrorSource(e) { | |
this.value = e; | |
} | |
ErrorSource.prototype.run = function(sink, scheduler) { | |
return scheduler.asap(new PropagateTask(runError, this.value, sink)); | |
}; | |
function runError(t, e, sink) { | |
sink.error(t, e); | |
} | |
function RecoverWith(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
RecoverWith.prototype.run = function(sink, scheduler) { | |
return new RecoverWithSink(this.f, this.source, sink, scheduler); | |
}; | |
function RecoverWithSink(f, source, sink, scheduler) { | |
this.f = f; | |
this.sink = new SafeSink(sink); | |
this.scheduler = scheduler; | |
this.disposable = source.run(this, scheduler); | |
} | |
RecoverWithSink.prototype.event = function(t, x) { | |
tryEvent.tryEvent(t, x, this.sink); | |
} | |
RecoverWithSink.prototype.end = function(t, x) { | |
tryEvent.tryEnd(t, x, this.sink); | |
} | |
RecoverWithSink.prototype.error = function(t, e) { | |
var nextSink = this.sink.disable(); | |
dispose.tryDispose(t, this.disposable, this.sink); | |
this._startNext(t, e, nextSink); | |
}; | |
RecoverWithSink.prototype._startNext = function(t, x, sink) { | |
try { | |
this.disposable = this._continue(this.f, x, sink); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
}; | |
RecoverWithSink.prototype._continue = function(f, x, sink) { | |
var stream = f(x); | |
return stream.source.run(sink, this.scheduler); | |
}; | |
RecoverWithSink.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
},{"../Promise":3,"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"../sink/Pipe":53,"../sink/SafeSink":54,"../source/tryEvent":66}],14:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var Filter = require('../fusion/Filter'); | |
exports.filter = filter; | |
exports.skipRepeats = skipRepeats; | |
exports.skipRepeatsWith = skipRepeatsWith; | |
/** | |
* Retain only items matching a predicate | |
* @param {function(x:*):boolean} p filtering predicate called for each item | |
* @param {Stream} stream stream to filter | |
* @returns {Stream} stream containing only items for which predicate returns truthy | |
*/ | |
function filter(p, stream) { | |
return new Stream(Filter.create(p, stream.source)); | |
} | |
/** | |
* Skip repeated events, using === to detect duplicates | |
* @param {Stream} stream stream from which to omit repeated events | |
* @returns {Stream} stream without repeated events | |
*/ | |
function skipRepeats(stream) { | |
return skipRepeatsWith(same, stream); | |
} | |
/** | |
* Skip repeated events using the provided equals function to detect duplicates | |
* @param {function(a:*, b:*):boolean} equals optional function to compare items | |
* @param {Stream} stream stream from which to omit repeated events | |
* @returns {Stream} stream without repeated events | |
*/ | |
function skipRepeatsWith(equals, stream) { | |
return new Stream(new SkipRepeats(equals, stream.source)); | |
} | |
function SkipRepeats(equals, source) { | |
this.equals = equals; | |
this.source = source; | |
} | |
SkipRepeats.prototype.run = function(sink, scheduler) { | |
return this.source.run(new SkipRepeatsSink(this.equals, sink), scheduler); | |
}; | |
function SkipRepeatsSink(equals, sink) { | |
this.equals = equals; | |
this.sink = sink; | |
this.value = void 0; | |
this.init = true; | |
} | |
SkipRepeatsSink.prototype.end = Sink.prototype.end; | |
SkipRepeatsSink.prototype.error = Sink.prototype.error; | |
SkipRepeatsSink.prototype.event = function(t, x) { | |
if(this.init) { | |
this.init = false; | |
this.value = x; | |
this.sink.event(t, x); | |
} else if(!this.equals(this.value, x)) { | |
this.value = x; | |
this.sink.event(t, x); | |
} | |
}; | |
function same(a, b) { | |
return a === b; | |
} | |
},{"../Stream":5,"../fusion/Filter":36,"../sink/Pipe":53}],15:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently; | |
var mergeMapConcurrently = require('./mergeConcurrently').mergeMapConcurrently; | |
exports.flatMap = flatMap; | |
exports.join = join; | |
/** | |
* Map each value in the stream to a new stream, and merge it into the | |
* returned outer stream. Event arrival times are preserved. | |
* @param {function(x:*):Stream} f chaining function, must return a Stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
function flatMap(f, stream) { | |
return mergeMapConcurrently(f, Infinity, stream); | |
} | |
/** | |
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer. Event arrival times are preserved. | |
* @param {Stream<Stream<X>>} stream stream of streams | |
* @returns {Stream<X>} new stream containing all events of all inner streams | |
*/ | |
function join(stream) { | |
return mergeConcurrently(Infinity, stream); | |
} | |
},{"./mergeConcurrently":19}],16:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
var Map = require('../fusion/Map'); | |
exports.throttle = throttle; | |
exports.debounce = debounce; | |
/** | |
* Limit the rate of events by suppressing events that occur too often | |
* @param {Number} period time to suppress events | |
* @param {Stream} stream | |
* @returns {Stream} | |
*/ | |
function throttle(period, stream) { | |
return new Stream(throttleSource(period, stream.source)); | |
} | |
function throttleSource(period, source) { | |
return source instanceof Map ? commuteMapThrottle(period, source) | |
: source instanceof Throttle ? fuseThrottle(period, source) | |
: new Throttle(period, source) | |
} | |
function commuteMapThrottle(period, source) { | |
return Map.create(source.f, throttleSource(period, source.source)) | |
} | |
function fuseThrottle(period, source) { | |
return new Throttle(Math.max(period, source.period), source.source) | |
} | |
function Throttle(period, source) { | |
this.period = period; | |
this.source = source; | |
} | |
Throttle.prototype.run = function(sink, scheduler) { | |
return this.source.run(new ThrottleSink(this.period, sink), scheduler); | |
}; | |
function ThrottleSink(period, sink) { | |
this.time = 0; | |
this.period = period; | |
this.sink = sink; | |
} | |
ThrottleSink.prototype.event = function(t, x) { | |
if(t >= this.time) { | |
this.time = t + this.period; | |
this.sink.event(t, x); | |
} | |
}; | |
ThrottleSink.prototype.end = Sink.prototype.end; | |
ThrottleSink.prototype.error = Sink.prototype.error; | |
/** | |
* Wait for a burst of events to subside and emit only the last event in the burst | |
* @param {Number} period events occuring more frequently than this | |
* will be suppressed | |
* @param {Stream} stream stream to debounce | |
* @returns {Stream} new debounced stream | |
*/ | |
function debounce(period, stream) { | |
return new Stream(new Debounce(period, stream.source)); | |
} | |
function Debounce(dt, source) { | |
this.dt = dt; | |
this.source = source; | |
} | |
Debounce.prototype.run = function(sink, scheduler) { | |
return new DebounceSink(this.dt, this.source, sink, scheduler); | |
}; | |
function DebounceSink(dt, source, sink, scheduler) { | |
this.dt = dt; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.value = void 0; | |
this.timer = null; | |
var sourceDisposable = source.run(this, scheduler); | |
this.disposable = dispose.all([this, sourceDisposable]); | |
} | |
DebounceSink.prototype.event = function(t, x) { | |
this._clearTimer(); | |
this.value = x; | |
this.timer = this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink)); | |
}; | |
DebounceSink.prototype.end = function(t, x) { | |
if(this._clearTimer()) { | |
this.sink.event(t, this.value); | |
this.value = void 0; | |
} | |
this.sink.end(t, x); | |
}; | |
DebounceSink.prototype.error = function(t, x) { | |
this._clearTimer(); | |
this.sink.error(t, x); | |
}; | |
DebounceSink.prototype.dispose = function() { | |
this._clearTimer(); | |
}; | |
DebounceSink.prototype._clearTimer = function() { | |
if(this.timer === null) { | |
return false; | |
} | |
this.timer.dispose(); | |
this.timer = null; | |
return true; | |
}; | |
},{"../Stream":5,"../disposable/dispose":34,"../fusion/Map":38,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],17:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
exports.loop = loop; | |
/** | |
* Generalized feedback loop. Call a stepper function for each event. The stepper | |
* will be called with 2 params: the current seed and the an event value. It must | |
* return a new { seed, value } pair. The `seed` will be fed back into the next | |
* invocation of stepper, and the `value` will be propagated as the event value. | |
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function | |
* @param {*} seed initial seed value passed to first stepper call | |
* @param {Stream} stream event stream | |
* @returns {Stream} new stream whose values are the `value` field of the objects | |
* returned by the stepper | |
*/ | |
function loop(stepper, seed, stream) { | |
return new Stream(new Loop(stepper, seed, stream.source)); | |
} | |
function Loop(stepper, seed, source) { | |
this.step = stepper; | |
this.seed = seed; | |
this.source = source; | |
} | |
Loop.prototype.run = function(sink, scheduler) { | |
return this.source.run(new LoopSink(this.step, this.seed, sink), scheduler); | |
}; | |
function LoopSink(stepper, seed, sink) { | |
this.step = stepper; | |
this.seed = seed; | |
this.sink = sink; | |
} | |
LoopSink.prototype.error = Pipe.prototype.error; | |
LoopSink.prototype.event = function(t, x) { | |
var result = this.step(this.seed, x); | |
this.seed = result.seed; | |
this.sink.event(t, result.value); | |
}; | |
LoopSink.prototype.end = function(t) { | |
this.sink.end(t, this.seed); | |
}; | |
},{"../Stream":5,"../sink/Pipe":53}],18:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var empty = require('../source/core').empty; | |
var dispose = require('../disposable/dispose'); | |
var base = require('@most/prelude'); | |
var copy = base.copy; | |
var reduce = base.reduce; | |
exports.merge = merge; | |
exports.mergeArray = mergeArray; | |
/** | |
* @returns {Stream} stream containing events from all streams in the argument | |
* list in time order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
function merge(/*...streams*/) { | |
return mergeArray(copy(arguments)); | |
} | |
/** | |
* @param {Array} streams array of stream to merge | |
* @returns {Stream} stream containing events from all input observables | |
* in time order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
function mergeArray(streams) { | |
var l = streams.length; | |
return l === 0 ? empty() | |
: l === 1 ? streams[0] | |
: new Stream(mergeSources(streams)); | |
} | |
/** | |
* This implements fusion/flattening for merge. It will | |
* fuse adjacent merge operations. For example: | |
* - a.merge(b).merge(c) effectively becomes merge(a, b, c) | |
* - merge(a, merge(b, c)) effectively becomes merge(a, b, c) | |
* It does this by concatenating the sources arrays of | |
* any nested Merge sources, in effect "flattening" nested | |
* merge operations into a single merge. | |
*/ | |
function mergeSources(streams) { | |
return new Merge(reduce(appendSources, [], streams)) | |
} | |
function appendSources(sources, stream) { | |
var source = stream.source; | |
return source instanceof Merge | |
? sources.concat(source.sources) | |
: sources.concat(source) | |
} | |
function Merge(sources) { | |
this.sources = sources; | |
} | |
Merge.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l); | |
var sinks = new Array(l); | |
var mergeSink = new MergeSink(disposables, sinks, sink); | |
for(var indexSink, i=0; i<l; ++i) { | |
indexSink = sinks[i] = new IndexSink(i, mergeSink); | |
disposables[i] = this.sources[i].run(indexSink, scheduler); | |
} | |
return dispose.all(disposables); | |
}; | |
function MergeSink(disposables, sinks, sink) { | |
this.sink = sink; | |
this.disposables = disposables; | |
this.activeCount = sinks.length; | |
} | |
MergeSink.prototype.error = Pipe.prototype.error; | |
MergeSink.prototype.event = function(t, indexValue) { | |
this.sink.event(t, indexValue.value); | |
}; | |
MergeSink.prototype.end = function(t, indexedValue) { | |
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink); | |
if(--this.activeCount === 0) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
},{"../Stream":5,"../disposable/dispose":34,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"@most/prelude":69}],19:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
var LinkedList = require('../LinkedList'); | |
var identity = require('@most/prelude').id; | |
exports.mergeConcurrently = mergeConcurrently; | |
exports.mergeMapConcurrently = mergeMapConcurrently; | |
function mergeConcurrently(concurrency, stream) { | |
return mergeMapConcurrently(identity, concurrency, stream); | |
} | |
function mergeMapConcurrently(f, concurrency, stream) { | |
return new Stream(new MergeConcurrently(f, concurrency, stream.source)); | |
} | |
function MergeConcurrently(f, concurrency, source) { | |
this.f = f; | |
this.concurrency = concurrency; | |
this.source = source; | |
} | |
MergeConcurrently.prototype.run = function(sink, scheduler) { | |
return new Outer(this.f, this.concurrency, this.source, sink, scheduler); | |
}; | |
function Outer(f, concurrency, source, sink, scheduler) { | |
this.f = f; | |
this.concurrency = concurrency; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.pending = []; | |
this.current = new LinkedList(); | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
this.active = true; | |
} | |
Outer.prototype.event = function(t, x) { | |
this._addInner(t, x); | |
}; | |
Outer.prototype._addInner = function(t, x) { | |
if(this.current.length < this.concurrency) { | |
this._startInner(t, x); | |
} else { | |
this.pending.push(x); | |
} | |
}; | |
Outer.prototype._startInner = function(t, x) { | |
try { | |
this._initInner(t, x); | |
} catch(e) { | |
this.error(t, e); | |
} | |
}; | |
Outer.prototype._initInner = function(t, x) { | |
var innerSink = new Inner(t, this, this.sink); | |
innerSink.disposable = mapAndRun(this.f, x, innerSink, this.scheduler); | |
this.current.add(innerSink); | |
} | |
function mapAndRun(f, x, sink, scheduler) { | |
return f(x).source.run(sink, scheduler); | |
} | |
Outer.prototype.end = function(t, x) { | |
this.active = false; | |
dispose.tryDispose(t, this.disposable, this.sink); | |
this._checkEnd(t, x); | |
}; | |
Outer.prototype.error = function(t, e) { | |
this.active = false; | |
this.sink.error(t, e); | |
}; | |
Outer.prototype.dispose = function() { | |
this.active = false; | |
this.pending.length = 0; | |
return Promise.all([this.disposable.dispose(), this.current.dispose()]); | |
}; | |
Outer.prototype._endInner = function(t, x, inner) { | |
this.current.remove(inner); | |
dispose.tryDispose(t, inner, this); | |
if(this.pending.length === 0) { | |
this._checkEnd(t, x); | |
} else { | |
this._startInner(t, this.pending.shift()); | |
} | |
}; | |
Outer.prototype._checkEnd = function(t, x) { | |
if(!this.active && this.current.isEmpty()) { | |
this.sink.end(t, x); | |
} | |
}; | |
function Inner(time, outer, sink) { | |
this.prev = this.next = null; | |
this.time = time; | |
this.outer = outer; | |
this.sink = sink; | |
this.disposable = void 0; | |
} | |
Inner.prototype.event = function(t, x) { | |
this.sink.event(Math.max(t, this.time), x); | |
}; | |
Inner.prototype.end = function(t, x) { | |
this.outer._endInner(Math.max(t, this.time), x, this); | |
}; | |
Inner.prototype.error = function(t, e) { | |
this.outer.error(Math.max(t, this.time), e); | |
}; | |
Inner.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
},{"../LinkedList":2,"../Stream":5,"../disposable/dispose":34,"@most/prelude":69}],20:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var runSource = require('../runSource'); | |
exports.observe = observe; | |
exports.drain = drain; | |
/** | |
* Observe all the event values in the stream in time order. The | |
* provided function `f` will be called for each event value | |
* @param {function(x:T):*} f function to call with each event value | |
* @param {Stream<T>} stream stream to observe | |
* @return {Promise} promise that fulfills after the stream ends without | |
* an error, or rejects if the stream ends with an error. | |
*/ | |
function observe(f, stream) { | |
return runSource.withDefaultScheduler(f, stream.source); | |
} | |
/** | |
* "Run" a stream by | |
* @param stream | |
* @return {*} | |
*/ | |
function drain(stream) { | |
return runSource.withDefaultScheduler(noop, stream.source); | |
} | |
function noop() {} | |
},{"../runSource":44}],21:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var fatal = require('../fatalError'); | |
var just = require('../source/core').of; | |
exports.fromPromise = fromPromise; | |
exports.awaitPromises = awaitPromises; | |
/** | |
* Create a stream containing only the promise's fulfillment | |
* value at the time it fulfills. | |
* @param {Promise<T>} p promise | |
* @return {Stream<T>} stream containing promise's fulfillment value. | |
* If the promise rejects, the stream will error | |
*/ | |
function fromPromise(p) { | |
return awaitPromises(just(p)); | |
} | |
/** | |
* Turn a Stream<Promise<T>> into Stream<T> by awaiting each promise. | |
* Event order is preserved. | |
* @param {Stream<Promise<T>>} stream | |
* @return {Stream<T>} stream of fulfillment values. The stream will | |
* error if any promise rejects. | |
*/ | |
function awaitPromises(stream) { | |
return new Stream(new Await(stream.source)); | |
} | |
function Await(source) { | |
this.source = source; | |
} | |
Await.prototype.run = function(sink, scheduler) { | |
return this.source.run(new AwaitSink(sink, scheduler), scheduler); | |
}; | |
function AwaitSink(sink, scheduler) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.queue = Promise.resolve(); | |
var self = this; | |
// Pre-create closures, to avoid creating them per event | |
this._eventBound = function(x) { | |
self.sink.event(self.scheduler.now(), x); | |
}; | |
this._endBound = function(x) { | |
self.sink.end(self.scheduler.now(), x); | |
}; | |
this._errorBound = function(e) { | |
self.sink.error(self.scheduler.now(), e); | |
}; | |
} | |
AwaitSink.prototype.event = function(t, promise) { | |
var self = this; | |
this.queue = this.queue.then(function() { | |
return self._event(promise); | |
}).catch(this._errorBound); | |
}; | |
AwaitSink.prototype.end = function(t, x) { | |
var self = this; | |
this.queue = this.queue.then(function() { | |
return self._end(x); | |
}).catch(this._errorBound); | |
}; | |
AwaitSink.prototype.error = function(t, e) { | |
var self = this; | |
// Don't resolve error values, propagate directly | |
this.queue = this.queue.then(function() { | |
return self._errorBound(e); | |
}).catch(fatal); | |
}; | |
AwaitSink.prototype._event = function(promise) { | |
return promise.then(this._eventBound); | |
}; | |
AwaitSink.prototype._end = function(x) { | |
return Promise.resolve(x).then(this._endBound); | |
}; | |
},{"../Stream":5,"../fatalError":35,"../source/core":57}],22:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var base = require('@most/prelude'); | |
var invoke = require('../invoke'); | |
exports.sample = sample; | |
exports.sampleWith = sampleWith; | |
exports.sampleArray = sampleArray; | |
/** | |
* When an event arrives on sampler, emit the result of calling f with the latest | |
* values of all streams being sampled | |
* @param {function(...values):*} f function to apply to each set of sampled values | |
* @param {Stream} sampler streams will be sampled whenever an event arrives | |
* on sampler | |
* @returns {Stream} stream of sampled and transformed values | |
*/ | |
function sample(f, sampler /*, ...streams */) { | |
return sampleArray(f, sampler, base.drop(2, arguments)); | |
} | |
/** | |
* When an event arrives on sampler, emit the latest event value from stream. | |
* @param {Stream} sampler stream of events at whose arrival time | |
* stream's latest value will be propagated | |
* @param {Stream} stream stream of values | |
* @returns {Stream} sampled stream of values | |
*/ | |
function sampleWith(sampler, stream) { | |
return new Stream(new Sampler(base.id, sampler.source, [stream.source])); | |
} | |
function sampleArray(f, sampler, streams) { | |
return new Stream(new Sampler(f, sampler.source, base.map(getSource, streams))); | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Sampler(f, sampler, sources) { | |
this.f = f; | |
this.sampler = sampler; | |
this.sources = sources; | |
} | |
Sampler.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l+1); | |
var sinks = new Array(l); | |
var sampleSink = new SampleSink(this.f, sinks, sink); | |
for(var hold, i=0; i<l; ++i) { | |
hold = sinks[i] = new Hold(sampleSink); | |
disposables[i] = this.sources[i].run(hold, scheduler); | |
} | |
disposables[i] = this.sampler.run(sampleSink, scheduler); | |
return dispose.all(disposables); | |
}; | |
function Hold(sink) { | |
this.sink = sink; | |
this.hasValue = false; | |
} | |
Hold.prototype.event = function(t, x) { | |
this.value = x; | |
this.hasValue = true; | |
this.sink._notify(this); | |
}; | |
Hold.prototype.end = function () {}; | |
Hold.prototype.error = Pipe.prototype.error; | |
function SampleSink(f, sinks, sink) { | |
this.f = f; | |
this.sinks = sinks; | |
this.sink = sink; | |
this.active = false; | |
} | |
SampleSink.prototype._notify = function() { | |
if(!this.active) { | |
this.active = this.sinks.every(hasValue); | |
} | |
}; | |
SampleSink.prototype.event = function(t) { | |
if(this.active) { | |
this.sink.event(t, invoke(this.f, base.map(getValue, this.sinks))); | |
} | |
}; | |
SampleSink.prototype.end = Pipe.prototype.end; | |
SampleSink.prototype.error = Pipe.prototype.error; | |
function hasValue(hold) { | |
return hold.hasValue; | |
} | |
function getValue(hold) { | |
return hold.value; | |
} | |
},{"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/Pipe":53,"@most/prelude":69}],23:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var core = require('../source/core'); | |
var dispose = require('../disposable/dispose'); | |
var Map = require('../fusion/Map'); | |
exports.take = take; | |
exports.skip = skip; | |
exports.slice = slice; | |
exports.takeWhile = takeWhile; | |
exports.skipWhile = skipWhile; | |
/** | |
* @param {number} n | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing only up to the first n items from stream | |
*/ | |
function take(n, stream) { | |
return slice(0, n, stream); | |
} | |
/** | |
* @param {number} n | |
* @param {Stream} stream | |
* @returns {Stream} new stream with the first n items removed | |
*/ | |
function skip(n, stream) { | |
return slice(n, Infinity, stream); | |
} | |
/** | |
* Slice a stream by index. Negative start/end indexes are not supported | |
* @param {number} start | |
* @param {number} end | |
* @param {Stream} stream | |
* @returns {Stream} stream containing items where start <= index < end | |
*/ | |
function slice(start, end, stream) { | |
return end <= start ? core.empty() | |
: new Stream(sliceSource(start, end, stream.source)); | |
} | |
function sliceSource(start, end, source) { | |
return source instanceof Map ? commuteMapSlice(start, end, source) | |
: source instanceof Slice ? fuseSlice(start, end, source) | |
: new Slice(start, end, source); | |
} | |
function commuteMapSlice(start, end, source) { | |
return Map.create(source.f, sliceSource(start, end, source.source)) | |
} | |
function fuseSlice(start, end, source) { | |
start += source.min; | |
end = Math.min(end + source.min, source.max); | |
return new Slice(start, end, source.source); | |
} | |
function Slice(min, max, source) { | |
this.source = source; | |
this.min = min; | |
this.max = max; | |
} | |
Slice.prototype.run = function(sink, scheduler) { | |
return new SliceSink(this.min, this.max - this.min, this.source, sink, scheduler); | |
}; | |
function SliceSink(skip, take, source, sink, scheduler) { | |
this.sink = sink; | |
this.skip = skip; | |
this.take = take; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
SliceSink.prototype.end = Sink.prototype.end; | |
SliceSink.prototype.error = Sink.prototype.error; | |
SliceSink.prototype.event = function(t, x) { | |
if(this.skip > 0) { | |
this.skip -= 1; | |
return; | |
} | |
if(this.take === 0) { | |
return; | |
} | |
this.take -= 1; | |
this.sink.event(t, x); | |
if(this.take === 0) { | |
this.dispose(); | |
this.sink.end(t, x); | |
} | |
}; | |
SliceSink.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function takeWhile(p, stream) { | |
return new Stream(new TakeWhile(p, stream.source)); | |
} | |
function TakeWhile(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
TakeWhile.prototype.run = function(sink, scheduler) { | |
return new TakeWhileSink(this.p, this.source, sink, scheduler); | |
}; | |
function TakeWhileSink(p, source, sink, scheduler) { | |
this.p = p; | |
this.sink = sink; | |
this.active = true; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
TakeWhileSink.prototype.end = Sink.prototype.end; | |
TakeWhileSink.prototype.error = Sink.prototype.error; | |
TakeWhileSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
var p = this.p; | |
this.active = p(x); | |
if(this.active) { | |
this.sink.event(t, x); | |
} else { | |
this.dispose(); | |
this.sink.end(t, x); | |
} | |
}; | |
TakeWhileSink.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function skipWhile(p, stream) { | |
return new Stream(new SkipWhile(p, stream.source)); | |
} | |
function SkipWhile(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
SkipWhile.prototype.run = function(sink, scheduler) { | |
return this.source.run(new SkipWhileSink(this.p, sink), scheduler); | |
}; | |
function SkipWhileSink(p, sink) { | |
this.p = p; | |
this.sink = sink; | |
this.skipping = true; | |
} | |
SkipWhileSink.prototype.end = Sink.prototype.end; | |
SkipWhileSink.prototype.error = Sink.prototype.error; | |
SkipWhileSink.prototype.event = function(t, x) { | |
if(this.skipping) { | |
var p = this.p; | |
this.skipping = p(x); | |
if(this.skipping) { | |
return; | |
} | |
} | |
this.sink.event(t, x); | |
}; | |
},{"../Stream":5,"../disposable/dispose":34,"../fusion/Map":38,"../sink/Pipe":53,"../source/core":57}],24:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
exports.switch = switchLatest; | |
/** | |
* Given a stream of streams, return a new stream that adopts the behavior | |
* of the most recent inner stream. | |
* @param {Stream} stream of streams on which to switch | |
* @returns {Stream} switching stream | |
*/ | |
function switchLatest(stream) { | |
return new Stream(new Switch(stream.source)); | |
} | |
function Switch(source) { | |
this.source = source; | |
} | |
Switch.prototype.run = function(sink, scheduler) { | |
var switchSink = new SwitchSink(sink, scheduler); | |
return dispose.all(switchSink, this.source.run(switchSink, scheduler)); | |
}; | |
function SwitchSink(sink, scheduler) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.current = null; | |
this.ended = false; | |
} | |
SwitchSink.prototype.event = function(t, stream) { | |
this._disposeCurrent(t); // TODO: capture the result of this dispose | |
this.current = new Segment(t, Infinity, this, this.sink); | |
this.current.disposable = stream.source.run(this.current, this.scheduler); | |
}; | |
SwitchSink.prototype.end = function(t, x) { | |
this.ended = true; | |
this._checkEnd(t, x); | |
}; | |
SwitchSink.prototype.error = function(t, e) { | |
this.ended = true; | |
this.sink.error(t, e); | |
}; | |
SwitchSink.prototype.dispose = function() { | |
return this._disposeCurrent(0); | |
}; | |
SwitchSink.prototype._disposeCurrent = function(t) { | |
if(this.current !== null) { | |
return this.current._dispose(t); | |
} | |
}; | |
SwitchSink.prototype._disposeInner = function(t, inner) { | |
inner._dispose(t); // TODO: capture the result of this dispose | |
if(inner === this.current) { | |
this.current = null; | |
} | |
}; | |
SwitchSink.prototype._checkEnd = function(t, x) { | |
if(this.ended && this.current === null) { | |
this.sink.end(t, x); | |
} | |
}; | |
SwitchSink.prototype._endInner = function(t, x, inner) { | |
this._disposeInner(t, inner); | |
this._checkEnd(t, x); | |
}; | |
SwitchSink.prototype._errorInner = function(t, e, inner) { | |
this._disposeInner(t, inner); | |
this.sink.error(t, e); | |
}; | |
function Segment(min, max, outer, sink) { | |
this.min = min; | |
this.max = max; | |
this.outer = outer; | |
this.sink = sink; | |
this.disposable = dispose.empty(); | |
} | |
Segment.prototype.event = function(t, x) { | |
if(t < this.max) { | |
this.sink.event(Math.max(t, this.min), x); | |
} | |
}; | |
Segment.prototype.end = function(t, x) { | |
this.outer._endInner(Math.max(t, this.min), x, this); | |
}; | |
Segment.prototype.error = function(t, e) { | |
this.outer._errorInner(Math.max(t, this.min), e, this); | |
}; | |
Segment.prototype._dispose = function(t) { | |
this.max = t; | |
dispose.tryDispose(t, this.disposable, this.sink) | |
}; | |
},{"../Stream":5,"../disposable/dispose":34}],25:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.thru = function thru(f, stream) { | |
return f(stream); | |
} | |
},{}],26:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var join = require('../combinator/flatMap').join; | |
exports.during = during; | |
exports.takeUntil = takeUntil; | |
exports.skipUntil = skipUntil; | |
function takeUntil(signal, stream) { | |
return new Stream(new Until(signal.source, stream.source)); | |
} | |
function skipUntil(signal, stream) { | |
return new Stream(new Since(signal.source, stream.source)); | |
} | |
function during(timeWindow, stream) { | |
return takeUntil(join(timeWindow), skipUntil(timeWindow, stream)); | |
} | |
function Until(maxSignal, source) { | |
this.maxSignal = maxSignal; | |
this.source = source; | |
} | |
Until.prototype.run = function(sink, scheduler) { | |
var min = new Bound(-Infinity, sink); | |
var max = new UpperBound(this.maxSignal, sink, scheduler); | |
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler); | |
return dispose.all([min, max, disposable]); | |
}; | |
function Since(minSignal, source) { | |
this.minSignal = minSignal; | |
this.source = source; | |
} | |
Since.prototype.run = function(sink, scheduler) { | |
var min = new LowerBound(this.minSignal, sink, scheduler); | |
var max = new Bound(Infinity, sink); | |
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler); | |
return dispose.all([min, max, disposable]); | |
}; | |
function Bound(value, sink) { | |
this.value = value; | |
this.sink = sink; | |
} | |
Bound.prototype.error = Pipe.prototype.error; | |
Bound.prototype.event = noop; | |
Bound.prototype.end = noop; | |
Bound.prototype.dispose = noop; | |
function TimeWindowSink(min, max, sink) { | |
this.min = min; | |
this.max = max; | |
this.sink = sink; | |
} | |
TimeWindowSink.prototype.event = function(t, x) { | |
if(t >= this.min.value && t < this.max.value) { | |
this.sink.event(t, x); | |
} | |
}; | |
TimeWindowSink.prototype.error = Pipe.prototype.error; | |
TimeWindowSink.prototype.end = Pipe.prototype.end; | |
function LowerBound(signal, sink, scheduler) { | |
this.value = Infinity; | |
this.sink = sink; | |
this.disposable = signal.run(this, scheduler); | |
} | |
LowerBound.prototype.event = function(t /*, x */) { | |
if(t < this.value) { | |
this.value = t; | |
} | |
}; | |
LowerBound.prototype.end = noop; | |
LowerBound.prototype.error = Pipe.prototype.error; | |
LowerBound.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function UpperBound(signal, sink, scheduler) { | |
this.value = Infinity; | |
this.sink = sink; | |
this.disposable = signal.run(this, scheduler); | |
} | |
UpperBound.prototype.event = function(t, x) { | |
if(t < this.value) { | |
this.value = t; | |
this.sink.end(t, x); | |
} | |
}; | |
UpperBound.prototype.end = noop; | |
UpperBound.prototype.error = Pipe.prototype.error; | |
UpperBound.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function noop() {} | |
},{"../Stream":5,"../combinator/flatMap":15,"../disposable/dispose":34,"../sink/Pipe":53}],27:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
exports.timestamp = timestamp; | |
function timestamp(stream) { | |
return new Stream(new Timestamp(stream.source)); | |
} | |
function Timestamp(source) { | |
this.source = source; | |
} | |
Timestamp.prototype.run = function(sink, scheduler) { | |
return this.source.run(new TimestampSink(sink), scheduler); | |
}; | |
function TimestampSink(sink) { | |
this.sink = sink; | |
} | |
TimestampSink.prototype.end = Sink.prototype.end; | |
TimestampSink.prototype.error = Sink.prototype.error; | |
TimestampSink.prototype.event = function(t, x) { | |
this.sink.event(t, { time: t, value: x }); | |
}; | |
},{"../Stream":5,"../sink/Pipe":53}],28:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.transduce = transduce; | |
/** | |
* Transform a stream by passing its events through a transducer. | |
* @param {function} transducer transducer function | |
* @param {Stream} stream stream whose events will be passed through the | |
* transducer | |
* @return {Stream} stream of events transformed by the transducer | |
*/ | |
function transduce(transducer, stream) { | |
return new Stream(new Transduce(transducer, stream.source)); | |
} | |
function Transduce(transducer, source) { | |
this.transducer = transducer; | |
this.source = source; | |
} | |
Transduce.prototype.run = function(sink, scheduler) { | |
var xf = this.transducer(new Transformer(sink)); | |
return this.source.run(new TransduceSink(getTxHandler(xf), sink), scheduler); | |
}; | |
function TransduceSink(adapter, sink) { | |
this.xf = adapter; | |
this.sink = sink; | |
} | |
TransduceSink.prototype.event = function(t, x) { | |
var next = this.xf.step(t, x); | |
return this.xf.isReduced(next) | |
? this.sink.end(t, this.xf.getResult(next)) | |
: next; | |
}; | |
TransduceSink.prototype.end = function(t, x) { | |
return this.xf.result(x); | |
}; | |
TransduceSink.prototype.error = function(t, e) { | |
return this.sink.error(t, e); | |
}; | |
function Transformer(sink) { | |
this.time = -Infinity; | |
this.sink = sink; | |
} | |
Transformer.prototype['@@transducer/init'] = Transformer.prototype.init = function() {}; | |
Transformer.prototype['@@transducer/step'] = Transformer.prototype.step = function(t, x) { | |
if(!isNaN(t)) { | |
this.time = Math.max(t, this.time); | |
} | |
return this.sink.event(this.time, x); | |
}; | |
Transformer.prototype['@@transducer/result'] = Transformer.prototype.result = function(x) { | |
return this.sink.end(this.time, x); | |
}; | |
/** | |
* Given an object supporting the new or legacy transducer protocol, | |
* create an adapter for it. | |
* @param {object} tx transform | |
* @returns {TxAdapter|LegacyTxAdapter} | |
*/ | |
function getTxHandler(tx) { | |
return typeof tx['@@transducer/step'] === 'function' | |
? new TxAdapter(tx) | |
: new LegacyTxAdapter(tx); | |
} | |
/** | |
* Adapter for new official transducer protocol | |
* @param {object} tx transform | |
* @constructor | |
*/ | |
function TxAdapter(tx) { | |
this.tx = tx; | |
} | |
TxAdapter.prototype.step = function(t, x) { | |
return this.tx['@@transducer/step'](t, x); | |
}; | |
TxAdapter.prototype.result = function(x) { | |
return this.tx['@@transducer/result'](x); | |
}; | |
TxAdapter.prototype.isReduced = function(x) { | |
return x != null && x['@@transducer/reduced']; | |
}; | |
TxAdapter.prototype.getResult = function(x) { | |
return x['@@transducer/value']; | |
}; | |
/** | |
* Adapter for older transducer protocol | |
* @param {object} tx transform | |
* @constructor | |
*/ | |
function LegacyTxAdapter(tx) { | |
this.tx = tx; | |
} | |
LegacyTxAdapter.prototype.step = function(t, x) { | |
return this.tx.step(t, x); | |
}; | |
LegacyTxAdapter.prototype.result = function(x) { | |
return this.tx.result(x); | |
}; | |
LegacyTxAdapter.prototype.isReduced = function(x) { | |
return x != null && x.__transducers_reduced__; | |
}; | |
LegacyTxAdapter.prototype.getResult = function(x) { | |
return x.value; | |
}; | |
},{"../Stream":5}],29:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Map = require('../fusion/Map'); | |
exports.map = map; | |
exports.constant = constant; | |
exports.tap = tap; | |
/** | |
* Transform each value in the stream by applying f to each | |
* @param {function(*):*} f mapping function | |
* @param {Stream} stream stream to map | |
* @returns {Stream} stream containing items transformed by f | |
*/ | |
function map(f, stream) { | |
return new Stream(Map.create(f, stream.source)); | |
} | |
/** | |
* Replace each value in the stream with x | |
* @param {*} x | |
* @param {Stream} stream | |
* @returns {Stream} stream containing items replaced with x | |
*/ | |
function constant(x, stream) { | |
return map(function() { | |
return x; | |
}, stream); | |
} | |
/** | |
* Perform a side effect for each item in the stream | |
* @param {function(x:*):*} f side effect to execute for each item. The | |
* return value will be discarded. | |
* @param {Stream} stream stream to tap | |
* @returns {Stream} new stream containing the same items as this stream | |
*/ | |
function tap(f, stream) { | |
return map(function(x) { | |
f(x); | |
return x; | |
}, stream); | |
} | |
},{"../Stream":5,"../fusion/Map":38}],30:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var transform = require('./transform'); | |
var core = require('../source/core'); | |
var Sink = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var dispose = require('../disposable/dispose'); | |
var base = require('@most/prelude'); | |
var invoke = require('../invoke'); | |
var Queue = require('../Queue'); | |
var map = base.map; | |
var tail = base.tail; | |
exports.zip = zip; | |
exports.zipArray = zipArray; | |
/** | |
* Combine streams pairwise (or tuple-wise) by index by applying f to values | |
* at corresponding indices. The returned stream ends when any of the input | |
* streams ends. | |
* @param {function} f function to combine values | |
* @returns {Stream} new stream with items at corresponding indices combined | |
* using f | |
*/ | |
function zip(f /*,...streams */) { | |
return zipArray(f, tail(arguments)); | |
} | |
/** | |
* Combine streams pairwise (or tuple-wise) by index by applying f to values | |
* at corresponding indices. The returned stream ends when any of the input | |
* streams ends. | |
* @param {function} f function to combine values | |
* @param {[Stream]} streams streams to zip using f | |
* @returns {Stream} new stream with items at corresponding indices combined | |
* using f | |
*/ | |
function zipArray(f, streams) { | |
return streams.length === 0 ? core.empty() | |
: streams.length === 1 ? transform.map(f, streams[0]) | |
: new Stream(new Zip(f, map(getSource, streams))); | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Zip(f, sources) { | |
this.f = f; | |
this.sources = sources; | |
} | |
Zip.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l); | |
var sinks = new Array(l); | |
var buffers = new Array(l); | |
var zipSink = new ZipSink(this.f, buffers, sinks, sink); | |
for(var indexSink, i=0; i<l; ++i) { | |
buffers[i] = new Queue(); | |
indexSink = sinks[i] = new IndexSink(i, zipSink); | |
disposables[i] = this.sources[i].run(indexSink, scheduler); | |
} | |
return dispose.all(disposables); | |
}; | |
function ZipSink(f, buffers, sinks, sink) { | |
this.f = f; | |
this.sinks = sinks; | |
this.sink = sink; | |
this.buffers = buffers; | |
} | |
ZipSink.prototype.event = function(t, indexedValue) { | |
var buffers = this.buffers; | |
var buffer = buffers[indexedValue.index]; | |
buffer.push(indexedValue.value); | |
if(buffer.length() === 1) { | |
if(!ready(this.buffers)) { | |
return; | |
} | |
emitZipped(this.f, t, buffers, this.sink); | |
if (ended(this.buffers, this.sinks)) { | |
this.sink.end(t, void 0); | |
} | |
} | |
}; | |
ZipSink.prototype.end = function(t, indexedValue) { | |
var buffer = this.buffers[indexedValue.index]; | |
if(buffer.isEmpty()) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
ZipSink.prototype.error = Sink.prototype.error; | |
function emitZipped (f, t, buffers, sink) { | |
sink.event(t, invoke(f, map(head, buffers))); | |
} | |
function head(buffer) { | |
return buffer.shift(); | |
} | |
function ended(buffers, sinks) { | |
for(var i=0, l=buffers.length; i<l; ++i) { | |
if(buffers[i].isEmpty() && !sinks[i].active) { | |
return true; | |
} | |
} | |
return false; | |
} | |
function ready(buffers) { | |
for(var i=0, l=buffers.length; i<l; ++i) { | |
if(buffers[i].isEmpty()) { | |
return false; | |
} | |
} | |
return true; | |
} | |
},{"../Queue":4,"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"./transform":29,"@most/prelude":69}],31:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = defer; | |
function defer(task) { | |
return Promise.resolve(task).then(runTask); | |
} | |
function runTask(task) { | |
try { | |
return task.run(); | |
} catch(e) { | |
return task.error(e); | |
} | |
} | |
},{}],32:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Disposable; | |
/** | |
* Create a new Disposable which will dispose its underlying resource. | |
* @param {function} dispose function | |
* @param {*?} data any data to be passed to disposer function | |
* @constructor | |
*/ | |
function Disposable(dispose, data) { | |
this._dispose = dispose; | |
this._data = data; | |
} | |
Disposable.prototype.dispose = function() { | |
return this._dispose(this._data); | |
}; | |
},{}],33:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = SettableDisposable; | |
function SettableDisposable() { | |
this.disposable = void 0; | |
this.disposed = false; | |
this._resolve = void 0; | |
var self = this; | |
this.result = new Promise(function(resolve) { | |
self._resolve = resolve; | |
}); | |
} | |
SettableDisposable.prototype.setDisposable = function(disposable) { | |
if(this.disposable !== void 0) { | |
throw new Error('setDisposable called more than once'); | |
} | |
this.disposable = disposable; | |
if(this.disposed) { | |
this._resolve(disposable.dispose()); | |
} | |
}; | |
SettableDisposable.prototype.dispose = function() { | |
if(this.disposed) { | |
return this.result; | |
} | |
this.disposed = true; | |
if(this.disposable !== void 0) { | |
this.result = this.disposable.dispose(); | |
} | |
return this.result; | |
}; | |
},{}],34:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Disposable = require('./Disposable'); | |
var SettableDisposable = require('./SettableDisposable'); | |
var isPromise = require('../Promise').isPromise; | |
var base = require('@most/prelude'); | |
var map = base.map; | |
var identity = base.id; | |
exports.tryDispose = tryDispose; | |
exports.create = create; | |
exports.once = once; | |
exports.empty = empty; | |
exports.all = all; | |
exports.settable = settable; | |
exports.promised = promised; | |
/** | |
* Call disposable.dispose. If it returns a promise, catch promise | |
* error and forward it through the provided sink. | |
* @param {number} t time | |
* @param {{dispose: function}} disposable | |
* @param {{error: function}} sink | |
* @return {*} result of disposable.dispose | |
*/ | |
function tryDispose(t, disposable, sink) { | |
var result = disposeSafely(disposable); | |
return isPromise(result) | |
? result.catch(function (e) { | |
sink.error(t, e); | |
}) | |
: result; | |
} | |
/** | |
* Create a new Disposable which will dispose its underlying resource | |
* at most once. | |
* @param {function} dispose function | |
* @param {*?} data any data to be passed to disposer function | |
* @return {Disposable} | |
*/ | |
function create(dispose, data) { | |
return once(new Disposable(dispose, data)); | |
} | |
/** | |
* Create a noop disposable. Can be used to satisfy a Disposable | |
* requirement when no actual resource needs to be disposed. | |
* @return {Disposable|exports|module.exports} | |
*/ | |
function empty() { | |
return new Disposable(identity, void 0); | |
} | |
/** | |
* Create a disposable that will dispose all input disposables in parallel. | |
* @param {Array<Disposable>} disposables | |
* @return {Disposable} | |
*/ | |
function all(disposables) { | |
return create(disposeAll, disposables); | |
} | |
function disposeAll(disposables) { | |
return Promise.all(map(disposeSafely, disposables)); | |
} | |
function disposeSafely(disposable) { | |
try { | |
return disposable.dispose(); | |
} catch(e) { | |
return Promise.reject(e); | |
} | |
} | |
/** | |
* Create a disposable from a promise for another disposable | |
* @param {Promise<Disposable>} disposablePromise | |
* @return {Disposable} | |
*/ | |
function promised(disposablePromise) { | |
return create(disposePromise, disposablePromise); | |
} | |
function disposePromise(disposablePromise) { | |
return disposablePromise.then(disposeOne); | |
} | |
function disposeOne(disposable) { | |
return disposable.dispose(); | |
} | |
/** | |
* Create a disposable proxy that allows its underlying disposable to | |
* be set later. | |
* @return {SettableDisposable} | |
*/ | |
function settable() { | |
return new SettableDisposable(); | |
} | |
/** | |
* Wrap an existing disposable (which may not already have been once()d) | |
* so that it will only dispose its underlying resource at most once. | |
* @param {{ dispose: function() }} disposable | |
* @return {Disposable} wrapped disposable | |
*/ | |
function once(disposable) { | |
return new Disposable(disposeMemoized, memoized(disposable)); | |
} | |
function disposeMemoized(memoized) { | |
if(!memoized.disposed) { | |
memoized.disposed = true; | |
memoized.value = disposeSafely(memoized.disposable); | |
memoized.disposable = void 0; | |
} | |
return memoized.value; | |
} | |
function memoized(disposable) { | |
return { disposed: false, disposable: disposable, value: void 0 }; | |
} | |
},{"../Promise":3,"./Disposable":32,"./SettableDisposable":33,"@most/prelude":69}],35:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = fatalError; | |
function fatalError (e) { | |
setTimeout(function() { | |
throw e; | |
}, 0); | |
} | |
},{}],36:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
module.exports = Filter; | |
function Filter(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
/** | |
* Create a filtered source, fusing adjacent filter.filter if possible | |
* @param {function(x:*):boolean} p filtering predicate | |
* @param {{run:function}} source source to filter | |
* @returns {Filter} filtered source | |
*/ | |
Filter.create = function createFilter(p, source) { | |
if (source instanceof Filter) { | |
return new Filter(and(source.p, p), source.source); | |
} | |
return new Filter(p, source); | |
}; | |
Filter.prototype.run = function(sink, scheduler) { | |
return this.source.run(new FilterSink(this.p, sink), scheduler); | |
}; | |
function FilterSink(p, sink) { | |
this.p = p; | |
this.sink = sink; | |
} | |
FilterSink.prototype.end = Pipe.prototype.end; | |
FilterSink.prototype.error = Pipe.prototype.error; | |
FilterSink.prototype.event = function(t, x) { | |
var p = this.p; | |
p(x) && this.sink.event(t, x); | |
}; | |
function and(p, q) { | |
return function(x) { | |
return p(x) && q(x); | |
}; | |
} | |
},{"../sink/Pipe":53}],37:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
module.exports = FilterMap; | |
function FilterMap(p, f, source) { | |
this.p = p; | |
this.f = f; | |
this.source = source; | |
} | |
FilterMap.prototype.run = function(sink, scheduler) { | |
return this.source.run(new FilterMapSink(this.p, this.f, sink), scheduler); | |
}; | |
function FilterMapSink(p, f, sink) { | |
this.p = p; | |
this.f = f; | |
this.sink = sink; | |
} | |
FilterMapSink.prototype.event = function(t, x) { | |
var f = this.f; | |
var p = this.p; | |
p(x) && this.sink.event(t, f(x)); | |
}; | |
FilterMapSink.prototype.end = Pipe.prototype.end; | |
FilterMapSink.prototype.error = Pipe.prototype.error; | |
},{"../sink/Pipe":53}],38:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
var Filter = require('./Filter'); | |
var FilterMap = require('./FilterMap'); | |
var base = require('@most/prelude'); | |
module.exports = Map; | |
function Map(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
/** | |
* Create a mapped source, fusing adjacent map.map, filter.map, | |
* and filter.map.map if possible | |
* @param {function(*):*} f mapping function | |
* @param {{run:function}} source source to map | |
* @returns {Map|FilterMap} mapped source, possibly fused | |
*/ | |
Map.create = function createMap(f, source) { | |
if(source instanceof Map) { | |
return new Map(base.compose(f, source.f), source.source); | |
} | |
if(source instanceof Filter) { | |
return new FilterMap(source.p, f, source.source); | |
} | |
return new Map(f, source); | |
}; | |
Map.prototype.run = function(sink, scheduler) { | |
return this.source.run(new MapSink(this.f, sink), scheduler); | |
}; | |
function MapSink(f, sink) { | |
this.f = f; | |
this.sink = sink; | |
} | |
MapSink.prototype.end = Pipe.prototype.end; | |
MapSink.prototype.error = Pipe.prototype.error; | |
MapSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.sink.event(t, f(x)); | |
}; | |
},{"../sink/Pipe":53,"./Filter":36,"./FilterMap":37,"@most/prelude":69}],39:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = invoke; | |
function invoke(f, args) { | |
/*eslint complexity: [2,7]*/ | |
switch(args.length) { | |
case 0: return f(); | |
case 1: return f(args[0]); | |
case 2: return f(args[0], args[1]); | |
case 3: return f(args[0], args[1], args[2]); | |
case 4: return f(args[0], args[1], args[2], args[3]); | |
case 5: return f(args[0], args[1], args[2], args[3], args[4]); | |
default: | |
return f.apply(void 0, args); | |
} | |
} | |
},{}],40:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.isIterable = isIterable; | |
exports.getIterator = getIterator; | |
exports.makeIterable = makeIterable; | |
/*global Set, Symbol*/ | |
var iteratorSymbol; | |
// Firefox ships a partial implementation using the name @@iterator. | |
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 | |
if (typeof Set === 'function' && typeof new Set()['@@iterator'] === 'function') { | |
iteratorSymbol = '@@iterator'; | |
} else { | |
iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator || | |
'_es6shim_iterator_'; | |
} | |
function isIterable(o) { | |
return typeof o[iteratorSymbol] === 'function'; | |
} | |
function getIterator(o) { | |
return o[iteratorSymbol](); | |
} | |
function makeIterable(f, o) { | |
o[iteratorSymbol] = f; | |
return o; | |
} | |
},{}],41:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
exports.fromObservable = fromObservable; | |
exports.ObservableSource = ObservableSource; | |
exports.SubscriberSink = SubscriberSink; | |
function fromObservable(observable) { | |
return new Stream(new ObservableSource(observable)); | |
} | |
function ObservableSource(observable) { | |
this.observable = observable; | |
} | |
ObservableSource.prototype.run = function(sink, scheduler) { | |
var sub = this.observable.subscribe(new SubscriberSink(sink, scheduler)); | |
if(typeof sub === 'function') { | |
return dispose.create(sub); | |
} else if(sub && typeof sub.unsubscribe === 'function') { | |
return dispose.create(unsubscribe, sub); | |
} | |
throw new TypeError('Observable returned invalid subscription ' + String(sub)); | |
} | |
function SubscriberSink(sink, scheduler) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
} | |
SubscriberSink.prototype.next = function(x) { | |
this.sink.event(this.scheduler.now(), x); | |
} | |
SubscriberSink.prototype.complete = function(x) { | |
this.sink.end(this.scheduler.now(), x); | |
} | |
SubscriberSink.prototype.error = function(e) { | |
this.sink.error(this.scheduler.now(), e); | |
} | |
function unsubscribe(subscription) { | |
return subscription.unsubscribe(); | |
} | |
},{"../Stream":5,"../disposable/dispose":34}],42:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var symbolObservable = require('symbol-observable'); | |
module.exports = getObservable; | |
function getObservable(o) { | |
var obs = null; | |
if(o != null && typeof o === 'object') { | |
var method = o[symbolObservable]; | |
if(typeof method === 'function') { | |
obs = method.call(o); | |
if(obs == null || typeof obs !== 'object') { | |
throw new TypeError('invalid observable ' + obs); | |
} | |
} | |
} | |
return obs; | |
} | |
},{"symbol-observable":70}],43:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var defaultScheduler = require('../scheduler/defaultScheduler'); | |
var dispose = require('../disposable/dispose'); | |
var fatalError = require('../fatalError'); | |
exports.subscribe = subscribe; | |
exports.SubscribeObserver = SubscribeObserver; | |
exports.Subscription = Subscription; | |
function subscribe(subscriber, stream) { | |
if(subscriber == null || typeof subscriber !== 'object') { | |
throw new TypeError('subscriber must be an object'); | |
} | |
var disposable = dispose.settable(); | |
var observer = new SubscribeObserver(fatalError, subscriber, disposable); | |
disposable.setDisposable(stream.source.run(observer, defaultScheduler)); | |
return new Subscription(disposable); | |
} | |
function SubscribeObserver(fatalError, subscriber, disposable) { | |
this.fatalError = fatalError; | |
this.subscriber = subscriber; | |
this.disposable = disposable; | |
} | |
SubscribeObserver.prototype.event = function(t, x) { | |
if(typeof this.subscriber.next === 'function') { | |
this.subscriber.next(x); | |
} | |
}; | |
SubscribeObserver.prototype.end = function(t, x) { | |
var s = this.subscriber; | |
doDispose(this.fatalError, s, s.complete, s.error, this.disposable, x); | |
}; | |
SubscribeObserver.prototype.error = function(t, e) { | |
var s = this.subscriber; | |
doDispose(this.fatalError, s, s.error, s.error, this.disposable, e); | |
}; | |
function Subscription(disposable) { | |
this.disposable = disposable; | |
} | |
Subscription.prototype.unsubscribe = function() { | |
this.disposable.dispose(); | |
} | |
function doDispose(fatal, subscriber, complete, error, disposable, x) { | |
Promise.resolve(disposable.dispose()).then(function () { | |
if(typeof complete === 'function') { | |
complete.call(subscriber, x); | |
} | |
}).catch(function(e) { | |
if(typeof error === 'function') { | |
error.call(subscriber, e); | |
} | |
}).catch(fatal); | |
} | |
},{"../disposable/dispose":34,"../fatalError":35,"../scheduler/defaultScheduler":47}],44:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Observer = require('./sink/Observer'); | |
var dispose = require('./disposable/dispose'); | |
var defaultScheduler = require('./scheduler/defaultScheduler'); | |
exports.withDefaultScheduler = withDefaultScheduler; | |
exports.withScheduler = withScheduler; | |
function withDefaultScheduler(f, source) { | |
return withScheduler(f, source, defaultScheduler); | |
} | |
function withScheduler(f, source, scheduler) { | |
return new Promise(function (resolve, reject) { | |
runSource(f, source, scheduler, resolve, reject); | |
}); | |
} | |
function runSource(f, source, scheduler, resolve, reject) { | |
var disposable = dispose.settable(); | |
var observer = new Observer(f, resolve, reject, disposable); | |
disposable.setDisposable(source.run(observer, scheduler)); | |
} | |
},{"./disposable/dispose":34,"./scheduler/defaultScheduler":47,"./sink/Observer":52}],45:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var fatal = require('../fatalError'); | |
module.exports = PropagateTask; | |
function PropagateTask(run, value, sink) { | |
this._run = run; | |
this.value = value; | |
this.sink = sink; | |
this.active = true; | |
} | |
PropagateTask.event = function(value, sink) { | |
return new PropagateTask(emit, value, sink); | |
}; | |
PropagateTask.end = function(value, sink) { | |
return new PropagateTask(end, value, sink); | |
}; | |
PropagateTask.error = function(value, sink) { | |
return new PropagateTask(error, value, sink); | |
}; | |
PropagateTask.prototype.dispose = function() { | |
this.active = false; | |
}; | |
PropagateTask.prototype.run = function(t) { | |
if(!this.active) { | |
return; | |
} | |
this._run(t, this.value, this.sink); | |
}; | |
PropagateTask.prototype.error = function(t, e) { | |
if(!this.active) { | |
return fatal(e); | |
} | |
this.sink.error(t, e); | |
}; | |
function error(t, e, sink) { | |
sink.error(t, e); | |
} | |
function emit(t, x, sink) { | |
sink.event(t, x); | |
} | |
function end(t, x, sink) { | |
sink.end(t, x); | |
} | |
},{"../fatalError":35}],46:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var base = require('@most/prelude'); | |
module.exports = Scheduler; | |
function ScheduledTask(delay, period, task, scheduler) { | |
this.time = delay; | |
this.period = period; | |
this.task = task; | |
this.scheduler = scheduler; | |
this.active = true; | |
} | |
ScheduledTask.prototype.run = function() { | |
return this.task.run(this.time); | |
}; | |
ScheduledTask.prototype.error = function(e) { | |
return this.task.error(this.time, e); | |
}; | |
ScheduledTask.prototype.dispose = function() { | |
this.scheduler.cancel(this); | |
return this.task.dispose(); | |
}; | |
function runTask(task) { | |
try { | |
return task.run(); | |
} catch(e) { | |
return task.error(e); | |
} | |
} | |
function Scheduler(timer) { | |
this.timer = timer; | |
this._timer = null; | |
this._nextArrival = 0; | |
this._tasks = []; | |
var self = this; | |
this._runReadyTasksBound = function() { | |
self._runReadyTasks(self.now()); | |
}; | |
} | |
Scheduler.prototype.now = function() { | |
return this.timer.now(); | |
}; | |
Scheduler.prototype.asap = function(task) { | |
return this.schedule(0, -1, task); | |
}; | |
Scheduler.prototype.delay = function(delay, task) { | |
return this.schedule(delay, -1, task); | |
}; | |
Scheduler.prototype.periodic = function(period, task) { | |
return this.schedule(0, period, task); | |
}; | |
Scheduler.prototype.schedule = function(delay, period, task) { | |
var now = this.now(); | |
var st = new ScheduledTask(now + Math.max(0, delay), period, task, this); | |
insertByTime(st, this._tasks); | |
this._scheduleNextRun(now); | |
return st; | |
}; | |
Scheduler.prototype.cancel = function(task) { | |
task.active = false; | |
var i = binarySearch(task.time, this._tasks); | |
if(i >= 0 && i < this._tasks.length) { | |
var at = base.findIndex(task, this._tasks[i].events); | |
if(at >= 0) { | |
this._tasks[i].events.splice(at, 1); | |
this._reschedule(); | |
} | |
} | |
}; | |
Scheduler.prototype.cancelAll = function(f) { | |
for(var i=0; i<this._tasks.length; ++i) { | |
removeAllFrom(f, this._tasks[i]); | |
} | |
this._reschedule(); | |
}; | |
function removeAllFrom(f, timeslot) { | |
timeslot.events = base.removeAll(f, timeslot.events); | |
} | |
Scheduler.prototype._reschedule = function() { | |
if(this._tasks.length === 0) { | |
this._unschedule(); | |
} else { | |
this._scheduleNextRun(this.now()); | |
} | |
}; | |
Scheduler.prototype._unschedule = function() { | |
this.timer.clearTimer(this._timer); | |
this._timer = null; | |
}; | |
Scheduler.prototype._scheduleNextRun = function(now) { | |
if(this._tasks.length === 0) { | |
return; | |
} | |
var nextArrival = this._tasks[0].time; | |
if(this._timer === null) { | |
this._scheduleNextArrival(nextArrival, now); | |
} else if(nextArrival < this._nextArrival) { | |
this._unschedule(); | |
this._scheduleNextArrival(nextArrival, now); | |
} | |
}; | |
Scheduler.prototype._scheduleNextArrival = function(nextArrival, now) { | |
this._nextArrival = nextArrival; | |
var delay = Math.max(0, nextArrival - now); | |
this._timer = this.timer.setTimer(this._runReadyTasksBound, delay); | |
}; | |
Scheduler.prototype._runReadyTasks = function(now) { | |
this._timer = null; | |
this._tasks = this._findAndRunTasks(now); | |
this._scheduleNextRun(this.now()); | |
}; | |
Scheduler.prototype._findAndRunTasks = function(now) { | |
var tasks = this._tasks; | |
var l = tasks.length; | |
var i = 0; | |
while(i < l && tasks[i].time <= now) { | |
++i; | |
} | |
this._tasks = tasks.slice(i); | |
// Run all ready tasks | |
for (var j = 0; j < i; ++j) { | |
this._tasks = runTasks(tasks[j], this._tasks); | |
} | |
return this._tasks; | |
}; | |
function runTasks(timeslot, tasks) { | |
var events = timeslot.events; | |
for(var i=0; i<events.length; ++i) { | |
var task = events[i]; | |
if(task.active) { | |
runTask(task); | |
// Reschedule periodic repeating tasks | |
// Check active again, since a task may have canceled itself | |
if(task.period >= 0) { | |
task.time = task.time + task.period; | |
insertByTime(task, tasks); | |
} | |
} | |
} | |
return tasks; | |
} | |
function insertByTime(task, timeslots) { | |
var l = timeslots.length; | |
if(l === 0) { | |
timeslots.push(newTimeslot(task.time, [task])); | |
return; | |
} | |
var i = binarySearch(task.time, timeslots); | |
if(i >= l) { | |
timeslots.push(newTimeslot(task.time, [task])); | |
} else if(task.time === timeslots[i].time) { | |
timeslots[i].events.push(task); | |
} else { | |
timeslots.splice(i, 0, newTimeslot(task.time, [task])); | |
} | |
} | |
function binarySearch(t, sortedArray) { | |
var lo = 0; | |
var hi = sortedArray.length; | |
var mid, y; | |
while (lo < hi) { | |
mid = Math.floor((lo + hi) / 2); | |
y = sortedArray[mid]; | |
if (t === y.time) { | |
return mid; | |
} else if (t < y.time) { | |
hi = mid; | |
} else { | |
lo = mid + 1; | |
} | |
} | |
return hi; | |
} | |
function newTimeslot(t, events) { | |
return { time: t, events: events }; | |
} | |
},{"@most/prelude":69}],47:[function(require,module,exports){ | |
(function (process){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Scheduler = require('./Scheduler'); | |
var setTimeoutTimer = require('./timeoutTimer'); | |
var nodeTimer = require('./nodeTimer'); | |
var isNode = typeof process === 'object' | |
&& typeof process.nextTick === 'function'; | |
module.exports = new Scheduler(isNode ? nodeTimer : setTimeoutTimer); | |
}).call(this,require('_process')) | |
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlZHVsZXIvZGVmYXVsdFNjaGVkdWxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnLi9TY2hlZHVsZXInKTtcbnZhciBzZXRUaW1lb3V0VGltZXIgPSByZXF1aXJlKCcuL3RpbWVvdXRUaW1lcicpO1xudmFyIG5vZGVUaW1lciA9IHJlcXVpcmUoJy4vbm9kZVRpbWVyJyk7XG5cbnZhciBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCdcblx0XHQmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZWR1bGVyKGlzTm9kZSA/IG5vZGVUaW1lciA6IHNldFRpbWVvdXRUaW1lcik7XG4iXX0= | |
},{"./Scheduler":46,"./nodeTimer":48,"./timeoutTimer":49,"_process":1}],48:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var defer = require('../defer'); | |
/*global setTimeout, clearTimeout*/ | |
function Task(f) { | |
this.f = f; | |
this.active = true; | |
} | |
Task.prototype.run = function() { | |
if(!this.active) { | |
return; | |
} | |
var f = this.f; | |
return f(); | |
}; | |
Task.prototype.error = function(e) { | |
throw e; | |
}; | |
Task.prototype.cancel = function() { | |
this.active = false; | |
}; | |
function runAsTask(f) { | |
var task = new Task(f); | |
defer(task); | |
return task; | |
} | |
module.exports = { | |
now: Date.now, | |
setTimer: function(f, dt) { | |
return dt <= 0 ? runAsTask(f) : setTimeout(f, dt); | |
}, | |
clearTimer: function(t) { | |
return t instanceof Task ? t.cancel() : clearTimeout(t); | |
} | |
}; | |
},{"../defer":31}],49:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
/*global setTimeout, clearTimeout*/ | |
module.exports = { | |
now: Date.now, | |
setTimer: function(f, dt) { | |
return setTimeout(f, dt); | |
}, | |
clearTimer: function(t) { | |
return clearTimeout(t); | |
} | |
}; | |
},{}],50:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var defer = require('../defer'); | |
module.exports = DeferredSink; | |
function DeferredSink(sink) { | |
this.sink = sink; | |
this.events = []; | |
this.active = true; | |
} | |
DeferredSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
if(this.events.length === 0) { | |
defer(new PropagateAllTask(this.sink, this.events)); | |
} | |
this.events.push({ time: t, value: x }); | |
}; | |
DeferredSink.prototype.error = function(t, e) { | |
this._end(new ErrorTask(t, e, this.sink)); | |
}; | |
DeferredSink.prototype.end = function(t, x) { | |
this._end(new EndTask(t, x, this.sink)); | |
}; | |
DeferredSink.prototype._end = function(task) { | |
this.active = false; | |
this.events = void 0; | |
defer(task); | |
} | |
function PropagateAllTask(sink, events) { | |
this.sink = sink; | |
this.events = events; | |
} | |
PropagateAllTask.prototype.run = function() { | |
var events = this.events; | |
var sink = this.sink; | |
var event; | |
for(var i = 0, l = events.length; i<l; ++i) { | |
event = events[i]; | |
sink.event(event.time, event.value); | |
} | |
events.length = 0; | |
}; | |
PropagateAllTask.prototype.error = function(e) { | |
this.sink.error(0, e); | |
}; | |
function EndTask(t, x, sink) { | |
this.time = t; | |
this.value = x; | |
this.sink = sink; | |
} | |
EndTask.prototype.run = function() { | |
this.sink.end(this.time, this.value); | |
}; | |
EndTask.prototype.error = function(e) { | |
this.sink.error(this.time, e); | |
}; | |
function ErrorTask(t, e, sink) { | |
this.time = t; | |
this.value = e; | |
this.sink = sink; | |
} | |
ErrorTask.prototype.run = function() { | |
this.sink.error(this.time, this.value); | |
}; | |
ErrorTask.prototype.error = function(e) { | |
throw e; | |
}; | |
},{"../defer":31}],51:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Sink = require('./Pipe'); | |
module.exports = IndexSink; | |
function IndexSink(i, sink) { | |
this.sink = sink; | |
this.index = i; | |
this.active = true; | |
this.value = void 0; | |
} | |
IndexSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.value = x; | |
this.sink.event(t, this); | |
}; | |
IndexSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.active = false; | |
this.sink.end(t, { index: this.index, value: x }); | |
}; | |
IndexSink.prototype.error = Sink.prototype.error; | |
},{"./Pipe":53}],52:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Observer; | |
/** | |
* Sink that accepts functions to apply to each event, and to end, and error | |
* signals. | |
* @constructor | |
*/ | |
function Observer(event, end, error, disposable) { | |
this._event = event; | |
this._end = end; | |
this._error = error; | |
this._disposable = disposable; | |
this.active = true; | |
} | |
Observer.prototype.event = function(t, x) { | |
if (!this.active) { | |
return; | |
} | |
this._event(x); | |
}; | |
Observer.prototype.end = function(t, x) { | |
if (!this.active) { | |
return; | |
} | |
this.active = false; | |
disposeThen(this._end, this._error, this._disposable, x); | |
}; | |
Observer.prototype.error = function(t, e) { | |
this.active = false; | |
disposeThen(this._error, this._error, this._disposable, e); | |
}; | |
function disposeThen(end, error, disposable, x) { | |
Promise.resolve(disposable.dispose()).then(function () { | |
end(x); | |
}, error); | |
} | |
},{}],53:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Pipe; | |
/** | |
* A sink mixin that simply forwards event, end, and error to | |
* another sink. | |
* @param sink | |
* @constructor | |
*/ | |
function Pipe(sink) { | |
this.sink = sink; | |
} | |
Pipe.prototype.event = function(t, x) { | |
return this.sink.event(t, x); | |
}; | |
Pipe.prototype.end = function(t, x) { | |
return this.sink.end(t, x); | |
}; | |
Pipe.prototype.error = function(t, e) { | |
return this.sink.error(t, e); | |
}; | |
},{}],54:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = SafeSink; | |
function SafeSink(sink) { | |
this.sink = sink; | |
this.active = true; | |
} | |
SafeSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.sink.event(t, x); | |
}; | |
SafeSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.disable(); | |
this.sink.end(t, x); | |
}; | |
SafeSink.prototype.error = function(t, e) { | |
this.disable(); | |
this.sink.error(t, e); | |
}; | |
SafeSink.prototype.disable = function() { | |
this.active = false; | |
return this.sink; | |
} | |
},{}],55:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var DeferredSink = require('../sink/DeferredSink'); | |
var dispose = require('../disposable/dispose'); | |
var tryEvent = require('./tryEvent'); | |
module.exports = EventEmitterSource; | |
function EventEmitterSource(event, source) { | |
this.event = event; | |
this.source = source; | |
} | |
EventEmitterSource.prototype.run = function(sink, scheduler) { | |
// NOTE: Because EventEmitter allows events in the same call stack as | |
// a listener is added, use a DeferredSink to buffer events | |
// until the stack clears, then propagate. This maintains most.js's | |
// invariant that no event will be delivered in the same call stack | |
// as an observer begins observing. | |
var dsink = new DeferredSink(sink); | |
function addEventVariadic(a) { | |
var l = arguments.length; | |
if(l > 1) { | |
var arr = new Array(l); | |
for(var i=0; i<l; ++i) { | |
arr[i] = arguments[i]; | |
} | |
tryEvent.tryEvent(scheduler.now(), arr, dsink); | |
} else { | |
tryEvent.tryEvent(scheduler.now(), a, dsink); | |
} | |
} | |
this.source.addListener(this.event, addEventVariadic); | |
return dispose.create(disposeEventEmitter, { target: this, addEvent: addEventVariadic }); | |
}; | |
function disposeEventEmitter(info) { | |
var target = info.target; | |
target.source.removeListener(target.event, info.addEvent); | |
} | |
},{"../disposable/dispose":34,"../sink/DeferredSink":50,"./tryEvent":66}],56:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var dispose = require('../disposable/dispose'); | |
var tryEvent = require('./tryEvent'); | |
module.exports = EventTargetSource; | |
function EventTargetSource(event, source, capture) { | |
this.event = event; | |
this.source = source; | |
this.capture = capture; | |
} | |
EventTargetSource.prototype.run = function(sink, scheduler) { | |
function addEvent(e) { | |
tryEvent.tryEvent(scheduler.now(), e, sink); | |
} | |
this.source.addEventListener(this.event, addEvent, this.capture); | |
return dispose.create(disposeEventTarget, | |
{ target: this, addEvent: addEvent }); | |
}; | |
function disposeEventTarget(info) { | |
var target = info.target; | |
target.source.removeEventListener(target.event, info.addEvent, target.capture); | |
} | |
},{"../disposable/dispose":34,"./tryEvent":66}],57:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.of = streamOf; | |
exports.empty = empty; | |
exports.never = never; | |
/** | |
* Stream containing only x | |
* @param {*} x | |
* @returns {Stream} | |
*/ | |
function streamOf(x) { | |
return new Stream(new Just(x)); | |
} | |
function Just(x) { | |
this.value = x; | |
} | |
Just.prototype.run = function(sink, scheduler) { | |
return scheduler.asap(new PropagateTask(runJust, this.value, sink)); | |
}; | |
function runJust(t, x, sink) { | |
sink.event(t, x); | |
sink.end(t, void 0); | |
} | |
/** | |
* Stream containing no events and ends immediately | |
* @returns {Stream} | |
*/ | |
function empty() { | |
return EMPTY; | |
} | |
function EmptySource() {} | |
EmptySource.prototype.run = function(sink, scheduler) { | |
var task = PropagateTask.end(void 0, sink); | |
scheduler.asap(task); | |
return dispose.create(disposeEmpty, task); | |
}; | |
function disposeEmpty(task) { | |
return task.dispose(); | |
} | |
var EMPTY = new Stream(new EmptySource()); | |
/** | |
* Stream containing no events and never ends | |
* @returns {Stream} | |
*/ | |
function never() { | |
return NEVER; | |
} | |
function NeverSource() {} | |
NeverSource.prototype.run = function() { | |
return dispose.empty(); | |
}; | |
var NEVER = new Stream(new NeverSource()); | |
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45}],58:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('@most/multicast').MulticastSource; | |
var DeferredSink = require('../sink/DeferredSink'); | |
var tryEvent = require('./tryEvent'); | |
exports.create = create; | |
/** | |
* @deprecated | |
*/ | |
function create(run) { | |
return new Stream(new MulticastSource(new SubscriberSource(run))); | |
} | |
function SubscriberSource(subscribe) { | |
this._subscribe = subscribe; | |
} | |
SubscriberSource.prototype.run = function(sink, scheduler) { | |
return new Subscription(new DeferredSink(sink), scheduler, this._subscribe); | |
}; | |
function Subscription(sink, scheduler, subscribe) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
this._unsubscribe = this._init(subscribe); | |
} | |
Subscription.prototype._init = function(subscribe) { | |
var s = this; | |
try { | |
return subscribe(add, end, error); | |
} catch(e) { | |
error(e); | |
} | |
function add(x) { | |
s._add(x); | |
} | |
function end(x) { | |
s._end(x); | |
} | |
function error(e) { | |
s._error(e); | |
} | |
}; | |
Subscription.prototype._add = function(x) { | |
if(!this.active) { | |
return; | |
} | |
tryEvent.tryEvent(this.scheduler.now(), x, this.sink); | |
}; | |
Subscription.prototype._end = function(x) { | |
if(!this.active) { | |
return; | |
} | |
this.active = false; | |
tryEvent.tryEnd(this.scheduler.now(), x, this.sink); | |
}; | |
Subscription.prototype._error = function(x) { | |
this.active = false; | |
this.sink.error(this.scheduler.now(), x); | |
}; | |
Subscription.prototype.dispose = function() { | |
this.active = false; | |
if(typeof this._unsubscribe === 'function') { | |
return this._unsubscribe.call(void 0); | |
} | |
}; | |
},{"../Stream":5,"../sink/DeferredSink":50,"./tryEvent":66,"@most/multicast":68}],59:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var fromArray = require('./fromArray').fromArray; | |
var isIterable = require('../iterable').isIterable; | |
var fromIterable = require('./fromIterable').fromIterable; | |
var getObservable = require('../observable/getObservable'); | |
var fromObservable = require('../observable/fromObservable').fromObservable; | |
var isArrayLike = require('@most/prelude').isArrayLike; | |
exports.from = from; | |
function from(a) { // eslint-disable-line complexity | |
if(a instanceof Stream) { | |
return a; | |
} | |
var observable = getObservable(a); | |
if(observable != null) { | |
return fromObservable(observable); | |
} | |
if(Array.isArray(a) || isArrayLike(a)) { | |
return fromArray(a); | |
} | |
if(isIterable(a)) { | |
return fromIterable(a); | |
} | |
throw new TypeError('from(x) must be observable, iterable, or array-like: ' + a); | |
} | |
},{"../Stream":5,"../iterable":40,"../observable/fromObservable":41,"../observable/getObservable":42,"./fromArray":60,"./fromIterable":62,"@most/prelude":69}],60:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.fromArray = fromArray; | |
function fromArray (a) { | |
return new Stream(new ArraySource(a)); | |
} | |
function ArraySource(a) { | |
this.array = a; | |
} | |
ArraySource.prototype.run = function(sink, scheduler) { | |
return scheduler.asap(new PropagateTask(runProducer, this.array, sink)); | |
}; | |
function runProducer(t, array, sink) { | |
for(var i=0, l=array.length; i<l && this.active; ++i) { | |
sink.event(t, array[i]); | |
} | |
this.active && end(t); | |
function end(t) { | |
sink.end(t); | |
} | |
} | |
},{"../Stream":5,"../scheduler/PropagateTask":45}],61:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('@most/multicast').MulticastSource; | |
var EventTargetSource = require('./EventTargetSource'); | |
var EventEmitterSource = require('./EventEmitterSource'); | |
exports.fromEvent = fromEvent; | |
/** | |
* Create a stream from an EventTarget, such as a DOM Node, or EventEmitter. | |
* @param {String} event event type name, e.g. 'click' | |
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter | |
* @param {boolean?} useCapture for DOM events, whether to use | |
* capturing--passed as 3rd parameter to addEventListener. | |
* @returns {Stream} stream containing all events of the specified type | |
* from the source. | |
*/ | |
function fromEvent(event, source /*, useCapture = false */) { | |
var s; | |
if(typeof source.addEventListener === 'function' && typeof source.removeEventListener === 'function') { | |
var capture = arguments.length > 2 && !!arguments[2]; | |
s = new MulticastSource(new EventTargetSource(event, source, capture)); | |
} else if(typeof source.addListener === 'function' && typeof source.removeListener === 'function') { | |
s = new EventEmitterSource(event, source); | |
} else { | |
throw new Error('source must support addEventListener/removeEventListener or addListener/removeListener'); | |
} | |
return new Stream(s); | |
} | |
},{"../Stream":5,"./EventEmitterSource":55,"./EventTargetSource":56,"@most/multicast":68}],62:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var getIterator = require('../iterable').getIterator; | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.fromIterable = fromIterable; | |
function fromIterable(iterable) { | |
return new Stream(new IterableSource(iterable)); | |
} | |
function IterableSource(iterable) { | |
this.iterable = iterable; | |
} | |
IterableSource.prototype.run = function(sink, scheduler) { | |
return new IteratorProducer(getIterator(this.iterable), sink, scheduler); | |
}; | |
function IteratorProducer(iterator, sink, scheduler) { | |
this.scheduler = scheduler; | |
this.iterator = iterator; | |
this.task = new PropagateTask(runProducer, this, sink); | |
scheduler.asap(this.task); | |
} | |
IteratorProducer.prototype.dispose = function() { | |
return this.task.dispose(); | |
}; | |
function runProducer(t, producer, sink) { | |
var x = producer.iterator.next(); | |
if(x.done) { | |
sink.end(t, x.value); | |
} else { | |
sink.event(t, x.value); | |
} | |
producer.scheduler.asap(producer.task); | |
} | |
},{"../Stream":5,"../iterable":40,"../scheduler/PropagateTask":45}],63:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2014 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var base = require('@most/prelude'); | |
exports.generate = generate; | |
/** | |
* Compute a stream using an *async* generator, which yields promises | |
* to control event times. | |
* @param f | |
* @returns {Stream} | |
*/ | |
function generate(f /*, ...args */) { | |
return new Stream(new GenerateSource(f, base.tail(arguments))); | |
} | |
function GenerateSource(f, args) { | |
this.f = f; | |
this.args = args; | |
} | |
GenerateSource.prototype.run = function(sink, scheduler) { | |
return new Generate(this.f.apply(void 0, this.args), sink, scheduler); | |
}; | |
function Generate(iterator, sink, scheduler) { | |
this.iterator = iterator; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
Promise.resolve(this).then(next).catch(err); | |
} | |
function next(generate, x) { | |
return generate.active ? handle(generate, generate.iterator.next(x)) : x; | |
} | |
function handle(generate, result) { | |
if (result.done) { | |
return generate.sink.end(generate.scheduler.now(), result.value); | |
} | |
return Promise.resolve(result.value).then(function (x) { | |
return emit(generate, x); | |
}, function(e) { | |
return error(generate, e); | |
}); | |
} | |
function emit(generate, x) { | |
generate.sink.event(generate.scheduler.now(), x); | |
return next(generate, x); | |
} | |
function error(generate, e) { | |
return handle(generate, generate.iterator.throw(e)); | |
} | |
Generate.prototype.dispose = function() { | |
this.active = false; | |
}; | |
},{"../Stream":5,"@most/prelude":69}],64:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.iterate = iterate; | |
/** | |
* Compute a stream by iteratively calling f to produce values | |
* Event times may be controlled by returning a Promise from f | |
* @param {function(x:*):*|Promise<*>} f | |
* @param {*} x initial value | |
* @returns {Stream} | |
*/ | |
function iterate(f, x) { | |
return new Stream(new IterateSource(f, x)); | |
} | |
function IterateSource(f, x) { | |
this.f = f; | |
this.value = x; | |
} | |
IterateSource.prototype.run = function(sink, scheduler) { | |
return new Iterate(this.f, this.value, sink, scheduler); | |
}; | |
function Iterate(f, initial, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var x = initial; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
function start(iterate) { | |
return stepIterate(iterate, x); | |
} | |
Promise.resolve(this).then(start).catch(err); | |
} | |
Iterate.prototype.dispose = function() { | |
this.active = false; | |
}; | |
function stepIterate(iterate, x) { | |
iterate.sink.event(iterate.scheduler.now(), x); | |
if(!iterate.active) { | |
return x; | |
} | |
var f = iterate.f; | |
return Promise.resolve(f(x)).then(function(y) { | |
return continueIterate(iterate, y); | |
}); | |
} | |
function continueIterate(iterate, x) { | |
return !iterate.active ? iterate.value : stepIterate(iterate, x); | |
} | |
},{"../Stream":5}],65:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
var MulticastSource = require('@most/multicast').MulticastSource; | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.periodic = periodic; | |
/** | |
* Create a stream that emits the current time periodically | |
* @param {Number} period periodicity of events in millis | |
* @param {*) value value to emit each period | |
* @returns {Stream} new stream that emits the current time every period | |
*/ | |
function periodic(period, value) { | |
return new Stream(new MulticastSource(new Periodic(period, value))); | |
} | |
function Periodic(period, value) { | |
this.period = period; | |
this.value = value; | |
} | |
Periodic.prototype.run = function(sink, scheduler) { | |
return scheduler.periodic(this.period, new PropagateTask(emit, this.value, sink)); | |
}; | |
function emit(t, x, sink) { | |
sink.event(t, x); | |
} | |
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"@most/multicast":68}],66:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.tryEvent = tryEvent; | |
exports.tryEnd = tryEnd; | |
function tryEvent(t, x, sink) { | |
try { | |
sink.event(t, x); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
} | |
function tryEnd(t, x, sink) { | |
try { | |
sink.end(t, x); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
} | |
},{}],67:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.unfold = unfold; | |
/** | |
* Compute a stream by unfolding tuples of future values from a seed value | |
* Event times may be controlled by returning a Promise from f | |
* @param {function(seed:*):{value:*, seed:*, done:boolean}|Promise<{value:*, seed:*, done:boolean}>} f unfolding function accepts | |
* a seed and returns a new tuple with a value, new seed, and boolean done flag. | |
* If tuple.done is true, the stream will end. | |
* @param {*} seed seed value | |
* @returns {Stream} stream containing all value of all tuples produced by the | |
* unfolding function. | |
*/ | |
function unfold(f, seed) { | |
return new Stream(new UnfoldSource(f, seed)); | |
} | |
function UnfoldSource(f, seed) { | |
this.f = f; | |
this.value = seed; | |
} | |
UnfoldSource.prototype.run = function(sink, scheduler) { | |
return new Unfold(this.f, this.value, sink, scheduler); | |
}; | |
function Unfold(f, x, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
function start(unfold) { | |
return stepUnfold(unfold, x); | |
} | |
Promise.resolve(this).then(start).catch(err); | |
} | |
Unfold.prototype.dispose = function() { | |
this.active = false; | |
}; | |
function stepUnfold(unfold, x) { | |
var f = unfold.f; | |
return Promise.resolve(f(x)).then(function(tuple) { | |
return continueUnfold(unfold, tuple); | |
}); | |
} | |
function continueUnfold(unfold, tuple) { | |
if(tuple.done) { | |
unfold.sink.end(unfold.scheduler.now(), tuple.value); | |
return tuple.value; | |
} | |
unfold.sink.event(unfold.scheduler.now(), tuple.value); | |
if(!unfold.active) { | |
return tuple.value; | |
} | |
return stepUnfold(unfold, tuple.seed); | |
} | |
},{"../Stream":5}],68:[function(require,module,exports){ | |
(function (global, factory) { | |
if (typeof define === "function" && define.amd) { | |
define('@most/multicast', ['exports', '@most/prelude'], factory); | |
} else if (typeof exports !== "undefined") { | |
factory(exports, require('@most/prelude')); | |
} else { | |
var mod = { | |
exports: {} | |
}; | |
factory(mod.exports, global.prelude); | |
global.mostMulticast = mod.exports; | |
} | |
})(this, function (exports, _prelude) { | |
'use strict'; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
exports.MulticastSource = undefined; | |
function _classCallCheck(instance, Constructor) { | |
if (!(instance instanceof Constructor)) { | |
throw new TypeError("Cannot call a class as a function"); | |
} | |
} | |
var _createClass = function () { | |
function defineProperties(target, props) { | |
for (var i = 0; i < props.length; i++) { | |
var descriptor = props[i]; | |
descriptor.enumerable = descriptor.enumerable || false; | |
descriptor.configurable = true; | |
if ("value" in descriptor) descriptor.writable = true; | |
Object.defineProperty(target, descriptor.key, descriptor); | |
} | |
} | |
return function (Constructor, protoProps, staticProps) { | |
if (protoProps) defineProperties(Constructor.prototype, protoProps); | |
if (staticProps) defineProperties(Constructor, staticProps); | |
return Constructor; | |
}; | |
}(); | |
var MulticastDisposable = function () { | |
function MulticastDisposable(source, sink) { | |
_classCallCheck(this, MulticastDisposable); | |
this.source = source; | |
this.sink = sink; | |
this.disposed = false; | |
} | |
_createClass(MulticastDisposable, [{ | |
key: 'dispose', | |
value: function dispose() { | |
if (this.disposed) { | |
return; | |
} | |
this.disposed = true; | |
var remaining = this.source.remove(this.sink); | |
return remaining === 0 && this.source._dispose(); | |
} | |
}]); | |
return MulticastDisposable; | |
}(); | |
function tryEvent(t, x, sink) { | |
try { | |
sink.event(t, x); | |
} catch (e) { | |
sink.error(t, e); | |
} | |
} | |
function tryEnd(t, x, sink) { | |
try { | |
sink.end(t, x); | |
} catch (e) { | |
sink.error(t, e); | |
} | |
} | |
var dispose = function dispose(disposable) { | |
return disposable.dispose(); | |
}; | |
var emptyDisposable = { | |
dispose: function dispose() {} | |
}; | |
var MulticastSource = function () { | |
function MulticastSource(source) { | |
_classCallCheck(this, MulticastSource); | |
this.source = source; | |
this.sinks = []; | |
this._disposable = emptyDisposable; | |
} | |
_createClass(MulticastSource, [{ | |
key: 'run', | |
value: function run(sink, scheduler) { | |
var n = this.add(sink); | |
if (n === 1) { | |
this._disposable = this.source.run(this, scheduler); | |
} | |
return new MulticastDisposable(this, sink); | |
} | |
}, { | |
key: '_dispose', | |
value: function _dispose() { | |
var disposable = this._disposable; | |
this._disposable = emptyDisposable; | |
return Promise.resolve(disposable).then(dispose); | |
} | |
}, { | |
key: 'add', | |
value: function add(sink) { | |
this.sinks = (0, _prelude.append)(sink, this.sinks); | |
return this.sinks.length; | |
} | |
}, { | |
key: 'remove', | |
value: function remove(sink) { | |
var i = (0, _prelude.findIndex)(sink, this.sinks); | |
// istanbul ignore next | |
if (i >= 0) { | |
this.sinks = (0, _prelude.remove)(i, this.sinks); | |
} | |
return this.sinks.length; | |
} | |
}, { | |
key: 'event', | |
value: function event(time, value) { | |
var s = this.sinks; | |
if (s.length === 1) { | |
return s[0].event(time, value); | |
} | |
for (var i = 0; i < s.length; ++i) { | |
tryEvent(time, value, s[i]); | |
} | |
} | |
}, { | |
key: 'end', | |
value: function end(time, value) { | |
var s = this.sinks; | |
for (var i = 0; i < s.length; ++i) { | |
tryEnd(time, value, s[i]); | |
} | |
} | |
}, { | |
key: 'error', | |
value: function error(time, err) { | |
var s = this.sinks; | |
for (var i = 0; i < s.length; ++i) { | |
s[i].error(time, err); | |
} | |
} | |
}]); | |
return MulticastSource; | |
}(); | |
function multicast(stream) { | |
var source = stream.source; | |
return source instanceof MulticastSource ? stream : new stream.constructor(new MulticastSource(source)); | |
} | |
exports.MulticastSource = MulticastSource; | |
exports.default = multicast; | |
}); | |
},{"@most/prelude":69}],69:[function(require,module,exports){ | |
(function (global, factory) { | |
if (typeof define === "function" && define.amd) { | |
define('@most/prelude', ['exports'], factory); | |
} else if (typeof exports !== "undefined") { | |
factory(exports); | |
} else { | |
var mod = { | |
exports: {} | |
}; | |
factory(mod.exports); | |
global.mostPrelude = mod.exports; | |
} | |
})(this, function (exports) { | |
'use strict'; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
// Non-mutating array operations | |
// cons :: a -> [a] -> [a] | |
// a with x prepended | |
function cons(x, a) { | |
var l = a.length; | |
var b = new Array(l + 1); | |
b[0] = x; | |
for (var i = 0; i < l; ++i) { | |
b[i + 1] = a[i]; | |
} | |
return b; | |
} | |
// append :: a -> [a] -> [a] | |
// a with x appended | |
function append(x, a) { | |
var l = a.length; | |
var b = new Array(l + 1); | |
for (var i = 0; i < l; ++i) { | |
b[i] = a[i]; | |
} | |
b[l] = x; | |
return b; | |
} | |
// drop :: Int -> [a] -> [a] | |
// drop first n elements | |
function drop(n, a) { | |
// eslint-disable-line complexity | |
if (n < 0) { | |
throw new TypeError('n must be >= 0'); | |
} | |
var l = a.length; | |
if (n === 0 || l === 0) { | |
return a; | |
} | |
if (n >= l) { | |
return []; | |
} | |
return unsafeDrop(n, a, l - n); | |
} | |
// unsafeDrop :: Int -> [a] -> Int -> [a] | |
// Internal helper for drop | |
function unsafeDrop(n, a, l) { | |
var b = new Array(l); | |
for (var i = 0; i < l; ++i) { | |
b[i] = a[n + i]; | |
} | |
return b; | |
} | |
// tail :: [a] -> [a] | |
// drop head element | |
function tail(a) { | |
return drop(1, a); | |
} | |
// copy :: [a] -> [a] | |
// duplicate a (shallow duplication) | |
function copy(a) { | |
var l = a.length; | |
var b = new Array(l); | |
for (var i = 0; i < l; ++i) { | |
b[i] = a[i]; | |
} | |
return b; | |
} | |
// map :: (a -> b) -> [a] -> [b] | |
// transform each element with f | |
function map(f, a) { | |
var l = a.length; | |
var b = new Array(l); | |
for (var i = 0; i < l; ++i) { | |
b[i] = f(a[i]); | |
} | |
return b; | |
} | |
// reduce :: (a -> b -> a) -> a -> [b] -> a | |
// accumulate via left-fold | |
function reduce(f, z, a) { | |
var r = z; | |
for (var i = 0, l = a.length; i < l; ++i) { | |
r = f(r, a[i], i); | |
} | |
return r; | |
} | |
// replace :: a -> Int -> [a] | |
// replace element at index | |
function replace(x, i, a) { | |
// eslint-disable-line complexity | |
if (i < 0) { | |
throw new TypeError('i must be >= 0'); | |
} | |
var l = a.length; | |
var b = new Array(l); | |
for (var j = 0; j < l; ++j) { | |
b[j] = i === j ? x : a[j]; | |
} | |
return b; | |
} | |
// remove :: Int -> [a] -> [a] | |
// remove element at index | |
function remove(i, a) { | |
// eslint-disable-line complexity | |
if (i < 0) { | |
throw new TypeError('i must be >= 0'); | |
} | |
var l = a.length; | |
if (l === 0 || i >= l) { | |
// exit early if index beyond end of array | |
return a; | |
} | |
if (l === 1) { | |
// exit early if index in bounds and length === 1 | |
return []; | |
} | |
return unsafeRemove(i, a, l - 1); | |
} | |
// unsafeRemove :: Int -> [a] -> Int -> [a] | |
// Internal helper to remove element at index | |
function unsafeRemove(i, a, l) { | |
var b = new Array(l); | |
var j = undefined; | |
for (j = 0; j < i; ++j) { | |
b[j] = a[j]; | |
} | |
for (j = i; j < l; ++j) { | |
b[j] = a[j + 1]; | |
} | |
return b; | |
} | |
// removeAll :: (a -> boolean) -> [a] -> [a] | |
// remove all elements matching a predicate | |
function removeAll(f, a) { | |
var l = a.length; | |
var b = new Array(l); | |
var j = 0; | |
for (var x, i = 0; i < l; ++i) { | |
x = a[i]; | |
if (!f(x)) { | |
b[j] = x; | |
++j; | |
} | |
} | |
b.length = j; | |
return b; | |
} | |
// findIndex :: a -> [a] -> Int | |
// find index of x in a, from the left | |
function findIndex(x, a) { | |
for (var i = 0, l = a.length; i < l; ++i) { | |
if (x === a[i]) { | |
return i; | |
} | |
} | |
return -1; | |
} | |
// isArrayLike :: * -> boolean | |
// Return true iff x is array-like | |
function isArrayLike(x) { | |
return x != null && typeof x.length === 'number' && typeof x !== 'function'; | |
} | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
// id :: a -> a | |
var id = function id(x) { | |
return x; | |
}; | |
// compose :: (b -> c) -> (a -> b) -> (a -> c) | |
var compose = function compose(f, g) { | |
return function (x) { | |
return f(g(x)); | |
}; | |
}; | |
// apply :: (a -> b) -> a -> b | |
var apply = function apply(f, x) { | |
return f(x); | |
}; | |
// curry2 :: ((a, b) -> c) -> (a -> b -> c) | |
function curry2(f) { | |
function curried(a, b) { | |
switch (arguments.length) { | |
case 0: | |
return curried; | |
case 1: | |
return function (b) { | |
return f(a, b); | |
}; | |
default: | |
return f(a, b); | |
} | |
} | |
return curried; | |
} | |
// curry3 :: ((a, b, c) -> d) -> (a -> b -> c -> d) | |
function curry3(f) { | |
function curried(a, b, c) { | |
// eslint-disable-line complexity | |
switch (arguments.length) { | |
case 0: | |
return curried; | |
case 1: | |
return curry2(function (b, c) { | |
return f(a, b, c); | |
}); | |
case 2: | |
return function (c) { | |
return f(a, b, c); | |
}; | |
default: | |
return f(a, b, c); | |
} | |
} | |
return curried; | |
} | |
exports.cons = cons; | |
exports.append = append; | |
exports.drop = drop; | |
exports.tail = tail; | |
exports.copy = copy; | |
exports.map = map; | |
exports.reduce = reduce; | |
exports.replace = replace; | |
exports.remove = remove; | |
exports.removeAll = removeAll; | |
exports.findIndex = findIndex; | |
exports.isArrayLike = isArrayLike; | |
exports.id = id; | |
exports.compose = compose; | |
exports.apply = apply; | |
exports.curry2 = curry2; | |
exports.curry3 = curry3; | |
}); | |
},{}],70:[function(require,module,exports){ | |
(function (global){ | |
/* global window */ | |
'use strict'; | |
module.exports = require('./ponyfill')(global || window || this); | |
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcG9ueWZpbGwnKShnbG9iYWwgfHwgd2luZG93IHx8IHRoaXMpO1xuIl19 | |
},{"./ponyfill":71}],71:[function(require,module,exports){ | |
'use strict'; | |
module.exports = function symbolObservablePonyfill(root) { | |
var result; | |
var Symbol = root.Symbol; | |
if (typeof Symbol === 'function') { | |
if (Symbol.observable) { | |
result = Symbol.observable; | |
} else { | |
result = Symbol('observable'); | |
Symbol.observable = result; | |
} | |
} else { | |
result = '@@observable'; | |
} | |
return result; | |
}; | |
},{}],"most":[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('./lib/Stream'); | |
var base = require('@most/prelude'); | |
var core = require('./lib/source/core'); | |
var from = require('./lib/source/from').from; | |
var periodic = require('./lib/source/periodic').periodic; | |
var symbolObservable = require('symbol-observable'); | |
/** | |
* Core stream type | |
* @type {Stream} | |
*/ | |
exports.Stream = Stream; | |
// Add of and empty to constructor for fantasy-land compat | |
exports.of = Stream.of = core.of; | |
exports.just = core.of; // easier ES6 import alias | |
exports.empty = Stream.empty = core.empty; | |
exports.never = core.never; | |
exports.from = from; | |
exports.periodic = periodic; | |
//----------------------------------------------------------------------- | |
// Draft ES Observable proposal interop | |
// https://github.com/zenparsing/es-observable | |
var subscribe = require('./lib/observable/subscribe').subscribe; | |
Stream.prototype.subscribe = function(subscriber) { | |
return subscribe(subscriber, this); | |
}; | |
Stream.prototype[symbolObservable] = function() { | |
return this; | |
} | |
//----------------------------------------------------------------------- | |
// Fluent adapter | |
var thru = require('./lib/combinator/thru').thru; | |
/** | |
* Adapt a functional stream transform to fluent style. | |
* It applies f to the this stream object | |
* @param {function(s: Stream): Stream} f function that | |
* receives the stream itself and must return a new stream | |
* @return {Stream} | |
*/ | |
Stream.prototype.thru = function(f) { | |
return thru(f, this); | |
} | |
//----------------------------------------------------------------------- | |
// Creating | |
var create = require('./lib/source/create'); | |
/** | |
* @deprecated | |
* Create a stream by imperatively pushing events. | |
* @param {function(add:function(x), end:function(e)):function} run function | |
* that will receive 2 functions as arguments, the first to add new values to the | |
* stream and the second to end the stream. It may *return* a function that | |
* will be called once all consumers have stopped observing the stream. | |
* @returns {Stream} stream containing all events added by run before end | |
*/ | |
exports.create = create.create; | |
//----------------------------------------------------------------------- | |
// Adapting other sources | |
var events = require('./lib/source/fromEvent'); | |
/** | |
* Create a stream of events from the supplied EventTarget or EventEmitter | |
* @param {String} event event name | |
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter. The source | |
* must support either addEventListener/removeEventListener (w3c EventTarget: | |
* http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget), | |
* or addListener/removeListener (node EventEmitter: http://nodejs.org/api/events.html) | |
* @returns {Stream} stream of events of the specified type from the source | |
*/ | |
exports.fromEvent = events.fromEvent; | |
//----------------------------------------------------------------------- | |
// Observing | |
var observe = require('./lib/combinator/observe'); | |
exports.observe = observe.observe; | |
exports.forEach = observe.observe; | |
exports.drain = observe.drain; | |
/** | |
* Process all the events in the stream | |
* @returns {Promise} promise that fulfills when the stream ends, or rejects | |
* if the stream fails with an unhandled error. | |
*/ | |
Stream.prototype.observe = Stream.prototype.forEach = function(f) { | |
return observe.observe(f, this); | |
}; | |
/** | |
* Consume all events in the stream, without providing a function to process each. | |
* This causes a stream to become active and begin emitting events, and is useful | |
* in cases where all processing has been setup upstream via other combinators, and | |
* there is no need to process the terminal events. | |
* @returns {Promise} promise that fulfills when the stream ends, or rejects | |
* if the stream fails with an unhandled error. | |
*/ | |
Stream.prototype.drain = function() { | |
return observe.drain(this); | |
}; | |
//------------------------------------------------------- | |
var loop = require('./lib/combinator/loop').loop; | |
exports.loop = loop; | |
/** | |
* Generalized feedback loop. Call a stepper function for each event. The stepper | |
* will be called with 2 params: the current seed and the an event value. It must | |
* return a new { seed, value } pair. The `seed` will be fed back into the next | |
* invocation of stepper, and the `value` will be propagated as the event value. | |
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function | |
* @param {*} seed initial seed value passed to first stepper call | |
* @returns {Stream} new stream whose values are the `value` field of the objects | |
* returned by the stepper | |
*/ | |
Stream.prototype.loop = function(stepper, seed) { | |
return loop(stepper, seed, this); | |
}; | |
//------------------------------------------------------- | |
var accumulate = require('./lib/combinator/accumulate'); | |
exports.scan = accumulate.scan; | |
exports.reduce = accumulate.reduce; | |
/** | |
* Create a stream containing successive reduce results of applying f to | |
* the previous reduce result and the current stream item. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @returns {Stream} new stream containing successive reduce results | |
*/ | |
Stream.prototype.scan = function(f, initial) { | |
return accumulate.scan(f, initial, this); | |
}; | |
/** | |
* Reduce the stream to produce a single result. Note that reducing an infinite | |
* stream will return a Promise that never fulfills, but that may reject if an error | |
* occurs. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial optional initial value | |
* @returns {Promise} promise for the file result of the reduce | |
*/ | |
Stream.prototype.reduce = function(f, initial) { | |
return accumulate.reduce(f, initial, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Building and extending | |
var unfold = require('./lib/source/unfold'); | |
var iterate = require('./lib/source/iterate'); | |
var generate = require('./lib/source/generate'); | |
var build = require('./lib/combinator/build'); | |
exports.unfold = unfold.unfold; | |
exports.iterate = iterate.iterate; | |
exports.generate = generate.generate; | |
exports.cycle = build.cycle; | |
exports.concat = build.concat; | |
exports.startWith = build.cons; | |
/** | |
* @deprecated | |
* Tie this stream into a circle, thus creating an infinite stream | |
* @returns {Stream} new infinite stream | |
*/ | |
Stream.prototype.cycle = function() { | |
return build.cycle(this); | |
}; | |
/** | |
* @param {Stream} tail | |
* @returns {Stream} new stream containing all items in this followed by | |
* all items in tail | |
*/ | |
Stream.prototype.concat = function(tail) { | |
return build.concat(this, tail); | |
}; | |
/** | |
* @param {*} x value to prepend | |
* @returns {Stream} a new stream with x prepended | |
*/ | |
Stream.prototype.startWith = function(x) { | |
return build.cons(x, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Transforming | |
var transform = require('./lib/combinator/transform'); | |
var applicative = require('./lib/combinator/applicative'); | |
exports.map = transform.map; | |
exports.constant = transform.constant; | |
exports.tap = transform.tap; | |
exports.ap = applicative.ap; | |
/** | |
* Transform each value in the stream by applying f to each | |
* @param {function(*):*} f mapping function | |
* @returns {Stream} stream containing items transformed by f | |
*/ | |
Stream.prototype.map = function(f) { | |
return transform.map(f, this); | |
}; | |
/** | |
* Assume this stream contains functions, and apply each function to each item | |
* in the provided stream. This generates, in effect, a cross product. | |
* @param {Stream} xs stream of items to which | |
* @returns {Stream} stream containing the cross product of items | |
*/ | |
Stream.prototype.ap = function(xs) { | |
return applicative.ap(this, xs); | |
}; | |
/** | |
* Replace each value in the stream with x | |
* @param {*} x | |
* @returns {Stream} stream containing items replaced with x | |
*/ | |
Stream.prototype.constant = function(x) { | |
return transform.constant(x, this); | |
}; | |
/** | |
* Perform a side effect for each item in the stream | |
* @param {function(x:*):*} f side effect to execute for each item. The | |
* return value will be discarded. | |
* @returns {Stream} new stream containing the same items as this stream | |
*/ | |
Stream.prototype.tap = function(f) { | |
return transform.tap(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Transducer support | |
var transduce = require('./lib/combinator/transduce'); | |
exports.transduce = transduce.transduce; | |
/** | |
* Transform this stream by passing its events through a transducer. | |
* @param {function} transducer transducer function | |
* @return {Stream} stream of events transformed by the transducer | |
*/ | |
Stream.prototype.transduce = function(transducer) { | |
return transduce.transduce(transducer, this); | |
}; | |
//----------------------------------------------------------------------- | |
// FlatMapping | |
var flatMap = require('./lib/combinator/flatMap'); | |
exports.flatMap = exports.chain = flatMap.flatMap; | |
exports.join = flatMap.join; | |
/** | |
* Map each value in the stream to a new stream, and merge it into the | |
* returned outer stream. Event arrival times are preserved. | |
* @param {function(x:*):Stream} f chaining function, must return a Stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
Stream.prototype.flatMap = Stream.prototype.chain = function(f) { | |
return flatMap.flatMap(f, this); | |
}; | |
/** | |
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer. Event arrival times are preserved. | |
* @returns {Stream<X>} new stream containing all events of all inner streams | |
*/ | |
Stream.prototype.join = function() { | |
return flatMap.join(this); | |
}; | |
var continueWith = require('./lib/combinator/continueWith').continueWith; | |
exports.continueWith = continueWith; | |
exports.flatMapEnd = continueWith; | |
/** | |
* Map the end event to a new stream, and begin emitting its values. | |
* @param {function(x:*):Stream} f function that receives the end event value, | |
* and *must* return a new Stream to continue with. | |
* @returns {Stream} new stream that emits all events from the original stream, | |
* followed by all events from the stream returned by f. | |
*/ | |
Stream.prototype.continueWith = Stream.prototype.flatMapEnd = function(f) { | |
return continueWith(f, this); | |
}; | |
var concatMap = require('./lib/combinator/concatMap').concatMap; | |
exports.concatMap = concatMap; | |
Stream.prototype.concatMap = function(f) { | |
return concatMap(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Concurrent merging | |
var mergeConcurrently = require('./lib/combinator/mergeConcurrently'); | |
exports.mergeConcurrently = mergeConcurrently.mergeConcurrently; | |
/** | |
* Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer, limiting the number of inner streams that may | |
* be active concurrently. | |
* @param {number} concurrency at most this many inner streams will be | |
* allowed to be active concurrently. | |
* @return {Stream<X>} new stream containing all events of all inner | |
* streams, with limited concurrency. | |
*/ | |
Stream.prototype.mergeConcurrently = function(concurrency) { | |
return mergeConcurrently.mergeConcurrently(concurrency, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Merging | |
var merge = require('./lib/combinator/merge'); | |
exports.merge = merge.merge; | |
exports.mergeArray = merge.mergeArray; | |
/** | |
* Merge this stream and all the provided streams | |
* @returns {Stream} stream containing items from this stream and s in time | |
* order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
Stream.prototype.merge = function(/*...streams*/) { | |
return merge.mergeArray(base.cons(this, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Combining | |
var combine = require('./lib/combinator/combine'); | |
exports.combine = combine.combine; | |
exports.combineArray = combine.combineArray; | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
Stream.prototype.combine = function(f /*, ...streams*/) { | |
return combine.combineArray(f, base.replace(this, 0, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Sampling | |
var sample = require('./lib/combinator/sample'); | |
exports.sample = sample.sample; | |
exports.sampleWith = sample.sampleWith; | |
/** | |
* When an event arrives on sampler, emit the latest event value from stream. | |
* @param {Stream} sampler stream of events at whose arrival time | |
* signal's latest value will be propagated | |
* @returns {Stream} sampled stream of values | |
*/ | |
Stream.prototype.sampleWith = function(sampler) { | |
return sample.sampleWith(sampler, this); | |
}; | |
/** | |
* When an event arrives on this stream, emit the result of calling f with the latest | |
* values of all streams being sampled | |
* @param {function(...values):*} f function to apply to each set of sampled values | |
* @returns {Stream} stream of sampled and transformed values | |
*/ | |
Stream.prototype.sample = function(f /* ...streams */) { | |
return sample.sampleArray(f, this, base.tail(arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Zipping | |
var zip = require('./lib/combinator/zip'); | |
exports.zip = zip.zip; | |
/** | |
* Pair-wise combine items with those in s. Given 2 streams: | |
* [1,2,3] zipWith f [4,5,6] -> [f(1,4),f(2,5),f(3,6)] | |
* Note: zip causes fast streams to buffer and wait for slow streams. | |
* @param {function(a:Stream, b:Stream, ...):*} f function to combine items | |
* @returns {Stream} new stream containing pairs | |
*/ | |
Stream.prototype.zip = function(f /*, ...streams*/) { | |
return zip.zipArray(f, base.replace(this, 0, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Switching | |
var switchLatest = require('./lib/combinator/switch').switch; | |
exports.switch = switchLatest; | |
exports.switchLatest = switchLatest; | |
/** | |
* Given a stream of streams, return a new stream that adopts the behavior | |
* of the most recent inner stream. | |
* @returns {Stream} switching stream | |
*/ | |
Stream.prototype.switch = Stream.prototype.switchLatest = function() { | |
return switchLatest(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Filtering | |
var filter = require('./lib/combinator/filter'); | |
exports.filter = filter.filter; | |
exports.skipRepeats = exports.distinct = filter.skipRepeats; | |
exports.skipRepeatsWith = exports.distinctBy = filter.skipRepeatsWith; | |
/** | |
* Retain only items matching a predicate | |
* stream: -12345678- | |
* filter(x => x % 2 === 0, stream): --2-4-6-8- | |
* @param {function(x:*):boolean} p filtering predicate called for each item | |
* @returns {Stream} stream containing only items for which predicate returns truthy | |
*/ | |
Stream.prototype.filter = function(p) { | |
return filter.filter(p, this); | |
}; | |
/** | |
* Skip repeated events, using === to compare items | |
* stream: -abbcd- | |
* distinct(stream): -ab-cd- | |
* @returns {Stream} stream with no repeated events | |
*/ | |
Stream.prototype.skipRepeats = function() { | |
return filter.skipRepeats(this); | |
}; | |
/** | |
* Skip repeated events, using supplied equals function to compare items | |
* @param {function(a:*, b:*):boolean} equals function to compare items | |
* @returns {Stream} stream with no repeated events | |
*/ | |
Stream.prototype.skipRepeatsWith = function(equals) { | |
return filter.skipRepeatsWith(equals, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Slicing | |
var slice = require('./lib/combinator/slice'); | |
exports.take = slice.take; | |
exports.skip = slice.skip; | |
exports.slice = slice.slice; | |
exports.takeWhile = slice.takeWhile; | |
exports.skipWhile = slice.skipWhile; | |
/** | |
* stream: -abcd- | |
* take(2, stream): -ab| | |
* @param {Number} n take up to this many events | |
* @returns {Stream} stream containing at most the first n items from this stream | |
*/ | |
Stream.prototype.take = function(n) { | |
return slice.take(n, this); | |
}; | |
/** | |
* stream: -abcd-> | |
* skip(2, stream): ---cd-> | |
* @param {Number} n skip this many events | |
* @returns {Stream} stream not containing the first n events | |
*/ | |
Stream.prototype.skip = function(n) { | |
return slice.skip(n, this); | |
}; | |
/** | |
* Slice a stream by event index. Equivalent to, but more efficient than | |
* stream.take(end).skip(start); | |
* NOTE: Negative start and end are not supported | |
* @param {Number} start skip all events before the start index | |
* @param {Number} end allow all events from the start index to the end index | |
* @returns {Stream} stream containing items where start <= index < end | |
*/ | |
Stream.prototype.slice = function(start, end) { | |
return slice.slice(start, end, this); | |
}; | |
/** | |
* stream: -123451234-> | |
* takeWhile(x => x < 5, stream): -1234| | |
* @param {function(x:*):boolean} p predicate | |
* @returns {Stream} stream containing items up to, but not including, the | |
* first item for which p returns falsy. | |
*/ | |
Stream.prototype.takeWhile = function(p) { | |
return slice.takeWhile(p, this); | |
}; | |
/** | |
* stream: -123451234-> | |
* skipWhile(x => x < 5, stream): -----51234-> | |
* @param {function(x:*):boolean} p predicate | |
* @returns {Stream} stream containing items following *and including* the | |
* first item for which p returns falsy. | |
*/ | |
Stream.prototype.skipWhile = function(p) { | |
return slice.skipWhile(p, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Time slicing | |
var timeslice = require('./lib/combinator/timeslice'); | |
exports.until = exports.takeUntil = timeslice.takeUntil; | |
exports.since = exports.skipUntil = timeslice.skipUntil; | |
exports.during = timeslice.during; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* signal: -------x | |
* takeUntil(signal, stream): -a-b-c-| | |
* @param {Stream} signal retain only events in stream before the first | |
* event in signal | |
* @returns {Stream} new stream containing only events that occur before | |
* the first event in signal. | |
*/ | |
Stream.prototype.until = Stream.prototype.takeUntil = function(signal) { | |
return timeslice.takeUntil(signal, this); | |
}; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* signal: -------x | |
* takeUntil(signal, stream): -------d-e-f-g-> | |
* @param {Stream} signal retain only events in stream at or after the first | |
* event in signal | |
* @returns {Stream} new stream containing only events that occur after | |
* the first event in signal. | |
*/ | |
Stream.prototype.since = Stream.prototype.skipUntil = function(signal) { | |
return timeslice.skipUntil(signal, this); | |
}; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* timeWindow: -----s | |
* s: -----t | |
* stream.during(timeWindow): -----c-d-e-| | |
* @param {Stream<Stream>} timeWindow a stream whose first event (s) represents | |
* the window start time. That event (s) is itself a stream whose first event (t) | |
* represents the window end time | |
* @returns {Stream} new stream containing only events within the provided timespan | |
*/ | |
Stream.prototype.during = function(timeWindow) { | |
return timeslice.during(timeWindow, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Delaying | |
var delay = require('./lib/combinator/delay').delay; | |
exports.delay = delay; | |
/** | |
* @param {Number} delayTime milliseconds to delay each item | |
* @returns {Stream} new stream containing the same items, but delayed by ms | |
*/ | |
Stream.prototype.delay = function(delayTime) { | |
return delay(delayTime, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Getting event timestamp | |
var timestamp = require('./lib/combinator/timestamp').timestamp; | |
exports.timestamp = timestamp; | |
/** | |
* Expose event timestamps into the stream. Turns a Stream<X> into | |
* Stream<{time:t, value:X}> | |
* @returns {Stream<{time:number, value:*}>} | |
*/ | |
Stream.prototype.timestamp = function() { | |
return timestamp(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Rate limiting | |
var limit = require('./lib/combinator/limit'); | |
exports.throttle = limit.throttle; | |
exports.debounce = limit.debounce; | |
/** | |
* Limit the rate of events | |
* stream: abcd----abcd---- | |
* throttle(2, stream): a-c-----a-c----- | |
* @param {Number} period time to suppress events | |
* @returns {Stream} new stream that skips events for throttle period | |
*/ | |
Stream.prototype.throttle = function(period) { | |
return limit.throttle(period, this); | |
}; | |
/** | |
* Wait for a burst of events to subside and emit only the last event in the burst | |
* stream: abcd----abcd---- | |
* debounce(2, stream): -----d-------d-- | |
* @param {Number} period events occuring more frequently than this | |
* on the provided scheduler will be suppressed | |
* @returns {Stream} new debounced stream | |
*/ | |
Stream.prototype.debounce = function(period) { | |
return limit.debounce(period, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Awaiting Promises | |
var promises = require('./lib/combinator/promises'); | |
exports.fromPromise = promises.fromPromise; | |
exports.await = promises.awaitPromises; | |
/** | |
* Await promises, turning a Stream<Promise<X>> into Stream<X>. Preserves | |
* event order, but timeshifts events based on promise resolution time. | |
* @returns {Stream<X>} stream containing non-promise values | |
*/ | |
Stream.prototype.await = function() { | |
return promises.awaitPromises(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Error handling | |
var errors = require('./lib/combinator/errors'); | |
exports.recoverWith = errors.flatMapError; | |
exports.flatMapError = errors.flatMapError; | |
exports.throwError = errors.throwError; | |
/** | |
* If this stream encounters an error, recover and continue with items from stream | |
* returned by f. | |
* stream: -a-b-c-X- | |
* f(X): d-e-f-g- | |
* flatMapError(f, stream): -a-b-c-d-e-f-g- | |
* @param {function(error:*):Stream} f function which returns a new stream | |
* @returns {Stream} new stream which will recover from an error by calling f | |
*/ | |
Stream.prototype.recoverWith = Stream.prototype.flatMapError = function(f) { | |
return errors.flatMapError(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Multicasting | |
var multicast = require('@most/multicast').default; | |
exports.multicast = multicast; | |
/** | |
* Transform the stream into multicast stream. That means that many subscribers | |
* to the stream will not cause multiple invocations of the internal machinery. | |
* @returns {Stream} new stream which will multicast events to all observers. | |
*/ | |
Stream.prototype.multicast = function() { | |
return multicast(this); | |
}; | |
},{"./lib/Stream":5,"./lib/combinator/accumulate":6,"./lib/combinator/applicative":7,"./lib/combinator/build":8,"./lib/combinator/combine":9,"./lib/combinator/concatMap":10,"./lib/combinator/continueWith":11,"./lib/combinator/delay":12,"./lib/combinator/errors":13,"./lib/combinator/filter":14,"./lib/combinator/flatMap":15,"./lib/combinator/limit":16,"./lib/combinator/loop":17,"./lib/combinator/merge":18,"./lib/combinator/mergeConcurrently":19,"./lib/combinator/observe":20,"./lib/combinator/promises":21,"./lib/combinator/sample":22,"./lib/combinator/slice":23,"./lib/combinator/switch":24,"./lib/combinator/thru":25,"./lib/combinator/timeslice":26,"./lib/combinator/timestamp":27,"./lib/combinator/transduce":28,"./lib/combinator/transform":29,"./lib/combinator/zip":30,"./lib/observable/subscribe":43,"./lib/source/core":57,"./lib/source/create":58,"./lib/source/from":59,"./lib/source/fromEvent":61,"./lib/source/generate":63,"./lib/source/iterate":64,"./lib/source/periodic":65,"./lib/source/unfold":67,"@most/multicast":68,"@most/prelude":69,"symbol-observable":70}]},{},[]) | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImxpYi9MaW5rZWRMaXN0LmpzIiwibGliL1Byb21pc2UuanMiLCJsaWIvUXVldWUuanMiLCJsaWIvU3RyZWFtLmpzIiwibGliL2NvbWJpbmF0b3IvYWNjdW11bGF0ZS5qcyIsImxpYi9jb21iaW5hdG9yL2FwcGxpY2F0aXZlLmpzIiwibGliL2NvbWJpbmF0b3IvYnVpbGQuanMiLCJsaWIvY29tYmluYXRvci9jb21iaW5lLmpzIiwibGliL2NvbWJpbmF0b3IvY29uY2F0TWFwLmpzIiwibGliL2NvbWJpbmF0b3IvY29udGludWVXaXRoLmpzIiwibGliL2NvbWJpbmF0b3IvZGVsYXkuanMiLCJsaWIvY29tYmluYXRvci9lcnJvcnMuanMiLCJsaWIvY29tYmluYXRvci9maWx0ZXIuanMiLCJsaWIvY29tYmluYXRvci9mbGF0TWFwLmpzIiwibGliL2NvbWJpbmF0b3IvbGltaXQuanMiLCJsaWIvY29tYmluYXRvci9sb29wLmpzIiwibGliL2NvbWJpbmF0b3IvbWVyZ2UuanMiLCJsaWIvY29tYmluYXRvci9tZXJnZUNvbmN1cnJlbnRseS5qcyIsImxpYi9jb21iaW5hdG9yL29ic2VydmUuanMiLCJsaWIvY29tYmluYXRvci9wcm9taXNlcy5qcyIsImxpYi9jb21iaW5hdG9yL3NhbXBsZS5qcyIsImxpYi9jb21iaW5hdG9yL3NsaWNlLmpzIiwibGliL2NvbWJpbmF0b3Ivc3dpdGNoLmpzIiwibGliL2NvbWJpbmF0b3IvdGhydS5qcyIsImxpYi9jb21iaW5hdG9yL3RpbWVzbGljZS5qcyIsImxpYi9jb21iaW5hdG9yL3RpbWVzdGFtcC5qcyIsImxpYi9jb21iaW5hdG9yL3RyYW5zZHVjZS5qcyIsImxpYi9jb21iaW5hdG9yL3RyYW5zZm9ybS5qcyIsImxpYi9jb21iaW5hdG9yL3ppcC5qcyIsImxpYi9kZWZlci5qcyIsImxpYi9kaXNwb3NhYmxlL0Rpc3Bvc2FibGUuanMiLCJsaWIvZGlzcG9zYWJsZS9TZXR0YWJsZURpc3Bvc2FibGUuanMiLCJsaWIvZGlzcG9zYWJsZS9kaXNwb3NlLmpzIiwibGliL2ZhdGFsRXJyb3IuanMiLCJsaWIvZnVzaW9uL0ZpbHRlci5qcyIsImxpYi9mdXNpb24vRmlsdGVyTWFwLmpzIiwibGliL2Z1c2lvbi9NYXAuanMiLCJsaWIvaW52b2tlLmpzIiwibGliL2l0ZXJhYmxlLmpzIiwibGliL29ic2VydmFibGUvZnJvbU9ic2VydmFibGUuanMiLCJsaWIvb2JzZXJ2YWJsZS9nZXRPYnNlcnZhYmxlLmpzIiwibGliL29ic2VydmFibGUvc3Vic2NyaWJlLmpzIiwibGliL3J1blNvdXJjZS5qcyIsImxpYi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzay5qcyIsImxpYi9zY2hlZHVsZXIvU2NoZWR1bGVyLmpzIiwibGliL3NjaGVkdWxlci9kZWZhdWx0U2NoZWR1bGVyLmpzIiwibGliL3NjaGVkdWxlci9ub2RlVGltZXIuanMiLCJsaWIvc2NoZWR1bGVyL3RpbWVvdXRUaW1lci5qcyIsImxpYi9zaW5rL0RlZmVycmVkU2luay5qcyIsImxpYi9zaW5rL0luZGV4U2luay5qcyIsImxpYi9zaW5rL09ic2VydmVyLmpzIiwibGliL3NpbmsvUGlwZS5qcyIsImxpYi9zaW5rL1NhZmVTaW5rLmpzIiwibGliL3NvdXJjZS9FdmVudEVtaXR0ZXJTb3VyY2UuanMiLCJsaWIvc291cmNlL0V2ZW50VGFyZ2V0U291cmNlLmpzIiwibGliL3NvdXJjZS9jb3JlLmpzIiwibGliL3NvdXJjZS9jcmVhdGUuanMiLCJsaWIvc291cmNlL2Zyb20uanMiLCJsaWIvc291cmNlL2Zyb21BcnJheS5qcyIsImxpYi9zb3VyY2UvZnJvbUV2ZW50LmpzIiwibGliL3NvdXJjZS9mcm9tSXRlcmFibGUuanMiLCJsaWIvc291cmNlL2dlbmVyYXRlLmpzIiwibGliL3NvdXJjZS9pdGVyYXRlLmpzIiwibGliL3NvdXJjZS9wZXJpb2RpYy5qcyIsImxpYi9zb3VyY2UvdHJ5RXZlbnQuanMiLCJsaWIvc291cmNlL3VuZm9sZC5qcyIsIm5vZGVfbW9kdWxlcy9AbW9zdC9tdWx0aWNhc3QvZGlzdC9tdWx0aWNhc3QuanMiLCJub2RlX21vZHVsZXMvQG1vc3QvcHJlbHVkZS9kaXN0L3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvcG9ueWZpbGwuanMiLCJtb3N0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuTXV0YXRpb25PYnNlcnZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICBpZiAoY2FuTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICB2YXIgaGlkZGVuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXVlTGlzdCA9IHF1ZXVlLnNsaWNlKCk7XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgcXVldWVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGhpZGRlbkRpdiwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaWRkZW5EaXYuc2V0QXR0cmlidXRlKCd5ZXMnLCAnbm8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmtlZExpc3Q7XG5cbi8qKlxuICogRG91Ymx5IGxpbmtlZCBsaXN0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTGlua2VkTGlzdCgpIHtcblx0dGhpcy5oZWFkID0gbnVsbDtcblx0dGhpcy5sZW5ndGggPSAwO1xufVxuXG4vKipcbiAqIEFkZCBhIG5vZGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICogQHBhcmFtIHt7cHJldjpPYmplY3R8bnVsbCwgbmV4dDpPYmplY3R8bnVsbCwgZGlzcG9zZTpmdW5jdGlvbn19IHggbm9kZSB0byBhZGRcbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oeCkge1xuXHRpZih0aGlzLmhlYWQgIT09IG51bGwpIHtcblx0XHR0aGlzLmhlYWQucHJldiA9IHg7XG5cdFx0eC5uZXh0ID0gdGhpcy5oZWFkO1xuXHR9XG5cdHRoaXMuaGVhZCA9IHg7XG5cdCsrdGhpcy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgcHJvdmlkZWQgbm9kZSBmcm9tIHRoZSBsaXN0XG4gKiBAcGFyYW0ge3twcmV2Ok9iamVjdHxudWxsLCBuZXh0Ok9iamVjdHxudWxsLCBkaXNwb3NlOmZ1bmN0aW9ufX0geCBub2RlIHRvIHJlbW92ZVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih4KSB7XG5cdC0tdGhpcy5sZW5ndGg7XG5cdGlmKHggPT09IHRoaXMuaGVhZCkge1xuXHRcdHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuXHR9XG5cdGlmKHgubmV4dCAhPT0gbnVsbCkge1xuXHRcdHgubmV4dC5wcmV2ID0geC5wcmV2O1xuXHRcdHgubmV4dCA9IG51bGw7XG5cdH1cblx0aWYoeC5wcmV2ICE9PSBudWxsKSB7XG5cdFx0eC5wcmV2Lm5leHQgPSB4Lm5leHQ7XG5cdFx0eC5wcmV2ID0gbnVsbDtcblx0fVxufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZmYgdGhlcmUgYXJlIG5vIG5vZGVzIGluIHRoZSBsaXN0XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xufTtcblxuLyoqXG4gKiBEaXNwb3NlIGFsbCBub2Rlc1xuICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCBmdWxmaWxscyB3aGVuIGFsbCBub2RlcyBoYXZlIGJlZW4gZGlzcG9zZWQsXG4gKiAgb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGlzcG9zaW5nXG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0aWYodGhpcy5pc0VtcHR5KCkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHR2YXIgcHJvbWlzZXMgPSBbXTtcblx0dmFyIHggPSB0aGlzLmhlYWQ7XG5cdHRoaXMuaGVhZCA9IG51bGw7XG5cdHRoaXMubGVuZ3RoID0gMDtcblxuXHR3aGlsZSh4ICE9PSBudWxsKSB7XG5cdFx0cHJvbWlzZXMucHVzaCh4LmRpc3Bvc2UoKSk7XG5cdFx0eCA9IHgubmV4dDtcblx0fVxuXG5cdHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbmV4cG9ydHMuaXNQcm9taXNlID0gaXNQcm9taXNlO1xuXG5mdW5jdGlvbiBpc1Byb21pc2UocCkge1xuXHRyZXR1cm4gcCAhPT0gbnVsbCAmJiB0eXBlb2YgcCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2RlcXVlXG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG5cbmZ1bmN0aW9uIFF1ZXVlKGNhcFBvdzIpIHtcblx0dGhpcy5fY2FwYWNpdHkgPSBjYXBQb3cyfHwzMjtcblx0dGhpcy5fbGVuZ3RoID0gMDtcblx0dGhpcy5faGVhZCA9IDA7XG59XG5cblF1ZXVlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIGxlbiA9IHRoaXMuX2xlbmd0aDtcblx0dGhpcy5fY2hlY2tDYXBhY2l0eShsZW4gKyAxKTtcblxuXHR2YXIgaSA9ICh0aGlzLl9oZWFkICsgbGVuKSAmICh0aGlzLl9jYXBhY2l0eSAtIDEpO1xuXHR0aGlzW2ldID0geDtcblx0dGhpcy5fbGVuZ3RoID0gbGVuICsgMTtcbn07XG5cblF1ZXVlLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuXHR2YXIgeCA9IHRoaXNbaGVhZF07XG5cblx0dGhpc1toZWFkXSA9IHZvaWQgMDtcblx0dGhpcy5faGVhZCA9IChoZWFkICsgMSkgJiAodGhpcy5fY2FwYWNpdHkgLSAxKTtcblx0dGhpcy5fbGVuZ3RoLS07XG5cdHJldHVybiB4O1xufTtcblxuUXVldWUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuX2xlbmd0aCA9PT0gMDtcbn07XG5cblF1ZXVlLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB0aGlzLl9sZW5ndGg7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUuX2NoZWNrQ2FwYWNpdHkgPSBmdW5jdGlvbiAoc2l6ZSkge1xuXHRpZiAodGhpcy5fY2FwYWNpdHkgPCBzaXplKSB7XG5cdFx0dGhpcy5fZW5zdXJlQ2FwYWNpdHkodGhpcy5fY2FwYWNpdHkgPDwgMSk7XG5cdH1cbn07XG5cblF1ZXVlLnByb3RvdHlwZS5fZW5zdXJlQ2FwYWNpdHkgPSBmdW5jdGlvbiAoY2FwYWNpdHkpIHtcblx0dmFyIG9sZENhcGFjaXR5ID0gdGhpcy5fY2FwYWNpdHk7XG5cdHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG5cblx0dmFyIGxhc3QgPSB0aGlzLl9oZWFkICsgdGhpcy5fbGVuZ3RoO1xuXG5cdGlmIChsYXN0ID4gb2xkQ2FwYWNpdHkpIHtcblx0XHRjb3B5KHRoaXMsIDAsIHRoaXMsIG9sZENhcGFjaXR5LCBsYXN0ICYgKG9sZENhcGFjaXR5IC0gMSkpO1xuXHR9XG59O1xuXG5mdW5jdGlvbiBjb3B5KHNyYywgc3JjSW5kZXgsIGRzdCwgZHN0SW5kZXgsIGxlbikge1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgKytqKSB7XG5cdFx0ZHN0W2ogKyBkc3RJbmRleF0gPSBzcmNbaiArIHNyY0luZGV4XTtcblx0XHRzcmNbaiArIHNyY0luZGV4XSA9IHZvaWQgMDtcblx0fVxufVxuXG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbmZ1bmN0aW9uIFN0cmVhbShzb3VyY2UpIHtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBydW5Tb3VyY2UgPSByZXF1aXJlKCcuLi9ydW5Tb3VyY2UnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgUHJvcGFnYXRlVGFzayA9IHJlcXVpcmUoJy4uL3NjaGVkdWxlci9Qcm9wYWdhdGVUYXNrJyk7XG5cbmV4cG9ydHMuc2NhbiA9IHNjYW47XG5leHBvcnRzLnJlZHVjZSA9IHJlZHVjZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJlYW0gY29udGFpbmluZyBzdWNjZXNzaXZlIHJlZHVjZSByZXN1bHRzIG9mIGFwcGx5aW5nIGYgdG9cbiAqIHRoZSBwcmV2aW91cyByZWR1Y2UgcmVzdWx0IGFuZCB0aGUgY3VycmVudCBzdHJlYW0gaXRlbS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ocmVzdWx0OiosIHg6Kik6Kn0gZiByZWR1Y2VyIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IGluaXRpYWwgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gdG8gc2NhblxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHN1Y2Nlc3NpdmUgcmVkdWNlIHJlc3VsdHNcbiAqL1xuZnVuY3Rpb24gc2NhbihmLCBpbml0aWFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNjYW4oZiwgaW5pdGlhbCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTY2FuKGYsIHosIHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0dGhpcy5mID0gZjtcblx0dGhpcy52YWx1ZSA9IHo7XG59XG5cblNjYW4ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgZDEgPSBzY2hlZHVsZXIuYXNhcChQcm9wYWdhdGVUYXNrLmV2ZW50KHRoaXMudmFsdWUsIHNpbmspKTtcblx0dmFyIGQyID0gdGhpcy5zb3VyY2UucnVuKG5ldyBTY2FuU2luayh0aGlzLmYsIHRoaXMudmFsdWUsIHNpbmspLCBzY2hlZHVsZXIpO1xuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW2QxLCBkMl0pO1xufTtcblxuZnVuY3Rpb24gU2NhblNpbmsoZiwgeiwgc2luaykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gejtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuU2NhblNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgZiA9IHRoaXMuZjtcblx0dGhpcy52YWx1ZSA9IGYodGhpcy52YWx1ZSwgeCk7XG5cdHRoaXMuc2luay5ldmVudCh0LCB0aGlzLnZhbHVlKTtcbn07XG5cblNjYW5TaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuU2NhblNpbmsucHJvdG90eXBlLmVuZCA9IFBpcGUucHJvdG90eXBlLmVuZDtcblxuLyoqXG4gKiBSZWR1Y2UgYSBzdHJlYW0gdG8gcHJvZHVjZSBhIHNpbmdsZSByZXN1bHQuICBOb3RlIHRoYXQgcmVkdWNpbmcgYW4gaW5maW5pdGVcbiAqIHN0cmVhbSB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCBuZXZlciBmdWxmaWxscywgYnV0IHRoYXQgbWF5IHJlamVjdCBpZiBhbiBlcnJvclxuICogb2NjdXJzLlxuICogQHBhcmFtIHtmdW5jdGlvbihyZXN1bHQ6KiwgeDoqKToqfSBmIHJlZHVjZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gaW5pdGlhbCBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRvIHJlZHVjZVxuICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIHRoZSBmaWxlIHJlc3VsdCBvZiB0aGUgcmVkdWNlXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShmLCBpbml0aWFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIHJ1blNvdXJjZS53aXRoRGVmYXVsdFNjaGVkdWxlcihub29wLCBuZXcgUmVkdWNlKGYsIGluaXRpYWwsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gUmVkdWNlKGYsIHosIHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0dGhpcy5mID0gZjtcblx0dGhpcy52YWx1ZSA9IHo7XG59XG5cblJlZHVjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFJlZHVjZVNpbmsodGhpcy5mLCB0aGlzLnZhbHVlLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFJlZHVjZVNpbmsoZiwgeiwgc2luaykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gejtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuUmVkdWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBmID0gdGhpcy5mO1xuXHR0aGlzLnZhbHVlID0gZih0aGlzLnZhbHVlLCB4KTtcblx0dGhpcy5zaW5rLmV2ZW50KHQsIHRoaXMudmFsdWUpO1xufTtcblxuUmVkdWNlU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuUmVkdWNlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCkge1xuXHR0aGlzLnNpbmsuZW5kKHQsIHRoaXMudmFsdWUpO1xufTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGNvbWJpbmUgPSByZXF1aXJlKCcuL2NvbWJpbmUnKS5jb21iaW5lO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmFwcGx5O1xuXG5leHBvcnRzLmFwICA9IGFwO1xuXG4vKipcbiAqIEFzc3VtZSBmcyBpcyBhIHN0cmVhbSBjb250YWluaW5nIGZ1bmN0aW9ucywgYW5kIGFwcGx5IHRoZSBsYXRlc3QgZnVuY3Rpb25cbiAqIGluIGZzIHRvIHRoZSBsYXRlc3QgdmFsdWUgaW4geHMuXG4gKiBmczogICAgICAgICAtLWYtLS0tLS0tLS1nLS0tLS0tLS1oLS0tLS0tPlxuICogeHM6ICAgICAgICAgLWEtLS0tLS0tYi0tLS0tLS1jLS0tLS0tLWQtLT5cbiAqIGFwKGZzLCB4cyk6IC0tZmEtLS0tLWZiLWdiLS0tZ2MtLWhjLS1oZC0+XG4gKiBAcGFyYW0ge1N0cmVhbX0gZnMgc3RyZWFtIG9mIGZ1bmN0aW9ucyB0byBhcHBseSB0byB0aGUgbGF0ZXN0IHhcbiAqIEBwYXJhbSB7U3RyZWFtfSB4cyBzdHJlYW0gb2YgdmFsdWVzIHRvIHdoaWNoIHRvIGFwcGx5IGFsbCB0aGUgbGF0ZXN0IGZcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGFsbCB0aGUgYXBwbGljYXRpb25zIG9mIGZzIHRvIHhzXG4gKi9cbmZ1bmN0aW9uIGFwKGZzLCB4cykge1xuXHRyZXR1cm4gY29tYmluZShhcHBseSwgZnMsIHhzKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgc3RyZWFtT2YgPSByZXF1aXJlKCcuLi9zb3VyY2UvY29yZScpLm9mO1xudmFyIGNvbnRpbnVlV2l0aCA9IHJlcXVpcmUoJy4vY29udGludWVXaXRoJykuY29udGludWVXaXRoO1xuXG5leHBvcnRzLmNvbmNhdCA9IGNvbmNhdDtcbmV4cG9ydHMuY3ljbGUgPSBjeWNsZTtcbmV4cG9ydHMuY29ucyA9IGNvbnM7XG5cbi8qKlxuICogQHBhcmFtIHsqfSB4IHZhbHVlIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2l0aCB4IHByZXBlbmRlZFxuICovXG5mdW5jdGlvbiBjb25zKHgsIHN0cmVhbSkge1xuXHRyZXR1cm4gY29uY2F0KHN0cmVhbU9mKHgpLCBzdHJlYW0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U3RyZWFtfSBsZWZ0XG4gKiBAcGFyYW0ge1N0cmVhbX0gcmlnaHRcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGluIGxlZnQgZm9sbG93ZWQgYnkgYWxsXG4gKiAgZXZlbnRzIGluIHJpZ2h0LiAgVGhpcyAqdGltZXNoaWZ0cyogcmlnaHQgdG8gdGhlIGVuZCBvZiBsZWZ0LlxuICovXG5mdW5jdGlvbiBjb25jYXQobGVmdCwgcmlnaHQpIHtcblx0cmV0dXJuIGNvbnRpbnVlV2l0aChmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmlnaHQ7XG5cdH0sIGxlZnQpO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBUaWUgc3RyZWFtIGludG8gYSBjaXJjbGUsIGNyZWF0aW5nIGFuIGluZmluaXRlIHN0cmVhbVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGluZmluaXRlIHN0cmVhbVxuICovXG5mdW5jdGlvbiBjeWNsZShzdHJlYW0pIHtcblx0cmV0dXJuIGNvbnRpbnVlV2l0aChmdW5jdGlvbiBjeWNsZU5leHQoKSB7XG5cdFx0cmV0dXJuIGN5Y2xlKHN0cmVhbSk7XG5cdH0sIHN0cmVhbSk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIHRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9jb3JlJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIEluZGV4U2luayA9IHJlcXVpcmUoJy4uL3NpbmsvSW5kZXhTaW5rJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGJhc2UgPSByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi4vaW52b2tlJyk7XG5cbnZhciBtYXAgPSBiYXNlLm1hcDtcbnZhciB0YWlsID0gYmFzZS50YWlsO1xuXG5leHBvcnRzLmNvbWJpbmVBcnJheSA9IGNvbWJpbmVBcnJheTtcbmV4cG9ydHMuY29tYmluZSA9IGNvbWJpbmU7XG5cbi8qKlxuICogQ29tYmluZSBsYXRlc3QgZXZlbnRzIGZyb20gYWxsIGlucHV0IHN0cmVhbXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uZXZlbnRzKToqfSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgbW9zdCByZWNlbnQgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGYgdG8gdGhlIG1vc3QgcmVjZW50XG4gKiAgZXZlbnQgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIHdoZW5ldmVyIGEgbmV3IGV2ZW50IGFycml2ZXMgb24gYW55IHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZShmIC8qLCAuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiBjb21iaW5lQXJyYXkoZiwgdGFpbChhcmd1bWVudHMpKTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIGxhdGVzdCBldmVudHMgZnJvbSBhbGwgaW5wdXQgc3RyZWFtc1xuICogQHBhcmFtIHtmdW5jdGlvbiguLi5ldmVudHMpOip9IGYgZnVuY3Rpb24gdG8gY29tYmluZSBtb3N0IHJlY2VudCBldmVudHNcbiAqIEBwYXJhbSB7W1N0cmVhbV19IHN0cmVhbXMgbW9zdCByZWNlbnQgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGYgdG8gdGhlIG1vc3QgcmVjZW50XG4gKiAgZXZlbnQgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIHdoZW5ldmVyIGEgbmV3IGV2ZW50IGFycml2ZXMgb24gYW55IHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZUFycmF5KGYsIHN0cmVhbXMpIHtcblx0dmFyIGwgPSBzdHJlYW1zLmxlbmd0aDtcblx0cmV0dXJuIGwgPT09IDAgPyBjb3JlLmVtcHR5KClcblx0XHQgOiBsID09PSAxID8gdHJhbnNmb3JtLm1hcChmLCBzdHJlYW1zWzBdKVxuXHRcdCA6IG5ldyBTdHJlYW0oY29tYmluZVNvdXJjZXMoZiwgc3RyZWFtcykpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lU291cmNlcyhmLCBzdHJlYW1zKSB7XG5cdHJldHVybiBuZXcgQ29tYmluZShmLCBtYXAoZ2V0U291cmNlLCBzdHJlYW1zKSlcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gQ29tYmluZShmLCBzb3VyY2VzKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG59XG5cbkNvbWJpbmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgbCA9IHRoaXMuc291cmNlcy5sZW5ndGg7XG5cdHZhciBkaXNwb3NhYmxlcyA9IG5ldyBBcnJheShsKTtcblx0dmFyIHNpbmtzID0gbmV3IEFycmF5KGwpO1xuXG5cdHZhciBtZXJnZVNpbmsgPSBuZXcgQ29tYmluZVNpbmsoZGlzcG9zYWJsZXMsIHNpbmtzLCBzaW5rLCB0aGlzLmYpO1xuXG5cdGZvcih2YXIgaW5kZXhTaW5rLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aW5kZXhTaW5rID0gc2lua3NbaV0gPSBuZXcgSW5kZXhTaW5rKGksIG1lcmdlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBDb21iaW5lU2luayhkaXNwb3NhYmxlcywgc2lua3MsIHNpbmssIGYpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5kaXNwb3NhYmxlcyA9IGRpc3Bvc2FibGVzO1xuXHR0aGlzLnNpbmtzID0gc2lua3M7XG5cdHRoaXMuZiA9IGY7XG5cblx0dmFyIGwgPSBzaW5rcy5sZW5ndGg7XG5cdHRoaXMuYXdhaXRpbmcgPSBsO1xuXHR0aGlzLnZhbHVlcyA9IG5ldyBBcnJheShsKTtcblx0dGhpcy5oYXNWYWx1ZSA9IG5ldyBBcnJheShsKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuXHRcdHRoaXMuaGFzVmFsdWVbaV0gPSBmYWxzZTtcblx0fVxuXG5cdHRoaXMuYWN0aXZlQ291bnQgPSBzaW5rcy5sZW5ndGg7XG59XG5cbkNvbWJpbmVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5Db21iaW5lU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCBpbmRleGVkVmFsdWUpIHtcblx0dmFyIGkgPSBpbmRleGVkVmFsdWUuaW5kZXg7XG5cdHZhciBhd2FpdGluZyA9IHRoaXMuX3VwZGF0ZVJlYWR5KGkpO1xuXG5cdHRoaXMudmFsdWVzW2ldID0gaW5kZXhlZFZhbHVlLnZhbHVlO1xuXHRpZihhd2FpdGluZyA9PT0gMCkge1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCBpbnZva2UodGhpcy5mLCB0aGlzLnZhbHVlcykpO1xuXHR9XG59O1xuXG5Db21iaW5lU2luay5wcm90b3R5cGUuX3VwZGF0ZVJlYWR5ID0gZnVuY3Rpb24oaW5kZXgpIHtcblx0aWYodGhpcy5hd2FpdGluZyA+IDApIHtcblx0XHRpZighdGhpcy5oYXNWYWx1ZVtpbmRleF0pIHtcblx0XHRcdHRoaXMuaGFzVmFsdWVbaW5kZXhdID0gdHJ1ZVxuXHRcdFx0dGhpcy5hd2FpdGluZyAtPSAxXG5cdFx0fVxuXHR9XG5cdHJldHVybiB0aGlzLmF3YWl0aW5nO1xufVxuXG5Db21iaW5lU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgaW5kZXhlZFZhbHVlKSB7XG5cdGRpc3Bvc2UudHJ5RGlzcG9zZSh0LCB0aGlzLmRpc3Bvc2FibGVzW2luZGV4ZWRWYWx1ZS5pbmRleF0sIHRoaXMuc2luayk7XG5cdGlmKC0tdGhpcy5hY3RpdmVDb3VudCA9PT0gMCkge1xuXHRcdHRoaXMuc2luay5lbmQodCwgaW5kZXhlZFZhbHVlLnZhbHVlKTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgbWVyZ2VNYXBDb25jdXJyZW50bHkgPSByZXF1aXJlKCcuL21lcmdlQ29uY3VycmVudGx5JykubWVyZ2VNYXBDb25jdXJyZW50bHk7XG5cbmV4cG9ydHMuY29uY2F0TWFwID0gY29uY2F0TWFwO1xuXG4vKipcbiAqIE1hcCBlYWNoIHZhbHVlIGluIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBjb25jYXRlbmF0ZSB0aGVtIGFsbFxuICogc3RyZWFtOiAgICAgICAgICAgICAgLWEtLS1iLS0tY1hcbiAqIGYoYSk6ICAgICAgICAgICAgICAgICAxLTEtMS0xWFxuICogZihiKTogICAgICAgICAgICAgICAgICAgICAgICAtMi0yLTItMlhcbiAqIGYoYyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy0zLTMtM1hcbiAqIHN0cmVhbS5jb25jYXRNYXAoZik6IC0xLTEtMS0xLTItMi0yLTItMy0zLTMtM1hcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpTdHJlYW19IGYgZnVuY3Rpb24gdG8gbWFwIGVhY2ggdmFsdWUgdG8gYSBzdHJlYW1cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGZyb20gZWFjaCBzdHJlYW0gcmV0dXJuZWQgYnkgZlxuICovXG5mdW5jdGlvbiBjb25jYXRNYXAoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBtZXJnZU1hcENvbmN1cnJlbnRseShmLCAxLCBzdHJlYW0pO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJy4uL1Byb21pc2UnKS5pc1Byb21pc2U7XG5cbmV4cG9ydHMuY29udGludWVXaXRoID0gY29udGludWVXaXRoO1xuXG5mdW5jdGlvbiBjb250aW51ZVdpdGgoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBDb250aW51ZVdpdGgoZiwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBDb250aW51ZVdpdGgoZiwgc291cmNlKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Db250aW51ZVdpdGgucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IENvbnRpbnVlV2l0aFNpbmsodGhpcy5mLCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIENvbnRpbnVlV2l0aFNpbmsoZiwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG59XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dGhpcy5zaW5rLmV2ZW50KHQsIHgpO1xufTtcblxuQ29udGludWVXaXRoU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlLCB0aGlzLnNpbmspO1xuXHR0aGlzLl9zdGFydE5leHQodCwgeCwgdGhpcy5zaW5rKTtcbn07XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLl9zdGFydE5leHQgPSBmdW5jdGlvbih0LCB4LCBzaW5rKSB7XG5cdHRyeSB7XG5cdFx0dGhpcy5kaXNwb3NhYmxlID0gdGhpcy5fY29udGludWUodGhpcy5mLCB4LCBzaW5rKTtcblx0fSBjYXRjaChlKSB7XG5cdFx0c2luay5lcnJvcih0LCBlKTtcblx0fVxufTtcblxuQ29udGludWVXaXRoU2luay5wcm90b3R5cGUuX2NvbnRpbnVlID0gZnVuY3Rpb24oZiwgeCwgc2luaykge1xuXHRyZXR1cm4gZih4KS5zb3VyY2UucnVuKHNpbmssIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLmRlbGF5ID0gZGVsYXk7XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5VGltZSBtaWxsaXNlY29uZHMgdG8gZGVsYXkgZWFjaCBpdGVtXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHNhbWUgaXRlbXMsIGJ1dCBkZWxheWVkIGJ5IG1zXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KGRlbGF5VGltZSwgc3RyZWFtKSB7XG5cdHJldHVybiBkZWxheVRpbWUgPD0gMCA/IHN0cmVhbVxuXHRcdCA6IG5ldyBTdHJlYW0obmV3IERlbGF5KGRlbGF5VGltZSwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBEZWxheShkdCwgc291cmNlKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkRlbGF5LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGRlbGF5U2luayA9IG5ldyBEZWxheVNpbmsodGhpcy5kdCwgc2luaywgc2NoZWR1bGVyKTtcblx0cmV0dXJuIGRpc3Bvc2UuYWxsKFtkZWxheVNpbmssIHRoaXMuc291cmNlLnJ1bihkZWxheVNpbmssIHNjaGVkdWxlcildKTtcbn07XG5cbmZ1bmN0aW9uIERlbGF5U2luayhkdCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG59XG5cbkRlbGF5U2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdHRoaXMuc2NoZWR1bGVyLmNhbmNlbEFsbChmdW5jdGlvbih0YXNrKSB7XG5cdFx0cmV0dXJuIHRhc2suc2luayA9PT0gc2VsZi5zaW5rO1xuXHR9KTtcbn07XG5cbkRlbGF5U2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHRoaXMuc2NoZWR1bGVyLmRlbGF5KHRoaXMuZHQsIFByb3BhZ2F0ZVRhc2suZXZlbnQoeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWxheVNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5zY2hlZHVsZXIuZGVsYXkodGhpcy5kdCwgUHJvcGFnYXRlVGFzay5lbmQoeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWxheVNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFNhZmVTaW5rID0gcmVxdWlyZSgnLi4vc2luay9TYWZlU2luaycpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgdHJ5RXZlbnQgPSByZXF1aXJlKCcuLi9zb3VyY2UvdHJ5RXZlbnQnKTtcbnZhciBpc1Byb21pc2UgPSByZXF1aXJlKCcuLi9Qcm9taXNlJykuaXNQcm9taXNlO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLmZsYXRNYXBFcnJvciA9IHJlY292ZXJXaXRoO1xuZXhwb3J0cy5yZWNvdmVyV2l0aCAgPSByZWNvdmVyV2l0aDtcbmV4cG9ydHMudGhyb3dFcnJvciAgID0gdGhyb3dFcnJvcjtcblxuLyoqXG4gKiBJZiBzdHJlYW0gZW5jb3VudGVycyBhbiBlcnJvciwgcmVjb3ZlciBhbmQgY29udGludWUgd2l0aCBpdGVtcyBmcm9tIHN0cmVhbVxuICogcmV0dXJuZWQgYnkgZi5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZXJyb3I6Kik6U3RyZWFtfSBmIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBuZXcgc3RyZWFtXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIHdoaWNoIHdpbGwgcmVjb3ZlciBmcm9tIGFuIGVycm9yIGJ5IGNhbGxpbmcgZlxuICovXG5mdW5jdGlvbiByZWNvdmVyV2l0aChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFJlY292ZXJXaXRoKGYsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJlYW0gY29udGFpbmluZyBvbmx5IGFuIGVycm9yXG4gKiBAcGFyYW0geyp9IGUgZXJyb3IgdmFsdWUsIHByZWZlcmFibHkgYW4gRXJyb3Igb3IgRXJyb3Igc3VidHlwZVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIG9ubHkgYW4gZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dFcnJvcihlKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBFcnJvclNvdXJjZShlKSk7XG59XG5cbmZ1bmN0aW9uIEVycm9yU291cmNlKGUpIHtcblx0dGhpcy52YWx1ZSA9IGU7XG59XG5cbkVycm9yU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHNjaGVkdWxlci5hc2FwKG5ldyBQcm9wYWdhdGVUYXNrKHJ1bkVycm9yLCB0aGlzLnZhbHVlLCBzaW5rKSk7XG59O1xuXG5mdW5jdGlvbiBydW5FcnJvcih0LCBlLCBzaW5rKSB7XG5cdHNpbmsuZXJyb3IodCwgZSk7XG59XG5cbmZ1bmN0aW9uIFJlY292ZXJXaXRoKGYsIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuUmVjb3ZlcldpdGgucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFJlY292ZXJXaXRoU2luayh0aGlzLmYsIHRoaXMuc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gUmVjb3ZlcldpdGhTaW5rKGYsIHNvdXJjZSwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IG5ldyBTYWZlU2luayhzaW5rKTtcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0XHR0cnlFdmVudC50cnlFdmVudCh0LCB4LCB0aGlzLnNpbmspO1xufVxuXG5SZWNvdmVyV2l0aFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0XHR0cnlFdmVudC50cnlFbmQodCwgeCwgdGhpcy5zaW5rKTtcbn1cblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dmFyIG5leHRTaW5rID0gdGhpcy5zaW5rLmRpc2FibGUoKTtcblxuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlLCB0aGlzLnNpbmspO1xuXHR0aGlzLl9zdGFydE5leHQodCwgZSwgbmV4dFNpbmspO1xufTtcblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5fc3RhcnROZXh0ID0gZnVuY3Rpb24odCwgeCwgc2luaykge1xuXHR0cnkge1xuXHRcdHRoaXMuZGlzcG9zYWJsZSA9IHRoaXMuX2NvbnRpbnVlKHRoaXMuZiwgeCwgc2luayk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHNpbmsuZXJyb3IodCwgZSk7XG5cdH1cbn07XG5cblJlY292ZXJXaXRoU2luay5wcm90b3R5cGUuX2NvbnRpbnVlID0gZnVuY3Rpb24oZiwgeCwgc2luaykge1xuXHR2YXIgc3RyZWFtID0gZih4KTtcblx0cmV0dXJuIHN0cmVhbS5zb3VyY2UucnVuKHNpbmssIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cblJlY292ZXJXaXRoU2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBGaWx0ZXIgPSByZXF1aXJlKCcuLi9mdXNpb24vRmlsdGVyJyk7XG5cbmV4cG9ydHMuZmlsdGVyID0gZmlsdGVyO1xuZXhwb3J0cy5za2lwUmVwZWF0cyA9IHNraXBSZXBlYXRzO1xuZXhwb3J0cy5za2lwUmVwZWF0c1dpdGggPSBza2lwUmVwZWF0c1dpdGg7XG5cbi8qKlxuICogUmV0YWluIG9ubHkgaXRlbXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpib29sZWFufSBwIGZpbHRlcmluZyBwcmVkaWNhdGUgY2FsbGVkIGZvciBlYWNoIGl0ZW1cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHRvIGZpbHRlclxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgb25seSBpdGVtcyBmb3Igd2hpY2ggcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5XG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihwLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0oRmlsdGVyLmNyZWF0ZShwLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMsIHVzaW5nID09PSB0byBkZXRlY3QgZHVwbGljYXRlc1xuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gZnJvbSB3aGljaCB0byBvbWl0IHJlcGVhdGVkIGV2ZW50c1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIHdpdGhvdXQgcmVwZWF0ZWQgZXZlbnRzXG4gKi9cbmZ1bmN0aW9uIHNraXBSZXBlYXRzKHN0cmVhbSkge1xuXHRyZXR1cm4gc2tpcFJlcGVhdHNXaXRoKHNhbWUsIHN0cmVhbSk7XG59XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMgdXNpbmcgdGhlIHByb3ZpZGVkIGVxdWFscyBmdW5jdGlvbiB0byBkZXRlY3QgZHVwbGljYXRlc1xuICogQHBhcmFtIHtmdW5jdGlvbihhOiosIGI6Kik6Ym9vbGVhbn0gZXF1YWxzIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNvbXBhcmUgaXRlbXNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIGZyb20gd2hpY2ggdG8gb21pdCByZXBlYXRlZCBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSB3aXRob3V0IHJlcGVhdGVkIGV2ZW50c1xuICovXG5mdW5jdGlvbiBza2lwUmVwZWF0c1dpdGgoZXF1YWxzLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNraXBSZXBlYXRzKGVxdWFscywgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTa2lwUmVwZWF0cyhlcXVhbHMsIHNvdXJjZSkge1xuXHR0aGlzLmVxdWFscyA9IGVxdWFscztcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNraXBSZXBlYXRzLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgU2tpcFJlcGVhdHNTaW5rKHRoaXMuZXF1YWxzLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFNraXBSZXBlYXRzU2luayhlcXVhbHMsIHNpbmspIHtcblx0dGhpcy5lcXVhbHMgPSBlcXVhbHM7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMudmFsdWUgPSB2b2lkIDA7XG5cdHRoaXMuaW5pdCA9IHRydWU7XG59XG5cblNraXBSZXBlYXRzU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5Ta2lwUmVwZWF0c1NpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblNraXBSZXBlYXRzU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuaW5pdCkge1xuXHRcdHRoaXMuaW5pdCA9IGZhbHNlO1xuXHRcdHRoaXMudmFsdWUgPSB4O1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCB4KTtcblx0fSBlbHNlIGlmKCF0aGlzLmVxdWFscyh0aGlzLnZhbHVlLCB4KSkge1xuXHRcdHRoaXMudmFsdWUgPSB4O1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCB4KTtcblx0fVxufTtcblxuZnVuY3Rpb24gc2FtZShhLCBiKSB7XG5cdHJldHVybiBhID09PSBiO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBtZXJnZUNvbmN1cnJlbnRseSA9IHJlcXVpcmUoJy4vbWVyZ2VDb25jdXJyZW50bHknKS5tZXJnZUNvbmN1cnJlbnRseTtcbnZhciBtZXJnZU1hcENvbmN1cnJlbnRseSA9IHJlcXVpcmUoJy4vbWVyZ2VDb25jdXJyZW50bHknKS5tZXJnZU1hcENvbmN1cnJlbnRseTtcblxuZXhwb3J0cy5mbGF0TWFwID0gZmxhdE1hcDtcbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbi8qKlxuICogTWFwIGVhY2ggdmFsdWUgaW4gdGhlIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBtZXJnZSBpdCBpbnRvIHRoZVxuICogcmV0dXJuZWQgb3V0ZXIgc3RyZWFtLiBFdmVudCBhcnJpdmFsIHRpbWVzIGFyZSBwcmVzZXJ2ZWQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGNoYWluaW5nIGZ1bmN0aW9uLCBtdXN0IHJldHVybiBhIFN0cmVhbVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgZnJvbSBlYWNoIHN0cmVhbSByZXR1cm5lZCBieSBmXG4gKi9cbmZ1bmN0aW9uIGZsYXRNYXAoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBtZXJnZU1hcENvbmN1cnJlbnRseShmLCBJbmZpbml0eSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBNb25hZGljIGpvaW4uIEZsYXR0ZW4gYSBTdHJlYW08U3RyZWFtPFg+PiB0byBTdHJlYW08WD4gYnkgbWVyZ2luZyBpbm5lclxuICogc3RyZWFtcyB0byB0aGUgb3V0ZXIuIEV2ZW50IGFycml2YWwgdGltZXMgYXJlIHByZXNlcnZlZC5cbiAqIEBwYXJhbSB7U3RyZWFtPFN0cmVhbTxYPj59IHN0cmVhbSBzdHJlYW0gb2Ygc3RyZWFtc1xuICogQHJldHVybnMge1N0cmVhbTxYPn0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgb2YgYWxsIGlubmVyIHN0cmVhbXNcbiAqL1xuZnVuY3Rpb24gam9pbihzdHJlYW0pIHtcblx0cmV0dXJuIG1lcmdlQ29uY3VycmVudGx5KEluZmluaXR5LCBzdHJlYW0pO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xudmFyIE1hcCA9IHJlcXVpcmUoJy4uL2Z1c2lvbi9NYXAnKTtcblxuZXhwb3J0cy50aHJvdHRsZSA9IHRocm90dGxlO1xuZXhwb3J0cy5kZWJvdW5jZSA9IGRlYm91bmNlO1xuXG4vKipcbiAqIExpbWl0IHRoZSByYXRlIG9mIGV2ZW50cyBieSBzdXBwcmVzc2luZyBldmVudHMgdGhhdCBvY2N1ciB0b28gb2Z0ZW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgdGltZSB0byBzdXBwcmVzcyBldmVudHNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKHBlcmlvZCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKHRocm90dGxlU291cmNlKHBlcmlvZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZVNvdXJjZShwZXJpb2QsIHNvdXJjZSkge1xuXHRyZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gY29tbXV0ZU1hcFRocm90dGxlKHBlcmlvZCwgc291cmNlKVxuXHRcdDogc291cmNlIGluc3RhbmNlb2YgVGhyb3R0bGUgPyBmdXNlVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpXG5cdFx0OiBuZXcgVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpXG59XG5cbmZ1bmN0aW9uIGNvbW11dGVNYXBUaHJvdHRsZShwZXJpb2QsIHNvdXJjZSkge1xuXHRyZXR1cm4gTWFwLmNyZWF0ZShzb3VyY2UuZiwgdGhyb3R0bGVTb3VyY2UocGVyaW9kLCBzb3VyY2Uuc291cmNlKSlcbn1cblxuZnVuY3Rpb24gZnVzZVRocm90dGxlKHBlcmlvZCwgc291cmNlKSB7XG5cdHJldHVybiBuZXcgVGhyb3R0bGUoTWF0aC5tYXgocGVyaW9kLCBzb3VyY2UucGVyaW9kKSwgc291cmNlLnNvdXJjZSlcbn1cblxuZnVuY3Rpb24gVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpIHtcblx0dGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UaHJvdHRsZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFRocm90dGxlU2luayh0aGlzLnBlcmlvZCwgc2luayksIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBUaHJvdHRsZVNpbmsocGVyaW9kLCBzaW5rKSB7XG5cdHRoaXMudGltZSA9IDA7XG5cdHRoaXMucGVyaW9kID0gcGVyaW9kO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5UaHJvdHRsZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0ID49IHRoaXMudGltZSkge1xuXHRcdHRoaXMudGltZSA9IHQgKyB0aGlzLnBlcmlvZDtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH1cbn07XG5cblRocm90dGxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5cblRocm90dGxlU2luay5wcm90b3R5cGUuZXJyb3IgPSBTaW5rLnByb3RvdHlwZS5lcnJvcjtcblxuLyoqXG4gKiBXYWl0IGZvciBhIGJ1cnN0IG9mIGV2ZW50cyB0byBzdWJzaWRlIGFuZCBlbWl0IG9ubHkgdGhlIGxhc3QgZXZlbnQgaW4gdGhlIGJ1cnN0XG4gKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIGV2ZW50cyBvY2N1cmluZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiB0aGlzXG4gKiAgd2lsbCBiZSBzdXBwcmVzc2VkXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHN0cmVhbSB0byBkZWJvdW5jZVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGRlYm91bmNlZCBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UocGVyaW9kLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IERlYm91bmNlKHBlcmlvZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBEZWJvdW5jZShkdCwgc291cmNlKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkRlYm91bmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBEZWJvdW5jZVNpbmsodGhpcy5kdCwgdGhpcy5zb3VyY2UsIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBEZWJvdW5jZVNpbmsoZHQsIHNvdXJjZSwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMudmFsdWUgPSB2b2lkIDA7XG5cdHRoaXMudGltZXIgPSBudWxsO1xuXG5cdHZhciBzb3VyY2VEaXNwb3NhYmxlID0gc291cmNlLnJ1bih0aGlzLCBzY2hlZHVsZXIpO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLmFsbChbdGhpcywgc291cmNlRGlzcG9zYWJsZV0pO1xufVxuXG5EZWJvdW5jZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9jbGVhclRpbWVyKCk7XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLnRpbWVyID0gdGhpcy5zY2hlZHVsZXIuZGVsYXkodGhpcy5kdCwgUHJvcGFnYXRlVGFzay5ldmVudCh4LCB0aGlzLnNpbmspKTtcbn07XG5cbkRlYm91bmNlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0aGlzLl9jbGVhclRpbWVyKCkpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgdGhpcy52YWx1ZSk7XG5cdFx0dGhpcy52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHR0aGlzLnNpbmsuZW5kKHQsIHgpO1xufTtcblxuRGVib3VuY2VTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5fY2xlYXJUaW1lcigpO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgeCk7XG59O1xuXG5EZWJvdW5jZVNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5fY2xlYXJUaW1lcigpO1xufTtcblxuRGVib3VuY2VTaW5rLnByb3RvdHlwZS5fY2xlYXJUaW1lciA9IGZ1bmN0aW9uKCkge1xuXHRpZih0aGlzLnRpbWVyID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRoaXMudGltZXIuZGlzcG9zZSgpO1xuXHR0aGlzLnRpbWVyID0gbnVsbDtcblx0cmV0dXJuIHRydWU7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBQaXBlID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG5cbmV4cG9ydHMubG9vcCA9IGxvb3A7XG5cbi8qKlxuICogR2VuZXJhbGl6ZWQgZmVlZGJhY2sgbG9vcC4gQ2FsbCBhIHN0ZXBwZXIgZnVuY3Rpb24gZm9yIGVhY2ggZXZlbnQuIFRoZSBzdGVwcGVyXG4gKiB3aWxsIGJlIGNhbGxlZCB3aXRoIDIgcGFyYW1zOiB0aGUgY3VycmVudCBzZWVkIGFuZCB0aGUgYW4gZXZlbnQgdmFsdWUuICBJdCBtdXN0XG4gKiByZXR1cm4gYSBuZXcgeyBzZWVkLCB2YWx1ZSB9IHBhaXIuIFRoZSBgc2VlZGAgd2lsbCBiZSBmZWQgYmFjayBpbnRvIHRoZSBuZXh0XG4gKiBpbnZvY2F0aW9uIG9mIHN0ZXBwZXIsIGFuZCB0aGUgYHZhbHVlYCB3aWxsIGJlIHByb3BhZ2F0ZWQgYXMgdGhlIGV2ZW50IHZhbHVlLlxuICogQHBhcmFtIHtmdW5jdGlvbihzZWVkOiosIHZhbHVlOiopOntzZWVkOiosIHZhbHVlOip9fSBzdGVwcGVyIGxvb3Agc3RlcCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBzZWVkIGluaXRpYWwgc2VlZCB2YWx1ZSBwYXNzZWQgdG8gZmlyc3Qgc3RlcHBlciBjYWxsXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIGV2ZW50IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBgdmFsdWVgIGZpZWxkIG9mIHRoZSBvYmplY3RzXG4gKiByZXR1cm5lZCBieSB0aGUgc3RlcHBlclxuICovXG5mdW5jdGlvbiBsb29wKHN0ZXBwZXIsIHNlZWQsIHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgTG9vcChzdGVwcGVyLCBzZWVkLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIExvb3Aoc3RlcHBlciwgc2VlZCwgc291cmNlKSB7XG5cdHRoaXMuc3RlcCA9IHN0ZXBwZXI7XG5cdHRoaXMuc2VlZCA9IHNlZWQ7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Mb29wLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgTG9vcFNpbmsodGhpcy5zdGVwLCB0aGlzLnNlZWQsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gTG9vcFNpbmsoc3RlcHBlciwgc2VlZCwgc2luaykge1xuXHR0aGlzLnN0ZXAgPSBzdGVwcGVyO1xuXHR0aGlzLnNlZWQgPSBzZWVkO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5Mb29wU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuTG9vcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgcmVzdWx0ID0gdGhpcy5zdGVwKHRoaXMuc2VlZCwgeCk7XG5cdHRoaXMuc2VlZCA9IHJlc3VsdC5zZWVkO1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgcmVzdWx0LnZhbHVlKTtcbn07XG5cbkxvb3BTaW5rLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0KSB7XG5cdHRoaXMuc2luay5lbmQodCwgdGhpcy5zZWVkKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBJbmRleFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL0luZGV4U2luaycpO1xudmFyIGVtcHR5ID0gcmVxdWlyZSgnLi4vc291cmNlL2NvcmUnKS5lbXB0eTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcblxudmFyIGNvcHkgPSBiYXNlLmNvcHk7XG52YXIgcmVkdWNlID0gYmFzZS5yZWR1Y2U7XG5cbmV4cG9ydHMubWVyZ2UgPSBtZXJnZTtcbmV4cG9ydHMubWVyZ2VBcnJheSA9IG1lcmdlQXJyYXk7XG5cbi8qKlxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgZXZlbnRzIGZyb20gYWxsIHN0cmVhbXMgaW4gdGhlIGFyZ3VtZW50XG4gKiBsaXN0IGluIHRpbWUgb3JkZXIuICBJZiB0d28gZXZlbnRzIGFyZSBzaW11bHRhbmVvdXMgdGhleSB3aWxsIGJlIG1lcmdlZCBpblxuICogYXJiaXRyYXJ5IG9yZGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZSgvKi4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gbWVyZ2VBcnJheShjb3B5KGFyZ3VtZW50cykpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHN0cmVhbXMgYXJyYXkgb2Ygc3RyZWFtIHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBldmVudHMgZnJvbSBhbGwgaW5wdXQgb2JzZXJ2YWJsZXNcbiAqIGluIHRpbWUgb3JkZXIuICBJZiB0d28gZXZlbnRzIGFyZSBzaW11bHRhbmVvdXMgdGhleSB3aWxsIGJlIG1lcmdlZCBpblxuICogYXJiaXRyYXJ5IG9yZGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZUFycmF5KHN0cmVhbXMpIHtcbiAgICB2YXIgbCA9IHN0cmVhbXMubGVuZ3RoO1xuICAgIHJldHVybiBsID09PSAwID8gZW1wdHkoKVxuXHRcdCA6IGwgPT09IDEgPyBzdHJlYW1zWzBdXG5cdFx0IDogbmV3IFN0cmVhbShtZXJnZVNvdXJjZXMoc3RyZWFtcykpO1xufVxuXG4vKipcbiAqIFRoaXMgaW1wbGVtZW50cyBmdXNpb24vZmxhdHRlbmluZyBmb3IgbWVyZ2UuICBJdCB3aWxsXG4gKiBmdXNlIGFkamFjZW50IG1lcmdlIG9wZXJhdGlvbnMuICBGb3IgZXhhbXBsZTpcbiAqIC0gYS5tZXJnZShiKS5tZXJnZShjKSBlZmZlY3RpdmVseSBiZWNvbWVzIG1lcmdlKGEsIGIsIGMpXG4gKiAtIG1lcmdlKGEsIG1lcmdlKGIsIGMpKSBlZmZlY3RpdmVseSBiZWNvbWVzIG1lcmdlKGEsIGIsIGMpXG4gKiBJdCBkb2VzIHRoaXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgc291cmNlcyBhcnJheXMgb2ZcbiAqIGFueSBuZXN0ZWQgTWVyZ2Ugc291cmNlcywgaW4gZWZmZWN0IFwiZmxhdHRlbmluZ1wiIG5lc3RlZFxuICogbWVyZ2Ugb3BlcmF0aW9ucyBpbnRvIGEgc2luZ2xlIG1lcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNvdXJjZXMoc3RyZWFtcykge1xuXHRyZXR1cm4gbmV3IE1lcmdlKHJlZHVjZShhcHBlbmRTb3VyY2VzLCBbXSwgc3RyZWFtcykpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZFNvdXJjZXMoc291cmNlcywgc3RyZWFtKSB7XG5cdHZhciBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHRyZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWVyZ2Vcblx0XHQ/IHNvdXJjZXMuY29uY2F0KHNvdXJjZS5zb3VyY2VzKVxuXHRcdDogc291cmNlcy5jb25jYXQoc291cmNlKVxufVxuXG5mdW5jdGlvbiBNZXJnZShzb3VyY2VzKSB7XG5cdHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG59XG5cbk1lcmdlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCk7XG5cdHZhciBzaW5rcyA9IG5ldyBBcnJheShsKTtcblxuXHR2YXIgbWVyZ2VTaW5rID0gbmV3IE1lcmdlU2luayhkaXNwb3NhYmxlcywgc2lua3MsIHNpbmspO1xuXG5cdGZvcih2YXIgaW5kZXhTaW5rLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aW5kZXhTaW5rID0gc2lua3NbaV0gPSBuZXcgSW5kZXhTaW5rKGksIG1lcmdlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBNZXJnZVNpbmsoZGlzcG9zYWJsZXMsIHNpbmtzLCBzaW5rKSB7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZXMgPSBkaXNwb3NhYmxlcztcblx0dGhpcy5hY3RpdmVDb3VudCA9IHNpbmtzLmxlbmd0aDtcbn1cblxuTWVyZ2VTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5NZXJnZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgaW5kZXhWYWx1ZSkge1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgaW5kZXhWYWx1ZS52YWx1ZSk7XG59O1xuXG5NZXJnZVNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIGluZGV4ZWRWYWx1ZSkge1xuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlc1tpbmRleGVkVmFsdWUuaW5kZXhdLCB0aGlzLnNpbmspO1xuXHRpZigtLXRoaXMuYWN0aXZlQ291bnQgPT09IDApIHtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIGluZGV4ZWRWYWx1ZS52YWx1ZSk7XG5cdH1cbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBMaW5rZWRMaXN0ID0gcmVxdWlyZSgnLi4vTGlua2VkTGlzdCcpO1xudmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmlkO1xuXG5leHBvcnRzLm1lcmdlQ29uY3VycmVudGx5ID0gbWVyZ2VDb25jdXJyZW50bHk7XG5leHBvcnRzLm1lcmdlTWFwQ29uY3VycmVudGx5ID0gbWVyZ2VNYXBDb25jdXJyZW50bHk7XG5cbmZ1bmN0aW9uIG1lcmdlQ29uY3VycmVudGx5KGNvbmN1cnJlbmN5LCBzdHJlYW0pIHtcblx0cmV0dXJuIG1lcmdlTWFwQ29uY3VycmVudGx5KGlkZW50aXR5LCBjb25jdXJyZW5jeSwgc3RyZWFtKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgTWVyZ2VDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gTWVyZ2VDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5NZXJnZUNvbmN1cnJlbnRseS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgT3V0ZXIodGhpcy5mLCB0aGlzLmNvbmN1cnJlbmN5LCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIE91dGVyKGYsIGNvbmN1cnJlbmN5LCBzb3VyY2UsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLnBlbmRpbmcgPSBbXTtcblx0dGhpcy5jdXJyZW50ID0gbmV3IExpbmtlZExpc3QoKTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuT3V0ZXIucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9hZGRJbm5lcih0LCB4KTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5fYWRkSW5uZXIgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuY3VycmVudC5sZW5ndGggPCB0aGlzLmNvbmN1cnJlbmN5KSB7XG5cdFx0dGhpcy5fc3RhcnRJbm5lcih0LCB4KTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnBlbmRpbmcucHVzaCh4KTtcblx0fVxufTtcblxuT3V0ZXIucHJvdG90eXBlLl9zdGFydElubmVyID0gZnVuY3Rpb24odCwgeCkge1xuXHR0cnkge1xuXHRcdHRoaXMuX2luaXRJbm5lcih0LCB4KTtcblx0fSBjYXRjaChlKSB7XG5cdFx0dGhpcy5lcnJvcih0LCBlKTtcblx0fVxufTtcblxuT3V0ZXIucHJvdG90eXBlLl9pbml0SW5uZXIgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBpbm5lclNpbmsgPSBuZXcgSW5uZXIodCwgdGhpcywgdGhpcy5zaW5rKTtcblx0aW5uZXJTaW5rLmRpc3Bvc2FibGUgPSBtYXBBbmRSdW4odGhpcy5mLCB4LCBpbm5lclNpbmssIHRoaXMuc2NoZWR1bGVyKTtcblx0dGhpcy5jdXJyZW50LmFkZChpbm5lclNpbmspO1xufVxuXG5mdW5jdGlvbiBtYXBBbmRSdW4oZiwgeCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBmKHgpLnNvdXJjZS5ydW4oc2luaywgc2NoZWR1bGVyKTtcbn1cblxuT3V0ZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0ZGlzcG9zZS50cnlEaXNwb3NlKHQsIHRoaXMuZGlzcG9zYWJsZSwgdGhpcy5zaW5rKTtcblx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG59O1xuXG5PdXRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuc2luay5lcnJvcih0LCBlKTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMucGVuZGluZy5sZW5ndGggPSAwO1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCksIHRoaXMuY3VycmVudC5kaXNwb3NlKCldKTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5fZW5kSW5uZXIgPSBmdW5jdGlvbih0LCB4LCBpbm5lcikge1xuXHR0aGlzLmN1cnJlbnQucmVtb3ZlKGlubmVyKTtcblx0ZGlzcG9zZS50cnlEaXNwb3NlKHQsIGlubmVyLCB0aGlzKTtcblxuXHRpZih0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5fc3RhcnRJbm5lcih0LCB0aGlzLnBlbmRpbmcuc2hpZnQoKSk7XG5cdH1cbn07XG5cbk91dGVyLnByb3RvdHlwZS5fY2hlY2tFbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSAmJiB0aGlzLmN1cnJlbnQuaXNFbXB0eSgpKSB7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuZnVuY3Rpb24gSW5uZXIodGltZSwgb3V0ZXIsIHNpbmspIHtcblx0dGhpcy5wcmV2ID0gdGhpcy5uZXh0ID0gbnVsbDtcblx0dGhpcy50aW1lID0gdGltZTtcblx0dGhpcy5vdXRlciA9IG91dGVyO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSB2b2lkIDA7XG59XG5cbklubmVyLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5zaW5rLmV2ZW50KE1hdGgubWF4KHQsIHRoaXMudGltZSksIHgpO1xufTtcblxuSW5uZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5vdXRlci5fZW5kSW5uZXIoTWF0aC5tYXgodCwgdGhpcy50aW1lKSwgeCwgdGhpcyk7XG59O1xuXG5Jbm5lci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMub3V0ZXIuZXJyb3IoTWF0aC5tYXgodCwgdGhpcy50aW1lKSwgZSk7XG59O1xuXG5Jbm5lci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIHJ1blNvdXJjZSA9IHJlcXVpcmUoJy4uL3J1blNvdXJjZScpO1xuXG5leHBvcnRzLm9ic2VydmUgPSBvYnNlcnZlO1xuZXhwb3J0cy5kcmFpbiA9IGRyYWluO1xuXG4vKipcbiAqIE9ic2VydmUgYWxsIHRoZSBldmVudCB2YWx1ZXMgaW4gdGhlIHN0cmVhbSBpbiB0aW1lIG9yZGVyLiBUaGVcbiAqIHByb3ZpZGVkIGZ1bmN0aW9uIGBmYCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBldmVudCB2YWx1ZVxuICogQHBhcmFtIHtmdW5jdGlvbih4OlQpOip9IGYgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIGVhY2ggZXZlbnQgdmFsdWVcbiAqIEBwYXJhbSB7U3RyZWFtPFQ+fSBzdHJlYW0gc3RyZWFtIHRvIG9ic2VydmVcbiAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBmdWxmaWxscyBhZnRlciB0aGUgc3RyZWFtIGVuZHMgd2l0aG91dFxuICogIGFuIGVycm9yLCBvciByZWplY3RzIGlmIHRoZSBzdHJlYW0gZW5kcyB3aXRoIGFuIGVycm9yLlxuICovXG5mdW5jdGlvbiBvYnNlcnZlKGYsIHN0cmVhbSkge1xuXHRyZXR1cm4gcnVuU291cmNlLndpdGhEZWZhdWx0U2NoZWR1bGVyKGYsIHN0cmVhbS5zb3VyY2UpO1xufVxuXG4vKipcbiAqIFwiUnVuXCIgYSBzdHJlYW0gYnlcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGRyYWluKHN0cmVhbSkge1xuXHRyZXR1cm4gcnVuU291cmNlLndpdGhEZWZhdWx0U2NoZWR1bGVyKG5vb3AsIHN0cmVhbS5zb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZmF0YWwgPSByZXF1aXJlKCcuLi9mYXRhbEVycm9yJyk7XG52YXIganVzdCA9IHJlcXVpcmUoJy4uL3NvdXJjZS9jb3JlJykub2Y7XG5cbmV4cG9ydHMuZnJvbVByb21pc2UgPSBmcm9tUHJvbWlzZTtcbmV4cG9ydHMuYXdhaXRQcm9taXNlcyA9IGF3YWl0UHJvbWlzZXM7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyZWFtIGNvbnRhaW5pbmcgb25seSB0aGUgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gKiB2YWx1ZSBhdCB0aGUgdGltZSBpdCBmdWxmaWxscy5cbiAqIEBwYXJhbSB7UHJvbWlzZTxUPn0gcCBwcm9taXNlXG4gKiBAcmV0dXJuIHtTdHJlYW08VD59IHN0cmVhbSBjb250YWluaW5nIHByb21pc2UncyBmdWxmaWxsbWVudCB2YWx1ZS5cbiAqICBJZiB0aGUgcHJvbWlzZSByZWplY3RzLCB0aGUgc3RyZWFtIHdpbGwgZXJyb3JcbiAqL1xuZnVuY3Rpb24gZnJvbVByb21pc2UocCkge1xuXHRyZXR1cm4gYXdhaXRQcm9taXNlcyhqdXN0KHApKTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgU3RyZWFtPFByb21pc2U8VD4+IGludG8gU3RyZWFtPFQ+IGJ5IGF3YWl0aW5nIGVhY2ggcHJvbWlzZS5cbiAqIEV2ZW50IG9yZGVyIGlzIHByZXNlcnZlZC5cbiAqIEBwYXJhbSB7U3RyZWFtPFByb21pc2U8VD4+fSBzdHJlYW1cbiAqIEByZXR1cm4ge1N0cmVhbTxUPn0gc3RyZWFtIG9mIGZ1bGZpbGxtZW50IHZhbHVlcy4gIFRoZSBzdHJlYW0gd2lsbFxuICogZXJyb3IgaWYgYW55IHByb21pc2UgcmVqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXdhaXRQcm9taXNlcyhzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IEF3YWl0KHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gQXdhaXQoc291cmNlKSB7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Bd2FpdC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEF3YWl0U2luayhzaW5rLCBzY2hlZHVsZXIpLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gQXdhaXRTaW5rKHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5xdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0Ly8gUHJlLWNyZWF0ZSBjbG9zdXJlcywgdG8gYXZvaWQgY3JlYXRpbmcgdGhlbSBwZXIgZXZlbnRcblx0dGhpcy5fZXZlbnRCb3VuZCA9IGZ1bmN0aW9uKHgpIHtcblx0XHRzZWxmLnNpbmsuZXZlbnQoc2VsZi5zY2hlZHVsZXIubm93KCksIHgpO1xuXHR9O1xuXG5cdHRoaXMuX2VuZEJvdW5kID0gZnVuY3Rpb24oeCkge1xuXHRcdHNlbGYuc2luay5lbmQoc2VsZi5zY2hlZHVsZXIubm93KCksIHgpO1xuXHR9O1xuXG5cdHRoaXMuX2Vycm9yQm91bmQgPSBmdW5jdGlvbihlKSB7XG5cdFx0c2VsZi5zaW5rLmVycm9yKHNlbGYuc2NoZWR1bGVyLm5vdygpLCBlKTtcblx0fTtcbn1cblxuQXdhaXRTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHByb21pc2UpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZWxmLl9ldmVudChwcm9taXNlKTtcblx0fSkuY2F0Y2godGhpcy5fZXJyb3JCb3VuZCk7XG59O1xuXG5Bd2FpdFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZWxmLl9lbmQoeCk7XG5cdH0pLmNhdGNoKHRoaXMuX2Vycm9yQm91bmQpO1xufTtcblxuQXdhaXRTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHQvLyBEb24ndCByZXNvbHZlIGVycm9yIHZhbHVlcywgcHJvcGFnYXRlIGRpcmVjdGx5XG5cdHRoaXMucXVldWUgPSB0aGlzLnF1ZXVlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNlbGYuX2Vycm9yQm91bmQoZSk7XG5cdH0pLmNhdGNoKGZhdGFsKTtcbn07XG5cbkF3YWl0U2luay5wcm90b3R5cGUuX2V2ZW50ID0gZnVuY3Rpb24ocHJvbWlzZSkge1xuXHRyZXR1cm4gcHJvbWlzZS50aGVuKHRoaXMuX2V2ZW50Qm91bmQpO1xufTtcblxuQXdhaXRTaW5rLnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4odGhpcy5fZW5kQm91bmQpO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4uL2ludm9rZScpO1xuXG5leHBvcnRzLnNhbXBsZSA9IHNhbXBsZTtcbmV4cG9ydHMuc2FtcGxlV2l0aCA9IHNhbXBsZVdpdGg7XG5leHBvcnRzLnNhbXBsZUFycmF5ID0gc2FtcGxlQXJyYXk7XG5cbi8qKlxuICogV2hlbiBhbiBldmVudCBhcnJpdmVzIG9uIHNhbXBsZXIsIGVtaXQgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGYgd2l0aCB0aGUgbGF0ZXN0XG4gKiB2YWx1ZXMgb2YgYWxsIHN0cmVhbXMgYmVpbmcgc2FtcGxlZFxuICogQHBhcmFtIHtmdW5jdGlvbiguLi52YWx1ZXMpOip9IGYgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzZXQgb2Ygc2FtcGxlZCB2YWx1ZXNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzYW1wbGVyIHN0cmVhbXMgd2lsbCBiZSBzYW1wbGVkIHdoZW5ldmVyIGFuIGV2ZW50IGFycml2ZXNcbiAqICBvbiBzYW1wbGVyXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gb2Ygc2FtcGxlZCBhbmQgdHJhbnNmb3JtZWQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHNhbXBsZShmLCBzYW1wbGVyIC8qLCAuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiBzYW1wbGVBcnJheShmLCBzYW1wbGVyLCBiYXNlLmRyb3AoMiwgYXJndW1lbnRzKSk7XG59XG5cbi8qKlxuICogV2hlbiBhbiBldmVudCBhcnJpdmVzIG9uIHNhbXBsZXIsIGVtaXQgdGhlIGxhdGVzdCBldmVudCB2YWx1ZSBmcm9tIHN0cmVhbS5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzYW1wbGVyIHN0cmVhbSBvZiBldmVudHMgYXQgd2hvc2UgYXJyaXZhbCB0aW1lXG4gKiAgc3RyZWFtJ3MgbGF0ZXN0IHZhbHVlIHdpbGwgYmUgcHJvcGFnYXRlZFxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gb2YgdmFsdWVzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzYW1wbGVkIHN0cmVhbSBvZiB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gc2FtcGxlV2l0aChzYW1wbGVyLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNhbXBsZXIoYmFzZS5pZCwgc2FtcGxlci5zb3VyY2UsIFtzdHJlYW0uc291cmNlXSkpO1xufVxuXG5mdW5jdGlvbiBzYW1wbGVBcnJheShmLCBzYW1wbGVyLCBzdHJlYW1zKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTYW1wbGVyKGYsIHNhbXBsZXIuc291cmNlLCBiYXNlLm1hcChnZXRTb3VyY2UsIHN0cmVhbXMpKSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZShzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zb3VyY2U7XG59XG5cbmZ1bmN0aW9uIFNhbXBsZXIoZiwgc2FtcGxlciwgc291cmNlcykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNhbXBsZXIgPSBzYW1wbGVyO1xuXHR0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xufVxuXG5TYW1wbGVyLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCsxKTtcblx0dmFyIHNpbmtzID0gbmV3IEFycmF5KGwpO1xuXG5cdHZhciBzYW1wbGVTaW5rID0gbmV3IFNhbXBsZVNpbmsodGhpcy5mLCBzaW5rcywgc2luayk7XG5cblx0Zm9yKHZhciBob2xkLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aG9sZCA9IHNpbmtzW2ldID0gbmV3IEhvbGQoc2FtcGxlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGhvbGQsIHNjaGVkdWxlcik7XG5cdH1cblxuXHRkaXNwb3NhYmxlc1tpXSA9IHRoaXMuc2FtcGxlci5ydW4oc2FtcGxlU2luaywgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoZGlzcG9zYWJsZXMpO1xufTtcblxuZnVuY3Rpb24gSG9sZChzaW5rKSB7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbn1cblxuSG9sZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcblx0dGhpcy5zaW5rLl9ub3RpZnkodGhpcyk7XG59O1xuXG5Ib2xkLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTtcbkhvbGQucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cbmZ1bmN0aW9uIFNhbXBsZVNpbmsoZiwgc2lua3MsIHNpbmspIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zaW5rcyA9IHNpbmtzO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xufVxuXG5TYW1wbGVTaW5rLnByb3RvdHlwZS5fbm90aWZ5ID0gZnVuY3Rpb24oKSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHRoaXMuYWN0aXZlID0gdGhpcy5zaW5rcy5ldmVyeShoYXNWYWx1ZSk7XG5cdH1cbn07XG5cblNhbXBsZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCkge1xuXHRpZih0aGlzLmFjdGl2ZSkge1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCBpbnZva2UodGhpcy5mLCBiYXNlLm1hcChnZXRWYWx1ZSwgdGhpcy5zaW5rcykpKTtcblx0fVxufTtcblxuU2FtcGxlU2luay5wcm90b3R5cGUuZW5kID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuU2FtcGxlU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuZnVuY3Rpb24gaGFzVmFsdWUoaG9sZCkge1xuXHRyZXR1cm4gaG9sZC5oYXNWYWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoaG9sZCkge1xuXHRyZXR1cm4gaG9sZC52YWx1ZTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuLi9zb3VyY2UvY29yZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBNYXAgPSByZXF1aXJlKCcuLi9mdXNpb24vTWFwJyk7XG5cbmV4cG9ydHMudGFrZSA9IHRha2U7XG5leHBvcnRzLnNraXAgPSBza2lwO1xuZXhwb3J0cy5zbGljZSA9IHNsaWNlO1xuZXhwb3J0cy50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG5leHBvcnRzLnNraXBXaGlsZSA9IHNraXBXaGlsZTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIG9ubHkgdXAgdG8gdGhlIGZpcnN0IG4gaXRlbXMgZnJvbSBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gdGFrZShuLCBzdHJlYW0pIHtcblx0cmV0dXJuIHNsaWNlKDAsIG4sIHN0cmVhbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2l0aCB0aGUgZmlyc3QgbiBpdGVtcyByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIHNraXAobiwgc3RyZWFtKSB7XG5cdHJldHVybiBzbGljZShuLCBJbmZpbml0eSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBTbGljZSBhIHN0cmVhbSBieSBpbmRleC4gTmVnYXRpdmUgc3RhcnQvZW5kIGluZGV4ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgaXRlbXMgd2hlcmUgc3RhcnQgPD0gaW5kZXggPCBlbmRcbiAqL1xuZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCwgc3RyZWFtKSB7XG5cdHJldHVybiBlbmQgPD0gc3RhcnQgPyBjb3JlLmVtcHR5KClcblx0XHQ6IG5ldyBTdHJlYW0oc2xpY2VTb3VyY2Uoc3RhcnQsIGVuZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBzbGljZVNvdXJjZShzdGFydCwgZW5kLCBzb3VyY2UpIHtcblx0cmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IGNvbW11dGVNYXBTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpXG5cdFx0OiBzb3VyY2UgaW5zdGFuY2VvZiBTbGljZSA/IGZ1c2VTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpXG5cdFx0OiBuZXcgU2xpY2Uoc3RhcnQsIGVuZCwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gY29tbXV0ZU1hcFNsaWNlKHN0YXJ0LCBlbmQsIHNvdXJjZSkge1xuXHRyZXR1cm4gTWFwLmNyZWF0ZShzb3VyY2UuZiwgc2xpY2VTb3VyY2Uoc3RhcnQsIGVuZCwgc291cmNlLnNvdXJjZSkpXG59XG5cbmZ1bmN0aW9uIGZ1c2VTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpIHtcblx0c3RhcnQgKz0gc291cmNlLm1pbjtcblx0ZW5kID0gTWF0aC5taW4oZW5kICsgc291cmNlLm1pbiwgc291cmNlLm1heCk7XG5cdHJldHVybiBuZXcgU2xpY2Uoc3RhcnQsIGVuZCwgc291cmNlLnNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIFNsaWNlKG1pbiwgbWF4LCBzb3VyY2UpIHtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdHRoaXMubWluID0gbWluO1xuXHR0aGlzLm1heCA9IG1heDtcbn1cblxuU2xpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFNsaWNlU2luayh0aGlzLm1pbiwgdGhpcy5tYXggLSB0aGlzLm1pbiwgdGhpcy5zb3VyY2UsIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBTbGljZVNpbmsoc2tpcCwgdGFrZSwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5za2lwID0gc2tpcDtcblx0dGhpcy50YWtlID0gdGFrZTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG59XG5cblNsaWNlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5TbGljZVNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblNsaWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuc2tpcCA+IDApIHtcblx0XHR0aGlzLnNraXAgLT0gMTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZih0aGlzLnRha2UgPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLnRha2UgLT0gMTtcblx0dGhpcy5zaW5rLmV2ZW50KHQsIHgpO1xuXHRpZih0aGlzLnRha2UgPT09IDApIHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIHgpO1xuXHR9XG59O1xuXG5TbGljZVNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiB0YWtlV2hpbGUocCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBUYWtlV2hpbGUocCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBUYWtlV2hpbGUocCwgc291cmNlKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UYWtlV2hpbGUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFRha2VXaGlsZVNpbmsodGhpcy5wLCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRha2VXaGlsZVNpbmsocCwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLm9uY2Uoc291cmNlLnJ1bih0aGlzLCBzY2hlZHVsZXIpKTtcbn1cblxuVGFrZVdoaWxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5UYWtlV2hpbGVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFNpbmsucHJvdG90eXBlLmVycm9yO1xuXG5UYWtlV2hpbGVTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHAgPSB0aGlzLnA7XG5cdHRoaXMuYWN0aXZlID0gcCh4KTtcblx0aWYodGhpcy5hY3RpdmUpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5kaXNwb3NlKCk7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuVGFrZVdoaWxlU2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG5cbmZ1bmN0aW9uIHNraXBXaGlsZShwLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNraXBXaGlsZShwLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIFNraXBXaGlsZShwLCBzb3VyY2UpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNraXBXaGlsZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFNraXBXaGlsZVNpbmsodGhpcy5wLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFNraXBXaGlsZVNpbmsocCwgc2luaykge1xuXHR0aGlzLnAgPSBwO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNraXBwaW5nID0gdHJ1ZTtcbn1cblxuU2tpcFdoaWxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5Ta2lwV2hpbGVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFNpbmsucHJvdG90eXBlLmVycm9yO1xuXG5Ta2lwV2hpbGVTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodGhpcy5za2lwcGluZykge1xuXHRcdHZhciBwID0gdGhpcy5wO1xuXHRcdHRoaXMuc2tpcHBpbmcgPSBwKHgpO1xuXHRcdGlmKHRoaXMuc2tpcHBpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG5cbmV4cG9ydHMuc3dpdGNoID0gc3dpdGNoTGF0ZXN0O1xuXG4vKipcbiAqIEdpdmVuIGEgc3RyZWFtIG9mIHN0cmVhbXMsIHJldHVybiBhIG5ldyBzdHJlYW0gdGhhdCBhZG9wdHMgdGhlIGJlaGF2aW9yXG4gKiBvZiB0aGUgbW9zdCByZWNlbnQgaW5uZXIgc3RyZWFtLlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBvZiBzdHJlYW1zIG9uIHdoaWNoIHRvIHN3aXRjaFxuICogQHJldHVybnMge1N0cmVhbX0gc3dpdGNoaW5nIHN0cmVhbVxuICovXG5mdW5jdGlvbiBzd2l0Y2hMYXRlc3Qoc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTd2l0Y2goc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTd2l0Y2goc291cmNlKSB7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Td2l0Y2gucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgc3dpdGNoU2luayA9IG5ldyBTd2l0Y2hTaW5rKHNpbmssIHNjaGVkdWxlcik7XG5cdHJldHVybiBkaXNwb3NlLmFsbChzd2l0Y2hTaW5rLCB0aGlzLnNvdXJjZS5ydW4oc3dpdGNoU2luaywgc2NoZWR1bGVyKSk7XG59O1xuXG5mdW5jdGlvbiBTd2l0Y2hTaW5rKHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5jdXJyZW50ID0gbnVsbDtcblx0dGhpcy5lbmRlZCA9IGZhbHNlO1xufVxuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHN0cmVhbSkge1xuXHR0aGlzLl9kaXNwb3NlQ3VycmVudCh0KTsgLy8gVE9ETzogY2FwdHVyZSB0aGUgcmVzdWx0IG9mIHRoaXMgZGlzcG9zZVxuXHR0aGlzLmN1cnJlbnQgPSBuZXcgU2VnbWVudCh0LCBJbmZpbml0eSwgdGhpcywgdGhpcy5zaW5rKTtcblx0dGhpcy5jdXJyZW50LmRpc3Bvc2FibGUgPSBzdHJlYW0uc291cmNlLnJ1bih0aGlzLmN1cnJlbnQsIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cblN3aXRjaFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5lbmRlZCA9IHRydWU7XG5cdHRoaXMuX2NoZWNrRW5kKHQsIHgpO1xufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuZW5kZWQgPSB0cnVlO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLl9kaXNwb3NlQ3VycmVudCgwKTtcbn07XG5cblN3aXRjaFNpbmsucHJvdG90eXBlLl9kaXNwb3NlQ3VycmVudCA9IGZ1bmN0aW9uKHQpIHtcblx0aWYodGhpcy5jdXJyZW50ICE9PSBudWxsKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3VycmVudC5fZGlzcG9zZSh0KTtcblx0fVxufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuX2Rpc3Bvc2VJbm5lciA9IGZ1bmN0aW9uKHQsIGlubmVyKSB7XG5cdGlubmVyLl9kaXNwb3NlKHQpOyAvLyBUT0RPOiBjYXB0dXJlIHRoZSByZXN1bHQgb2YgdGhpcyBkaXNwb3NlXG5cdGlmKGlubmVyID09PSB0aGlzLmN1cnJlbnQpIHtcblx0XHR0aGlzLmN1cnJlbnQgPSBudWxsO1xuXHR9XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5fY2hlY2tFbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuZW5kZWQgJiYgdGhpcy5jdXJyZW50ID09PSBudWxsKSB7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuX2VuZElubmVyID0gZnVuY3Rpb24odCwgeCwgaW5uZXIpIHtcblx0dGhpcy5fZGlzcG9zZUlubmVyKHQsIGlubmVyKTtcblx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5fZXJyb3JJbm5lciA9IGZ1bmN0aW9uKHQsIGUsIGlubmVyKSB7XG5cdHRoaXMuX2Rpc3Bvc2VJbm5lcih0LCBpbm5lcik7XG5cdHRoaXMuc2luay5lcnJvcih0LCBlKTtcbn07XG5cbmZ1bmN0aW9uIFNlZ21lbnQobWluLCBtYXgsIG91dGVyLCBzaW5rKSB7XG5cdHRoaXMubWluID0gbWluO1xuXHR0aGlzLm1heCA9IG1heDtcblx0dGhpcy5vdXRlciA9IG91dGVyO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLmVtcHR5KCk7XG59XG5cblNlZ21lbnQucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0IDwgdGhpcy5tYXgpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQoTWF0aC5tYXgodCwgdGhpcy5taW4pLCB4KTtcblx0fVxufTtcblxuU2VnbWVudC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLm91dGVyLl9lbmRJbm5lcihNYXRoLm1heCh0LCB0aGlzLm1pbiksIHgsIHRoaXMpO1xufTtcblxuU2VnbWVudC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMub3V0ZXIuX2Vycm9ySW5uZXIoTWF0aC5tYXgodCwgdGhpcy5taW4pLCBlLCB0aGlzKTtcbn07XG5cblNlZ21lbnQucHJvdG90eXBlLl9kaXNwb3NlID0gZnVuY3Rpb24odCkge1xuXHR0aGlzLm1heCA9IHQ7XG5cdGRpc3Bvc2UudHJ5RGlzcG9zZSh0LCB0aGlzLmRpc3Bvc2FibGUsIHRoaXMuc2luaylcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuZXhwb3J0cy50aHJ1ID0gZnVuY3Rpb24gdGhydShmLCBzdHJlYW0pIHtcblx0cmV0dXJuIGYoc3RyZWFtKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBqb2luID0gcmVxdWlyZSgnLi4vY29tYmluYXRvci9mbGF0TWFwJykuam9pbjtcblxuZXhwb3J0cy5kdXJpbmcgICAgPSBkdXJpbmc7XG5leHBvcnRzLnRha2VVbnRpbCA9IHRha2VVbnRpbDtcbmV4cG9ydHMuc2tpcFVudGlsID0gc2tpcFVudGlsO1xuXG5mdW5jdGlvbiB0YWtlVW50aWwoc2lnbmFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFVudGlsKHNpZ25hbC5zb3VyY2UsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc2tpcFVudGlsKHNpZ25hbCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTaW5jZShzaWduYWwuc291cmNlLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIGR1cmluZyh0aW1lV2luZG93LCBzdHJlYW0pIHtcblx0cmV0dXJuIHRha2VVbnRpbChqb2luKHRpbWVXaW5kb3cpLCBza2lwVW50aWwodGltZVdpbmRvdywgc3RyZWFtKSk7XG59XG5cbmZ1bmN0aW9uIFVudGlsKG1heFNpZ25hbCwgc291cmNlKSB7XG5cdHRoaXMubWF4U2lnbmFsID0gbWF4U2lnbmFsO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuVW50aWwucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgbWluID0gbmV3IEJvdW5kKC1JbmZpbml0eSwgc2luayk7XG5cdHZhciBtYXggPSBuZXcgVXBwZXJCb3VuZCh0aGlzLm1heFNpZ25hbCwgc2luaywgc2NoZWR1bGVyKTtcblx0dmFyIGRpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4obmV3IFRpbWVXaW5kb3dTaW5rKG1pbiwgbWF4LCBzaW5rKSwgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW21pbiwgbWF4LCBkaXNwb3NhYmxlXSk7XG59O1xuXG5mdW5jdGlvbiBTaW5jZShtaW5TaWduYWwsIHNvdXJjZSkge1xuXHR0aGlzLm1pblNpZ25hbCA9IG1pblNpZ25hbDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNpbmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIG1pbiA9IG5ldyBMb3dlckJvdW5kKHRoaXMubWluU2lnbmFsLCBzaW5rLCBzY2hlZHVsZXIpO1xuXHR2YXIgbWF4ID0gbmV3IEJvdW5kKEluZmluaXR5LCBzaW5rKTtcblx0dmFyIGRpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4obmV3IFRpbWVXaW5kb3dTaW5rKG1pbiwgbWF4LCBzaW5rKSwgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW21pbiwgbWF4LCBkaXNwb3NhYmxlXSk7XG59O1xuXG5mdW5jdGlvbiBCb3VuZCh2YWx1ZSwgc2luaykge1xuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkJvdW5kLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuQm91bmQucHJvdG90eXBlLmV2ZW50ID0gbm9vcDtcbkJvdW5kLnByb3RvdHlwZS5lbmQgPSBub29wO1xuQm91bmQucHJvdG90eXBlLmRpc3Bvc2UgPSBub29wO1xuXG5mdW5jdGlvbiBUaW1lV2luZG93U2luayhtaW4sIG1heCwgc2luaykge1xuXHR0aGlzLm1pbiA9IG1pbjtcblx0dGhpcy5tYXggPSBtYXg7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cblRpbWVXaW5kb3dTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodCA+PSB0aGlzLm1pbi52YWx1ZSAmJiB0IDwgdGhpcy5tYXgudmFsdWUpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH1cbn07XG5cblRpbWVXaW5kb3dTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuVGltZVdpbmRvd1NpbmsucHJvdG90eXBlLmVuZCA9IFBpcGUucHJvdG90eXBlLmVuZDtcblxuZnVuY3Rpb24gTG93ZXJCb3VuZChzaWduYWwsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnZhbHVlID0gSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNpZ25hbC5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuTG93ZXJCb3VuZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0IC8qLCB4ICovKSB7XG5cdGlmKHQgPCB0aGlzLnZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHQ7XG5cdH1cbn07XG5cbkxvd2VyQm91bmQucHJvdG90eXBlLmVuZCA9IG5vb3A7XG5Mb3dlckJvdW5kLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5Mb3dlckJvdW5kLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmRpc3Bvc2FibGUuZGlzcG9zZSgpO1xufTtcblxuZnVuY3Rpb24gVXBwZXJCb3VuZChzaWduYWwsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnZhbHVlID0gSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNpZ25hbC5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuVXBwZXJCb3VuZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHQgPCB0aGlzLnZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHQ7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuVXBwZXJCb3VuZC5wcm90b3R5cGUuZW5kID0gbm9vcDtcblVwcGVyQm91bmQucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cblVwcGVyQm91bmQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xuXG5leHBvcnRzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdGltZXN0YW1wKHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgVGltZXN0YW1wKHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gVGltZXN0YW1wKHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuVGltZXN0YW1wLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgVGltZXN0YW1wU2luayhzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRpbWVzdGFtcFNpbmsoc2luaykge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5UaW1lc3RhbXBTaW5rLnByb3RvdHlwZS5lbmQgICA9IFNpbmsucHJvdG90eXBlLmVuZDtcblRpbWVzdGFtcFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblRpbWVzdGFtcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgeyB0aW1lOiB0LCB2YWx1ZTogeCB9KTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xuXG5leHBvcnRzLnRyYW5zZHVjZSA9IHRyYW5zZHVjZTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBzdHJlYW0gYnkgcGFzc2luZyBpdHMgZXZlbnRzIHRocm91Z2ggYSB0cmFuc2R1Y2VyLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IHRyYW5zZHVjZXIgdHJhbnNkdWNlciBmdW5jdGlvblxuICogQHBhcmFtICB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHdob3NlIGV2ZW50cyB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogIHRyYW5zZHVjZXJcbiAqIEByZXR1cm4ge1N0cmVhbX0gc3RyZWFtIG9mIGV2ZW50cyB0cmFuc2Zvcm1lZCBieSB0aGUgdHJhbnNkdWNlclxuICovXG5mdW5jdGlvbiB0cmFuc2R1Y2UodHJhbnNkdWNlciwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBUcmFuc2R1Y2UodHJhbnNkdWNlciwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBUcmFuc2R1Y2UodHJhbnNkdWNlciwgc291cmNlKSB7XG5cdHRoaXMudHJhbnNkdWNlciA9IHRyYW5zZHVjZXI7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UcmFuc2R1Y2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgeGYgPSB0aGlzLnRyYW5zZHVjZXIobmV3IFRyYW5zZm9ybWVyKHNpbmspKTtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgVHJhbnNkdWNlU2luayhnZXRUeEhhbmRsZXIoeGYpLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRyYW5zZHVjZVNpbmsoYWRhcHRlciwgc2luaykge1xuXHR0aGlzLnhmID0gYWRhcHRlcjtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuVHJhbnNkdWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBuZXh0ID0gdGhpcy54Zi5zdGVwKHQsIHgpO1xuXG5cdHJldHVybiB0aGlzLnhmLmlzUmVkdWNlZChuZXh0KVxuXHRcdD8gdGhpcy5zaW5rLmVuZCh0LCB0aGlzLnhmLmdldFJlc3VsdChuZXh0KSlcblx0XHQ6IG5leHQ7XG59O1xuXG5UcmFuc2R1Y2VTaW5rLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnhmLnJlc3VsdCh4KTtcbn07XG5cblRyYW5zZHVjZVNpbmsucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHRyZXR1cm4gdGhpcy5zaW5rLmVycm9yKHQsIGUpO1xufTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtZXIoc2luaykge1xuXHR0aGlzLnRpbWUgPSAtSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFRyYW5zZm9ybWVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7fTtcblxuVHJhbnNmb3JtZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gVHJhbnNmb3JtZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCFpc05hTih0KSkge1xuXHRcdHRoaXMudGltZSA9IE1hdGgubWF4KHQsIHRoaXMudGltZSk7XG5cdH1cblx0cmV0dXJuIHRoaXMuc2luay5ldmVudCh0aGlzLnRpbWUsIHgpO1xufTtcblxuVHJhbnNmb3JtZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBUcmFuc2Zvcm1lci5wcm90b3R5cGUucmVzdWx0ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdGhpcy5zaW5rLmVuZCh0aGlzLnRpbWUsIHgpO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3Qgc3VwcG9ydGluZyB0aGUgbmV3IG9yIGxlZ2FjeSB0cmFuc2R1Y2VyIHByb3RvY29sLFxuICogY3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGl0LlxuICogQHBhcmFtIHtvYmplY3R9IHR4IHRyYW5zZm9ybVxuICogQHJldHVybnMge1R4QWRhcHRlcnxMZWdhY3lUeEFkYXB0ZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFR4SGFuZGxlcih0eCkge1xuXHRyZXR1cm4gdHlwZW9mIHR4WydAQHRyYW5zZHVjZXIvc3RlcCddID09PSAnZnVuY3Rpb24nXG5cdFx0PyBuZXcgVHhBZGFwdGVyKHR4KVxuXHRcdDogbmV3IExlZ2FjeVR4QWRhcHRlcih0eCk7XG59XG5cbi8qKlxuICogQWRhcHRlciBmb3IgbmV3IG9mZmljaWFsIHRyYW5zZHVjZXIgcHJvdG9jb2xcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eCB0cmFuc2Zvcm1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUeEFkYXB0ZXIodHgpIHtcblx0dGhpcy50eCA9IHR4O1xufVxuXG5UeEFkYXB0ZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnR4WydAQHRyYW5zZHVjZXIvc3RlcCddKHQsIHgpO1xufTtcblR4QWRhcHRlci5wcm90b3R5cGUucmVzdWx0ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdGhpcy50eFsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHgpO1xufTtcblR4QWRhcHRlci5wcm90b3R5cGUuaXNSZWR1Y2VkID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4geCAhPSBudWxsICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ107XG59O1xuVHhBZGFwdGVyLnByb3RvdHlwZS5nZXRSZXN1bHQgPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiB4WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbn07XG5cbi8qKlxuICogQWRhcHRlciBmb3Igb2xkZXIgdHJhbnNkdWNlciBwcm90b2NvbFxuICogQHBhcmFtIHtvYmplY3R9IHR4IHRyYW5zZm9ybVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIExlZ2FjeVR4QWRhcHRlcih0eCkge1xuXHR0aGlzLnR4ID0gdHg7XG59XG5cbkxlZ2FjeVR4QWRhcHRlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0cmV0dXJuIHRoaXMudHguc3RlcCh0LCB4KTtcbn07XG5MZWdhY3lUeEFkYXB0ZXIucHJvdG90eXBlLnJlc3VsdCA9IGZ1bmN0aW9uKHgpIHtcblx0cmV0dXJuIHRoaXMudHgucmVzdWx0KHgpO1xufTtcbkxlZ2FjeVR4QWRhcHRlci5wcm90b3R5cGUuaXNSZWR1Y2VkID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4geCAhPSBudWxsICYmIHguX190cmFuc2R1Y2Vyc19yZWR1Y2VkX187XG59O1xuTGVnYWN5VHhBZGFwdGVyLnByb3RvdHlwZS5nZXRSZXN1bHQgPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiB4LnZhbHVlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTWFwID0gcmVxdWlyZSgnLi4vZnVzaW9uL01hcCcpO1xuXG5leHBvcnRzLm1hcCA9IG1hcDtcbmV4cG9ydHMuY29uc3RhbnQgPSBjb25zdGFudDtcbmV4cG9ydHMudGFwID0gdGFwO1xuXG4vKipcbiAqIFRyYW5zZm9ybSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gYnkgYXBwbHlpbmcgZiB0byBlYWNoXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCopOip9IGYgbWFwcGluZyBmdW5jdGlvblxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gdG8gbWFwXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyB0cmFuc2Zvcm1lZCBieSBmXG4gKi9cbmZ1bmN0aW9uIG1hcChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0oTWFwLmNyZWF0ZShmLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gd2l0aCB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHJlcGxhY2VkIHdpdGggeFxuICovXG5mdW5jdGlvbiBjb25zdGFudCh4LCBzdHJlYW0pIHtcblx0cmV0dXJuIG1hcChmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4geDtcblx0fSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtIGEgc2lkZSBlZmZlY3QgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RyZWFtXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6Kn0gZiBzaWRlIGVmZmVjdCB0byBleGVjdXRlIGZvciBlYWNoIGl0ZW0uIFRoZVxuICogIHJldHVybiB2YWx1ZSB3aWxsIGJlIGRpc2NhcmRlZC5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHRvIHRhcFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zIGFzIHRoaXMgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIHRhcChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG1hcChmdW5jdGlvbih4KSB7XG5cdFx0Zih4KTtcblx0XHRyZXR1cm4geDtcblx0fSwgc3RyZWFtKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgdHJhbnNmb3JtID0gcmVxdWlyZSgnLi90cmFuc2Zvcm0nKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi4vc291cmNlL2NvcmUnKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgSW5kZXhTaW5rID0gcmVxdWlyZSgnLi4vc2luay9JbmRleFNpbmsnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuLi9pbnZva2UnKTtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL1F1ZXVlJyk7XG5cbnZhciBtYXAgPSBiYXNlLm1hcDtcbnZhciB0YWlsID0gYmFzZS50YWlsO1xuXG5leHBvcnRzLnppcCA9IHppcDtcbmV4cG9ydHMuemlwQXJyYXkgPSB6aXBBcnJheTtcblxuLyoqXG4gKiBDb21iaW5lIHN0cmVhbXMgcGFpcndpc2UgKG9yIHR1cGxlLXdpc2UpIGJ5IGluZGV4IGJ5IGFwcGx5aW5nIGYgdG8gdmFsdWVzXG4gKiBhdCBjb3JyZXNwb25kaW5nIGluZGljZXMuICBUaGUgcmV0dXJuZWQgc3RyZWFtIGVuZHMgd2hlbiBhbnkgb2YgdGhlIGlucHV0XG4gKiBzdHJlYW1zIGVuZHMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgdmFsdWVzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIHdpdGggaXRlbXMgYXQgY29ycmVzcG9uZGluZyBpbmRpY2VzIGNvbWJpbmVkXG4gKiAgdXNpbmcgZlxuICovXG5mdW5jdGlvbiB6aXAoZiAvKiwuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiB6aXBBcnJheShmLCB0YWlsKGFyZ3VtZW50cykpO1xufVxuXG4vKipcbiAqIENvbWJpbmUgc3RyZWFtcyBwYWlyd2lzZSAob3IgdHVwbGUtd2lzZSkgYnkgaW5kZXggYnkgYXBwbHlpbmcgZiB0byB2YWx1ZXNcbiAqIGF0IGNvcnJlc3BvbmRpbmcgaW5kaWNlcy4gIFRoZSByZXR1cm5lZCBzdHJlYW0gZW5kcyB3aGVuIGFueSBvZiB0aGUgaW5wdXRcbiAqIHN0cmVhbXMgZW5kcy5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgZnVuY3Rpb24gdG8gY29tYmluZSB2YWx1ZXNcbiAqIEBwYXJhbSB7W1N0cmVhbV19IHN0cmVhbXMgc3RyZWFtcyB0byB6aXAgdXNpbmcgZlxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aXRoIGl0ZW1zIGF0IGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBjb21iaW5lZFxuICogIHVzaW5nIGZcbiAqL1xuZnVuY3Rpb24gemlwQXJyYXkoZiwgc3RyZWFtcykge1xuXHRyZXR1cm4gc3RyZWFtcy5sZW5ndGggPT09IDAgPyBjb3JlLmVtcHR5KClcblx0XHQgOiBzdHJlYW1zLmxlbmd0aCA9PT0gMSA/IHRyYW5zZm9ybS5tYXAoZiwgc3RyZWFtc1swXSlcblx0XHQgOiBuZXcgU3RyZWFtKG5ldyBaaXAoZiwgbWFwKGdldFNvdXJjZSwgc3RyZWFtcykpKTtcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gWmlwKGYsIHNvdXJjZXMpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zb3VyY2VzID0gc291cmNlcztcbn1cblxuWmlwLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCk7XG5cdHZhciBzaW5rcyA9IG5ldyBBcnJheShsKTtcblx0dmFyIGJ1ZmZlcnMgPSBuZXcgQXJyYXkobCk7XG5cblx0dmFyIHppcFNpbmsgPSBuZXcgWmlwU2luayh0aGlzLmYsIGJ1ZmZlcnMsIHNpbmtzLCBzaW5rKTtcblxuXHRmb3IodmFyIGluZGV4U2luaywgaT0wOyBpPGw7ICsraSkge1xuXHRcdGJ1ZmZlcnNbaV0gPSBuZXcgUXVldWUoKTtcblx0XHRpbmRleFNpbmsgPSBzaW5rc1tpXSA9IG5ldyBJbmRleFNpbmsoaSwgemlwU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBaaXBTaW5rKGYsIGJ1ZmZlcnMsIHNpbmtzLCBzaW5rKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2lua3MgPSBzaW5rcztcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5idWZmZXJzID0gYnVmZmVycztcbn1cblxuWmlwU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCBpbmRleGVkVmFsdWUpIHtcblx0dmFyIGJ1ZmZlcnMgPSB0aGlzLmJ1ZmZlcnM7XG5cdHZhciBidWZmZXIgPSBidWZmZXJzW2luZGV4ZWRWYWx1ZS5pbmRleF07XG5cblx0YnVmZmVyLnB1c2goaW5kZXhlZFZhbHVlLnZhbHVlKTtcblxuXHRpZihidWZmZXIubGVuZ3RoKCkgPT09IDEpIHtcblx0XHRpZighcmVhZHkodGhpcy5idWZmZXJzKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGVtaXRaaXBwZWQodGhpcy5mLCB0LCBidWZmZXJzLCB0aGlzLnNpbmspO1xuXG5cdFx0aWYgKGVuZGVkKHRoaXMuYnVmZmVycywgdGhpcy5zaW5rcykpIHtcblx0XHRcdHRoaXMuc2luay5lbmQodCwgdm9pZCAwKTtcblx0XHR9XG5cdH1cbn07XG5cblppcFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIGluZGV4ZWRWYWx1ZSkge1xuXHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzW2luZGV4ZWRWYWx1ZS5pbmRleF07XG5cdGlmKGJ1ZmZlci5pc0VtcHR5KCkpIHtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIGluZGV4ZWRWYWx1ZS52YWx1ZSk7XG5cdH1cbn07XG5cblppcFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cbmZ1bmN0aW9uIGVtaXRaaXBwZWQgKGYsIHQsIGJ1ZmZlcnMsIHNpbmspIHtcblx0c2luay5ldmVudCh0LCBpbnZva2UoZiwgbWFwKGhlYWQsIGJ1ZmZlcnMpKSk7XG59XG5cbmZ1bmN0aW9uIGhlYWQoYnVmZmVyKSB7XG5cdHJldHVybiBidWZmZXIuc2hpZnQoKTtcbn1cblxuZnVuY3Rpb24gZW5kZWQoYnVmZmVycywgc2lua3MpIHtcblx0Zm9yKHZhciBpPTAsIGw9YnVmZmVycy5sZW5ndGg7IGk8bDsgKytpKSB7XG5cdFx0aWYoYnVmZmVyc1tpXS5pc0VtcHR5KCkgJiYgIXNpbmtzW2ldLmFjdGl2ZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZHkoYnVmZmVycykge1xuXHRmb3IodmFyIGk9MCwgbD1idWZmZXJzLmxlbmd0aDsgaTxsOyArK2kpIHtcblx0XHRpZihidWZmZXJzW2ldLmlzRW1wdHkoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmVyO1xuXG5mdW5jdGlvbiBkZWZlcih0YXNrKSB7XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUodGFzaykudGhlbihydW5UYXNrKTtcbn1cblxuZnVuY3Rpb24gcnVuVGFzayh0YXNrKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRhc2sucnVuKCk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHJldHVybiB0YXNrLmVycm9yKGUpO1xuXHR9XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwb3NhYmxlO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBEaXNwb3NhYmxlIHdoaWNoIHdpbGwgZGlzcG9zZSBpdHMgdW5kZXJseWluZyByZXNvdXJjZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRpc3Bvc2UgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kj99IGRhdGEgYW55IGRhdGEgdG8gYmUgcGFzc2VkIHRvIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gRGlzcG9zYWJsZShkaXNwb3NlLCBkYXRhKSB7XG5cdHRoaXMuX2Rpc3Bvc2UgPSBkaXNwb3NlO1xuXHR0aGlzLl9kYXRhID0gZGF0YTtcbn1cblxuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5fZGlzcG9zZSh0aGlzLl9kYXRhKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBTZXR0YWJsZURpc3Bvc2FibGU7XG5cbmZ1bmN0aW9uIFNldHRhYmxlRGlzcG9zYWJsZSgpIHtcblx0dGhpcy5kaXNwb3NhYmxlID0gdm9pZCAwO1xuXHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdHRoaXMuX3Jlc29sdmUgPSB2b2lkIDA7XG5cblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnJlc3VsdCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcblx0XHRzZWxmLl9yZXNvbHZlID0gcmVzb2x2ZTtcblx0fSk7XG59XG5cblNldHRhYmxlRGlzcG9zYWJsZS5wcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uKGRpc3Bvc2FibGUpIHtcblx0aWYodGhpcy5kaXNwb3NhYmxlICE9PSB2b2lkIDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3NldERpc3Bvc2FibGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlJyk7XG5cdH1cblxuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NhYmxlO1xuXG5cdGlmKHRoaXMuZGlzcG9zZWQpIHtcblx0XHR0aGlzLl9yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKTtcblx0fVxufTtcblxuU2V0dGFibGVEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdGlmKHRoaXMuZGlzcG9zZWQpIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN1bHQ7XG5cdH1cblxuXHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblxuXHRpZih0aGlzLmRpc3Bvc2FibGUgIT09IHZvaWQgMCkge1xuXHRcdHRoaXMucmVzdWx0ID0gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHJldHVybiB0aGlzLnJlc3VsdDtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIERpc3Bvc2FibGUgPSByZXF1aXJlKCcuL0Rpc3Bvc2FibGUnKTtcbnZhciBTZXR0YWJsZURpc3Bvc2FibGUgPSByZXF1aXJlKCcuL1NldHRhYmxlRGlzcG9zYWJsZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJy4uL1Byb21pc2UnKS5pc1Byb21pc2U7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcblxudmFyIG1hcCA9IGJhc2UubWFwO1xudmFyIGlkZW50aXR5ID0gYmFzZS5pZDtcblxuZXhwb3J0cy50cnlEaXNwb3NlID0gdHJ5RGlzcG9zZTtcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuZXhwb3J0cy5vbmNlID0gb25jZTtcbmV4cG9ydHMuZW1wdHkgPSBlbXB0eTtcbmV4cG9ydHMuYWxsID0gYWxsO1xuZXhwb3J0cy5zZXR0YWJsZSA9IHNldHRhYmxlO1xuZXhwb3J0cy5wcm9taXNlZCA9IHByb21pc2VkO1xuXG4vKipcbiAqIENhbGwgZGlzcG9zYWJsZS5kaXNwb3NlLiAgSWYgaXQgcmV0dXJucyBhIHByb21pc2UsIGNhdGNoIHByb21pc2VcbiAqIGVycm9yIGFuZCBmb3J3YXJkIGl0IHRocm91Z2ggdGhlIHByb3ZpZGVkIHNpbmsuXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0aW1lXG4gKiBAcGFyYW0ge3tkaXNwb3NlOiBmdW5jdGlvbn19IGRpc3Bvc2FibGVcbiAqIEBwYXJhbSB7e2Vycm9yOiBmdW5jdGlvbn19IHNpbmtcbiAqIEByZXR1cm4geyp9IHJlc3VsdCBvZiBkaXNwb3NhYmxlLmRpc3Bvc2VcbiAqL1xuZnVuY3Rpb24gdHJ5RGlzcG9zZSh0LCBkaXNwb3NhYmxlLCBzaW5rKSB7XG5cdHZhciByZXN1bHQgPSBkaXNwb3NlU2FmZWx5KGRpc3Bvc2FibGUpO1xuXHRyZXR1cm4gaXNQcm9taXNlKHJlc3VsdClcblx0XHQ/IHJlc3VsdC5jYXRjaChmdW5jdGlvbiAoZSkge1xuXHRcdFx0c2luay5lcnJvcih0LCBlKTtcblx0XHR9KVxuXHRcdDogcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBEaXNwb3NhYmxlIHdoaWNoIHdpbGwgZGlzcG9zZSBpdHMgdW5kZXJseWluZyByZXNvdXJjZVxuICogYXQgbW9zdCBvbmNlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGlzcG9zZSBmdW5jdGlvblxuICogQHBhcmFtIHsqP30gZGF0YSBhbnkgZGF0YSB0byBiZSBwYXNzZWQgdG8gZGlzcG9zZXIgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShkaXNwb3NlLCBkYXRhKSB7XG5cdHJldHVybiBvbmNlKG5ldyBEaXNwb3NhYmxlKGRpc3Bvc2UsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBub29wIGRpc3Bvc2FibGUuIENhbiBiZSB1c2VkIHRvIHNhdGlzZnkgYSBEaXNwb3NhYmxlXG4gKiByZXF1aXJlbWVudCB3aGVuIG5vIGFjdHVhbCByZXNvdXJjZSBuZWVkcyB0byBiZSBkaXNwb3NlZC5cbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV8ZXhwb3J0c3xtb2R1bGUuZXhwb3J0c31cbiAqL1xuZnVuY3Rpb24gZW1wdHkoKSB7XG5cdHJldHVybiBuZXcgRGlzcG9zYWJsZShpZGVudGl0eSwgdm9pZCAwKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwb3NhYmxlIHRoYXQgd2lsbCBkaXNwb3NlIGFsbCBpbnB1dCBkaXNwb3NhYmxlcyBpbiBwYXJhbGxlbC5cbiAqIEBwYXJhbSB7QXJyYXk8RGlzcG9zYWJsZT59IGRpc3Bvc2FibGVzXG4gKiBAcmV0dXJuIHtEaXNwb3NhYmxlfVxuICovXG5mdW5jdGlvbiBhbGwoZGlzcG9zYWJsZXMpIHtcblx0cmV0dXJuIGNyZWF0ZShkaXNwb3NlQWxsLCBkaXNwb3NhYmxlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VBbGwoZGlzcG9zYWJsZXMpIHtcblx0cmV0dXJuIFByb21pc2UuYWxsKG1hcChkaXNwb3NlU2FmZWx5LCBkaXNwb3NhYmxlcykpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlU2FmZWx5KGRpc3Bvc2FibGUpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRpc3Bvc2FibGUgZnJvbSBhIHByb21pc2UgZm9yIGFub3RoZXIgZGlzcG9zYWJsZVxuICogQHBhcmFtIHtQcm9taXNlPERpc3Bvc2FibGU+fSBkaXNwb3NhYmxlUHJvbWlzZVxuICogQHJldHVybiB7RGlzcG9zYWJsZX1cbiAqL1xuZnVuY3Rpb24gcHJvbWlzZWQoZGlzcG9zYWJsZVByb21pc2UpIHtcblx0cmV0dXJuIGNyZWF0ZShkaXNwb3NlUHJvbWlzZSwgZGlzcG9zYWJsZVByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlUHJvbWlzZShkaXNwb3NhYmxlUHJvbWlzZSkge1xuXHRyZXR1cm4gZGlzcG9zYWJsZVByb21pc2UudGhlbihkaXNwb3NlT25lKTtcbn1cblxuZnVuY3Rpb24gZGlzcG9zZU9uZShkaXNwb3NhYmxlKSB7XG5cdHJldHVybiBkaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwb3NhYmxlIHByb3h5IHRoYXQgYWxsb3dzIGl0cyB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgdG9cbiAqIGJlIHNldCBsYXRlci5cbiAqIEByZXR1cm4ge1NldHRhYmxlRGlzcG9zYWJsZX1cbiAqL1xuZnVuY3Rpb24gc2V0dGFibGUoKSB7XG5cdHJldHVybiBuZXcgU2V0dGFibGVEaXNwb3NhYmxlKCk7XG59XG5cbi8qKlxuICogV3JhcCBhbiBleGlzdGluZyBkaXNwb3NhYmxlICh3aGljaCBtYXkgbm90IGFscmVhZHkgaGF2ZSBiZWVuIG9uY2UoKWQpXG4gKiBzbyB0aGF0IGl0IHdpbGwgb25seSBkaXNwb3NlIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlIGF0IG1vc3Qgb25jZS5cbiAqIEBwYXJhbSB7eyBkaXNwb3NlOiBmdW5jdGlvbigpIH19IGRpc3Bvc2FibGVcbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV9IHdyYXBwZWQgZGlzcG9zYWJsZVxuICovXG5mdW5jdGlvbiBvbmNlKGRpc3Bvc2FibGUpIHtcblx0cmV0dXJuIG5ldyBEaXNwb3NhYmxlKGRpc3Bvc2VNZW1vaXplZCwgbWVtb2l6ZWQoZGlzcG9zYWJsZSkpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlTWVtb2l6ZWQobWVtb2l6ZWQpIHtcblx0aWYoIW1lbW9pemVkLmRpc3Bvc2VkKSB7XG5cdFx0bWVtb2l6ZWQuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdG1lbW9pemVkLnZhbHVlID0gZGlzcG9zZVNhZmVseShtZW1vaXplZC5kaXNwb3NhYmxlKTtcblx0XHRtZW1vaXplZC5kaXNwb3NhYmxlID0gdm9pZCAwO1xuXHR9XG5cblx0cmV0dXJuIG1lbW9pemVkLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBtZW1vaXplZChkaXNwb3NhYmxlKSB7XG5cdHJldHVybiB7IGRpc3Bvc2VkOiBmYWxzZSwgZGlzcG9zYWJsZTogZGlzcG9zYWJsZSwgdmFsdWU6IHZvaWQgMCB9O1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gZmF0YWxFcnJvcjtcblxuZnVuY3Rpb24gZmF0YWxFcnJvciAoZSkge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdHRocm93IGU7XG5cdH0sIDApO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBQaXBlID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsdGVyO1xuXG5mdW5jdGlvbiBGaWx0ZXIocCwgc291cmNlKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZpbHRlcmVkIHNvdXJjZSwgZnVzaW5nIGFkamFjZW50IGZpbHRlci5maWx0ZXIgaWYgcG9zc2libGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpib29sZWFufSBwIGZpbHRlcmluZyBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7e3J1bjpmdW5jdGlvbn19IHNvdXJjZSBzb3VyY2UgdG8gZmlsdGVyXG4gKiBAcmV0dXJucyB7RmlsdGVyfSBmaWx0ZXJlZCBzb3VyY2VcbiAqL1xuRmlsdGVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihwLCBzb3VyY2UpIHtcblx0aWYgKHNvdXJjZSBpbnN0YW5jZW9mIEZpbHRlcikge1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFuZChzb3VyY2UucCwgcCksIHNvdXJjZS5zb3VyY2UpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBGaWx0ZXIocCwgc291cmNlKTtcbn07XG5cbkZpbHRlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEZpbHRlclNpbmsodGhpcy5wLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEZpbHRlclNpbmsocCwgc2luaykge1xuXHR0aGlzLnAgPSBwO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5GaWx0ZXJTaW5rLnByb3RvdHlwZS5lbmQgICA9IFBpcGUucHJvdG90eXBlLmVuZDtcbkZpbHRlclNpbmsucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cbkZpbHRlclNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgcCA9IHRoaXMucDtcblx0cCh4KSAmJiB0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5mdW5jdGlvbiBhbmQocCwgcSkge1xuXHRyZXR1cm4gZnVuY3Rpb24oeCkge1xuXHRcdHJldHVybiBwKHgpICYmIHEoeCk7XG5cdH07XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWx0ZXJNYXA7XG5cbmZ1bmN0aW9uIEZpbHRlck1hcChwLCBmLCBzb3VyY2UpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkZpbHRlck1hcC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEZpbHRlck1hcFNpbmsodGhpcy5wLCB0aGlzLmYsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gRmlsdGVyTWFwU2luayhwLCBmLCBzaW5rKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkZpbHRlck1hcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgZiA9IHRoaXMuZjtcblx0dmFyIHAgPSB0aGlzLnA7XG5cdHAoeCkgJiYgdGhpcy5zaW5rLmV2ZW50KHQsIGYoeCkpO1xufTtcblxuRmlsdGVyTWFwU2luay5wcm90b3R5cGUuZW5kID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuRmlsdGVyTWFwU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIEZpbHRlciA9IHJlcXVpcmUoJy4vRmlsdGVyJyk7XG52YXIgRmlsdGVyTWFwID0gcmVxdWlyZSgnLi9GaWx0ZXJNYXAnKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcblxuZnVuY3Rpb24gTWFwKGYsIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtYXBwZWQgc291cmNlLCBmdXNpbmcgYWRqYWNlbnQgbWFwLm1hcCwgZmlsdGVyLm1hcCxcbiAqIGFuZCBmaWx0ZXIubWFwLm1hcCBpZiBwb3NzaWJsZVxuICogQHBhcmFtIHtmdW5jdGlvbigqKToqfSBmIG1hcHBpbmcgZnVuY3Rpb25cbiAqIEBwYXJhbSB7e3J1bjpmdW5jdGlvbn19IHNvdXJjZSBzb3VyY2UgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWFwfEZpbHRlck1hcH0gbWFwcGVkIHNvdXJjZSwgcG9zc2libHkgZnVzZWRcbiAqL1xuTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZU1hcChmLCBzb3VyY2UpIHtcblx0aWYoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoYmFzZS5jb21wb3NlKGYsIHNvdXJjZS5mKSwgc291cmNlLnNvdXJjZSk7XG5cdH1cblxuXHRpZihzb3VyY2UgaW5zdGFuY2VvZiBGaWx0ZXIpIHtcblx0XHRyZXR1cm4gbmV3IEZpbHRlck1hcChzb3VyY2UucCwgZiwgc291cmNlLnNvdXJjZSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IE1hcChmLCBzb3VyY2UpO1xufTtcblxuTWFwLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgTWFwU2luayh0aGlzLmYsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gTWFwU2luayhmLCBzaW5rKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbk1hcFNpbmsucHJvdG90eXBlLmVuZCAgID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuTWFwU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuTWFwU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBmID0gdGhpcy5mO1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgZih4KSk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gaW52b2tlO1xuXG5mdW5jdGlvbiBpbnZva2UoZiwgYXJncykge1xuXHQvKmVzbGludCBjb21wbGV4aXR5OiBbMiw3XSovXG5cdHN3aXRjaChhcmdzLmxlbmd0aCkge1xuXHRcdGNhc2UgMDogcmV0dXJuIGYoKTtcblx0XHRjYXNlIDE6IHJldHVybiBmKGFyZ3NbMF0pO1xuXHRcdGNhc2UgMjogcmV0dXJuIGYoYXJnc1swXSwgYXJnc1sxXSk7XG5cdFx0Y2FzZSAzOiByZXR1cm4gZihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcblx0XHRjYXNlIDQ6IHJldHVybiBmKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuXHRcdGNhc2UgNTogcmV0dXJuIGYoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmLmFwcGx5KHZvaWQgMCwgYXJncyk7XG5cdH1cbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5leHBvcnRzLmlzSXRlcmFibGUgPSBpc0l0ZXJhYmxlO1xuZXhwb3J0cy5nZXRJdGVyYXRvciA9IGdldEl0ZXJhdG9yO1xuZXhwb3J0cy5tYWtlSXRlcmFibGUgPSBtYWtlSXRlcmFibGU7XG5cbi8qZ2xvYmFsIFNldCwgU3ltYm9sKi9cbnZhciBpdGVyYXRvclN5bWJvbDtcbi8vIEZpcmVmb3ggc2hpcHMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBuYW1lIEBAaXRlcmF0b3IuXG4vLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05MDcwNzcjYzE0XG5pZiAodHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV3IFNldCgpWydAQGl0ZXJhdG9yJ10gPT09ICdmdW5jdGlvbicpIHtcblx0aXRlcmF0b3JTeW1ib2wgPSAnQEBpdGVyYXRvcic7XG59IGVsc2Uge1xuXHRpdGVyYXRvclN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yIHx8XG5cdCdfZXM2c2hpbV9pdGVyYXRvcl8nO1xufVxuXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKG8pIHtcblx0cmV0dXJuIHR5cGVvZiBvW2l0ZXJhdG9yU3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3Iobykge1xuXHRyZXR1cm4gb1tpdGVyYXRvclN5bWJvbF0oKTtcbn1cblxuZnVuY3Rpb24gbWFrZUl0ZXJhYmxlKGYsIG8pIHtcblx0b1tpdGVyYXRvclN5bWJvbF0gPSBmO1xuXHRyZXR1cm4gbztcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xuXG5leHBvcnRzLmZyb21PYnNlcnZhYmxlID0gZnJvbU9ic2VydmFibGU7XG5leHBvcnRzLk9ic2VydmFibGVTb3VyY2UgPSBPYnNlcnZhYmxlU291cmNlO1xuZXhwb3J0cy5TdWJzY3JpYmVyU2luayA9IFN1YnNjcmliZXJTaW5rO1xuXG5mdW5jdGlvbiBmcm9tT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBPYnNlcnZhYmxlU291cmNlKG9ic2VydmFibGUpKTtcbn1cblxuZnVuY3Rpb24gT2JzZXJ2YWJsZVNvdXJjZShvYnNlcnZhYmxlKSB7XG5cdHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG59XG5cbk9ic2VydmFibGVTb3VyY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgc3ViID0gdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZShuZXcgU3Vic2NyaWJlclNpbmsoc2luaywgc2NoZWR1bGVyKSk7XG5cdGlmKHR5cGVvZiBzdWIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gZGlzcG9zZS5jcmVhdGUoc3ViKTtcblx0fSBlbHNlIGlmKHN1YiAmJiB0eXBlb2Ygc3ViLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGRpc3Bvc2UuY3JlYXRlKHVuc3Vic2NyaWJlLCBzdWIpO1xuXHR9XG5cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSByZXR1cm5lZCBpbnZhbGlkIHN1YnNjcmlwdGlvbiAnICsgU3RyaW5nKHN1YikpO1xufVxuXG5mdW5jdGlvbiBTdWJzY3JpYmVyU2luayhzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG59XG5cblN1YnNjcmliZXJTaW5rLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuXHR0aGlzLnNpbmsuZXZlbnQodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufVxuXG5TdWJzY3JpYmVyU2luay5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbih4KSB7XG5cdHRoaXMuc2luay5lbmQodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufVxuXG5TdWJzY3JpYmVyU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7XG5cdHRoaXMuc2luay5lcnJvcih0aGlzLnNjaGVkdWxlci5ub3coKSwgZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuXHRyZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIHN5bWJvbE9ic2VydmFibGUgPSByZXF1aXJlKCdzeW1ib2wtb2JzZXJ2YWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE9ic2VydmFibGU7XG5cbmZ1bmN0aW9uIGdldE9ic2VydmFibGUobykge1xuXHR2YXIgb2JzID0gbnVsbDtcblx0aWYobyAhPSBudWxsICYmIHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuXHRcdHZhciBtZXRob2QgPSBvW3N5bWJvbE9ic2VydmFibGVdO1xuXHRcdGlmKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdG9icyA9IG1ldGhvZC5jYWxsKG8pO1xuXHRcdFx0aWYob2JzID09IG51bGwgfHwgdHlwZW9mIG9icyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBvYnNlcnZhYmxlICcgKyBvYnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYnM7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRlZmF1bHRTY2hlZHVsZXIgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvZGVmYXVsdFNjaGVkdWxlcicpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBmYXRhbEVycm9yID0gcmVxdWlyZSgnLi4vZmF0YWxFcnJvcicpO1xuXG5leHBvcnRzLnN1YnNjcmliZSA9IHN1YnNjcmliZTtcbmV4cG9ydHMuU3Vic2NyaWJlT2JzZXJ2ZXIgPSBTdWJzY3JpYmVPYnNlcnZlcjtcbmV4cG9ydHMuU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uO1xuXG5mdW5jdGlvbiBzdWJzY3JpYmUoc3Vic2NyaWJlciwgc3RyZWFtKSB7XG5cdGlmKHN1YnNjcmliZXIgPT0gbnVsbCB8fCB0eXBlb2Ygc3Vic2NyaWJlciAhPT0gJ29iamVjdCcpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdWJzY3JpYmVyIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIgZGlzcG9zYWJsZSA9IGRpc3Bvc2Uuc2V0dGFibGUoKTtcblx0dmFyIG9ic2VydmVyID0gbmV3IFN1YnNjcmliZU9ic2VydmVyKGZhdGFsRXJyb3IsIHN1YnNjcmliZXIsIGRpc3Bvc2FibGUpO1xuXG5cdGRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZShzdHJlYW0uc291cmNlLnJ1bihvYnNlcnZlciwgZGVmYXVsdFNjaGVkdWxlcikpO1xuXG5cdHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGRpc3Bvc2FibGUpO1xufVxuXG5mdW5jdGlvbiBTdWJzY3JpYmVPYnNlcnZlcihmYXRhbEVycm9yLCBzdWJzY3JpYmVyLCBkaXNwb3NhYmxlKSB7XG5cdHRoaXMuZmF0YWxFcnJvciA9IGZhdGFsRXJyb3I7XG5cdHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG59XG5cblN1YnNjcmliZU9ic2VydmVyLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodHlwZW9mIHRoaXMuc3Vic2NyaWJlci5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhpcy5zdWJzY3JpYmVyLm5leHQoeCk7XG5cdH1cbn07XG5cblN1YnNjcmliZU9ic2VydmVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBzID0gdGhpcy5zdWJzY3JpYmVyO1xuXHRkb0Rpc3Bvc2UodGhpcy5mYXRhbEVycm9yLCBzLCBzLmNvbXBsZXRlLCBzLmVycm9yLCB0aGlzLmRpc3Bvc2FibGUsIHgpO1xufTtcblxuU3Vic2NyaWJlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHR2YXIgcyA9IHRoaXMuc3Vic2NyaWJlcjtcblx0ZG9EaXNwb3NlKHRoaXMuZmF0YWxFcnJvciwgcywgcy5lcnJvciwgcy5lcnJvciwgdGhpcy5kaXNwb3NhYmxlLCBlKTtcbn07XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihkaXNwb3NhYmxlKSB7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG59XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn1cblxuZnVuY3Rpb24gZG9EaXNwb3NlKGZhdGFsLCBzdWJzY3JpYmVyLCBjb21wbGV0ZSwgZXJyb3IsIGRpc3Bvc2FibGUsIHgpIHtcblx0UHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRpZih0eXBlb2YgY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbXBsZXRlLmNhbGwoc3Vic2NyaWJlciwgeCk7XG5cdFx0fVxuXHR9KS5jYXRjaChmdW5jdGlvbihlKSB7XG5cdFx0aWYodHlwZW9mIGVycm9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRlcnJvci5jYWxsKHN1YnNjcmliZXIsIGUpO1xuXHRcdH1cblx0fSkuY2F0Y2goZmF0YWwpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBPYnNlcnZlciA9IHJlcXVpcmUoJy4vc2luay9PYnNlcnZlcicpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGRlZmF1bHRTY2hlZHVsZXIgPSByZXF1aXJlKCcuL3NjaGVkdWxlci9kZWZhdWx0U2NoZWR1bGVyJyk7XG5cbmV4cG9ydHMud2l0aERlZmF1bHRTY2hlZHVsZXIgPSB3aXRoRGVmYXVsdFNjaGVkdWxlcjtcbmV4cG9ydHMud2l0aFNjaGVkdWxlciA9IHdpdGhTY2hlZHVsZXI7XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0U2NoZWR1bGVyKGYsIHNvdXJjZSkge1xuXHRyZXR1cm4gd2l0aFNjaGVkdWxlcihmLCBzb3VyY2UsIGRlZmF1bHRTY2hlZHVsZXIpO1xufVxuXG5mdW5jdGlvbiB3aXRoU2NoZWR1bGVyKGYsIHNvdXJjZSwgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0cnVuU291cmNlKGYsIHNvdXJjZSwgc2NoZWR1bGVyLCByZXNvbHZlLCByZWplY3QpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gcnVuU291cmNlKGYsIHNvdXJjZSwgc2NoZWR1bGVyLCByZXNvbHZlLCByZWplY3QpIHtcblx0dmFyIGRpc3Bvc2FibGUgPSBkaXNwb3NlLnNldHRhYmxlKCk7XG5cdHZhciBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmLCByZXNvbHZlLCByZWplY3QsIGRpc3Bvc2FibGUpO1xuXG5cdGRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZShzb3VyY2UucnVuKG9ic2VydmVyLCBzY2hlZHVsZXIpKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgZmF0YWwgPSByZXF1aXJlKCcuLi9mYXRhbEVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvcGFnYXRlVGFzaztcblxuZnVuY3Rpb24gUHJvcGFnYXRlVGFzayhydW4sIHZhbHVlLCBzaW5rKSB7XG5cdHRoaXMuX3J1biA9IHJ1bjtcblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG59XG5cblByb3BhZ2F0ZVRhc2suZXZlbnQgPSBmdW5jdGlvbih2YWx1ZSwgc2luaykge1xuXHRyZXR1cm4gbmV3IFByb3BhZ2F0ZVRhc2soZW1pdCwgdmFsdWUsIHNpbmspO1xufTtcblxuUHJvcGFnYXRlVGFzay5lbmQgPSBmdW5jdGlvbih2YWx1ZSwgc2luaykge1xuXHRyZXR1cm4gbmV3IFByb3BhZ2F0ZVRhc2soZW5kLCB2YWx1ZSwgc2luayk7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLmVycm9yID0gZnVuY3Rpb24odmFsdWUsIHNpbmspIHtcblx0cmV0dXJuIG5ldyBQcm9wYWdhdGVUYXNrKGVycm9yLCB2YWx1ZSwgc2luayk7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbih0KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLl9ydW4odCwgdGhpcy52YWx1ZSwgdGhpcy5zaW5rKTtcbn07XG5cblByb3BhZ2F0ZVRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm4gZmF0YWwoZSk7XG5cdH1cblx0dGhpcy5zaW5rLmVycm9yKHQsIGUpO1xufTtcblxuZnVuY3Rpb24gZXJyb3IodCwgZSwgc2luaykge1xuXHRzaW5rLmVycm9yKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBlbWl0KHQsIHgsIHNpbmspIHtcblx0c2luay5ldmVudCh0LCB4KTtcbn1cblxuZnVuY3Rpb24gZW5kKHQsIHgsIHNpbmspIHtcblx0c2luay5lbmQodCwgeCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGJhc2UgPSByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZWR1bGVyO1xuXG5mdW5jdGlvbiBTY2hlZHVsZWRUYXNrKGRlbGF5LCBwZXJpb2QsIHRhc2ssIHNjaGVkdWxlcikge1xuXHR0aGlzLnRpbWUgPSBkZWxheTtcblx0dGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG5cdHRoaXMudGFzayA9IHRhc2s7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG59XG5cblNjaGVkdWxlZFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy50YXNrLnJ1bih0aGlzLnRpbWUpO1xufTtcblxuU2NoZWR1bGVkVGFzay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7XG5cdHJldHVybiB0aGlzLnRhc2suZXJyb3IodGhpcy50aW1lLCBlKTtcbn07XG5cblNjaGVkdWxlZFRhc2sucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5zY2hlZHVsZXIuY2FuY2VsKHRoaXMpO1xuXHRyZXR1cm4gdGhpcy50YXNrLmRpc3Bvc2UoKTtcbn07XG5cbmZ1bmN0aW9uIHJ1blRhc2sodGFzaykge1xuXHR0cnkge1xuXHRcdHJldHVybiB0YXNrLnJ1bigpO1xuXHR9IGNhdGNoKGUpIHtcblx0XHRyZXR1cm4gdGFzay5lcnJvcihlKTtcblx0fVxufVxuXG5mdW5jdGlvbiBTY2hlZHVsZXIodGltZXIpIHtcblx0dGhpcy50aW1lciA9IHRpbWVyO1xuXG5cdHRoaXMuX3RpbWVyID0gbnVsbDtcblx0dGhpcy5fbmV4dEFycml2YWwgPSAwO1xuXHR0aGlzLl90YXNrcyA9IFtdO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0dGhpcy5fcnVuUmVhZHlUYXNrc0JvdW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0c2VsZi5fcnVuUmVhZHlUYXNrcyhzZWxmLm5vdygpKTtcblx0fTtcbn1cblxuU2NoZWR1bGVyLnByb3RvdHlwZS5ub3cgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMudGltZXIubm93KCk7XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLmFzYXAgPSBmdW5jdGlvbih0YXNrKSB7XG5cdHJldHVybiB0aGlzLnNjaGVkdWxlKDAsIC0xLCB0YXNrKTtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbihkZWxheSwgdGFzaykge1xuXHRyZXR1cm4gdGhpcy5zY2hlZHVsZShkZWxheSwgLTEsIHRhc2spO1xufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5wZXJpb2RpYyA9IGZ1bmN0aW9uKHBlcmlvZCwgdGFzaykge1xuXHRyZXR1cm4gdGhpcy5zY2hlZHVsZSgwLCBwZXJpb2QsIHRhc2spO1xufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKGRlbGF5LCBwZXJpb2QsIHRhc2spIHtcblx0dmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdHZhciBzdCA9IG5ldyBTY2hlZHVsZWRUYXNrKG5vdyArIE1hdGgubWF4KDAsIGRlbGF5KSwgcGVyaW9kLCB0YXNrLCB0aGlzKTtcblxuXHRpbnNlcnRCeVRpbWUoc3QsIHRoaXMuX3Rhc2tzKTtcblx0dGhpcy5fc2NoZWR1bGVOZXh0UnVuKG5vdyk7XG5cdHJldHVybiBzdDtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24odGFzaykge1xuXHR0YXNrLmFjdGl2ZSA9IGZhbHNlO1xuXHR2YXIgaSA9IGJpbmFyeVNlYXJjaCh0YXNrLnRpbWUsIHRoaXMuX3Rhc2tzKTtcblxuXHRpZihpID49IDAgJiYgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuXHRcdHZhciBhdCA9IGJhc2UuZmluZEluZGV4KHRhc2ssIHRoaXMuX3Rhc2tzW2ldLmV2ZW50cyk7XG5cdFx0aWYoYXQgPj0gMCkge1xuXHRcdFx0dGhpcy5fdGFza3NbaV0uZXZlbnRzLnNwbGljZShhdCwgMSk7XG5cdFx0XHR0aGlzLl9yZXNjaGVkdWxlKCk7XG5cdFx0fVxuXHR9XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLmNhbmNlbEFsbCA9IGZ1bmN0aW9uKGYpIHtcblx0Zm9yKHZhciBpPTA7IGk8dGhpcy5fdGFza3MubGVuZ3RoOyArK2kpIHtcblx0XHRyZW1vdmVBbGxGcm9tKGYsIHRoaXMuX3Rhc2tzW2ldKTtcblx0fVxuXHR0aGlzLl9yZXNjaGVkdWxlKCk7XG59O1xuXG5mdW5jdGlvbiByZW1vdmVBbGxGcm9tKGYsIHRpbWVzbG90KSB7XG5cdHRpbWVzbG90LmV2ZW50cyA9IGJhc2UucmVtb3ZlQWxsKGYsIHRpbWVzbG90LmV2ZW50cyk7XG59XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX3Jlc2NoZWR1bGUgPSBmdW5jdGlvbigpIHtcblx0aWYodGhpcy5fdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhpcy5fdW5zY2hlZHVsZSgpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dFJ1bih0aGlzLm5vdygpKTtcblx0fVxufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5fdW5zY2hlZHVsZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLnRpbWVyLmNsZWFyVGltZXIodGhpcy5fdGltZXIpO1xuXHR0aGlzLl90aW1lciA9IG51bGw7XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLl9zY2hlZHVsZU5leHRSdW4gPSBmdW5jdGlvbihub3cpIHtcblx0aWYodGhpcy5fdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIG5leHRBcnJpdmFsID0gdGhpcy5fdGFza3NbMF0udGltZTtcblxuXHRpZih0aGlzLl90aW1lciA9PT0gbnVsbCkge1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dEFycml2YWwobmV4dEFycml2YWwsIG5vdyk7XG5cdH0gZWxzZSBpZihuZXh0QXJyaXZhbCA8IHRoaXMuX25leHRBcnJpdmFsKSB7XG5cdFx0dGhpcy5fdW5zY2hlZHVsZSgpO1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dEFycml2YWwobmV4dEFycml2YWwsIG5vdyk7XG5cdH1cbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX3NjaGVkdWxlTmV4dEFycml2YWwgPSBmdW5jdGlvbihuZXh0QXJyaXZhbCwgbm93KSB7XG5cdHRoaXMuX25leHRBcnJpdmFsID0gbmV4dEFycml2YWw7XG5cdHZhciBkZWxheSA9IE1hdGgubWF4KDAsIG5leHRBcnJpdmFsIC0gbm93KTtcblx0dGhpcy5fdGltZXIgPSB0aGlzLnRpbWVyLnNldFRpbWVyKHRoaXMuX3J1blJlYWR5VGFza3NCb3VuZCwgZGVsYXkpO1xufTtcblxuXG5TY2hlZHVsZXIucHJvdG90eXBlLl9ydW5SZWFkeVRhc2tzID0gZnVuY3Rpb24obm93KSB7XG5cdHRoaXMuX3RpbWVyID0gbnVsbDtcblxuXHR0aGlzLl90YXNrcyA9IHRoaXMuX2ZpbmRBbmRSdW5UYXNrcyhub3cpO1xuXG5cdHRoaXMuX3NjaGVkdWxlTmV4dFJ1bih0aGlzLm5vdygpKTtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX2ZpbmRBbmRSdW5UYXNrcyA9IGZ1bmN0aW9uKG5vdykge1xuXHR2YXIgdGFza3MgPSB0aGlzLl90YXNrcztcblx0dmFyIGwgPSB0YXNrcy5sZW5ndGg7XG5cdHZhciBpID0gMDtcblxuXHR3aGlsZShpIDwgbCAmJiB0YXNrc1tpXS50aW1lIDw9IG5vdykge1xuXHRcdCsraTtcblx0fVxuXG5cdHRoaXMuX3Rhc2tzID0gdGFza3Muc2xpY2UoaSk7XG5cblx0Ly8gUnVuIGFsbCByZWFkeSB0YXNrc1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGk7ICsraikge1xuXHRcdHRoaXMuX3Rhc2tzID0gcnVuVGFza3ModGFza3Nbal0sIHRoaXMuX3Rhc2tzKTtcblx0fVxuXHRyZXR1cm4gdGhpcy5fdGFza3M7XG59O1xuXG5mdW5jdGlvbiBydW5UYXNrcyh0aW1lc2xvdCwgdGFza3MpIHtcblx0dmFyIGV2ZW50cyA9IHRpbWVzbG90LmV2ZW50cztcblx0Zm9yKHZhciBpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHRhc2sgPSBldmVudHNbaV07XG5cblx0XHRpZih0YXNrLmFjdGl2ZSkge1xuXHRcdFx0cnVuVGFzayh0YXNrKTtcblxuXHRcdFx0Ly8gUmVzY2hlZHVsZSBwZXJpb2RpYyByZXBlYXRpbmcgdGFza3Ncblx0XHRcdC8vIENoZWNrIGFjdGl2ZSBhZ2Fpbiwgc2luY2UgYSB0YXNrIG1heSBoYXZlIGNhbmNlbGVkIGl0c2VsZlxuXHRcdFx0aWYodGFzay5wZXJpb2QgPj0gMCkge1xuXHRcdFx0XHR0YXNrLnRpbWUgPSB0YXNrLnRpbWUgKyB0YXNrLnBlcmlvZDtcblx0XHRcdFx0aW5zZXJ0QnlUaW1lKHRhc2ssIHRhc2tzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJ5VGltZSh0YXNrLCB0aW1lc2xvdHMpIHtcblx0dmFyIGwgPSB0aW1lc2xvdHMubGVuZ3RoO1xuXG5cdGlmKGwgPT09IDApIHtcblx0XHR0aW1lc2xvdHMucHVzaChuZXdUaW1lc2xvdCh0YXNrLnRpbWUsIFt0YXNrXSkpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBpID0gYmluYXJ5U2VhcmNoKHRhc2sudGltZSwgdGltZXNsb3RzKTtcblxuXHRpZihpID49IGwpIHtcblx0XHR0aW1lc2xvdHMucHVzaChuZXdUaW1lc2xvdCh0YXNrLnRpbWUsIFt0YXNrXSkpO1xuXHR9IGVsc2UgaWYodGFzay50aW1lID09PSB0aW1lc2xvdHNbaV0udGltZSkge1xuXHRcdHRpbWVzbG90c1tpXS5ldmVudHMucHVzaCh0YXNrKTtcblx0fSBlbHNlIHtcblx0XHR0aW1lc2xvdHMuc3BsaWNlKGksIDAsIG5ld1RpbWVzbG90KHRhc2sudGltZSwgW3Rhc2tdKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKHQsIHNvcnRlZEFycmF5KSB7XG5cdHZhciBsbyA9IDA7XG5cdHZhciBoaSA9IHNvcnRlZEFycmF5Lmxlbmd0aDtcblx0dmFyIG1pZCwgeTtcblxuXHR3aGlsZSAobG8gPCBoaSkge1xuXHRcdG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMik7XG5cdFx0eSA9IHNvcnRlZEFycmF5W21pZF07XG5cblx0XHRpZiAodCA9PT0geS50aW1lKSB7XG5cdFx0XHRyZXR1cm4gbWlkO1xuXHRcdH0gZWxzZSBpZiAodCA8IHkudGltZSkge1xuXHRcdFx0aGkgPSBtaWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvID0gbWlkICsgMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGhpO1xufVxuXG5mdW5jdGlvbiBuZXdUaW1lc2xvdCh0LCBldmVudHMpIHtcblx0cmV0dXJuIHsgdGltZTogdCwgZXZlbnRzOiBldmVudHMgfTtcbn1cbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJy4vU2NoZWR1bGVyJyk7XG52YXIgc2V0VGltZW91dFRpbWVyID0gcmVxdWlyZSgnLi90aW1lb3V0VGltZXInKTtcbnZhciBub2RlVGltZXIgPSByZXF1aXJlKCcuL25vZGVUaW1lcicpO1xuXG52YXIgaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnXG5cdFx0JiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVkdWxlcihpc05vZGUgPyBub2RlVGltZXIgOiBzZXRUaW1lb3V0VGltZXIpO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTl6WTJobFpIVnNaWEl2WkdWbVlYVnNkRk5qYUdWa2RXeGxjaTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2lCQWJHbGpaVzV6WlNCTlNWUWdUR2xqWlc1elpTQW9ZeWtnWTI5d2VYSnBaMmgwSURJd01UQXRNakF4TmlCdmNtbG5hVzVoYkNCaGRYUm9iM0lnYjNJZ1lYVjBhRzl5Y3lBcUwxeHVMeW9xSUVCaGRYUm9iM0lnUW5KcFlXNGdRMkYyWVd4cFpYSWdLaTljYmk4cUtpQkFZWFYwYUc5eUlFcHZhRzRnU0dGdWJpQXFMMXh1WEc1MllYSWdVMk5vWldSMWJHVnlJRDBnY21WeGRXbHlaU2duTGk5VFkyaGxaSFZzWlhJbktUdGNiblpoY2lCelpYUlVhVzFsYjNWMFZHbHRaWElnUFNCeVpYRjFhWEpsS0NjdUwzUnBiV1Z2ZFhSVWFXMWxjaWNwTzF4dWRtRnlJRzV2WkdWVWFXMWxjaUE5SUhKbGNYVnBjbVVvSnk0dmJtOWtaVlJwYldWeUp5azdYRzVjYm5aaGNpQnBjMDV2WkdVZ1BTQjBlWEJsYjJZZ2NISnZZMlZ6Y3lBOVBUMGdKMjlpYW1WamRDZGNibHgwWEhRbUppQjBlWEJsYjJZZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXlBOVBUMGdKMloxYm1OMGFXOXVKenRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCdVpYY2dVMk5vWldSMWJHVnlLR2x6VG05a1pTQS9JRzV2WkdWVWFXMWxjaUE2SUhObGRGUnBiV1Z2ZFhSVWFXMWxjaWs3WEc0aVhYMD0iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRlZmVyID0gcmVxdWlyZSgnLi4vZGVmZXInKTtcblxuLypnbG9iYWwgc2V0VGltZW91dCwgY2xlYXJUaW1lb3V0Ki9cblxuZnVuY3Rpb24gVGFzayhmKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgZiA9IHRoaXMuZjtcblx0cmV0dXJuIGYoKTtcbn07XG5cblRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aHJvdyBlO1xufTtcblxuVGFzay5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBydW5Bc1Rhc2soZikge1xuXHR2YXIgdGFzayA9IG5ldyBUYXNrKGYpO1xuXHRkZWZlcih0YXNrKTtcblx0cmV0dXJuIHRhc2s7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRub3c6IERhdGUubm93LFxuXHRzZXRUaW1lcjogZnVuY3Rpb24oZiwgZHQpIHtcblx0XHRyZXR1cm4gZHQgPD0gMCA/IHJ1bkFzVGFzayhmKSA6IHNldFRpbWVvdXQoZiwgZHQpO1xuXHR9LFxuXHRjbGVhclRpbWVyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQgaW5zdGFuY2VvZiBUYXNrID8gdC5jYW5jZWwoKSA6IGNsZWFyVGltZW91dCh0KTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4vKmdsb2JhbCBzZXRUaW1lb3V0LCBjbGVhclRpbWVvdXQqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0bm93OiBEYXRlLm5vdyxcblx0c2V0VGltZXI6IGZ1bmN0aW9uKGYsIGR0KSB7XG5cdFx0cmV0dXJuIHNldFRpbWVvdXQoZiwgZHQpO1xuXHR9LFxuXHRjbGVhclRpbWVyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIGNsZWFyVGltZW91dCh0KTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgZGVmZXIgPSByZXF1aXJlKCcuLi9kZWZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmVycmVkU2luaztcblxuZnVuY3Rpb24gRGVmZXJyZWRTaW5rKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5ldmVudHMgPSBbXTtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xufVxuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZih0aGlzLmV2ZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRkZWZlcihuZXcgUHJvcGFnYXRlQWxsVGFzayh0aGlzLnNpbmssIHRoaXMuZXZlbnRzKSk7XG5cdH1cblxuXHR0aGlzLmV2ZW50cy5wdXNoKHsgdGltZTogdCwgdmFsdWU6IHggfSk7XG59O1xuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHR0aGlzLl9lbmQobmV3IEVycm9yVGFzayh0LCBlLCB0aGlzLnNpbmspKTtcbn07XG5cbkRlZmVycmVkU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9lbmQobmV3IEVuZFRhc2sodCwgeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbih0YXNrKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuZXZlbnRzID0gdm9pZCAwO1xuXHRkZWZlcih0YXNrKTtcbn1cblxuZnVuY3Rpb24gUHJvcGFnYXRlQWxsVGFzayhzaW5rLCBldmVudHMpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5ldmVudHMgPSBldmVudHM7XG59XG5cblByb3BhZ2F0ZUFsbFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgZXZlbnRzID0gdGhpcy5ldmVudHM7XG5cdHZhciBzaW5rID0gdGhpcy5zaW5rO1xuXHR2YXIgZXZlbnQ7XG5cblx0Zm9yKHZhciBpID0gMCwgbCA9IGV2ZW50cy5sZW5ndGg7IGk8bDsgKytpKSB7XG5cdFx0ZXZlbnQgPSBldmVudHNbaV07XG5cdFx0c2luay5ldmVudChldmVudC50aW1lLCBldmVudC52YWx1ZSk7XG5cdH1cblxuXHRldmVudHMubGVuZ3RoID0gMDtcbn07XG5cblByb3BhZ2F0ZUFsbFRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aGlzLnNpbmsuZXJyb3IoMCwgZSk7XG59O1xuXG5mdW5jdGlvbiBFbmRUYXNrKHQsIHgsIHNpbmspIHtcblx0dGhpcy50aW1lID0gdDtcblx0dGhpcy52YWx1ZSA9IHg7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkVuZFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNpbmsuZW5kKHRoaXMudGltZSwgdGhpcy52YWx1ZSk7XG59O1xuXG5FbmRUYXNrLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGUpIHtcblx0dGhpcy5zaW5rLmVycm9yKHRoaXMudGltZSwgZSk7XG59O1xuXG5mdW5jdGlvbiBFcnJvclRhc2sodCwgZSwgc2luaykge1xuXHR0aGlzLnRpbWUgPSB0O1xuXHR0aGlzLnZhbHVlID0gZTtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuRXJyb3JUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHtcblx0dGhpcy5zaW5rLmVycm9yKHRoaXMudGltZSwgdGhpcy52YWx1ZSk7XG59O1xuXG5FcnJvclRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aHJvdyBlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU2luayA9IHJlcXVpcmUoJy4vUGlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEluZGV4U2luaztcblxuZnVuY3Rpb24gSW5kZXhTaW5rKGksIHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5pbmRleCA9IGk7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0dGhpcy52YWx1ZSA9IHZvaWQgMDtcbn1cblxuSW5kZXhTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgdGhpcyk7XG59O1xuXG5JbmRleFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuc2luay5lbmQodCwgeyBpbmRleDogdGhpcy5pbmRleCwgdmFsdWU6IHggfSk7XG59O1xuXG5JbmRleFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBPYnNlcnZlcjtcblxuLyoqXG4gKiBTaW5rIHRoYXQgYWNjZXB0cyBmdW5jdGlvbnMgdG8gYXBwbHkgdG8gZWFjaCBldmVudCwgYW5kIHRvIGVuZCwgYW5kIGVycm9yXG4gKiBzaWduYWxzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE9ic2VydmVyKGV2ZW50LCBlbmQsIGVycm9yLCBkaXNwb3NhYmxlKSB7XG5cdHRoaXMuX2V2ZW50ID0gZXZlbnQ7XG5cdHRoaXMuX2VuZCA9IGVuZDtcblx0dGhpcy5fZXJyb3IgPSBlcnJvcjtcblx0dGhpcy5fZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuT2JzZXJ2ZXIucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZiAoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuX2V2ZW50KHgpO1xufTtcblxuT2JzZXJ2ZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYgKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHRkaXNwb3NlVGhlbih0aGlzLl9lbmQsIHRoaXMuX2Vycm9yLCB0aGlzLl9kaXNwb3NhYmxlLCB4KTtcbn07XG5cbk9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0ZGlzcG9zZVRoZW4odGhpcy5fZXJyb3IsIHRoaXMuX2Vycm9yLCB0aGlzLl9kaXNwb3NhYmxlLCBlKTtcbn07XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUaGVuKGVuZCwgZXJyb3IsIGRpc3Bvc2FibGUsIHgpIHtcblx0UHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRlbmQoeCk7XG5cdH0sIGVycm9yKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBpcGU7XG5cbi8qKlxuICogQSBzaW5rIG1peGluIHRoYXQgc2ltcGx5IGZvcndhcmRzIGV2ZW50LCBlbmQsIGFuZCBlcnJvciB0b1xuICogYW5vdGhlciBzaW5rLlxuICogQHBhcmFtIHNpbmtcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQaXBlKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuUGlwZS5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5QaXBlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZW5kKHQsIHgpO1xufTtcblxuUGlwZS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gU2FmZVNpbms7XG5cbmZ1bmN0aW9uIFNhZmVTaW5rKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xufVxuXG5TYWZlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dGhpcy5kaXNhYmxlKCk7XG5cdHRoaXMuc2luay5lbmQodCwgeCk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuZGlzYWJsZSgpO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHRyZXR1cm4gdGhpcy5zaW5rO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBEZWZlcnJlZFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL0RlZmVycmVkU2luaycpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciB0cnlFdmVudCA9IHJlcXVpcmUoJy4vdHJ5RXZlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXJTb3VyY2U7XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlclNvdXJjZShldmVudCwgc291cmNlKSB7XG5cdHRoaXMuZXZlbnQgPSBldmVudDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkV2ZW50RW1pdHRlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdC8vIE5PVEU6IEJlY2F1c2UgRXZlbnRFbWl0dGVyIGFsbG93cyBldmVudHMgaW4gdGhlIHNhbWUgY2FsbCBzdGFjayBhc1xuXHQvLyBhIGxpc3RlbmVyIGlzIGFkZGVkLCB1c2UgYSBEZWZlcnJlZFNpbmsgdG8gYnVmZmVyIGV2ZW50c1xuXHQvLyB1bnRpbCB0aGUgc3RhY2sgY2xlYXJzLCB0aGVuIHByb3BhZ2F0ZS4gIFRoaXMgbWFpbnRhaW5zIG1vc3QuanMnc1xuXHQvLyBpbnZhcmlhbnQgdGhhdCBubyBldmVudCB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgc2FtZSBjYWxsIHN0YWNrXG5cdC8vIGFzIGFuIG9ic2VydmVyIGJlZ2lucyBvYnNlcnZpbmcuXG5cdHZhciBkc2luayA9IG5ldyBEZWZlcnJlZFNpbmsoc2luayk7XG5cblx0ZnVuY3Rpb24gYWRkRXZlbnRWYXJpYWRpYyhhKSB7XG5cdFx0dmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdGlmKGwgPiAxKSB7XG5cdFx0XHR2YXIgYXJyID0gbmV3IEFycmF5KGwpO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bDsgKytpKSB7XG5cdFx0XHRcdGFycltpXSA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdH1cblx0XHRcdHRyeUV2ZW50LnRyeUV2ZW50KHNjaGVkdWxlci5ub3coKSwgYXJyLCBkc2luayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeUV2ZW50LnRyeUV2ZW50KHNjaGVkdWxlci5ub3coKSwgYSwgZHNpbmspO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuc291cmNlLmFkZExpc3RlbmVyKHRoaXMuZXZlbnQsIGFkZEV2ZW50VmFyaWFkaWMpO1xuXG5cdHJldHVybiBkaXNwb3NlLmNyZWF0ZShkaXNwb3NlRXZlbnRFbWl0dGVyLCB7IHRhcmdldDogdGhpcywgYWRkRXZlbnQ6IGFkZEV2ZW50VmFyaWFkaWMgfSk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRXZlbnRFbWl0dGVyKGluZm8pIHtcblx0dmFyIHRhcmdldCA9IGluZm8udGFyZ2V0O1xuXHR0YXJnZXQuc291cmNlLnJlbW92ZUxpc3RlbmVyKHRhcmdldC5ldmVudCwgaW5mby5hZGRFdmVudCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciB0cnlFdmVudCA9IHJlcXVpcmUoJy4vdHJ5RXZlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldFNvdXJjZTtcblxuZnVuY3Rpb24gRXZlbnRUYXJnZXRTb3VyY2UoZXZlbnQsIHNvdXJjZSwgY2FwdHVyZSkge1xuXHR0aGlzLmV2ZW50ID0gZXZlbnQ7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xuXHR0aGlzLmNhcHR1cmUgPSBjYXB0dXJlO1xufVxuXG5FdmVudFRhcmdldFNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdGZ1bmN0aW9uIGFkZEV2ZW50KGUpIHtcblx0XHR0cnlFdmVudC50cnlFdmVudChzY2hlZHVsZXIubm93KCksIGUsIHNpbmspO1xuXHR9XG5cblx0dGhpcy5zb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmV2ZW50LCBhZGRFdmVudCwgdGhpcy5jYXB0dXJlKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5jcmVhdGUoZGlzcG9zZUV2ZW50VGFyZ2V0LFxuXHRcdHsgdGFyZ2V0OiB0aGlzLCBhZGRFdmVudDogYWRkRXZlbnQgfSk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRXZlbnRUYXJnZXQoaW5mbykge1xuXHR2YXIgdGFyZ2V0ID0gaW5mby50YXJnZXQ7XG5cdHRhcmdldC5zb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQuZXZlbnQsIGluZm8uYWRkRXZlbnQsIHRhcmdldC5jYXB0dXJlKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLm9mID0gc3RyZWFtT2Y7XG5leHBvcnRzLmVtcHR5ID0gZW1wdHk7XG5leHBvcnRzLm5ldmVyID0gbmV2ZXI7XG5cbi8qKlxuICogU3RyZWFtIGNvbnRhaW5pbmcgb25seSB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbiBmdW5jdGlvbiBzdHJlYW1PZih4KSB7XG4gXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgSnVzdCh4KSk7XG4gfVxuXG4gZnVuY3Rpb24gSnVzdCh4KSB7XG4gXHR0aGlzLnZhbHVlID0geDtcbiB9XG5cbiBKdXN0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcbiBcdHJldHVybiBzY2hlZHVsZXIuYXNhcChuZXcgUHJvcGFnYXRlVGFzayhydW5KdXN0LCB0aGlzLnZhbHVlLCBzaW5rKSk7XG4gfTtcblxuIGZ1bmN0aW9uIHJ1bkp1c3QodCwgeCwgc2luaykge1xuIFx0c2luay5ldmVudCh0LCB4KTtcbiBcdHNpbmsuZW5kKHQsIHZvaWQgMCk7XG4gfVxuXG4vKipcbiAqIFN0cmVhbSBjb250YWluaW5nIG5vIGV2ZW50cyBhbmQgZW5kcyBpbW1lZGlhdGVseVxuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gZW1wdHkoKSB7XG5cdHJldHVybiBFTVBUWTtcbn1cblxuZnVuY3Rpb24gRW1wdHlTb3VyY2UoKSB7fVxuXG5FbXB0eVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHZhciB0YXNrID0gUHJvcGFnYXRlVGFzay5lbmQodm9pZCAwLCBzaW5rKTtcblx0c2NoZWR1bGVyLmFzYXAodGFzayk7XG5cblx0cmV0dXJuIGRpc3Bvc2UuY3JlYXRlKGRpc3Bvc2VFbXB0eSwgdGFzayk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRW1wdHkodGFzaykge1xuXHRyZXR1cm4gdGFzay5kaXNwb3NlKCk7XG59XG5cbnZhciBFTVBUWSA9IG5ldyBTdHJlYW0obmV3IEVtcHR5U291cmNlKCkpO1xuXG4vKipcbiAqIFN0cmVhbSBjb250YWluaW5nIG5vIGV2ZW50cyBhbmQgbmV2ZXIgZW5kc1xuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gbmV2ZXIoKSB7XG5cdHJldHVybiBORVZFUjtcbn1cblxuZnVuY3Rpb24gTmV2ZXJTb3VyY2UoKSB7fVxuXG5OZXZlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBkaXNwb3NlLmVtcHR5KCk7XG59O1xuXG52YXIgTkVWRVIgPSBuZXcgU3RyZWFtKG5ldyBOZXZlclNvdXJjZSgpKTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTXVsdGljYXN0U291cmNlID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuTXVsdGljYXN0U291cmNlO1xudmFyIERlZmVycmVkU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvRGVmZXJyZWRTaW5rJyk7XG52YXIgdHJ5RXZlbnQgPSByZXF1aXJlKCcuL3RyeUV2ZW50Jyk7XG5cbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShydW4pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IE11bHRpY2FzdFNvdXJjZShuZXcgU3Vic2NyaWJlclNvdXJjZShydW4pKSk7XG59XG5cbmZ1bmN0aW9uIFN1YnNjcmliZXJTb3VyY2Uoc3Vic2NyaWJlKSB7XG5cdHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTtcbn1cblxuU3Vic2NyaWJlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG5ldyBEZWZlcnJlZFNpbmsoc2luayksIHNjaGVkdWxlciwgdGhpcy5fc3Vic2NyaWJlKTtcbn07XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihzaW5rLCBzY2hlZHVsZXIsIHN1YnNjcmliZSkge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXHR0aGlzLl91bnN1YnNjcmliZSA9IHRoaXMuX2luaXQoc3Vic2NyaWJlKTtcbn1cblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKHN1YnNjcmliZSkge1xuXHR2YXIgcyA9IHRoaXM7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gc3Vic2NyaWJlKGFkZCwgZW5kLCBlcnJvcik7XG5cdH0gY2F0Y2goZSkge1xuXHRcdGVycm9yKGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gYWRkKHgpIHtcblx0XHRzLl9hZGQoeCk7XG5cdH1cblx0ZnVuY3Rpb24gZW5kKHgpIHtcblx0XHRzLl9lbmQoeCk7XG5cdH1cblx0ZnVuY3Rpb24gZXJyb3IoZSkge1xuXHRcdHMuX2Vycm9yKGUpO1xuXHR9XG59O1xuXG5TdWJzY3JpcHRpb24ucHJvdG90eXBlLl9hZGQgPSBmdW5jdGlvbih4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0cnlFdmVudC50cnlFdmVudCh0aGlzLnNjaGVkdWxlci5ub3coKSwgeCwgdGhpcy5zaW5rKTtcbn07XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uKHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRyeUV2ZW50LnRyeUVuZCh0aGlzLnNjaGVkdWxlci5ub3coKSwgeCwgdGhpcy5zaW5rKTtcbn07XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24oeCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHR0aGlzLnNpbmsuZXJyb3IodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdGlmKHR5cGVvZiB0aGlzLl91bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiB0aGlzLl91bnN1YnNjcmliZS5jYWxsKHZvaWQgMCk7XG5cdH1cbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGZyb21BcnJheSA9IHJlcXVpcmUoJy4vZnJvbUFycmF5JykuZnJvbUFycmF5O1xudmFyIGlzSXRlcmFibGUgPSByZXF1aXJlKCcuLi9pdGVyYWJsZScpLmlzSXRlcmFibGU7XG52YXIgZnJvbUl0ZXJhYmxlID0gcmVxdWlyZSgnLi9mcm9tSXRlcmFibGUnKS5mcm9tSXRlcmFibGU7XG52YXIgZ2V0T2JzZXJ2YWJsZSA9IHJlcXVpcmUoJy4uL29ic2VydmFibGUvZ2V0T2JzZXJ2YWJsZScpO1xudmFyIGZyb21PYnNlcnZhYmxlID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9mcm9tT2JzZXJ2YWJsZScpLmZyb21PYnNlcnZhYmxlO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmlzQXJyYXlMaWtlO1xuXG5leHBvcnRzLmZyb20gPSBmcm9tO1xuXG5mdW5jdGlvbiBmcm9tKGEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG5cdGlmKGEgaW5zdGFuY2VvZiBTdHJlYW0pIHtcblx0XHRyZXR1cm4gYTtcblx0fVxuXG5cdHZhciBvYnNlcnZhYmxlID0gZ2V0T2JzZXJ2YWJsZShhKTtcblx0aWYob2JzZXJ2YWJsZSAhPSBudWxsKSB7XG5cdFx0cmV0dXJuIGZyb21PYnNlcnZhYmxlKG9ic2VydmFibGUpO1xuXHR9XG5cblx0aWYoQXJyYXkuaXNBcnJheShhKSB8fCBpc0FycmF5TGlrZShhKSkge1xuXHRcdHJldHVybiBmcm9tQXJyYXkoYSk7XG5cdH1cblxuXHRpZihpc0l0ZXJhYmxlKGEpKSB7XG5cdFx0cmV0dXJuIGZyb21JdGVyYWJsZShhKTtcblx0fVxuXG5cdHRocm93IG5ldyBUeXBlRXJyb3IoJ2Zyb20oeCkgbXVzdCBiZSBvYnNlcnZhYmxlLCBpdGVyYWJsZSwgb3IgYXJyYXktbGlrZTogJyArIGEpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5mcm9tQXJyYXkgPSBmcm9tQXJyYXk7XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAoYSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgQXJyYXlTb3VyY2UoYSkpO1xufVxuXG5mdW5jdGlvbiBBcnJheVNvdXJjZShhKSB7XG5cdHRoaXMuYXJyYXkgPSBhO1xufVxuXG5BcnJheVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBzY2hlZHVsZXIuYXNhcChuZXcgUHJvcGFnYXRlVGFzayhydW5Qcm9kdWNlciwgdGhpcy5hcnJheSwgc2luaykpO1xufTtcblxuZnVuY3Rpb24gcnVuUHJvZHVjZXIodCwgYXJyYXksIHNpbmspIHtcblx0Zm9yKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGwgJiYgdGhpcy5hY3RpdmU7ICsraSkge1xuXHRcdHNpbmsuZXZlbnQodCwgYXJyYXlbaV0pO1xuXHR9XG5cblx0dGhpcy5hY3RpdmUgJiYgZW5kKHQpO1xuXG5cdGZ1bmN0aW9uIGVuZCh0KSB7XG5cdFx0c2luay5lbmQodCk7XG5cdH1cbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTXVsdGljYXN0U291cmNlID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuTXVsdGljYXN0U291cmNlO1xudmFyIEV2ZW50VGFyZ2V0U291cmNlID0gcmVxdWlyZSgnLi9FdmVudFRhcmdldFNvdXJjZScpO1xudmFyIEV2ZW50RW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4vRXZlbnRFbWl0dGVyU291cmNlJyk7XG5cbmV4cG9ydHMuZnJvbUV2ZW50ID0gZnJvbUV2ZW50O1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGFuIEV2ZW50VGFyZ2V0LCBzdWNoIGFzIGEgRE9NIE5vZGUsIG9yIEV2ZW50RW1pdHRlci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBldmVudCB0eXBlIG5hbWUsIGUuZy4gJ2NsaWNrJ1xuICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudEVtaXR0ZXJ9IHNvdXJjZSBFdmVudFRhcmdldCBvciBFdmVudEVtaXR0ZXJcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IHVzZUNhcHR1cmUgZm9yIERPTSBldmVudHMsIHdoZXRoZXIgdG8gdXNlXG4gKiAgY2FwdHVyaW5nLS1wYXNzZWQgYXMgM3JkIHBhcmFtZXRlciB0byBhZGRFdmVudExpc3RlbmVyLlxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgYWxsIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGVcbiAqIGZyb20gdGhlIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gZnJvbUV2ZW50KGV2ZW50LCBzb3VyY2UgLyosIHVzZUNhcHR1cmUgPSBmYWxzZSAqLykge1xuXHR2YXIgcztcblxuXHRpZih0eXBlb2Ygc291cmNlLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGNhcHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblx0XHRzID0gbmV3IE11bHRpY2FzdFNvdXJjZShuZXcgRXZlbnRUYXJnZXRTb3VyY2UoZXZlbnQsIHNvdXJjZSwgY2FwdHVyZSkpO1xuXHR9IGVsc2UgaWYodHlwZW9mIHNvdXJjZS5hZGRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cyA9IG5ldyBFdmVudEVtaXR0ZXJTb3VyY2UoZXZlbnQsIHNvdXJjZSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdzb3VyY2UgbXVzdCBzdXBwb3J0IGFkZEV2ZW50TGlzdGVuZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lciBvciBhZGRMaXN0ZW5lci9yZW1vdmVMaXN0ZW5lcicpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBTdHJlYW0ocyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaXRlcmFibGUnKS5nZXRJdGVyYXRvcjtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5mcm9tSXRlcmFibGUgPSBmcm9tSXRlcmFibGU7XG5cbmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgSXRlcmFibGVTb3VyY2UoaXRlcmFibGUpKTtcbn1cblxuZnVuY3Rpb24gSXRlcmFibGVTb3VyY2UoaXRlcmFibGUpIHtcblx0dGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlO1xufVxuXG5JdGVyYWJsZVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgSXRlcmF0b3JQcm9kdWNlcihnZXRJdGVyYXRvcih0aGlzLml0ZXJhYmxlKSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEl0ZXJhdG9yUHJvZHVjZXIoaXRlcmF0b3IsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yO1xuXHR0aGlzLnRhc2sgPSBuZXcgUHJvcGFnYXRlVGFzayhydW5Qcm9kdWNlciwgdGhpcywgc2luayk7XG5cdHNjaGVkdWxlci5hc2FwKHRoaXMudGFzayk7XG59XG5cbkl0ZXJhdG9yUHJvZHVjZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMudGFzay5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiBydW5Qcm9kdWNlcih0LCBwcm9kdWNlciwgc2luaykge1xuXHR2YXIgeCA9IHByb2R1Y2VyLml0ZXJhdG9yLm5leHQoKTtcblx0aWYoeC5kb25lKSB7XG5cdFx0c2luay5lbmQodCwgeC52YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0c2luay5ldmVudCh0LCB4LnZhbHVlKTtcblx0fVxuXG5cdHByb2R1Y2VyLnNjaGVkdWxlci5hc2FwKHByb2R1Y2VyLnRhc2spO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xuXG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5cbi8qKlxuICogQ29tcHV0ZSBhIHN0cmVhbSB1c2luZyBhbiAqYXN5bmMqIGdlbmVyYXRvciwgd2hpY2ggeWllbGRzIHByb21pc2VzXG4gKiB0byBjb250cm9sIGV2ZW50IHRpbWVzLlxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlKGYgLyosIC4uLmFyZ3MgKi8pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IEdlbmVyYXRlU291cmNlKGYsIGJhc2UudGFpbChhcmd1bWVudHMpKSk7XG59XG5cbmZ1bmN0aW9uIEdlbmVyYXRlU291cmNlKGYsIGFyZ3MpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5hcmdzID0gYXJncztcbn1cblxuR2VuZXJhdGVTb3VyY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IEdlbmVyYXRlKHRoaXMuZi5hcHBseSh2b2lkIDAsIHRoaXMuYXJncyksIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBHZW5lcmF0ZShpdGVyYXRvciwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblxuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGZ1bmN0aW9uIGVycihlKSB7XG5cdFx0c2VsZi5zaW5rLmVycm9yKHNlbGYuc2NoZWR1bGVyLm5vdygpLCBlKTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKG5leHQpLmNhdGNoKGVycik7XG59XG5cbmZ1bmN0aW9uIG5leHQoZ2VuZXJhdGUsIHgpIHtcblx0cmV0dXJuIGdlbmVyYXRlLmFjdGl2ZSA/IGhhbmRsZShnZW5lcmF0ZSwgZ2VuZXJhdGUuaXRlcmF0b3IubmV4dCh4KSkgOiB4O1xufVxuXG5mdW5jdGlvbiBoYW5kbGUoZ2VuZXJhdGUsIHJlc3VsdCkge1xuXHRpZiAocmVzdWx0LmRvbmUpIHtcblx0XHRyZXR1cm4gZ2VuZXJhdGUuc2luay5lbmQoZ2VuZXJhdGUuc2NoZWR1bGVyLm5vdygpLCByZXN1bHQudmFsdWUpO1xuXHR9XG5cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQudmFsdWUpLnRoZW4oZnVuY3Rpb24gKHgpIHtcblx0XHRyZXR1cm4gZW1pdChnZW5lcmF0ZSwgeCk7XG5cdH0sIGZ1bmN0aW9uKGUpIHtcblx0XHRyZXR1cm4gZXJyb3IoZ2VuZXJhdGUsIGUpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZW1pdChnZW5lcmF0ZSwgeCkge1xuXHRnZW5lcmF0ZS5zaW5rLmV2ZW50KGdlbmVyYXRlLnNjaGVkdWxlci5ub3coKSwgeCk7XG5cdHJldHVybiBuZXh0KGdlbmVyYXRlLCB4KTtcbn1cblxuZnVuY3Rpb24gZXJyb3IoZ2VuZXJhdGUsIGUpIHtcblx0cmV0dXJuIGhhbmRsZShnZW5lcmF0ZSwgZ2VuZXJhdGUuaXRlcmF0b3IudGhyb3coZSkpO1xufVxuXG5HZW5lcmF0ZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG5cbmV4cG9ydHMuaXRlcmF0ZSA9IGl0ZXJhdGU7XG5cbi8qKlxuICogQ29tcHV0ZSBhIHN0cmVhbSBieSBpdGVyYXRpdmVseSBjYWxsaW5nIGYgdG8gcHJvZHVjZSB2YWx1ZXNcbiAqIEV2ZW50IHRpbWVzIG1heSBiZSBjb250cm9sbGVkIGJ5IHJldHVybmluZyBhIFByb21pc2UgZnJvbSBmXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6KnxQcm9taXNlPCo+fSBmXG4gKiBAcGFyYW0geyp9IHggaW5pdGlhbCB2YWx1ZVxuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZShmLCB4KSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBJdGVyYXRlU291cmNlKGYsIHgpKTtcbn1cblxuZnVuY3Rpb24gSXRlcmF0ZVNvdXJjZShmLCB4KSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMudmFsdWUgPSB4O1xufVxuXG5JdGVyYXRlU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBJdGVyYXRlKHRoaXMuZiwgdGhpcy52YWx1ZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEl0ZXJhdGUoZiwgaW5pdGlhbCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG5cblx0dmFyIHggPSBpbml0aWFsO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0ZnVuY3Rpb24gZXJyKGUpIHtcblx0XHRzZWxmLnNpbmsuZXJyb3Ioc2VsZi5zY2hlZHVsZXIubm93KCksIGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RhcnQoaXRlcmF0ZSkge1xuXHRcdHJldHVybiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKHN0YXJ0KS5jYXRjaChlcnIpO1xufVxuXG5JdGVyYXRlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KSB7XG5cdGl0ZXJhdGUuc2luay5ldmVudChpdGVyYXRlLnNjaGVkdWxlci5ub3coKSwgeCk7XG5cblx0aWYoIWl0ZXJhdGUuYWN0aXZlKSB7XG5cdFx0cmV0dXJuIHg7XG5cdH1cblxuXHR2YXIgZiA9IGl0ZXJhdGUuZjtcblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmKHgpKS50aGVuKGZ1bmN0aW9uKHkpIHtcblx0XHRyZXR1cm4gY29udGludWVJdGVyYXRlKGl0ZXJhdGUsIHkpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gY29udGludWVJdGVyYXRlKGl0ZXJhdGUsIHgpIHtcblx0cmV0dXJuICFpdGVyYXRlLmFjdGl2ZSA/IGl0ZXJhdGUudmFsdWUgOiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIE11bHRpY2FzdFNvdXJjZSA9IHJlcXVpcmUoJ0Btb3N0L211bHRpY2FzdCcpLk11bHRpY2FzdFNvdXJjZTtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5wZXJpb2RpYyA9IHBlcmlvZGljO1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IHRpbWUgcGVyaW9kaWNhbGx5XG4gKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIHBlcmlvZGljaXR5IG9mIGV2ZW50cyBpbiBtaWxsaXNcbiAqIEBwYXJhbSB7KikgdmFsdWUgdmFsdWUgdG8gZW1pdCBlYWNoIHBlcmlvZFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IHRpbWUgZXZlcnkgcGVyaW9kXG4gKi9cbmZ1bmN0aW9uIHBlcmlvZGljKHBlcmlvZCwgdmFsdWUpIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IE11bHRpY2FzdFNvdXJjZShuZXcgUGVyaW9kaWMocGVyaW9kLCB2YWx1ZSkpKTtcbn1cblxuZnVuY3Rpb24gUGVyaW9kaWMocGVyaW9kLCB2YWx1ZSkge1xuXHR0aGlzLnBlcmlvZCA9IHBlcmlvZDtcblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xufVxuXG5QZXJpb2RpYy5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBzY2hlZHVsZXIucGVyaW9kaWModGhpcy5wZXJpb2QsIG5ldyBQcm9wYWdhdGVUYXNrKGVtaXQsIHRoaXMudmFsdWUsIHNpbmspKTtcbn07XG5cbmZ1bmN0aW9uIGVtaXQodCwgeCwgc2luaykge1xuXHRzaW5rLmV2ZW50KHQsIHgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbmV4cG9ydHMudHJ5RXZlbnQgPSB0cnlFdmVudDtcbmV4cG9ydHMudHJ5RW5kID0gdHJ5RW5kO1xuXG5mdW5jdGlvbiB0cnlFdmVudCh0LCB4LCBzaW5rKSB7XG5cdHRyeSB7XG5cdFx0c2luay5ldmVudCh0LCB4KTtcblx0fSBjYXRjaChlKSB7XG5cdFx0c2luay5lcnJvcih0LCBlKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cnlFbmQodCwgeCwgc2luaykge1xuXHR0cnkge1xuXHRcdHNpbmsuZW5kKHQsIHgpO1xuXHR9IGNhdGNoKGUpIHtcblx0XHRzaW5rLmVycm9yKHQsIGUpO1xuXHR9XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xuXG5leHBvcnRzLnVuZm9sZCA9IHVuZm9sZDtcblxuLyoqXG4gKiBDb21wdXRlIGEgc3RyZWFtIGJ5IHVuZm9sZGluZyB0dXBsZXMgb2YgZnV0dXJlIHZhbHVlcyBmcm9tIGEgc2VlZCB2YWx1ZVxuICogRXZlbnQgdGltZXMgbWF5IGJlIGNvbnRyb2xsZWQgYnkgcmV0dXJuaW5nIGEgUHJvbWlzZSBmcm9tIGZcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc2VlZDoqKTp7dmFsdWU6Kiwgc2VlZDoqLCBkb25lOmJvb2xlYW59fFByb21pc2U8e3ZhbHVlOiosIHNlZWQ6KiwgZG9uZTpib29sZWFufT59IGYgdW5mb2xkaW5nIGZ1bmN0aW9uIGFjY2VwdHNcbiAqICBhIHNlZWQgYW5kIHJldHVybnMgYSBuZXcgdHVwbGUgd2l0aCBhIHZhbHVlLCBuZXcgc2VlZCwgYW5kIGJvb2xlYW4gZG9uZSBmbGFnLlxuICogIElmIHR1cGxlLmRvbmUgaXMgdHJ1ZSwgdGhlIHN0cmVhbSB3aWxsIGVuZC5cbiAqIEBwYXJhbSB7Kn0gc2VlZCBzZWVkIHZhbHVlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBhbGwgdmFsdWUgb2YgYWxsIHR1cGxlcyBwcm9kdWNlZCBieSB0aGVcbiAqICB1bmZvbGRpbmcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHVuZm9sZChmLCBzZWVkKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBVbmZvbGRTb3VyY2UoZiwgc2VlZCkpO1xufVxuXG5mdW5jdGlvbiBVbmZvbGRTb3VyY2UoZiwgc2VlZCkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gc2VlZDtcbn1cblxuVW5mb2xkU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBVbmZvbGQodGhpcy5mLCB0aGlzLnZhbHVlLCBzaW5rLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gVW5mb2xkKGYsIHgsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0ZnVuY3Rpb24gZXJyKGUpIHtcblx0XHRzZWxmLnNpbmsuZXJyb3Ioc2VsZi5zY2hlZHVsZXIubm93KCksIGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RhcnQodW5mb2xkKSB7XG5cdFx0cmV0dXJuIHN0ZXBVbmZvbGQodW5mb2xkLCB4KTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKHN0YXJ0KS5jYXRjaChlcnIpO1xufVxuXG5VbmZvbGQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHN0ZXBVbmZvbGQodW5mb2xkLCB4KSB7XG5cdHZhciBmID0gdW5mb2xkLmY7XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoZih4KSkudGhlbihmdW5jdGlvbih0dXBsZSkge1xuXHRcdHJldHVybiBjb250aW51ZVVuZm9sZCh1bmZvbGQsIHR1cGxlKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRpbnVlVW5mb2xkKHVuZm9sZCwgdHVwbGUpIHtcblx0aWYodHVwbGUuZG9uZSkge1xuXHRcdHVuZm9sZC5zaW5rLmVuZCh1bmZvbGQuc2NoZWR1bGVyLm5vdygpLCB0dXBsZS52YWx1ZSk7XG5cdFx0cmV0dXJuIHR1cGxlLnZhbHVlO1xuXHR9XG5cblx0dW5mb2xkLnNpbmsuZXZlbnQodW5mb2xkLnNjaGVkdWxlci5ub3coKSwgdHVwbGUudmFsdWUpO1xuXG5cdGlmKCF1bmZvbGQuYWN0aXZlKSB7XG5cdFx0cmV0dXJuIHR1cGxlLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzdGVwVW5mb2xkKHVuZm9sZCwgdHVwbGUuc2VlZCk7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ0Btb3N0L211bHRpY2FzdCcsIFsnZXhwb3J0cycsICdAbW9zdC9wcmVsdWRlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJykpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb2QgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgZmFjdG9yeShtb2QuZXhwb3J0cywgZ2xvYmFsLnByZWx1ZGUpO1xuICAgIGdsb2JhbC5tb3N0TXVsdGljYXN0ID0gbW9kLmV4cG9ydHM7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzLCBfcHJlbHVkZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuTXVsdGljYXN0U291cmNlID0gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBNdWx0aWNhc3REaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpY2FzdERpc3Bvc2FibGUoc291cmNlLCBzaW5rKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTXVsdGljYXN0RGlzcG9zYWJsZSk7XG5cbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5zaW5rID0gc2luaztcbiAgICAgIHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoTXVsdGljYXN0RGlzcG9zYWJsZSwgW3tcbiAgICAgIGtleTogJ2Rpc3Bvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5zb3VyY2UucmVtb3ZlKHRoaXMuc2luayk7XG4gICAgICAgIHJldHVybiByZW1haW5pbmcgPT09IDAgJiYgdGhpcy5zb3VyY2UuX2Rpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gTXVsdGljYXN0RGlzcG9zYWJsZTtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIHRyeUV2ZW50KHQsIHgsIHNpbmspIHtcbiAgICB0cnkge1xuICAgICAgc2luay5ldmVudCh0LCB4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaW5rLmVycm9yKHQsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeUVuZCh0LCB4LCBzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNpbmsuZW5kKHQsIHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNpbmsuZXJyb3IodCwgZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKGRpc3Bvc2FibGUpIHtcbiAgICByZXR1cm4gZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gIH07XG5cbiAgdmFyIGVtcHR5RGlzcG9zYWJsZSA9IHtcbiAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge31cbiAgfTtcblxuICB2YXIgTXVsdGljYXN0U291cmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpY2FzdFNvdXJjZShzb3VyY2UpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNdWx0aWNhc3RTb3VyY2UpO1xuXG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2lua3MgPSBbXTtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSBlbXB0eURpc3Bvc2FibGU7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKE11bHRpY2FzdFNvdXJjZSwgW3tcbiAgICAgIGtleTogJ3J1bicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcnVuKHNpbmssIHNjaGVkdWxlcikge1xuICAgICAgICB2YXIgbiA9IHRoaXMuYWRkKHNpbmspO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE11bHRpY2FzdERpc3Bvc2FibGUodGhpcywgc2luayk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnX2Rpc3Bvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kaXNwb3NlKCkge1xuICAgICAgICB2YXIgZGlzcG9zYWJsZSA9IHRoaXMuX2Rpc3Bvc2FibGU7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSBlbXB0eURpc3Bvc2FibGU7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGlzcG9zYWJsZSkudGhlbihkaXNwb3NlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdhZGQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChzaW5rKSB7XG4gICAgICAgIHRoaXMuc2lua3MgPSAoMCwgX3ByZWx1ZGUuYXBwZW5kKShzaW5rLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lua3MubGVuZ3RoO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3JlbW92ZScsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKHNpbmspIHtcbiAgICAgICAgdmFyIGkgPSAoMCwgX3ByZWx1ZGUuZmluZEluZGV4KShzaW5rLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgIHRoaXMuc2lua3MgPSAoMCwgX3ByZWx1ZGUucmVtb3ZlKShpLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNpbmtzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdldmVudCcsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZXZlbnQodGltZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNpbmtzO1xuICAgICAgICBpZiAocy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gc1swXS5ldmVudCh0aW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdHJ5RXZlbnQodGltZSwgdmFsdWUsIHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZW5kJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmQodGltZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNpbmtzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB0cnlFbmQodGltZSwgdmFsdWUsIHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZXJyb3InLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVycm9yKHRpbWUsIGVycikge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc2lua3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHNbaV0uZXJyb3IodGltZSwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBNdWx0aWNhc3RTb3VyY2U7XG4gIH0oKTtcblxuICBmdW5jdGlvbiBtdWx0aWNhc3Qoc3RyZWFtKSB7XG4gICAgdmFyIHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE11bHRpY2FzdFNvdXJjZSA/IHN0cmVhbSA6IG5ldyBzdHJlYW0uY29uc3RydWN0b3IobmV3IE11bHRpY2FzdFNvdXJjZShzb3VyY2UpKTtcbiAgfVxuXG4gIGV4cG9ydHMuTXVsdGljYXN0U291cmNlID0gTXVsdGljYXN0U291cmNlO1xuICBleHBvcnRzLmRlZmF1bHQgPSBtdWx0aWNhc3Q7XG59KTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZSgnQG1vc3QvcHJlbHVkZScsIFsnZXhwb3J0cyddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1vZCA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBmYWN0b3J5KG1vZC5leHBvcnRzKTtcbiAgICBnbG9iYWwubW9zdFByZWx1ZGUgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICAvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cblxuICAvLyBOb24tbXV0YXRpbmcgYXJyYXkgb3BlcmF0aW9uc1xuXG4gIC8vIGNvbnMgOjogYSAtPiBbYV0gLT4gW2FdXG4gIC8vIGEgd2l0aCB4IHByZXBlbmRlZFxuICBmdW5jdGlvbiBjb25zKHgsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwgKyAxKTtcbiAgICBiWzBdID0geDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgYltpICsgMV0gPSBhW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIGFwcGVuZCA6OiBhIC0+IFthXSAtPiBbYV1cbiAgLy8gYSB3aXRoIHggYXBwZW5kZWRcbiAgZnVuY3Rpb24gYXBwZW5kKHgsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwgKyAxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgYltpXSA9IGFbaV07XG4gICAgfVxuXG4gICAgYltsXSA9IHg7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBkcm9wIDo6IEludCAtPiBbYV0gLT4gW2FdXG4gIC8vIGRyb3AgZmlyc3QgbiBlbGVtZW50c1xuICBmdW5jdGlvbiBkcm9wKG4sIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAobiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ24gbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMCB8fCBsID09PSAwKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBpZiAobiA+PSBsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuc2FmZURyb3AobiwgYSwgbCAtIG4pO1xuICB9XG5cbiAgLy8gdW5zYWZlRHJvcCA6OiBJbnQgLT4gW2FdIC0+IEludCAtPiBbYV1cbiAgLy8gSW50ZXJuYWwgaGVscGVyIGZvciBkcm9wXG4gIGZ1bmN0aW9uIHVuc2FmZURyb3AobiwgYSwgbCkge1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICBiW2ldID0gYVtuICsgaV07XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9XG5cbiAgLy8gdGFpbCA6OiBbYV0gLT4gW2FdXG4gIC8vIGRyb3AgaGVhZCBlbGVtZW50XG4gIGZ1bmN0aW9uIHRhaWwoYSkge1xuICAgIHJldHVybiBkcm9wKDEsIGEpO1xuICB9XG5cbiAgLy8gY29weSA6OiBbYV0gLT4gW2FdXG4gIC8vIGR1cGxpY2F0ZSBhIChzaGFsbG93IGR1cGxpY2F0aW9uKVxuICBmdW5jdGlvbiBjb3B5KGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICBiW2ldID0gYVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBtYXAgOjogKGEgLT4gYikgLT4gW2FdIC0+IFtiXVxuICAvLyB0cmFuc2Zvcm0gZWFjaCBlbGVtZW50IHdpdGggZlxuICBmdW5jdGlvbiBtYXAoZiwgYSkge1xuICAgIHZhciBsID0gYS5sZW5ndGg7XG4gICAgdmFyIGIgPSBuZXcgQXJyYXkobCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgIGJbaV0gPSBmKGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIHJlZHVjZSA6OiAoYSAtPiBiIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAgLy8gYWNjdW11bGF0ZSB2aWEgbGVmdC1mb2xkXG4gIGZ1bmN0aW9uIHJlZHVjZShmLCB6LCBhKSB7XG4gICAgdmFyIHIgPSB6O1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIHIgPSBmKHIsIGFbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIHJlcGxhY2UgOjogYSAtPiBJbnQgLT4gW2FdXG4gIC8vIHJlcGxhY2UgZWxlbWVudCBhdCBpbmRleFxuICBmdW5jdGlvbiByZXBsYWNlKHgsIGksIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2kgbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICB2YXIgYiA9IG5ldyBBcnJheShsKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGw7ICsraikge1xuICAgICAgYltqXSA9IGkgPT09IGogPyB4IDogYVtqXTtcbiAgICB9XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyByZW1vdmUgOjogSW50IC0+IFthXSAtPiBbYV1cbiAgLy8gcmVtb3ZlIGVsZW1lbnQgYXQgaW5kZXhcbiAgZnVuY3Rpb24gcmVtb3ZlKGksIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2kgbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICBpZiAobCA9PT0gMCB8fCBpID49IGwpIHtcbiAgICAgIC8vIGV4aXQgZWFybHkgaWYgaW5kZXggYmV5b25kIGVuZCBvZiBhcnJheVxuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgaWYgKGwgPT09IDEpIHtcbiAgICAgIC8vIGV4aXQgZWFybHkgaWYgaW5kZXggaW4gYm91bmRzIGFuZCBsZW5ndGggPT09IDFcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5zYWZlUmVtb3ZlKGksIGEsIGwgLSAxKTtcbiAgfVxuXG4gIC8vIHVuc2FmZVJlbW92ZSA6OiBJbnQgLT4gW2FdIC0+IEludCAtPiBbYV1cbiAgLy8gSW50ZXJuYWwgaGVscGVyIHRvIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4XG4gIGZ1bmN0aW9uIHVuc2FmZVJlbW92ZShpLCBhLCBsKSB7XG4gICAgdmFyIGIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGogPSB1bmRlZmluZWQ7XG4gICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikge1xuICAgICAgYltqXSA9IGFbal07XG4gICAgfVxuICAgIGZvciAoaiA9IGk7IGogPCBsOyArK2opIHtcbiAgICAgIGJbal0gPSBhW2ogKyAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIHJlbW92ZUFsbCA6OiAoYSAtPiBib29sZWFuKSAtPiBbYV0gLT4gW2FdXG4gIC8vIHJlbW92ZSBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKGYsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBqID0gMDtcbiAgICBmb3IgKHZhciB4LCBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICBpZiAoIWYoeCkpIHtcbiAgICAgICAgYltqXSA9IHg7XG4gICAgICAgICsrajtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiLmxlbmd0aCA9IGo7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBmaW5kSW5kZXggOjogYSAtPiBbYV0gLT4gSW50XG4gIC8vIGZpbmQgaW5kZXggb2YgeCBpbiBhLCBmcm9tIHRoZSBsZWZ0XG4gIGZ1bmN0aW9uIGZpbmRJbmRleCh4LCBhKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgaWYgKHggPT09IGFbaV0pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIGlzQXJyYXlMaWtlIDo6ICogLT4gYm9vbGVhblxuICAvLyBSZXR1cm4gdHJ1ZSBpZmYgeCBpcyBhcnJheS1saWtlXG4gIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgICByZXR1cm4geCAhPSBudWxsICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHggIT09ICdmdW5jdGlvbic7XG4gIH1cblxuICAvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cblxuICAvLyBpZCA6OiBhIC0+IGFcbiAgdmFyIGlkID0gZnVuY3Rpb24gaWQoeCkge1xuICAgIHJldHVybiB4O1xuICB9O1xuXG4gIC8vIGNvbXBvc2UgOjogKGIgLT4gYykgLT4gKGEgLT4gYikgLT4gKGEgLT4gYylcbiAgdmFyIGNvbXBvc2UgPSBmdW5jdGlvbiBjb21wb3NlKGYsIGcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmKGcoeCkpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gYXBwbHkgOjogKGEgLT4gYikgLT4gYSAtPiBiXG4gIHZhciBhcHBseSA9IGZ1bmN0aW9uIGFwcGx5KGYsIHgpIHtcbiAgICByZXR1cm4gZih4KTtcbiAgfTtcblxuICAvLyBjdXJyeTIgOjogKChhLCBiKSAtPiBjKSAtPiAoYSAtPiBiIC0+IGMpXG4gIGZ1bmN0aW9uIGN1cnJ5MihmKSB7XG4gICAgZnVuY3Rpb24gY3VycmllZChhLCBiKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBjdXJyaWVkO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICByZXR1cm4gZihhLCBiKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmKGEsIGIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmllZDtcbiAgfVxuXG4gIC8vIGN1cnJ5MyA6OiAoKGEsIGIsIGMpIC0+IGQpIC0+IChhIC0+IGIgLT4gYyAtPiBkKVxuICBmdW5jdGlvbiBjdXJyeTMoZikge1xuICAgIGZ1bmN0aW9uIGN1cnJpZWQoYSwgYiwgYykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBjdXJyaWVkO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGN1cnJ5MihmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgcmV0dXJuIGYoYSwgYiwgYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBmKGEsIGIsIGMpO1xuICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGYoYSwgYiwgYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyaWVkO1xuICB9XG5cbiAgZXhwb3J0cy5jb25zID0gY29ucztcbiAgZXhwb3J0cy5hcHBlbmQgPSBhcHBlbmQ7XG4gIGV4cG9ydHMuZHJvcCA9IGRyb3A7XG4gIGV4cG9ydHMudGFpbCA9IHRhaWw7XG4gIGV4cG9ydHMuY29weSA9IGNvcHk7XG4gIGV4cG9ydHMubWFwID0gbWFwO1xuICBleHBvcnRzLnJlZHVjZSA9IHJlZHVjZTtcbiAgZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcbiAgZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG4gIGV4cG9ydHMucmVtb3ZlQWxsID0gcmVtb3ZlQWxsO1xuICBleHBvcnRzLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuICBleHBvcnRzLmlkID0gaWQ7XG4gIGV4cG9ydHMuY29tcG9zZSA9IGNvbXBvc2U7XG4gIGV4cG9ydHMuYXBwbHkgPSBhcHBseTtcbiAgZXhwb3J0cy5jdXJyeTIgPSBjdXJyeTI7XG4gIGV4cG9ydHMuY3VycnkzID0gY3VycnkzO1xufSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiBnbG9iYWwgd2luZG93ICovXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9wb255ZmlsbCcpKGdsb2JhbCB8fCB3aW5kb3cgfHwgdGhpcyk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OXplVzFpYjJ3dGIySnpaWEoyWVdKc1pTOXBibVJsZUM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9nWjJ4dlltRnNJSGRwYm1SdmR5QXFMMXh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSEpsY1hWcGNtVW9KeTR2Y0c5dWVXWnBiR3duS1NobmJHOWlZV3dnZkh3Z2QybHVaRzkzSUh4OElIUm9hWE1wTzF4dUlsMTkiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9saWIvU3RyZWFtJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2NvcmUnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2Zyb20nKS5mcm9tO1xudmFyIHBlcmlvZGljID0gcmVxdWlyZSgnLi9saWIvc291cmNlL3BlcmlvZGljJykucGVyaW9kaWM7XG52YXIgc3ltYm9sT2JzZXJ2YWJsZSA9IHJlcXVpcmUoJ3N5bWJvbC1vYnNlcnZhYmxlJyk7XG5cbi8qKlxuICogQ29yZSBzdHJlYW0gdHlwZVxuICogQHR5cGUge1N0cmVhbX1cbiAqL1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW07XG5cbi8vIEFkZCBvZiBhbmQgZW1wdHkgdG8gY29uc3RydWN0b3IgZm9yIGZhbnRhc3ktbGFuZCBjb21wYXRcbmV4cG9ydHMub2YgICAgICAgPSBTdHJlYW0ub2YgICAgPSBjb3JlLm9mO1xuZXhwb3J0cy5qdXN0ICAgICA9IGNvcmUub2Y7IC8vIGVhc2llciBFUzYgaW1wb3J0IGFsaWFzXG5leHBvcnRzLmVtcHR5ICAgID0gU3RyZWFtLmVtcHR5ID0gY29yZS5lbXB0eTtcbmV4cG9ydHMubmV2ZXIgICAgPSBjb3JlLm5ldmVyO1xuZXhwb3J0cy5mcm9tICAgICA9IGZyb207XG5leHBvcnRzLnBlcmlvZGljID0gcGVyaW9kaWM7XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERyYWZ0IEVTIE9ic2VydmFibGUgcHJvcG9zYWwgaW50ZXJvcFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxuXG52YXIgc3Vic2NyaWJlID0gcmVxdWlyZSgnLi9saWIvb2JzZXJ2YWJsZS9zdWJzY3JpYmUnKS5zdWJzY3JpYmU7XG5cblN0cmVhbS5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuXHRyZXR1cm4gc3Vic2NyaWJlKHN1YnNjcmliZXIsIHRoaXMpO1xufTtcblxuU3RyZWFtLnByb3RvdHlwZVtzeW1ib2xPYnNlcnZhYmxlXSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmx1ZW50IGFkYXB0ZXJcblxudmFyIHRocnUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3RocnUnKS50aHJ1O1xuXG4vKipcbiAqIEFkYXB0IGEgZnVuY3Rpb25hbCBzdHJlYW0gdHJhbnNmb3JtIHRvIGZsdWVudCBzdHlsZS5cbiAqIEl0IGFwcGxpZXMgZiB0byB0aGUgdGhpcyBzdHJlYW0gb2JqZWN0XG4gKiBAcGFyYW0gIHtmdW5jdGlvbihzOiBTdHJlYW0pOiBTdHJlYW19IGYgZnVuY3Rpb24gdGhhdFxuICogcmVjZWl2ZXMgdGhlIHN0cmVhbSBpdHNlbGYgYW5kIG11c3QgcmV0dXJuIGEgbmV3IHN0cmVhbVxuICogQHJldHVybiB7U3RyZWFtfVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRocnUgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiB0aHJ1KGYsIHRoaXMpO1xufVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDcmVhdGluZ1xuXG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2NyZWF0ZScpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBDcmVhdGUgYSBzdHJlYW0gYnkgaW1wZXJhdGl2ZWx5IHB1c2hpbmcgZXZlbnRzLlxuICogQHBhcmFtIHtmdW5jdGlvbihhZGQ6ZnVuY3Rpb24oeCksIGVuZDpmdW5jdGlvbihlKSk6ZnVuY3Rpb259IHJ1biBmdW5jdGlvblxuICogIHRoYXQgd2lsbCByZWNlaXZlIDIgZnVuY3Rpb25zIGFzIGFyZ3VtZW50cywgdGhlIGZpcnN0IHRvIGFkZCBuZXcgdmFsdWVzIHRvIHRoZVxuICogIHN0cmVhbSBhbmQgdGhlIHNlY29uZCB0byBlbmQgdGhlIHN0cmVhbS4gSXQgbWF5ICpyZXR1cm4qIGEgZnVuY3Rpb24gdGhhdFxuICogIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWxsIGNvbnN1bWVycyBoYXZlIHN0b3BwZWQgb2JzZXJ2aW5nIHRoZSBzdHJlYW0uXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGFkZGVkIGJ5IHJ1biBiZWZvcmUgZW5kXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlLmNyZWF0ZTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRhcHRpbmcgb3RoZXIgc291cmNlc1xuXG52YXIgZXZlbnRzID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2Zyb21FdmVudCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSBvZiBldmVudHMgZnJvbSB0aGUgc3VwcGxpZWQgRXZlbnRUYXJnZXQgb3IgRXZlbnRFbWl0dGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudEVtaXR0ZXJ9IHNvdXJjZSBFdmVudFRhcmdldCBvciBFdmVudEVtaXR0ZXIuIFRoZSBzb3VyY2VcbiAqICBtdXN0IHN1cHBvcnQgZWl0aGVyIGFkZEV2ZW50TGlzdGVuZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lciAodzNjIEV2ZW50VGFyZ2V0OlxuICogIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUV2ZW50cy9ldmVudHMuaHRtbCNFdmVudHMtRXZlbnRUYXJnZXQpLFxuICogIG9yIGFkZExpc3RlbmVyL3JlbW92ZUxpc3RlbmVyIChub2RlIEV2ZW50RW1pdHRlcjogaHR0cDovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sKVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIG9mIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgc291cmNlXG4gKi9cbmV4cG9ydHMuZnJvbUV2ZW50ID0gZXZlbnRzLmZyb21FdmVudDtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JzZXJ2aW5nXG5cbnZhciBvYnNlcnZlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9vYnNlcnZlJyk7XG5cbmV4cG9ydHMub2JzZXJ2ZSA9IG9ic2VydmUub2JzZXJ2ZTtcbmV4cG9ydHMuZm9yRWFjaCA9IG9ic2VydmUub2JzZXJ2ZTtcbmV4cG9ydHMuZHJhaW4gICA9IG9ic2VydmUuZHJhaW47XG5cbi8qKlxuICogUHJvY2VzcyBhbGwgdGhlIGV2ZW50cyBpbiB0aGUgc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdoZW4gdGhlIHN0cmVhbSBlbmRzLCBvciByZWplY3RzXG4gKiAgaWYgdGhlIHN0cmVhbSBmYWlscyB3aXRoIGFuIHVuaGFuZGxlZCBlcnJvci5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5vYnNlcnZlID0gU3RyZWFtLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZikge1xuXHRyZXR1cm4gb2JzZXJ2ZS5vYnNlcnZlKGYsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBDb25zdW1lIGFsbCBldmVudHMgaW4gdGhlIHN0cmVhbSwgd2l0aG91dCBwcm92aWRpbmcgYSBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2guXG4gKiBUaGlzIGNhdXNlcyBhIHN0cmVhbSB0byBiZWNvbWUgYWN0aXZlIGFuZCBiZWdpbiBlbWl0dGluZyBldmVudHMsIGFuZCBpcyB1c2VmdWxcbiAqIGluIGNhc2VzIHdoZXJlIGFsbCBwcm9jZXNzaW5nIGhhcyBiZWVuIHNldHVwIHVwc3RyZWFtIHZpYSBvdGhlciBjb21iaW5hdG9ycywgYW5kXG4gKiB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlIHRlcm1pbmFsIGV2ZW50cy5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiB0aGUgc3RyZWFtIGVuZHMsIG9yIHJlamVjdHNcbiAqICBpZiB0aGUgc3RyZWFtIGZhaWxzIHdpdGggYW4gdW5oYW5kbGVkIGVycm9yLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBvYnNlcnZlLmRyYWluKHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBsb29wID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9sb29wJykubG9vcDtcblxuZXhwb3J0cy5sb29wID0gbG9vcDtcblxuLyoqXG4gKiBHZW5lcmFsaXplZCBmZWVkYmFjayBsb29wLiBDYWxsIGEgc3RlcHBlciBmdW5jdGlvbiBmb3IgZWFjaCBldmVudC4gVGhlIHN0ZXBwZXJcbiAqIHdpbGwgYmUgY2FsbGVkIHdpdGggMiBwYXJhbXM6IHRoZSBjdXJyZW50IHNlZWQgYW5kIHRoZSBhbiBldmVudCB2YWx1ZS4gIEl0IG11c3RcbiAqIHJldHVybiBhIG5ldyB7IHNlZWQsIHZhbHVlIH0gcGFpci4gVGhlIGBzZWVkYCB3aWxsIGJlIGZlZCBiYWNrIGludG8gdGhlIG5leHRcbiAqIGludm9jYXRpb24gb2Ygc3RlcHBlciwgYW5kIHRoZSBgdmFsdWVgIHdpbGwgYmUgcHJvcGFnYXRlZCBhcyB0aGUgZXZlbnQgdmFsdWUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHNlZWQ6KiwgdmFsdWU6Kik6e3NlZWQ6KiwgdmFsdWU6Kn19IHN0ZXBwZXIgbG9vcCBzdGVwIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHNlZWQgaW5pdGlhbCBzZWVkIHZhbHVlIHBhc3NlZCB0byBmaXJzdCBzdGVwcGVyIGNhbGxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2hvc2UgdmFsdWVzIGFyZSB0aGUgYHZhbHVlYCBmaWVsZCBvZiB0aGUgb2JqZWN0c1xuICogcmV0dXJuZWQgYnkgdGhlIHN0ZXBwZXJcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5sb29wID0gZnVuY3Rpb24oc3RlcHBlciwgc2VlZCkge1xuXHRyZXR1cm4gbG9vcChzdGVwcGVyLCBzZWVkLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgYWNjdW11bGF0ZSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvYWNjdW11bGF0ZScpO1xuXG5leHBvcnRzLnNjYW4gICA9IGFjY3VtdWxhdGUuc2NhbjtcbmV4cG9ydHMucmVkdWNlID0gYWNjdW11bGF0ZS5yZWR1Y2U7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyZWFtIGNvbnRhaW5pbmcgc3VjY2Vzc2l2ZSByZWR1Y2UgcmVzdWx0cyBvZiBhcHBseWluZyBmIHRvXG4gKiB0aGUgcHJldmlvdXMgcmVkdWNlIHJlc3VsdCBhbmQgdGhlIGN1cnJlbnQgc3RyZWFtIGl0ZW0uXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHJlc3VsdDoqLCB4OiopOip9IGYgcmVkdWNlciBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBpbml0aWFsIGluaXRpYWwgdmFsdWVcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBzdWNjZXNzaXZlIHJlZHVjZSByZXN1bHRzXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2NhbiA9IGZ1bmN0aW9uKGYsIGluaXRpYWwpIHtcblx0cmV0dXJuIGFjY3VtdWxhdGUuc2NhbihmLCBpbml0aWFsLCB0aGlzKTtcbn07XG5cbi8qKlxuICogUmVkdWNlIHRoZSBzdHJlYW0gdG8gcHJvZHVjZSBhIHNpbmdsZSByZXN1bHQuICBOb3RlIHRoYXQgcmVkdWNpbmcgYW4gaW5maW5pdGVcbiAqIHN0cmVhbSB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCBuZXZlciBmdWxmaWxscywgYnV0IHRoYXQgbWF5IHJlamVjdCBpZiBhbiBlcnJvclxuICogb2NjdXJzLlxuICogQHBhcmFtIHtmdW5jdGlvbihyZXN1bHQ6KiwgeDoqKToqfSBmIHJlZHVjZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gaW5pdGlhbCBvcHRpb25hbCBpbml0aWFsIHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSBmb3IgdGhlIGZpbGUgcmVzdWx0IG9mIHRoZSByZWR1Y2VcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbihmLCBpbml0aWFsKSB7XG5cdHJldHVybiBhY2N1bXVsYXRlLnJlZHVjZShmLCBpbml0aWFsLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1aWxkaW5nIGFuZCBleHRlbmRpbmdcblxudmFyIHVuZm9sZCA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS91bmZvbGQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2l0ZXJhdGUnKTtcbnZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS9nZW5lcmF0ZScpO1xudmFyIGJ1aWxkID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9idWlsZCcpO1xuXG5leHBvcnRzLnVuZm9sZCAgICA9IHVuZm9sZC51bmZvbGQ7XG5leHBvcnRzLml0ZXJhdGUgICA9IGl0ZXJhdGUuaXRlcmF0ZTtcbmV4cG9ydHMuZ2VuZXJhdGUgID0gZ2VuZXJhdGUuZ2VuZXJhdGU7XG5leHBvcnRzLmN5Y2xlICAgICA9IGJ1aWxkLmN5Y2xlO1xuZXhwb3J0cy5jb25jYXQgICAgPSBidWlsZC5jb25jYXQ7XG5leHBvcnRzLnN0YXJ0V2l0aCA9IGJ1aWxkLmNvbnM7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRpZSB0aGlzIHN0cmVhbSBpbnRvIGEgY2lyY2xlLCB0aHVzIGNyZWF0aW5nIGFuIGluZmluaXRlIHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGluZmluaXRlIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLmN5Y2xlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBidWlsZC5jeWNsZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJlYW19IHRhaWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgaXRlbXMgaW4gdGhpcyBmb2xsb3dlZCBieVxuICogIGFsbCBpdGVtcyBpbiB0YWlsXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24odGFpbCkge1xuXHRyZXR1cm4gYnVpbGQuY29uY2F0KHRoaXMsIHRhaWwpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IHggdmFsdWUgdG8gcHJlcGVuZFxuICogQHJldHVybnMge1N0cmVhbX0gYSBuZXcgc3RyZWFtIHdpdGggeCBwcmVwZW5kZWRcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5zdGFydFdpdGggPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiBidWlsZC5jb25zKHgsIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHJhbnNmb3JtaW5nXG5cbnZhciB0cmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3RyYW5zZm9ybScpO1xudmFyIGFwcGxpY2F0aXZlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9hcHBsaWNhdGl2ZScpO1xuXG5leHBvcnRzLm1hcCAgICAgID0gdHJhbnNmb3JtLm1hcDtcbmV4cG9ydHMuY29uc3RhbnQgPSB0cmFuc2Zvcm0uY29uc3RhbnQ7XG5leHBvcnRzLnRhcCAgICAgID0gdHJhbnNmb3JtLnRhcDtcbmV4cG9ydHMuYXAgICAgICAgPSBhcHBsaWNhdGl2ZS5hcDtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gZWFjaCB2YWx1ZSBpbiB0aGUgc3RyZWFtIGJ5IGFwcGx5aW5nIGYgdG8gZWFjaFxuICogQHBhcmFtIHtmdW5jdGlvbigqKToqfSBmIG1hcHBpbmcgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHRyYW5zZm9ybWVkIGJ5IGZcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiB0cmFuc2Zvcm0ubWFwKGYsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBBc3N1bWUgdGhpcyBzdHJlYW0gY29udGFpbnMgZnVuY3Rpb25zLCBhbmQgYXBwbHkgZWFjaCBmdW5jdGlvbiB0byBlYWNoIGl0ZW1cbiAqIGluIHRoZSBwcm92aWRlZCBzdHJlYW0uICBUaGlzIGdlbmVyYXRlcywgaW4gZWZmZWN0LCBhIGNyb3NzIHByb2R1Y3QuXG4gKiBAcGFyYW0ge1N0cmVhbX0geHMgc3RyZWFtIG9mIGl0ZW1zIHRvIHdoaWNoXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBpdGVtc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oeHMpIHtcblx0cmV0dXJuIGFwcGxpY2F0aXZlLmFwKHRoaXMsIHhzKTtcbn07XG5cbi8qKlxuICogUmVwbGFjZSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gd2l0aCB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHJlcGxhY2VkIHdpdGggeFxuICovXG5TdHJlYW0ucHJvdG90eXBlLmNvbnN0YW50ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdHJhbnNmb3JtLmNvbnN0YW50KHgsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgc2lkZSBlZmZlY3QgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RyZWFtXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6Kn0gZiBzaWRlIGVmZmVjdCB0byBleGVjdXRlIGZvciBlYWNoIGl0ZW0uIFRoZVxuICogIHJldHVybiB2YWx1ZSB3aWxsIGJlIGRpc2NhcmRlZC5cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyB0aGUgc2FtZSBpdGVtcyBhcyB0aGlzIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRhcCA9IGZ1bmN0aW9uKGYpIHtcblx0cmV0dXJuIHRyYW5zZm9ybS50YXAoZiwgdGhpcyk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmFuc2R1Y2VyIHN1cHBvcnRcblxudmFyIHRyYW5zZHVjZSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvdHJhbnNkdWNlJyk7XG5cbmV4cG9ydHMudHJhbnNkdWNlID0gdHJhbnNkdWNlLnRyYW5zZHVjZTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhpcyBzdHJlYW0gYnkgcGFzc2luZyBpdHMgZXZlbnRzIHRocm91Z2ggYSB0cmFuc2R1Y2VyLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IHRyYW5zZHVjZXIgdHJhbnNkdWNlciBmdW5jdGlvblxuICogQHJldHVybiB7U3RyZWFtfSBzdHJlYW0gb2YgZXZlbnRzIHRyYW5zZm9ybWVkIGJ5IHRoZSB0cmFuc2R1Y2VyXG4gKi9cblN0cmVhbS5wcm90b3R5cGUudHJhbnNkdWNlID0gZnVuY3Rpb24odHJhbnNkdWNlcikge1xuXHRyZXR1cm4gdHJhbnNkdWNlLnRyYW5zZHVjZSh0cmFuc2R1Y2VyLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZsYXRNYXBwaW5nXG5cbnZhciBmbGF0TWFwID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9mbGF0TWFwJyk7XG5cbmV4cG9ydHMuZmxhdE1hcCA9IGV4cG9ydHMuY2hhaW4gPSBmbGF0TWFwLmZsYXRNYXA7XG5leHBvcnRzLmpvaW4gICAgPSBmbGF0TWFwLmpvaW47XG5cbi8qKlxuICogTWFwIGVhY2ggdmFsdWUgaW4gdGhlIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBtZXJnZSBpdCBpbnRvIHRoZVxuICogcmV0dXJuZWQgb3V0ZXIgc3RyZWFtLiBFdmVudCBhcnJpdmFsIHRpbWVzIGFyZSBwcmVzZXJ2ZWQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGNoYWluaW5nIGZ1bmN0aW9uLCBtdXN0IHJldHVybiBhIFN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgZnJvbSBlYWNoIHN0cmVhbSByZXR1cm5lZCBieSBmXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZmxhdE1hcCA9IFN0cmVhbS5wcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiBmbGF0TWFwLmZsYXRNYXAoZiwgdGhpcyk7XG59O1xuXG4vKipcbiAqIE1vbmFkaWMgam9pbi4gRmxhdHRlbiBhIFN0cmVhbTxTdHJlYW08WD4+IHRvIFN0cmVhbTxYPiBieSBtZXJnaW5nIGlubmVyXG4gKiBzdHJlYW1zIHRvIHRoZSBvdXRlci4gRXZlbnQgYXJyaXZhbCB0aW1lcyBhcmUgcHJlc2VydmVkLlxuICogQHJldHVybnMge1N0cmVhbTxYPn0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgb2YgYWxsIGlubmVyIHN0cmVhbXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBmbGF0TWFwLmpvaW4odGhpcyk7XG59O1xuXG52YXIgY29udGludWVXaXRoID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9jb250aW51ZVdpdGgnKS5jb250aW51ZVdpdGg7XG5cbmV4cG9ydHMuY29udGludWVXaXRoID0gY29udGludWVXaXRoO1xuZXhwb3J0cy5mbGF0TWFwRW5kID0gY29udGludWVXaXRoO1xuXG4vKipcbiAqIE1hcCB0aGUgZW5kIGV2ZW50IHRvIGEgbmV3IHN0cmVhbSwgYW5kIGJlZ2luIGVtaXR0aW5nIGl0cyB2YWx1ZXMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGVuZCBldmVudCB2YWx1ZSxcbiAqIGFuZCAqbXVzdCogcmV0dXJuIGEgbmV3IFN0cmVhbSB0byBjb250aW51ZSB3aXRoLlxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IGVtaXRzIGFsbCBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtLFxuICogZm9sbG93ZWQgYnkgYWxsIGV2ZW50cyBmcm9tIHRoZSBzdHJlYW0gcmV0dXJuZWQgYnkgZi5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5jb250aW51ZVdpdGggPSBTdHJlYW0ucHJvdG90eXBlLmZsYXRNYXBFbmQgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiBjb250aW51ZVdpdGgoZiwgdGhpcyk7XG59O1xuXG52YXIgY29uY2F0TWFwID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9jb25jYXRNYXAnKS5jb25jYXRNYXA7XG5cbmV4cG9ydHMuY29uY2F0TWFwID0gY29uY2F0TWFwO1xuXG5TdHJlYW0ucHJvdG90eXBlLmNvbmNhdE1hcCA9IGZ1bmN0aW9uKGYpIHtcblx0cmV0dXJuIGNvbmNhdE1hcChmLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmN1cnJlbnQgbWVyZ2luZ1xuXG52YXIgbWVyZ2VDb25jdXJyZW50bHkgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL21lcmdlQ29uY3VycmVudGx5Jyk7XG5cbmV4cG9ydHMubWVyZ2VDb25jdXJyZW50bHkgPSBtZXJnZUNvbmN1cnJlbnRseS5tZXJnZUNvbmN1cnJlbnRseTtcblxuLyoqXG4gKiBGbGF0dGVuIGEgU3RyZWFtPFN0cmVhbTxYPj4gdG8gU3RyZWFtPFg+IGJ5IG1lcmdpbmcgaW5uZXJcbiAqIHN0cmVhbXMgdG8gdGhlIG91dGVyLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGlubmVyIHN0cmVhbXMgdGhhdCBtYXlcbiAqIGJlIGFjdGl2ZSBjb25jdXJyZW50bHkuXG4gKiBAcGFyYW0ge251bWJlcn0gY29uY3VycmVuY3kgYXQgbW9zdCB0aGlzIG1hbnkgaW5uZXIgc3RyZWFtcyB3aWxsIGJlXG4gKiAgYWxsb3dlZCB0byBiZSBhY3RpdmUgY29uY3VycmVudGx5LlxuICogQHJldHVybiB7U3RyZWFtPFg+fSBuZXcgc3RyZWFtIGNvbnRhaW5pbmcgYWxsIGV2ZW50cyBvZiBhbGwgaW5uZXJcbiAqICBzdHJlYW1zLCB3aXRoIGxpbWl0ZWQgY29uY3VycmVuY3kuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubWVyZ2VDb25jdXJyZW50bHkgPSBmdW5jdGlvbihjb25jdXJyZW5jeSkge1xuXHRyZXR1cm4gbWVyZ2VDb25jdXJyZW50bHkubWVyZ2VDb25jdXJyZW50bHkoY29uY3VycmVuY3ksIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVyZ2luZ1xuXG52YXIgbWVyZ2UgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL21lcmdlJyk7XG5cbmV4cG9ydHMubWVyZ2UgPSBtZXJnZS5tZXJnZTtcbmV4cG9ydHMubWVyZ2VBcnJheSA9IG1lcmdlLm1lcmdlQXJyYXk7XG5cbi8qKlxuICogTWVyZ2UgdGhpcyBzdHJlYW0gYW5kIGFsbCB0aGUgcHJvdmlkZWQgc3RyZWFtc1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgaXRlbXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcyBpbiB0aW1lXG4gKiBvcmRlci4gIElmIHR3byBldmVudHMgYXJlIHNpbXVsdGFuZW91cyB0aGV5IHdpbGwgYmUgbWVyZ2VkIGluXG4gKiBhcmJpdHJhcnkgb3JkZXIuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbigvKi4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gbWVyZ2UubWVyZ2VBcnJheShiYXNlLmNvbnModGhpcywgYXJndW1lbnRzKSk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb21iaW5pbmdcblxudmFyIGNvbWJpbmUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL2NvbWJpbmUnKTtcblxuZXhwb3J0cy5jb21iaW5lID0gY29tYmluZS5jb21iaW5lO1xuZXhwb3J0cy5jb21iaW5lQXJyYXkgPSBjb21iaW5lLmNvbWJpbmVBcnJheTtcblxuLyoqXG4gKiBDb21iaW5lIGxhdGVzdCBldmVudHMgZnJvbSBhbGwgaW5wdXQgc3RyZWFtc1xuICogQHBhcmFtIHtmdW5jdGlvbiguLi5ldmVudHMpOip9IGYgZnVuY3Rpb24gdG8gY29tYmluZSBtb3N0IHJlY2VudCBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgZiB0byB0aGUgbW9zdCByZWNlbnRcbiAqICBldmVudCBvZiBlYWNoIGlucHV0IHN0cmVhbSwgd2hlbmV2ZXIgYSBuZXcgZXZlbnQgYXJyaXZlcyBvbiBhbnkgc3RyZWFtLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbihmIC8qLCAuLi5zdHJlYW1zKi8pIHtcblx0cmV0dXJuIGNvbWJpbmUuY29tYmluZUFycmF5KGYsIGJhc2UucmVwbGFjZSh0aGlzLCAwLCBhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNhbXBsaW5nXG5cbnZhciBzYW1wbGUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3NhbXBsZScpO1xuXG5leHBvcnRzLnNhbXBsZSA9IHNhbXBsZS5zYW1wbGU7XG5leHBvcnRzLnNhbXBsZVdpdGggPSBzYW1wbGUuc2FtcGxlV2l0aDtcblxuLyoqXG4gKiBXaGVuIGFuIGV2ZW50IGFycml2ZXMgb24gc2FtcGxlciwgZW1pdCB0aGUgbGF0ZXN0IGV2ZW50IHZhbHVlIGZyb20gc3RyZWFtLlxuICogQHBhcmFtIHtTdHJlYW19IHNhbXBsZXIgc3RyZWFtIG9mIGV2ZW50cyBhdCB3aG9zZSBhcnJpdmFsIHRpbWVcbiAqICBzaWduYWwncyBsYXRlc3QgdmFsdWUgd2lsbCBiZSBwcm9wYWdhdGVkXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzYW1wbGVkIHN0cmVhbSBvZiB2YWx1ZXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5zYW1wbGVXaXRoID0gZnVuY3Rpb24oc2FtcGxlcikge1xuXHRyZXR1cm4gc2FtcGxlLnNhbXBsZVdpdGgoc2FtcGxlciwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFdoZW4gYW4gZXZlbnQgYXJyaXZlcyBvbiB0aGlzIHN0cmVhbSwgZW1pdCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZiB3aXRoIHRoZSBsYXRlc3RcbiAqIHZhbHVlcyBvZiBhbGwgc3RyZWFtcyBiZWluZyBzYW1wbGVkXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLnZhbHVlcyk6Kn0gZiBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHNldCBvZiBzYW1wbGVkIHZhbHVlc1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIG9mIHNhbXBsZWQgYW5kIHRyYW5zZm9ybWVkIHZhbHVlc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uKGYgLyogLi4uc3RyZWFtcyAqLykge1xuXHRyZXR1cm4gc2FtcGxlLnNhbXBsZUFycmF5KGYsIHRoaXMsIGJhc2UudGFpbChhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFppcHBpbmdcblxudmFyIHppcCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvemlwJyk7XG5cbmV4cG9ydHMuemlwID0gemlwLnppcDtcblxuLyoqXG4gKiBQYWlyLXdpc2UgY29tYmluZSBpdGVtcyB3aXRoIHRob3NlIGluIHMuIEdpdmVuIDIgc3RyZWFtczpcbiAqIFsxLDIsM10gemlwV2l0aCBmIFs0LDUsNl0gLT4gW2YoMSw0KSxmKDIsNSksZigzLDYpXVxuICogTm90ZTogemlwIGNhdXNlcyBmYXN0IHN0cmVhbXMgdG8gYnVmZmVyIGFuZCB3YWl0IGZvciBzbG93IHN0cmVhbXMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGE6U3RyZWFtLCBiOlN0cmVhbSwgLi4uKToqfSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgaXRlbXNcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBwYWlyc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLnppcCA9IGZ1bmN0aW9uKGYgLyosIC4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gemlwLnppcEFycmF5KGYsIGJhc2UucmVwbGFjZSh0aGlzLCAwLCBhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN3aXRjaGluZ1xuXG52YXIgc3dpdGNoTGF0ZXN0ID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9zd2l0Y2gnKS5zd2l0Y2g7XG5cbmV4cG9ydHMuc3dpdGNoICAgICAgID0gc3dpdGNoTGF0ZXN0O1xuZXhwb3J0cy5zd2l0Y2hMYXRlc3QgPSBzd2l0Y2hMYXRlc3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBzdHJlYW0gb2Ygc3RyZWFtcywgcmV0dXJuIGEgbmV3IHN0cmVhbSB0aGF0IGFkb3B0cyB0aGUgYmVoYXZpb3JcbiAqIG9mIHRoZSBtb3N0IHJlY2VudCBpbm5lciBzdHJlYW0uXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzd2l0Y2hpbmcgc3RyZWFtXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc3dpdGNoID0gU3RyZWFtLnByb3RvdHlwZS5zd2l0Y2hMYXRlc3QgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHN3aXRjaExhdGVzdCh0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbHRlcmluZ1xuXG52YXIgZmlsdGVyID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9maWx0ZXInKTtcblxuZXhwb3J0cy5maWx0ZXIgICAgICAgICAgPSBmaWx0ZXIuZmlsdGVyO1xuZXhwb3J0cy5za2lwUmVwZWF0cyAgICAgPSBleHBvcnRzLmRpc3RpbmN0ICAgPSBmaWx0ZXIuc2tpcFJlcGVhdHM7XG5leHBvcnRzLnNraXBSZXBlYXRzV2l0aCA9IGV4cG9ydHMuZGlzdGluY3RCeSA9IGZpbHRlci5za2lwUmVwZWF0c1dpdGg7XG5cbi8qKlxuICogUmV0YWluIG9ubHkgaXRlbXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIHN0cmVhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNDU2NzgtXG4gKiBmaWx0ZXIoeCA9PiB4ICUgMiA9PT0gMCwgc3RyZWFtKTogLS0yLTQtNi04LVxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgZmlsdGVyaW5nIHByZWRpY2F0ZSBjYWxsZWQgZm9yIGVhY2ggaXRlbVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgb25seSBpdGVtcyBmb3Igd2hpY2ggcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5XG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocCkge1xuXHRyZXR1cm4gZmlsdGVyLmZpbHRlcihwLCB0aGlzKTtcbn07XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMsIHVzaW5nID09PSB0byBjb21wYXJlIGl0ZW1zXG4gKiBzdHJlYW06ICAgICAgICAgICAtYWJiY2QtXG4gKiBkaXN0aW5jdChzdHJlYW0pOiAtYWItY2QtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gd2l0aCBubyByZXBlYXRlZCBldmVudHNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5za2lwUmVwZWF0cyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gZmlsdGVyLnNraXBSZXBlYXRzKHRoaXMpO1xufTtcblxuLyoqXG4gKiBTa2lwIHJlcGVhdGVkIGV2ZW50cywgdXNpbmcgc3VwcGxpZWQgZXF1YWxzIGZ1bmN0aW9uIHRvIGNvbXBhcmUgaXRlbXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oYToqLCBiOiopOmJvb2xlYW59IGVxdWFscyBmdW5jdGlvbiB0byBjb21wYXJlIGl0ZW1zXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gd2l0aCBubyByZXBlYXRlZCBldmVudHNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5za2lwUmVwZWF0c1dpdGggPSBmdW5jdGlvbihlcXVhbHMpIHtcblx0cmV0dXJuIGZpbHRlci5za2lwUmVwZWF0c1dpdGgoZXF1YWxzLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNsaWNpbmdcblxudmFyIHNsaWNlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9zbGljZScpO1xuXG5leHBvcnRzLnRha2UgICAgICA9IHNsaWNlLnRha2U7XG5leHBvcnRzLnNraXAgICAgICA9IHNsaWNlLnNraXA7XG5leHBvcnRzLnNsaWNlICAgICA9IHNsaWNlLnNsaWNlO1xuZXhwb3J0cy50YWtlV2hpbGUgPSBzbGljZS50YWtlV2hpbGU7XG5leHBvcnRzLnNraXBXaGlsZSA9IHNsaWNlLnNraXBXaGlsZTtcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgIC1hYmNkLVxuICogdGFrZSgyLCBzdHJlYW0pOiAtYWJ8XG4gKiBAcGFyYW0ge051bWJlcn0gbiB0YWtlIHVwIHRvIHRoaXMgbWFueSBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGF0IG1vc3QgdGhlIGZpcnN0IG4gaXRlbXMgZnJvbSB0aGlzIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRha2UgPSBmdW5jdGlvbihuKSB7XG5cdHJldHVybiBzbGljZS50YWtlKG4sIHRoaXMpO1xufTtcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgIC1hYmNkLT5cbiAqIHNraXAoMiwgc3RyZWFtKTogLS0tY2QtPlxuICogQHBhcmFtIHtOdW1iZXJ9IG4gc2tpcCB0aGlzIG1hbnkgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gbm90IGNvbnRhaW5pbmcgdGhlIGZpcnN0IG4gZXZlbnRzXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKG4pIHtcblx0cmV0dXJuIHNsaWNlLnNraXAobiwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFNsaWNlIGEgc3RyZWFtIGJ5IGV2ZW50IGluZGV4LiBFcXVpdmFsZW50IHRvLCBidXQgbW9yZSBlZmZpY2llbnQgdGhhblxuICogc3RyZWFtLnRha2UoZW5kKS5za2lwKHN0YXJ0KTtcbiAqIE5PVEU6IE5lZ2F0aXZlIHN0YXJ0IGFuZCBlbmQgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBza2lwIGFsbCBldmVudHMgYmVmb3JlIHRoZSBzdGFydCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGVuZCBhbGxvdyBhbGwgZXZlbnRzIGZyb20gdGhlIHN0YXJ0IGluZGV4IHRvIHRoZSBlbmQgaW5kZXhcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHdoZXJlIHN0YXJ0IDw9IGluZGV4IDwgZW5kXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG5cdHJldHVybiBzbGljZS5zbGljZShzdGFydCwgZW5kLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgICAgIC0xMjM0NTEyMzQtPlxuICogdGFrZVdoaWxlKHggPT4geCA8IDUsIHN0cmVhbSk6IC0xMjM0fFxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgcHJlZGljYXRlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZVxuICogZmlyc3QgaXRlbSBmb3Igd2hpY2ggcCByZXR1cm5zIGZhbHN5LlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRha2VXaGlsZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIHNsaWNlLnRha2VXaGlsZShwLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgICAgIC0xMjM0NTEyMzQtPlxuICogc2tpcFdoaWxlKHggPT4geCA8IDUsIHN0cmVhbSk6IC0tLS0tNTEyMzQtPlxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgcHJlZGljYXRlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyBmb2xsb3dpbmcgKmFuZCBpbmNsdWRpbmcqIHRoZVxuICogZmlyc3QgaXRlbSBmb3Igd2hpY2ggcCByZXR1cm5zIGZhbHN5LlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnNraXBXaGlsZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIHNsaWNlLnNraXBXaGlsZShwLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWUgc2xpY2luZ1xuXG52YXIgdGltZXNsaWNlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci90aW1lc2xpY2UnKTtcblxuZXhwb3J0cy51bnRpbCAgPSBleHBvcnRzLnRha2VVbnRpbCA9IHRpbWVzbGljZS50YWtlVW50aWw7XG5leHBvcnRzLnNpbmNlICA9IGV4cG9ydHMuc2tpcFVudGlsID0gdGltZXNsaWNlLnNraXBVbnRpbDtcbmV4cG9ydHMuZHVyaW5nID0gdGltZXNsaWNlLmR1cmluZztcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgICAgICAgICAgICAtYS1iLWMtZC1lLWYtZy0+XG4gKiBzaWduYWw6ICAgICAgICAgICAgICAgICAgICAtLS0tLS0teFxuICogdGFrZVVudGlsKHNpZ25hbCwgc3RyZWFtKTogLWEtYi1jLXxcbiAqIEBwYXJhbSB7U3RyZWFtfSBzaWduYWwgcmV0YWluIG9ubHkgZXZlbnRzIGluIHN0cmVhbSBiZWZvcmUgdGhlIGZpcnN0XG4gKiBldmVudCBpbiBzaWduYWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB0aGF0IG9jY3VyIGJlZm9yZVxuICogdGhlIGZpcnN0IGV2ZW50IGluIHNpZ25hbC5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS51bnRpbCA9IFN0cmVhbS5wcm90b3R5cGUudGFrZVVudGlsID0gZnVuY3Rpb24oc2lnbmFsKSB7XG5cdHJldHVybiB0aW1lc2xpY2UudGFrZVVudGlsKHNpZ25hbCwgdGhpcyk7XG59O1xuXG4vKipcbiAqIHN0cmVhbTogICAgICAgICAgICAgICAgICAgIC1hLWItYy1kLWUtZi1nLT5cbiAqIHNpZ25hbDogICAgICAgICAgICAgICAgICAgIC0tLS0tLS14XG4gKiB0YWtlVW50aWwoc2lnbmFsLCBzdHJlYW0pOiAtLS0tLS0tZC1lLWYtZy0+XG4gKiBAcGFyYW0ge1N0cmVhbX0gc2lnbmFsIHJldGFpbiBvbmx5IGV2ZW50cyBpbiBzdHJlYW0gYXQgb3IgYWZ0ZXIgdGhlIGZpcnN0XG4gKiBldmVudCBpbiBzaWduYWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB0aGF0IG9jY3VyIGFmdGVyXG4gKiB0aGUgZmlyc3QgZXZlbnQgaW4gc2lnbmFsLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnNpbmNlID0gU3RyZWFtLnByb3RvdHlwZS5za2lwVW50aWwgPSBmdW5jdGlvbihzaWduYWwpIHtcblx0cmV0dXJuIHRpbWVzbGljZS5za2lwVW50aWwoc2lnbmFsLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgLWEtYi1jLWQtZS1mLWctPlxuICogdGltZVdpbmRvdzogICAgICAgICAgICAgICAgLS0tLS1zXG4gKiBzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLXRcbiAqIHN0cmVhbS5kdXJpbmcodGltZVdpbmRvdyk6IC0tLS0tYy1kLWUtfFxuICogQHBhcmFtIHtTdHJlYW08U3RyZWFtPn0gdGltZVdpbmRvdyBhIHN0cmVhbSB3aG9zZSBmaXJzdCBldmVudCAocykgcmVwcmVzZW50c1xuICogIHRoZSB3aW5kb3cgc3RhcnQgdGltZS4gIFRoYXQgZXZlbnQgKHMpIGlzIGl0c2VsZiBhIHN0cmVhbSB3aG9zZSBmaXJzdCBldmVudCAodClcbiAqICByZXByZXNlbnRzIHRoZSB3aW5kb3cgZW5kIHRpbWVcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB3aXRoaW4gdGhlIHByb3ZpZGVkIHRpbWVzcGFuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZHVyaW5nID0gZnVuY3Rpb24odGltZVdpbmRvdykge1xuXHRyZXR1cm4gdGltZXNsaWNlLmR1cmluZyh0aW1lV2luZG93LCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbGF5aW5nXG5cbnZhciBkZWxheSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvZGVsYXknKS5kZWxheTtcblxuZXhwb3J0cy5kZWxheSA9IGRlbGF5O1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheVRpbWUgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGVhY2ggaXRlbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zLCBidXQgZGVsYXllZCBieSBtc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLmRlbGF5ID0gZnVuY3Rpb24oZGVsYXlUaW1lKSB7XG5cdHJldHVybiBkZWxheShkZWxheVRpbWUsIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2V0dGluZyBldmVudCB0aW1lc3RhbXBcblxudmFyIHRpbWVzdGFtcCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvdGltZXN0YW1wJykudGltZXN0YW1wO1xuXG5leHBvcnRzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuLyoqXG4gKiBFeHBvc2UgZXZlbnQgdGltZXN0YW1wcyBpbnRvIHRoZSBzdHJlYW0uIFR1cm5zIGEgU3RyZWFtPFg+IGludG9cbiAqIFN0cmVhbTx7dGltZTp0LCB2YWx1ZTpYfT5cbiAqIEByZXR1cm5zIHtTdHJlYW08e3RpbWU6bnVtYmVyLCB2YWx1ZToqfT59XG4gKi9cblN0cmVhbS5wcm90b3R5cGUudGltZXN0YW1wID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aW1lc3RhbXAodGhpcyk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSYXRlIGxpbWl0aW5nXG5cbnZhciBsaW1pdCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvbGltaXQnKTtcblxuZXhwb3J0cy50aHJvdHRsZSA9IGxpbWl0LnRocm90dGxlO1xuZXhwb3J0cy5kZWJvdW5jZSA9IGxpbWl0LmRlYm91bmNlO1xuXG4vKipcbiAqIExpbWl0IHRoZSByYXRlIG9mIGV2ZW50c1xuICogc3RyZWFtOiAgICAgICAgICAgICAgYWJjZC0tLS1hYmNkLS0tLVxuICogdGhyb3R0bGUoMiwgc3RyZWFtKTogYS1jLS0tLS1hLWMtLS0tLVxuICogQHBhcmFtIHtOdW1iZXJ9IHBlcmlvZCB0aW1lIHRvIHN1cHByZXNzIGV2ZW50c1xuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IHNraXBzIGV2ZW50cyBmb3IgdGhyb3R0bGUgcGVyaW9kXG4gKi9cblN0cmVhbS5wcm90b3R5cGUudGhyb3R0bGUgPSBmdW5jdGlvbihwZXJpb2QpIHtcblx0cmV0dXJuIGxpbWl0LnRocm90dGxlKHBlcmlvZCwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIGEgYnVyc3Qgb2YgZXZlbnRzIHRvIHN1YnNpZGUgYW5kIGVtaXQgb25seSB0aGUgbGFzdCBldmVudCBpbiB0aGUgYnVyc3RcbiAqIHN0cmVhbTogICAgICAgICAgICAgIGFiY2QtLS0tYWJjZC0tLS1cbiAqIGRlYm91bmNlKDIsIHN0cmVhbSk6IC0tLS0tZC0tLS0tLS1kLS1cbiAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgZXZlbnRzIG9jY3VyaW5nIG1vcmUgZnJlcXVlbnRseSB0aGFuIHRoaXNcbiAqICBvbiB0aGUgcHJvdmlkZWQgc2NoZWR1bGVyIHdpbGwgYmUgc3VwcHJlc3NlZFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGRlYm91bmNlZCBzdHJlYW1cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5kZWJvdW5jZSA9IGZ1bmN0aW9uKHBlcmlvZCkge1xuXHRyZXR1cm4gbGltaXQuZGVib3VuY2UocGVyaW9kLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEF3YWl0aW5nIFByb21pc2VzXG5cbnZhciBwcm9taXNlcyA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvcHJvbWlzZXMnKTtcblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IHByb21pc2VzLmZyb21Qcm9taXNlO1xuZXhwb3J0cy5hd2FpdCAgICAgICA9IHByb21pc2VzLmF3YWl0UHJvbWlzZXM7XG5cbi8qKlxuICogQXdhaXQgcHJvbWlzZXMsIHR1cm5pbmcgYSBTdHJlYW08UHJvbWlzZTxYPj4gaW50byBTdHJlYW08WD4uICBQcmVzZXJ2ZXNcbiAqIGV2ZW50IG9yZGVyLCBidXQgdGltZXNoaWZ0cyBldmVudHMgYmFzZWQgb24gcHJvbWlzZSByZXNvbHV0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7U3RyZWFtPFg+fSBzdHJlYW0gY29udGFpbmluZyBub24tcHJvbWlzZSB2YWx1ZXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5hd2FpdCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gcHJvbWlzZXMuYXdhaXRQcm9taXNlcyh0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVycm9yIGhhbmRsaW5nXG5cbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL2Vycm9ycycpO1xuXG5leHBvcnRzLnJlY292ZXJXaXRoICA9IGVycm9ycy5mbGF0TWFwRXJyb3I7XG5leHBvcnRzLmZsYXRNYXBFcnJvciA9IGVycm9ycy5mbGF0TWFwRXJyb3I7XG5leHBvcnRzLnRocm93RXJyb3IgICA9IGVycm9ycy50aHJvd0Vycm9yO1xuXG4vKipcbiAqIElmIHRoaXMgc3RyZWFtIGVuY291bnRlcnMgYW4gZXJyb3IsIHJlY292ZXIgYW5kIGNvbnRpbnVlIHdpdGggaXRlbXMgZnJvbSBzdHJlYW1cbiAqIHJldHVybmVkIGJ5IGYuXG4gKiBzdHJlYW06ICAgICAgICAgICAgICAgICAgLWEtYi1jLVgtXG4gKiBmKFgpOiAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtZS1mLWctXG4gKiBmbGF0TWFwRXJyb3IoZiwgc3RyZWFtKTogLWEtYi1jLWQtZS1mLWctXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGVycm9yOiopOlN0cmVhbX0gZiBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgbmV3IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aGljaCB3aWxsIHJlY292ZXIgZnJvbSBhbiBlcnJvciBieSBjYWxsaW5nIGZcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5yZWNvdmVyV2l0aCA9IFN0cmVhbS5wcm90b3R5cGUuZmxhdE1hcEVycm9yID0gZnVuY3Rpb24oZikge1xuXHRyZXR1cm4gZXJyb3JzLmZsYXRNYXBFcnJvcihmLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE11bHRpY2FzdGluZ1xuXG52YXIgbXVsdGljYXN0ID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuZGVmYXVsdDtcblxuZXhwb3J0cy5tdWx0aWNhc3QgPSBtdWx0aWNhc3Q7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBzdHJlYW0gaW50byBtdWx0aWNhc3Qgc3RyZWFtLiAgVGhhdCBtZWFucyB0aGF0IG1hbnkgc3Vic2NyaWJlcnNcbiAqIHRvIHRoZSBzdHJlYW0gd2lsbCBub3QgY2F1c2UgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhlIGludGVybmFsIG1hY2hpbmVyeS5cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2hpY2ggd2lsbCBtdWx0aWNhc3QgZXZlbnRzIHRvIGFsbCBvYnNlcnZlcnMuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubXVsdGljYXN0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBtdWx0aWNhc3QodGhpcyk7XG59O1xuIl19 | |
const most = require('most'); | |
const stream = most.just(Array(170000)); | |
const dest = []; | |
stream.forEach(bigArray => | |
dest.push.apply(dest, bigArray) | |
); | |
console.log(dest); | |
;}, 0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"most": "0.19.6" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment