Skip to content

Instantly share code, notes, and snippets.

@ahdinosaur
Last active September 12, 2016 09:15
Show Gist options
  • Save ahdinosaur/7d807a71278795e254630e9570c533b9 to your computer and use it in GitHub Desktop.
Save ahdinosaur/7d807a71278795e254630e9570c533b9 to your computer and use it in GitHub Desktop.
requirebin sketch
var pull = require('pull-stream')
var paramap = require('pull-paramap')
var async = require('pull-async')
var xhr = require('xhr')
var urls = [
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/agpl3.txt',
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/apache.txt',
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/mit.txt'
]
pull(
pull.values(urls),
paramap(function (url, next) {
pull(
async(cb => {
xhr(url, cb)
}),
pull.map(res => res.body),
pull.map(str => str.toUpperCase()),
pull.through(str => console.log(str)),
pull.drain(null, (err) => {
next(err, url)
})
)
}),
pull.collect((err, out) => {
console.log('done', out)
})
)
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){
'use strict'
module.exports = function pull (a) {
var length = arguments.length
if (typeof a === 'function' && a.length === 1) {
var args = new Array(length)
for(var i = 0; i < length; i++)
args[i] = arguments[i]
return function (read) {
if (args == null) {
throw new TypeError("partial sink should only be called once!")
}
// Grab the reference after the check, because it's always an array now
// (engines like that kind of consistency).
var ref = args
args = null
// Prioritize common case of small number of pulls.
switch (length) {
case 1: return pull(read, ref[0])
case 2: return pull(read, ref[0], ref[1])
case 3: return pull(read, ref[0], ref[1], ref[2])
case 4: return pull(read, ref[0], ref[1], ref[2], ref[3])
default:
ref.unshift(read)
return pull.apply(null, ref)
}
}
}
var read = a
if (read && typeof read.source === 'function') {
read = read.source
}
for (var i = 1; i < length; i++) {
var s = arguments[i]
if (typeof s === 'function') {
read = s(read)
} else if (s && typeof s === 'object') {
s.sink(read)
read = s.source
}
}
return read
}
},{}],2:[function(require,module,exports){
'use strict'
var reduce = require('./reduce')
module.exports = function collect (cb) {
return reduce(function (arr, item) {
arr.push(item)
return arr
}, [], cb)
}
},{"./reduce":9}],3:[function(require,module,exports){
'use strict'
var reduce = require('./reduce')
module.exports = function concat (cb) {
return reduce(function (a, b) {
return a + b
}, '', cb)
}
},{"./reduce":9}],4:[function(require,module,exports){
'use strict'
module.exports = function drain (op, done) {
var read, abort
function sink (_read) {
read = _read
if(abort) return sink.abort()
//this function is much simpler to write if you
//just use recursion, but by using a while loop
//we do not blow the stack if the stream happens to be sync.
;(function next() {
var loop = true, cbed = false
while(loop) {
cbed = false
read(null, function (end, data) {
cbed = true
if(end = end || abort) {
loop = false
if(done) done(end === true ? null : end)
else if(end && end !== true)
throw end
}
else if(op && false === op(data) || abort) {
loop = false
read(abort || true, done || function () {})
}
else if(!loop){
next()
}
})
if(!cbed) {
loop = false
return
}
}
})()
}
sink.abort = function (err, cb) {
if('function' == typeof err)
cb = err, err = true
abort = err || true
if(read) return read(abort, cb || function () {})
}
return sink
}
},{}],5:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
var drain = require('./drain')
module.exports = function find (test, cb) {
var ended = false
if(!cb)
cb = test, test = id
else
test = prop(test) || id
return drain(function (data) {
if(test(data)) {
ended = true
cb(null, data)
return false
}
}, function (err) {
if(ended) return //already called back
cb(err === true ? null : err, null)
})
}
},{"../util/prop":29,"./drain":4}],6:[function(require,module,exports){
'use strict'
module.exports = {
drain: require('./drain'),
onEnd: require('./on-end'),
log: require('./log'),
find: require('./find'),
reduce: require('./reduce'),
collect: require('./collect'),
concat: require('./concat')
}
},{"./collect":2,"./concat":3,"./drain":4,"./find":5,"./log":7,"./on-end":8,"./reduce":9}],7:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function log (done) {
return drain(function (data) {
console.log(data)
}, done)
}
},{"./drain":4}],8:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function onEnd (done) {
return drain(null, done)
}
},{"./drain":4}],9:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function reduce (reducer, acc, cb) {
return drain(function (data) {
acc = reducer(acc, data)
}, function (err) {
cb(err, acc)
})
}
},{"./drain":4}],10:[function(require,module,exports){
'use strict'
module.exports = function count (max) {
var i = 0; max = max || Infinity
return function (end, cb) {
if(end) return cb && cb(end)
if(i > max)
return cb(true)
cb(null, i++)
}
}
},{}],11:[function(require,module,exports){
'use strict'
//a stream that ends immediately.
module.exports = function empty () {
return function (abort, cb) {
cb(true)
}
}
},{}],12:[function(require,module,exports){
'use strict'
//a stream that errors immediately.
module.exports = function error (err) {
return function (abort, cb) {
cb(err)
}
}
},{}],13:[function(require,module,exports){
'use strict'
module.exports = {
keys: require('./keys'),
once: require('./once'),
values: require('./values'),
count: require('./count'),
infinite: require('./infinite'),
empty: require('./empty'),
error: require('./error')
}
},{"./count":10,"./empty":11,"./error":12,"./infinite":14,"./keys":15,"./once":16,"./values":17}],14:[function(require,module,exports){
'use strict'
module.exports = function infinite (generate) {
generate = generate || Math.random
return function (end, cb) {
if(end) return cb && cb(end)
return cb(null, generate())
}
}
},{}],15:[function(require,module,exports){
'use strict'
var values = require('./values')
module.exports = function (object) {
return values(Object.keys(object))
}
},{"./values":17}],16:[function(require,module,exports){
'use strict'
var abortCb = require('../util/abort-cb')
module.exports = function once (value, onAbort) {
return function (abort, cb) {
if(abort)
return abortCb(cb, abort, onAbort)
if(value != null) {
var _value = value; value = null
cb(null, _value)
} else
cb(true)
}
}
},{"../util/abort-cb":28}],17:[function(require,module,exports){
'use strict'
var abortCb = require('../util/abort-cb')
module.exports = function values (array, onAbort) {
if(!array)
return function (abort, cb) {
if(abort) return abortCb(cb, abort, onAbort)
return cb(true)
}
if(!Array.isArray(array))
array = Object.keys(array).map(function (k) {
return array[k]
})
var i = 0
return function (abort, cb) {
if(abort)
return abortCb(cb, abort, onAbort)
if(i >= array.length)
cb(true)
else
cb(null, array[i++])
}
}
},{"../util/abort-cb":28}],18:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
module.exports = function asyncMap (map) {
if(!map) return id
map = prop(map)
var busy = false, abortCb, aborted
return function (read) {
return function next (abort, cb) {
if(aborted) return cb(aborted)
if(abort) {
aborted = abort
if(!busy) read(abort, cb)
else read(abort, function () {
//if we are still busy, wait for the mapper to complete.
if(busy) abortCb = cb
else cb(abort)
})
}
else
read(null, function (end, data) {
if(end) cb(end)
else if(aborted) cb(aborted)
else {
busy = true
map(data, function (err, data) {
busy = false
if(aborted) {
cb(aborted)
abortCb(aborted)
}
else if(err) next (err, cb)
else cb(null, data)
})
}
})
}
}
}
},{"../util/prop":29}],19:[function(require,module,exports){
'use strict'
var tester = require('../util/tester')
var filter = require('./filter')
module.exports = function filterNot (test) {
test = tester(test)
return filter(function (data) { return !test(data) })
}
},{"../util/tester":30,"./filter":20}],20:[function(require,module,exports){
'use strict'
var tester = require('../util/tester')
module.exports = function filter (test) {
//regexp
test = tester(test)
return function (read) {
return function next (end, cb) {
var sync, loop = true
while(loop) {
loop = false
sync = true
read(end, function (end, data) {
if(!end && !test(data))
return sync ? loop = true : next(end, cb)
cb(end, data)
})
sync = false
}
}
}
}
},{"../util/tester":30}],21:[function(require,module,exports){
'use strict'
var values = require('../sources/values')
var once = require('../sources/once')
//convert a stream of arrays or streams into just a stream.
module.exports = function flatten () {
return function (read) {
var _read
return function (abort, cb) {
if (abort) { //abort the current stream, and then stream of streams.
_read ? _read(abort, function(err) {
read(err || abort, cb)
}) : read(abort, cb)
}
else if(_read) nextChunk()
else nextStream()
function nextChunk () {
_read(null, function (err, data) {
if (err === true) nextStream()
else if (err) {
read(true, function(abortErr) {
// TODO: what do we do with the abortErr?
cb(err)
})
}
else cb(null, data)
})
}
function nextStream () {
_read = null
read(null, function (end, stream) {
if(end)
return cb(end)
if(Array.isArray(stream) || stream && 'object' === typeof stream)
stream = values(stream)
else if('function' != typeof stream)
stream = once(stream)
_read = stream
nextChunk()
})
}
}
}
}
},{"../sources/once":16,"../sources/values":17}],22:[function(require,module,exports){
'use strict'
module.exports = {
map: require('./map'),
asyncMap: require('./async-map'),
filter: require('./filter'),
filterNot: require('./filter-not'),
through: require('./through'),
take: require('./take'),
unique: require('./unique'),
nonUnique: require('./non-unique'),
flatten: require('./flatten')
}
},{"./async-map":18,"./filter":20,"./filter-not":19,"./flatten":21,"./map":23,"./non-unique":24,"./take":25,"./through":26,"./unique":27}],23:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
module.exports = function map (mapper) {
if(!mapper) return id
mapper = prop(mapper)
return function (read) {
return function (abort, cb) {
read(abort, function (end, data) {
try {
data = !end ? mapper(data) : null
} catch (err) {
return read(err, function () {
return cb(err)
})
}
cb(end, data)
})
}
}
}
},{"../util/prop":29}],24:[function(require,module,exports){
'use strict'
var unique = require('./unique')
//passes an item through when you see it for the second time.
module.exports = function nonUnique (field) {
return unique(field, true)
}
},{"./unique":27}],25:[function(require,module,exports){
'use strict'
//read a number of items and then stop.
module.exports = function take (test, opts) {
opts = opts || {}
var last = opts.last || false // whether the first item for which !test(item) should still pass
var ended = false
if('number' === typeof test) {
last = true
var n = test; test = function () {
return --n
}
}
return function (read) {
function terminate (cb) {
read(true, function (err) {
last = false; cb(err || true)
})
}
return function (end, cb) {
if(ended) last ? terminate(cb) : cb(ended)
else if(ended = end) read(ended, cb)
else
read(null, function (end, data) {
if(ended = ended || end) {
//last ? terminate(cb) :
cb(ended)
}
else if(!test(data)) {
ended = true
last ? cb(null, data) : terminate(cb)
}
else
cb(null, data)
})
}
}
}
},{}],26:[function(require,module,exports){
'use strict'
//a pass through stream that doesn't change the value.
module.exports = function through (op, onEnd) {
var a = false
function once (abort) {
if(a || !onEnd) return
a = true
onEnd(abort === true ? null : abort)
}
return function (read) {
return function (end, cb) {
if(end) once(end)
return read(end, function (end, data) {
if(!end) op && op(data)
else once(end)
cb(end, data)
})
}
}
}
},{}],27:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
var filter = require('./filter')
//drop items you have already seen.
module.exports = function unique (field, invert) {
field = prop(field) || id
var seen = {}
return filter(function (data) {
var key = field(data)
if(seen[key]) return !!invert //false, by default
else seen[key] = true
return !invert //true by default
})
}
},{"../util/prop":29,"./filter":20}],28:[function(require,module,exports){
module.exports = function abortCb(cb, abort, onAbort) {
cb(abort)
onAbort && onAbort(abort === true ? null: abort)
return
}
},{}],29:[function(require,module,exports){
module.exports = function prop (key) {
return key && (
'string' == typeof key
? function (data) { return data[key] }
: 'object' === typeof key && 'function' === typeof key.exec //regexp
? function (data) { var v = key.exec(data); return v && v[0] }
: key
)
}
},{}],30:[function(require,module,exports){
var prop = require('./prop')
function id (e) { return e }
module.exports = function tester (test) {
return (
'object' === typeof test && 'function' === typeof test.test //regexp
? function (data) { return test.test(data) }
: prop (test) || id
)
}
},{"./prop":29}],"pull-stream":[function(require,module,exports){
'use strict'
var sources = require('./sources')
var sinks = require('./sinks')
var throughs = require('./throughs')
exports = module.exports = require('./pull')
for(var k in sources)
exports[k] = sources[k]
for(var k in throughs)
exports[k] = throughs[k]
for(var k in sinks)
exports[k] = sinks[k]
},{"./pull":1,"./sinks":6,"./sources":13,"./throughs":22}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInB1bGwuanMiLCJzaW5rcy9jb2xsZWN0LmpzIiwic2lua3MvY29uY2F0LmpzIiwic2lua3MvZHJhaW4uanMiLCJzaW5rcy9maW5kLmpzIiwic2lua3MvaW5kZXguanMiLCJzaW5rcy9sb2cuanMiLCJzaW5rcy9vbi1lbmQuanMiLCJzaW5rcy9yZWR1Y2UuanMiLCJzb3VyY2VzL2NvdW50LmpzIiwic291cmNlcy9lbXB0eS5qcyIsInNvdXJjZXMvZXJyb3IuanMiLCJzb3VyY2VzL2luZGV4LmpzIiwic291cmNlcy9pbmZpbml0ZS5qcyIsInNvdXJjZXMva2V5cy5qcyIsInNvdXJjZXMvb25jZS5qcyIsInNvdXJjZXMvdmFsdWVzLmpzIiwidGhyb3VnaHMvYXN5bmMtbWFwLmpzIiwidGhyb3VnaHMvZmlsdGVyLW5vdC5qcyIsInRocm91Z2hzL2ZpbHRlci5qcyIsInRocm91Z2hzL2ZsYXR0ZW4uanMiLCJ0aHJvdWdocy9pbmRleC5qcyIsInRocm91Z2hzL21hcC5qcyIsInRocm91Z2hzL25vbi11bmlxdWUuanMiLCJ0aHJvdWdocy90YWtlLmpzIiwidGhyb3VnaHMvdGhyb3VnaC5qcyIsInRocm91Z2hzL3VuaXF1ZS5qcyIsInV0aWwvYWJvcnQtY2IuanMiLCJ1dGlsL3Byb3AuanMiLCJ1dGlsL3Rlc3Rlci5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHB1bGwgKGEpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nICYmIGEubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcnRpYWwgc2luayBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSFcIilcbiAgICAgIH1cblxuICAgICAgLy8gR3JhYiB0aGUgcmVmZXJlbmNlIGFmdGVyIHRoZSBjaGVjaywgYmVjYXVzZSBpdCdzIGFsd2F5cyBhbiBhcnJheSBub3dcbiAgICAgIC8vIChlbmdpbmVzIGxpa2UgdGhhdCBraW5kIG9mIGNvbnNpc3RlbmN5KS5cbiAgICAgIHZhciByZWYgPSBhcmdzXG4gICAgICBhcmdzID0gbnVsbFxuXG4gICAgICAvLyBQcmlvcml0aXplIGNvbW1vbiBjYXNlIG9mIHNtYWxsIG51bWJlciBvZiBwdWxscy5cbiAgICAgIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSlcbiAgICAgIGNhc2UgMjogcmV0dXJuIHB1bGwocmVhZCwgcmVmWzBdLCByZWZbMV0pXG4gICAgICBjYXNlIDM6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSwgcmVmWzFdLCByZWZbMl0pXG4gICAgICBjYXNlIDQ6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSwgcmVmWzFdLCByZWZbMl0sIHJlZlszXSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlZi51bnNoaWZ0KHJlYWQpXG4gICAgICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsIHJlZilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVhZCA9IGFcblxuICBpZiAocmVhZCAmJiB0eXBlb2YgcmVhZC5zb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZWFkID0gcmVhZC5zb3VyY2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IGFyZ3VtZW50c1tpXVxuICAgIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZCA9IHMocmVhZClcbiAgICB9IGVsc2UgaWYgKHMgJiYgdHlwZW9mIHMgPT09ICdvYmplY3QnKSB7XG4gICAgICBzLnNpbmsocmVhZClcbiAgICAgIHJlYWQgPSBzLnNvdXJjZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkXG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHJlZHVjZSA9IHJlcXVpcmUoJy4vcmVkdWNlJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb2xsZWN0IChjYikge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uIChhcnIsIGl0ZW0pIHtcbiAgICBhcnIucHVzaChpdGVtKVxuICAgIHJldHVybiBhcnJcbiAgfSwgW10sIGNiKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29uY2F0IChjYikge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgKyBiXG4gIH0sICcnLCBjYilcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyYWluIChvcCwgZG9uZSkge1xuICB2YXIgcmVhZCwgYWJvcnRcblxuICBmdW5jdGlvbiBzaW5rIChfcmVhZCkge1xuICAgIHJlYWQgPSBfcmVhZFxuICAgIGlmKGFib3J0KSByZXR1cm4gc2luay5hYm9ydCgpXG4gICAgLy90aGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0byB3cml0ZSBpZiB5b3VcbiAgICAvL2p1c3QgdXNlIHJlY3Vyc2lvbiwgYnV0IGJ5IHVzaW5nIGEgd2hpbGUgbG9vcFxuICAgIC8vd2UgZG8gbm90IGJsb3cgdGhlIHN0YWNrIGlmIHRoZSBzdHJlYW0gaGFwcGVucyB0byBiZSBzeW5jLlxuICAgIDsoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgdmFyIGxvb3AgPSB0cnVlLCBjYmVkID0gZmFsc2VcbiAgICAgICAgd2hpbGUobG9vcCkge1xuICAgICAgICAgIGNiZWQgPSBmYWxzZVxuICAgICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgICAgY2JlZCA9IHRydWVcbiAgICAgICAgICAgIGlmKGVuZCA9IGVuZCB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYoZG9uZSkgZG9uZShlbmQgPT09IHRydWUgPyBudWxsIDogZW5kKVxuICAgICAgICAgICAgICBlbHNlIGlmKGVuZCAmJiBlbmQgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgdGhyb3cgZW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKG9wICYmIGZhbHNlID09PSBvcChkYXRhKSB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgcmVhZChhYm9ydCB8fCB0cnVlLCBkb25lIHx8IGZ1bmN0aW9uICgpIHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighbG9vcCl7XG4gICAgICAgICAgICAgIG5leHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYoIWNiZWQpIHtcbiAgICAgICAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gIH1cblxuICBzaW5rLmFib3J0ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09IHR5cGVvZiBlcnIpXG4gICAgICBjYiA9IGVyciwgZXJyID0gdHJ1ZVxuICAgIGFib3J0ID0gZXJyIHx8IHRydWVcbiAgICBpZihyZWFkKSByZXR1cm4gcmVhZChhYm9ydCwgY2IgfHwgZnVuY3Rpb24gKCkge30pXG4gIH1cblxuICByZXR1cm4gc2lua1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cbnZhciBwcm9wID0gcmVxdWlyZSgnLi4vdXRpbC9wcm9wJylcbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbmQgKHRlc3QsIGNiKSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCFjYilcbiAgICBjYiA9IHRlc3QsIHRlc3QgPSBpZFxuICBlbHNlXG4gICAgdGVzdCA9IHByb3AodGVzdCkgfHwgaWRcblxuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZih0ZXN0KGRhdGEpKSB7XG4gICAgICBlbmRlZCA9IHRydWVcbiAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiAvL2FscmVhZHkgY2FsbGVkIGJhY2tcbiAgICBjYihlcnIgPT09IHRydWUgPyBudWxsIDogZXJyLCBudWxsKVxuICB9KVxufVxuXG5cblxuXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRyYWluOiByZXF1aXJlKCcuL2RyYWluJyksXG4gIG9uRW5kOiByZXF1aXJlKCcuL29uLWVuZCcpLFxuICBsb2c6IHJlcXVpcmUoJy4vbG9nJyksXG4gIGZpbmQ6IHJlcXVpcmUoJy4vZmluZCcpLFxuICByZWR1Y2U6IHJlcXVpcmUoJy4vcmVkdWNlJyksXG4gIGNvbGxlY3Q6IHJlcXVpcmUoJy4vY29sbGVjdCcpLFxuICBjb25jYXQ6IHJlcXVpcmUoJy4vY29uY2F0Jylcbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxvZyAoZG9uZSkge1xuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBjb25zb2xlLmxvZyhkYXRhKVxuICB9LCBkb25lKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9uRW5kIChkb25lKSB7XG4gIHJldHVybiBkcmFpbihudWxsLCBkb25lKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlZHVjZSAocmVkdWNlciwgYWNjLCBjYikge1xuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBhY2MgPSByZWR1Y2VyKGFjYywgZGF0YSlcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGNiKGVyciwgYWNjKVxuICB9KVxufVxuXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb3VudCAobWF4KSB7XG4gIHZhciBpID0gMDsgbWF4ID0gbWF4IHx8IEluZmluaXR5XG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICBpZihpID4gbWF4KVxuICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgY2IobnVsbCwgaSsrKVxuICB9XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnXG4vL2Egc3RyZWFtIHRoYXQgZW5kcyBpbW1lZGlhdGVseS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZW1wdHkgKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGNiKHRydWUpXG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuLy9hIHN0cmVhbSB0aGF0IGVycm9ycyBpbW1lZGlhdGVseS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXJyb3IgKGVycikge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGNiKGVycilcbiAgfVxufVxuXG4iLCIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0ge1xuICBrZXlzOiByZXF1aXJlKCcuL2tleXMnKSxcbiAgb25jZTogcmVxdWlyZSgnLi9vbmNlJyksXG4gIHZhbHVlczogcmVxdWlyZSgnLi92YWx1ZXMnKSxcbiAgY291bnQ6IHJlcXVpcmUoJy4vY291bnQnKSxcbiAgaW5maW5pdGU6IHJlcXVpcmUoJy4vaW5maW5pdGUnKSxcbiAgZW1wdHk6IHJlcXVpcmUoJy4vZW1wdHknKSxcbiAgZXJyb3I6IHJlcXVpcmUoJy4vZXJyb3InKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmluaXRlIChnZW5lcmF0ZSkge1xuICBnZW5lcmF0ZSA9IGdlbmVyYXRlIHx8IE1hdGgucmFuZG9tXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICByZXR1cm4gY2IobnVsbCwgZ2VuZXJhdGUoKSlcbiAgfVxufVxuXG5cbiIsIid1c2Ugc3RyaWN0J1xudmFyIHZhbHVlcyA9IHJlcXVpcmUoJy4vdmFsdWVzJylcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdmFsdWVzKE9iamVjdC5rZXlzKG9iamVjdCkpXG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgYWJvcnRDYiA9IHJlcXVpcmUoJy4uL3V0aWwvYWJvcnQtY2InKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9uY2UgKHZhbHVlLCBvbkFib3J0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpXG4gICAgICByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgaWYodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIF92YWx1ZSA9IHZhbHVlOyB2YWx1ZSA9IG51bGxcbiAgICAgIGNiKG51bGwsIF92YWx1ZSlcbiAgICB9IGVsc2VcbiAgICAgIGNiKHRydWUpXG4gIH1cbn1cblxuXG4iLCIndXNlIHN0cmljdCdcbnZhciBhYm9ydENiID0gcmVxdWlyZSgnLi4vdXRpbC9hYm9ydC1jYicpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsdWVzIChhcnJheSwgb25BYm9ydCkge1xuICBpZighYXJyYXkpXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICAgIGlmKGFib3J0KSByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICB9XG4gIGlmKCFBcnJheS5pc0FycmF5KGFycmF5KSlcbiAgICBhcnJheSA9IE9iamVjdC5rZXlzKGFycmF5KS5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBhcnJheVtrXVxuICAgIH0pXG4gIHZhciBpID0gMFxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGFib3J0KVxuICAgICAgcmV0dXJuIGFib3J0Q2IoY2IsIGFib3J0LCBvbkFib3J0KVxuICAgIGlmKGkgPj0gYXJyYXkubGVuZ3RoKVxuICAgICAgY2IodHJ1ZSlcbiAgICBlbHNlXG4gICAgICBjYihudWxsLCBhcnJheVtpKytdKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gaWQgKGUpIHsgcmV0dXJuIGUgfVxudmFyIHByb3AgPSByZXF1aXJlKCcuLi91dGlsL3Byb3AnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzeW5jTWFwIChtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIGlkXG4gIG1hcCA9IHByb3AobWFwKVxuICB2YXIgYnVzeSA9IGZhbHNlLCBhYm9ydENiLCBhYm9ydGVkXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0IChhYm9ydCwgY2IpIHtcbiAgICAgIGlmKGFib3J0ZWQpIHJldHVybiBjYihhYm9ydGVkKVxuICAgICAgaWYoYWJvcnQpIHtcbiAgICAgICAgYWJvcnRlZCA9IGFib3J0XG4gICAgICAgIGlmKCFidXN5KSByZWFkKGFib3J0LCBjYilcbiAgICAgICAgZWxzZSByZWFkKGFib3J0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy9pZiB3ZSBhcmUgc3RpbGwgYnVzeSwgd2FpdCBmb3IgdGhlIG1hcHBlciB0byBjb21wbGV0ZS5cbiAgICAgICAgICBpZihidXN5KSBhYm9ydENiID0gY2JcbiAgICAgICAgICBlbHNlIGNiKGFib3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBpZihlbmQpIGNiKGVuZClcbiAgICAgICAgICBlbHNlIGlmKGFib3J0ZWQpIGNiKGFib3J0ZWQpXG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidXN5ID0gdHJ1ZVxuICAgICAgICAgICAgbWFwKGRhdGEsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgICAgYnVzeSA9IGZhbHNlXG4gICAgICAgICAgICAgIGlmKGFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjYihhYm9ydGVkKVxuICAgICAgICAgICAgICAgIGFib3J0Q2IoYWJvcnRlZClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmKGVycikgbmV4dCAoZXJyLCBjYilcbiAgICAgICAgICAgICAgZWxzZSBjYihudWxsLCBkYXRhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciB0ZXN0ZXIgPSByZXF1aXJlKCcuLi91dGlsL3Rlc3RlcicpXG52YXIgZmlsdGVyID0gcmVxdWlyZSgnLi9maWx0ZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbHRlck5vdCAodGVzdCkge1xuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmaWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuICF0ZXN0KGRhdGEpIH0pXG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHRlc3RlciA9IHJlcXVpcmUoJy4uL3V0aWwvdGVzdGVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWx0ZXIgKHRlc3QpIHtcbiAgLy9yZWdleHBcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgICAgdmFyIHN5bmMsIGxvb3AgPSB0cnVlXG4gICAgICB3aGlsZShsb29wKSB7XG4gICAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgICBzeW5jID0gdHJ1ZVxuICAgICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgICAgICByZXR1cm4gc3luYyA/IGxvb3AgPSB0cnVlIDogbmV4dChlbmQsIGNiKVxuICAgICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgc3luYyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgdmFsdWVzID0gcmVxdWlyZSgnLi4vc291cmNlcy92YWx1ZXMnKVxudmFyIG9uY2UgPSByZXF1aXJlKCcuLi9zb3VyY2VzL29uY2UnKVxuXG4vL2NvbnZlcnQgYSBzdHJlYW0gb2YgYXJyYXlzIG9yIHN0cmVhbXMgaW50byBqdXN0IGEgc3RyZWFtLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGF0dGVuICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgdmFyIF9yZWFkXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICAgIGlmIChhYm9ydCkgeyAvL2Fib3J0IHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHRoZW4gc3RyZWFtIG9mIHN0cmVhbXMuXG4gICAgICAgIF9yZWFkID8gX3JlYWQoYWJvcnQsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHJlYWQoZXJyIHx8IGFib3J0LCBjYilcbiAgICAgICAgfSkgOiByZWFkKGFib3J0LCBjYilcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYoX3JlYWQpIG5leHRDaHVuaygpXG4gICAgICBlbHNlIG5leHRTdHJlYW0oKVxuXG4gICAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgICBfcmVhZChudWxsLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgaWYgKGVyciA9PT0gdHJ1ZSkgbmV4dFN0cmVhbSgpXG4gICAgICAgICAgZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWFkKHRydWUsIGZ1bmN0aW9uKGFib3J0RXJyKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgZG8gd2UgZG8gd2l0aCB0aGUgYWJvcnRFcnI/XG4gICAgICAgICAgICAgIGNiKGVycilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG5leHRTdHJlYW0gKCkge1xuICAgICAgICBfcmVhZCA9IG51bGxcbiAgICAgICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBzdHJlYW0pIHtcbiAgICAgICAgICBpZihlbmQpXG4gICAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoc3RyZWFtKSB8fCBzdHJlYW0gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgICBzdHJlYW0gPSB2YWx1ZXMoc3RyZWFtKVxuICAgICAgICAgIGVsc2UgaWYoJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgICAgc3RyZWFtID0gb25jZShzdHJlYW0pXG4gICAgICAgICAgX3JlYWQgPSBzdHJlYW1cbiAgICAgICAgICBuZXh0Q2h1bmsoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1hcDogcmVxdWlyZSgnLi9tYXAnKSxcbiAgYXN5bmNNYXA6IHJlcXVpcmUoJy4vYXN5bmMtbWFwJyksXG4gIGZpbHRlcjogcmVxdWlyZSgnLi9maWx0ZXInKSxcbiAgZmlsdGVyTm90OiByZXF1aXJlKCcuL2ZpbHRlci1ub3QnKSxcbiAgdGhyb3VnaDogcmVxdWlyZSgnLi90aHJvdWdoJyksXG4gIHRha2U6IHJlcXVpcmUoJy4vdGFrZScpLFxuICB1bmlxdWU6IHJlcXVpcmUoJy4vdW5pcXVlJyksXG4gIG5vblVuaXF1ZTogcmVxdWlyZSgnLi9ub24tdW5pcXVlJyksXG4gIGZsYXR0ZW46IHJlcXVpcmUoJy4vZmxhdHRlbicpXG59XG5cblxuXG4iLCIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gaWQgKGUpIHsgcmV0dXJuIGUgfVxudmFyIHByb3AgPSByZXF1aXJlKCcuLi91dGlsL3Byb3AnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyKSB7XG4gIGlmKCFtYXBwZXIpIHJldHVybiBpZFxuICBtYXBwZXIgPSBwcm9wKG1hcHBlcilcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICAgIHJlYWQoYWJvcnQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9ICFlbmQgPyBtYXBwZXIoZGF0YSkgOiBudWxsXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiByZWFkKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHVuaXF1ZSA9IHJlcXVpcmUoJy4vdW5pcXVlJylcblxuLy9wYXNzZXMgYW4gaXRlbSB0aHJvdWdoIHdoZW4geW91IHNlZSBpdCBmb3IgdGhlIHNlY29uZCB0aW1lLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub25VbmlxdWUgKGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUoZmllbGQsIHRydWUpXG59XG4iLCIndXNlIHN0cmljdCdcblxuLy9yZWFkIGEgbnVtYmVyIG9mIGl0ZW1zIGFuZCB0aGVuIHN0b3AuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRha2UgKHRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdmFyIGxhc3QgPSBvcHRzLmxhc3QgfHwgZmFsc2UgLy8gd2hldGhlciB0aGUgZmlyc3QgaXRlbSBmb3Igd2hpY2ggIXRlc3QoaXRlbSkgc2hvdWxkIHN0aWxsIHBhc3NcbiAgdmFyIGVuZGVkID0gZmFsc2VcbiAgaWYoJ251bWJlcicgPT09IHR5cGVvZiB0ZXN0KSB7XG4gICAgbGFzdCA9IHRydWVcbiAgICB2YXIgbiA9IHRlc3Q7IHRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLS1uXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG5cbiAgICBmdW5jdGlvbiB0ZXJtaW5hdGUgKGNiKSB7XG4gICAgICByZWFkKHRydWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgbGFzdCA9IGZhbHNlOyBjYihlcnIgfHwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgICBpZihlbmRlZCkgICAgICAgICAgICBsYXN0ID8gdGVybWluYXRlKGNiKSA6IGNiKGVuZGVkKVxuICAgICAgZWxzZSBpZihlbmRlZCA9IGVuZCkgcmVhZChlbmRlZCwgY2IpXG4gICAgICBlbHNlXG4gICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGlmKGVuZGVkID0gZW5kZWQgfHwgZW5kKSB7XG4gICAgICAgICAgICAvL2xhc3QgPyB0ZXJtaW5hdGUoY2IpIDpcbiAgICAgICAgICAgIGNiKGVuZGVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmKCF0ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGxhc3QgPyBjYihudWxsLCBkYXRhKSA6IHRlcm1pbmF0ZShjYilcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vL2EgcGFzcyB0aHJvdWdoIHN0cmVhbSB0aGF0IGRvZXNuJ3QgY2hhbmdlIHRoZSB2YWx1ZS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGhyb3VnaCAob3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcblxuICBmdW5jdGlvbiBvbmNlIChhYm9ydCkge1xuICAgIGlmKGEgfHwgIW9uRW5kKSByZXR1cm5cbiAgICBhID0gdHJ1ZVxuICAgIG9uRW5kKGFib3J0ID09PSB0cnVlID8gbnVsbCA6IGFib3J0KVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIGlmKCFlbmQpIG9wICYmIG9wKGRhdGEpXG4gICAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gaWQgKGUpIHsgcmV0dXJuIGUgfVxudmFyIHByb3AgPSByZXF1aXJlKCcuLi91dGlsL3Byb3AnKVxudmFyIGZpbHRlciA9IHJlcXVpcmUoJy4vZmlsdGVyJylcblxuLy9kcm9wIGl0ZW1zIHlvdSBoYXZlIGFscmVhZHkgc2Vlbi5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdW5pcXVlIChmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpIHtcbiAgY2IoYWJvcnQpXG4gIG9uQWJvcnQgJiYgb25BYm9ydChhYm9ydCA9PT0gdHJ1ZSA/IG51bGw6IGFib3J0KVxuICByZXR1cm5cbn1cblxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcm9wIChrZXkpIHtcbiAgcmV0dXJuIGtleSAmJiAoXG4gICAgJ3N0cmluZycgPT0gdHlwZW9mIGtleVxuICAgID8gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGFba2V5XSB9XG4gICAgOiAnb2JqZWN0JyA9PT0gdHlwZW9mIGtleSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Yga2V5LmV4ZWMgLy9yZWdleHBcbiAgICA/IGZ1bmN0aW9uIChkYXRhKSB7IHZhciB2ID0ga2V5LmV4ZWMoZGF0YSk7IHJldHVybiB2ICYmIHZbMF0gfVxuICAgIDoga2V5XG4gIClcbn1cbiIsInZhciBwcm9wID0gcmVxdWlyZSgnLi9wcm9wJylcblxuZnVuY3Rpb24gaWQgKGUpIHsgcmV0dXJuIGUgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRlc3RlciAodGVzdCkge1xuICByZXR1cm4gKFxuICAgICdvYmplY3QnID09PSB0eXBlb2YgdGVzdCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGVzdC50ZXN0IC8vcmVnZXhwXG4gICAgPyBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gdGVzdC50ZXN0KGRhdGEpIH1cbiAgICA6IHByb3AgKHRlc3QpIHx8IGlkXG4gIClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgc291cmNlcyAgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzICAgID0gcmVxdWlyZSgnLi9zaW5rcycpXG52YXIgdGhyb3VnaHMgPSByZXF1aXJlKCcuL3Rocm91Z2hzJylcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9wdWxsJylcblxuZm9yKHZhciBrIGluIHNvdXJjZXMpXG4gIGV4cG9ydHNba10gPSBzb3VyY2VzW2tdXG5cbmZvcih2YXIgayBpbiB0aHJvdWdocylcbiAgZXhwb3J0c1trXSA9IHRocm91Z2hzW2tdXG5cbmZvcih2YXIgayBpbiBzaW5rcylcbiAgZXhwb3J0c1trXSA9IHNpbmtzW2tdXG5cbiJdfQ==
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})({"pull-paramap":[function(require,module,exports){
module.exports = function (map, width) {
var reading = false, abort
return function (read) {
var i = 0, j = 0, last = 0
var seen = [], started = false, ended = false, _cb, error
function drain () {
if(_cb) {
var cb = _cb
if(error) {
_cb = null
return cb(error)
}
if(Object.hasOwnProperty.call(seen, j)) {
_cb = null
var data = seen[j]; delete seen[j]; j++
cb(null, data)
if(width) start()
} else if(j >= last && ended) {
_cb = null
cb(true)
}
}
}
function start () {
started = true
if(ended) return drain()
if(reading || width && (i - width >= j)) return
reading = true
read(abort, function (end, data) {
reading = false
if(end) {
last = i; ended = end
drain()
} else {
var k = i++
map(data, function (err, data) {
seen[k] = data
if(err) error = err
drain()
})
if(!ended)
start()
}
})
}
return function (_abort, cb) {
if(_abort)
read(ended = abort = _abort, function (err) {
if(cb) return cb(err)
})
else {
_cb = cb
if(!started) start()
drain()
}
}
}
}
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hcCwgd2lkdGgpIHtcbiAgdmFyIHJlYWRpbmcgPSBmYWxzZSwgYWJvcnRcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgdmFyIGkgPSAwLCBqID0gMCwgbGFzdCA9IDBcbiAgICB2YXIgc2VlbiA9IFtdLCBzdGFydGVkID0gZmFsc2UsIGVuZGVkID0gZmFsc2UsIF9jYiwgZXJyb3JcblxuICAgIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICAgIGlmKF9jYikge1xuICAgICAgICB2YXIgY2IgPSBfY2JcbiAgICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgICBfY2IgPSBudWxsXG4gICAgICAgICAgcmV0dXJuIGNiKGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlZW4sIGopKSB7XG4gICAgICAgICAgX2NiID0gbnVsbFxuICAgICAgICAgIHZhciBkYXRhID0gc2VlbltqXTsgZGVsZXRlIHNlZW5bal07IGorK1xuICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICAgICAgaWYod2lkdGgpIHN0YXJ0KClcbiAgICAgICAgfSBlbHNlIGlmKGogPj0gbGFzdCAmJiBlbmRlZCkge1xuICAgICAgICAgIF9jYiA9IG51bGxcbiAgICAgICAgICBjYih0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnQgKCkge1xuICAgICAgc3RhcnRlZCA9IHRydWVcbiAgICAgIGlmKGVuZGVkKSByZXR1cm4gZHJhaW4oKVxuICAgICAgaWYocmVhZGluZyB8fCB3aWR0aCAmJiAoaSAtIHdpZHRoID49IGopKSByZXR1cm5cbiAgICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICBpZihlbmQpIHtcbiAgICAgICAgICBsYXN0ID0gaTsgZW5kZWQgPSBlbmRcbiAgICAgICAgICBkcmFpbigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGsgPSBpKytcblxuICAgICAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBzZWVuW2tdID0gZGF0YVxuICAgICAgICAgICAgaWYoZXJyKSBlcnJvciA9IGVyclxuICAgICAgICAgICAgZHJhaW4oKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZighZW5kZWQpXG4gICAgICAgICAgICBzdGFydCgpXG5cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF9hYm9ydCwgY2IpIHtcbiAgICAgIGlmKF9hYm9ydClcbiAgICAgICAgcmVhZChlbmRlZCA9IGFib3J0ID0gX2Fib3J0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYoY2IpIHJldHVybiBjYihlcnIpXG4gICAgICAgIH0pXG4gICAgICBlbHNlIHtcbiAgICAgICAgX2NiID0gY2JcbiAgICAgICAgaWYoIXN0YXJ0ZWQpIHN0YXJ0KClcbiAgICAgICAgZHJhaW4oKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4iXX0=
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})({"pull-async":[function(require,module,exports){
module.exports = pullAsync
function pullAsync (continuable) {
var done
return function (abort, cb) {
if (abort) return cb(abort)
if (done) return cb(true)
continuable(function (err, data) {
done = true
cb(err, data)
})
}
}
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJtb2R1bGUuZXhwb3J0cyA9IHB1bGxBc3luY1xuXG5mdW5jdGlvbiBwdWxsQXN5bmMgKGNvbnRpbnVhYmxlKSB7XG4gIHZhciBkb25lXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYgKGFib3J0KSByZXR1cm4gY2IoYWJvcnQpXG4gICAgaWYgKGRvbmUpIHJldHVybiBjYih0cnVlKVxuICAgIGNvbnRpbnVhYmxlKGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGRvbmUgPSB0cnVlXG4gICAgICBjYihlcnIsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuIl19
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){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else if (typeof self !== "undefined"){
module.exports = self;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19
},{}],2:[function(require,module,exports){
module.exports = isFunction
var toString = Object.prototype.toString
function isFunction (fn) {
var string = toString.call(fn)
return string === '[object Function]' ||
(typeof fn === 'function' && string !== '[object RegExp]') ||
(typeof window !== 'undefined' &&
// IE8 and below
(fn === window.setTimeout ||
fn === window.alert ||
fn === window.confirm ||
fn === window.prompt))
};
},{}],3:[function(require,module,exports){
var isFunction = require('is-function')
module.exports = forEach
var toString = Object.prototype.toString
var hasOwnProperty = Object.prototype.hasOwnProperty
function forEach(list, iterator, context) {
if (!isFunction(iterator)) {
throw new TypeError('iterator must be a function')
}
if (arguments.length < 3) {
context = this
}
if (toString.call(list) === '[object Array]')
forEachArray(list, iterator, context)
else if (typeof list === 'string')
forEachString(list, iterator, context)
else
forEachObject(list, iterator, context)
}
function forEachArray(array, iterator, context) {
for (var i = 0, len = array.length; i < len; i++) {
if (hasOwnProperty.call(array, i)) {
iterator.call(context, array[i], i, array)
}
}
}
function forEachString(string, iterator, context) {
for (var i = 0, len = string.length; i < len; i++) {
// no such thing as a sparse string.
iterator.call(context, string.charAt(i), i, string)
}
}
function forEachObject(object, iterator, context) {
for (var k in object) {
if (hasOwnProperty.call(object, k)) {
iterator.call(context, object[k], k, object)
}
}
}
},{"is-function":2}],4:[function(require,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],5:[function(require,module,exports){
var trim = require('trim')
, forEach = require('for-each')
, isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
}
module.exports = function (headers) {
if (!headers)
return {}
var result = {}
forEach(
trim(headers).split('\n')
, function (row) {
var index = row.indexOf(':')
, key = trim(row.slice(0, index)).toLowerCase()
, value = trim(row.slice(index + 1))
if (typeof(result[key]) === 'undefined') {
result[key] = value
} else if (isArray(result[key])) {
result[key].push(value)
} else {
result[key] = [ result[key], value ]
}
}
)
return result
}
},{"for-each":3,"trim":4}],6:[function(require,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],"xhr":[function(require,module,exports){
"use strict";
var window = require("global/window")
var isFunction = require("is-function")
var parseHeaders = require("parse-headers")
var xtend = require("xtend")
module.exports = createXHR
createXHR.XMLHttpRequest = window.XMLHttpRequest || noop
createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest
forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) {
createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) {
options = initParams(uri, options, callback)
options.method = method.toUpperCase()
return _createXHR(options)
}
})
function forEachArray(array, iterator) {
for (var i = 0; i < array.length; i++) {
iterator(array[i])
}
}
function isEmpty(obj){
for(var i in obj){
if(obj.hasOwnProperty(i)) return false
}
return true
}
function initParams(uri, options, callback) {
var params = uri
if (isFunction(options)) {
callback = options
if (typeof uri === "string") {
params = {uri:uri}
}
} else {
params = xtend(options, {uri: uri})
}
params.callback = callback
return params
}
function createXHR(uri, options, callback) {
options = initParams(uri, options, callback)
return _createXHR(options)
}
function _createXHR(options) {
if(typeof options.callback === "undefined"){
throw new Error("callback argument missing")
}
var called = false
var callback = function cbOnce(err, response, body){
if(!called){
called = true
options.callback(err, response, body)
}
}
function readystatechange() {
if (xhr.readyState === 4) {
loadFunc()
}
}
function getBody() {
// Chrome with requestType=blob throws errors arround when even testing access to responseText
var body = undefined
if (xhr.response) {
body = xhr.response
} else {
body = xhr.responseText || getXml(xhr)
}
if (isJson) {
try {
body = JSON.parse(body)
} catch (e) {}
}
return body
}
var failureResponse = {
body: undefined,
headers: {},
statusCode: 0,
method: method,
url: uri,
rawRequest: xhr
}
function errorFunc(evt) {
clearTimeout(timeoutTimer)
if(!(evt instanceof Error)){
evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )
}
evt.statusCode = 0
return callback(evt, failureResponse)
}
// will load the data & process the response in a special response object
function loadFunc() {
if (aborted) return
var status
clearTimeout(timeoutTimer)
if(options.useXDR && xhr.status===undefined) {
//IE8 CORS GET successful response doesn't have a status field, but body is fine
status = 200
} else {
status = (xhr.status === 1223 ? 204 : xhr.status)
}
var response = failureResponse
var err = null
if (status !== 0){
response = {
body: getBody(),
statusCode: status,
method: method,
headers: {},
url: uri,
rawRequest: xhr
}
if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
response.headers = parseHeaders(xhr.getAllResponseHeaders())
}
} else {
err = new Error("Internal XMLHttpRequest Error")
}
return callback(err, response, response.body)
}
var xhr = options.xhr || null
if (!xhr) {
if (options.cors || options.useXDR) {
xhr = new createXHR.XDomainRequest()
}else{
xhr = new createXHR.XMLHttpRequest()
}
}
var key
var aborted
var uri = xhr.url = options.uri || options.url
var method = xhr.method = options.method || "GET"
var body = options.body || options.data || null
var headers = xhr.headers = options.headers || {}
var sync = !!options.sync
var isJson = false
var timeoutTimer
if ("json" in options) {
isJson = true
headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user
if (method !== "GET" && method !== "HEAD") {
headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user
body = JSON.stringify(options.json)
}
}
xhr.onreadystatechange = readystatechange
xhr.onload = loadFunc
xhr.onerror = errorFunc
// IE9 must have onprogress be set to a unique function.
xhr.onprogress = function () {
// IE must die
}
xhr.ontimeout = errorFunc
xhr.open(method, uri, !sync, options.username, options.password)
//has to be after open
if(!sync) {
xhr.withCredentials = !!options.withCredentials
}
// Cannot set timeout with sync request
// not setting timeout on the xhr object, because of old webkits etc. not handling that correctly
// both npm's request and jquery 1.x use this kind of timeout, so this is being consistent
if (!sync && options.timeout > 0 ) {
timeoutTimer = setTimeout(function(){
aborted=true//IE9 may still call readystatechange
xhr.abort("timeout")
var e = new Error("XMLHttpRequest timeout")
e.code = "ETIMEDOUT"
errorFunc(e)
}, options.timeout )
}
if (xhr.setRequestHeader) {
for(key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key])
}
}
} else if (options.headers && !isEmpty(options.headers)) {
throw new Error("Headers cannot be set on an XDomainRequest object")
}
if ("responseType" in options) {
xhr.responseType = options.responseType
}
if ("beforeSend" in options &&
typeof options.beforeSend === "function"
) {
options.beforeSend(xhr)
}
xhr.send(body)
return xhr
}
function getXml(xhr) {
if (xhr.responseType === "document") {
return xhr.responseXML
}
var firefoxBugTakenEffect = xhr.status === 204 && xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"
if (xhr.responseType === "" && !firefoxBugTakenEffect) {
return xhr.responseXML
}
return null
}
function noop() {}
},{"global/window":1,"is-function":2,"parse-headers":5,"xtend":6}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIiwibm9kZV9tb2R1bGVzL2lzLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtaGVhZGVycy9wYXJzZS1oZWFkZXJzLmpzIiwibm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgIG1vZHVsZS5leHBvcnRzID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7fTtcbn1cblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5bmJHOWlZV3d2ZDJsdVpHOTNMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVdZZ0tIUjVjR1Z2WmlCM2FXNWtiM2NnSVQwOUlGd2lkVzVrWldacGJtVmtYQ0lwSUh0Y2JpQWdJQ0J0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSGRwYm1SdmR6dGNibjBnWld4elpTQnBaaUFvZEhsd1pXOW1JR2RzYjJKaGJDQWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh1SUNBZ0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1oyeHZZbUZzTzF4dWZTQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ2MyVnNaaUFoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWw3WEc0Z0lDQWdiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQnpaV3htTzF4dWZTQmxiSE5sSUh0Y2JpQWdJQ0J0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHQ5TzF4dWZWeHVJbDE5IiwibW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHN0cmluZyA9IHRvU3RyaW5nLmNhbGwoZm4pXG4gIHJldHVybiBzdHJpbmcgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHxcbiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8XG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIC8vIElFOCBhbmQgYmVsb3dcbiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5hbGVydCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5jb25maXJtIHx8XG4gICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpXG59O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCdpcy1mdW5jdGlvbicpXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaFxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oaXRlcmF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzXG4gICAgfVxuICAgIFxuICAgIGlmICh0b1N0cmluZy5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKVxuICAgICAgICBmb3JFYWNoQXJyYXkobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKVxuICAgICAgICBmb3JFYWNoU3RyaW5nKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2VcbiAgICAgICAgZm9yRWFjaE9iamVjdChsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgaSkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgYXJyYXlbaV0sIGksIGFycmF5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaykpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqZWN0W2tdLCBrLCBvYmplY3QpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cbmZ1bmN0aW9uIHRyaW0oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59XG5cbmV4cG9ydHMubGVmdCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJyk7XG59O1xuXG5leHBvcnRzLnJpZ2h0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn07XG4iLCJ2YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKVxuICAsIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpXG4gICwgaXNBcnJheSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpXG4gICAgcmV0dXJuIHt9XG5cbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgZm9yRWFjaChcbiAgICAgIHRyaW0oaGVhZGVycykuc3BsaXQoJ1xcbicpXG4gICAgLCBmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAgICAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgICAgIGlmICh0eXBlb2YocmVzdWx0W2tleV0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgKVxuXG4gIHJldHVybiByZXN1bHRcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgd2luZG93ID0gcmVxdWlyZShcImdsb2JhbC93aW5kb3dcIilcbnZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZShcImlzLWZ1bmN0aW9uXCIpXG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZShcInBhcnNlLWhlYWRlcnNcIilcbnZhciB4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZFwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVhIUlxuY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0ID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0IHx8IG5vb3BcbmNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKSkgPyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxuZm9yRWFjaEFycmF5KFtcImdldFwiLCBcInB1dFwiLCBcInBvc3RcIiwgXCJwYXRjaFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIl0sIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGNyZWF0ZVhIUlttZXRob2QgPT09IFwiZGVsZXRlXCIgPyBcImRlbFwiIDogbWV0aG9kXSA9IGZ1bmN0aW9uKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmope1xuICAgIGZvcih2YXIgaSBpbiBvYmope1xuICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gdXJpXG5cbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zID0geHRlbmQob3B0aW9ucywge3VyaTogdXJpfSlcbiAgICB9XG5cbiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVYSFIob3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FsbGJhY2sgYXJndW1lbnQgbWlzc2luZ1wiKVxuICAgIH1cblxuICAgIHZhciBjYWxsZWQgPSBmYWxzZVxuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNiT25jZShlcnIsIHJlc3BvbnNlLCBib2R5KXtcbiAgICAgICAgaWYoIWNhbGxlZCl7XG4gICAgICAgICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKGVyciwgcmVzcG9uc2UsIGJvZHkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkeXN0YXRlY2hhbmdlKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgIGxvYWRGdW5jKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgICAgIC8vIENocm9tZSB3aXRoIHJlcXVlc3RUeXBlPWJsb2IgdGhyb3dzIGVycm9ycyBhcnJvdW5kIHdoZW4gZXZlbiB0ZXN0aW5nIGFjY2VzcyB0byByZXNwb25zZVRleHRcbiAgICAgICAgdmFyIGJvZHkgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlVGV4dCB8fCBnZXRYbWwoeGhyKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgdmFyIGZhaWx1cmVSZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICAgICAgICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yRnVuYyhldnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYoIShldnQgaW5zdGFuY2VvZiBFcnJvcikpe1xuICAgICAgICAgICAgZXZ0ID0gbmV3IEVycm9yKFwiXCIgKyAoZXZ0IHx8IFwiVW5rbm93biBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKSApXG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0YXR1c0NvZGUgPSAwXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhldnQsIGZhaWx1cmVSZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyB3aWxsIGxvYWQgdGhlIGRhdGEgJiBwcm9jZXNzIHRoZSByZXNwb25zZSBpbiBhIHNwZWNpYWwgcmVzcG9uc2Ugb2JqZWN0XG4gICAgZnVuY3Rpb24gbG9hZEZ1bmMoKSB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm5cbiAgICAgICAgdmFyIHN0YXR1c1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZihvcHRpb25zLnVzZVhEUiAmJiB4aHIuc3RhdHVzPT09dW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL0lFOCBDT1JTIEdFVCBzdWNjZXNzZnVsIHJlc3BvbnNlIGRvZXNuJ3QgaGF2ZSBhIHN0YXR1cyBmaWVsZCwgYnV0IGJvZHkgaXMgZmluZVxuICAgICAgICAgICAgc3RhdHVzID0gMjAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXMpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gZmFpbHVyZVJlc3BvbnNlXG4gICAgICAgIHZhciBlcnIgPSBudWxsXG5cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMCl7XG4gICAgICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBib2R5OiBnZXRCb2R5KCksXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogc3RhdHVzLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyl7IC8vcmVtZW1iZXIgeGhyIGNhbiBpbiBmYWN0IGJlIFhEUiBmb3IgQ09SUyBpbiBJRVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKFwiSW50ZXJuYWwgWE1MSHR0cFJlcXVlc3QgRXJyb3JcIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbFxuXG4gICAgaWYgKCF4aHIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29ycyB8fCBvcHRpb25zLnVzZVhEUikge1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCgpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5XG4gICAgdmFyIGFib3J0ZWRcbiAgICB2YXIgdXJpID0geGhyLnVybCA9IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMudXJsXG4gICAgdmFyIG1ldGhvZCA9IHhoci5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiXG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhIHx8IG51bGxcbiAgICB2YXIgaGVhZGVycyA9IHhoci5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgdmFyIHN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICAgIHZhciBpc0pzb24gPSBmYWxzZVxuICAgIHZhciB0aW1lb3V0VGltZXJcblxuICAgIGlmIChcImpzb25cIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlzSnNvbiA9IHRydWVcbiAgICAgICAgaGVhZGVyc1tcImFjY2VwdFwiXSB8fCBoZWFkZXJzW1wiQWNjZXB0XCJdIHx8IChoZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgIGlmIChtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgICAgICAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSB8fCBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdIHx8IChoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5qc29uKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlYWR5c3RhdGVjaGFuZ2VcbiAgICB4aHIub25sb2FkID0gbG9hZEZ1bmNcbiAgICB4aHIub25lcnJvciA9IGVycm9yRnVuY1xuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmNcbiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpXG4gICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlblxuICAgIGlmKCFzeW5jKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgfVxuICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdFxuICAgIC8vIG5vdCBzZXR0aW5nIHRpbWVvdXQgb24gdGhlIHhociBvYmplY3QsIGJlY2F1c2Ugb2Ygb2xkIHdlYmtpdHMgZXRjLiBub3QgaGFuZGxpbmcgdGhhdCBjb3JyZWN0bHlcbiAgICAvLyBib3RoIG5wbSdzIHJlcXVlc3QgYW5kIGpxdWVyeSAxLnggdXNlIHRoaXMga2luZCBvZiB0aW1lb3V0LCBzbyB0aGlzIGlzIGJlaW5nIGNvbnNpc3RlbnRcbiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHtcbiAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgYWJvcnRlZD10cnVlLy9JRTkgbWF5IHN0aWxsIGNhbGwgcmVhZHlzdGF0ZWNoYW5nZVxuICAgICAgICAgICAgeGhyLmFib3J0KFwidGltZW91dFwiKVxuICAgICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoXCJYTUxIdHRwUmVxdWVzdCB0aW1lb3V0XCIpXG4gICAgICAgICAgICBlLmNvZGUgPSBcIkVUSU1FRE9VVFwiXG4gICAgICAgICAgICBlcnJvckZ1bmMoZSlcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0IClcbiAgICB9XG5cbiAgICBpZiAoeGhyLnNldFJlcXVlc3RIZWFkZXIpIHtcbiAgICAgICAgZm9yKGtleSBpbiBoZWFkZXJzKXtcbiAgICAgICAgICAgIGlmKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSl7XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaGVhZGVycyAmJiAhaXNFbXB0eShvcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBpZiAoXCJyZXNwb25zZVR5cGVcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZVxuICAgIH1cblxuICAgIGlmIChcImJlZm9yZVNlbmRcIiBpbiBvcHRpb25zICYmXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmJlZm9yZVNlbmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgICBvcHRpb25zLmJlZm9yZVNlbmQoeGhyKVxuICAgIH1cblxuICAgIHhoci5zZW5kKGJvZHkpXG5cbiAgICByZXR1cm4geGhyXG5cblxufVxuXG5mdW5jdGlvbiBnZXRYbWwoeGhyKSB7XG4gICAgaWYgKHhoci5yZXNwb25zZVR5cGUgPT09IFwiZG9jdW1lbnRcIikge1xuICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlWE1MXG4gICAgfVxuICAgIHZhciBmaXJlZm94QnVnVGFrZW5FZmZlY3QgPSB4aHIuc3RhdHVzID09PSAyMDQgJiYgeGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIl19
var pull = require('pull-stream')
var paramap = require('pull-paramap')
var async = require('pull-async')
var xhr = require('xhr')
var urls = [
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/agpl3.txt',
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/apache.txt',
'https://raw.githubusercontent.com/terinjokes/gulp-license/master/licenses/mit.txt'
]
pull(
pull.values(urls),
paramap(function (url, next) {
pull(
async(cb => {
xhr(url, cb)
}),
pull.map(res => res.body),
pull.map(str => str.toUpperCase()),
pull.through(str => console.log(str)),
pull.drain(null, (err) => {
next(err, url)
})
)
}),
pull.collect((err, out) => {
console.log('done', out)
})
)
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"pull-stream": "3.4.5",
"pull-paramap": "1.1.6",
"pull-async": "1.0.0",
"xhr": "2.2.2"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- 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