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
var unified = require('unified'); | |
var markdown = require('remark-parse'); | |
var remark2rehype = require('remark-rehype'); | |
var slug = require('rehype-slug'); | |
var link = require('rehype-autolink-headings'); | |
var raw = require('rehype-raw'); | |
var stringify = require('rehype-stringify'); | |
const input = `## Test | |
[link](href) | |
\`\`\`js | |
console.log(window) | |
\`\`\` | |
<button>Random Html</button> | |
<Button>Random react like stuff</Button> | |
`; | |
unified() | |
.use(markdown) | |
.use(remark2rehype, {allowDangerousHTML: true}) | |
.use(slug) | |
.use(link) | |
.use(raw) | |
.use(stringify) | |
.processSync(input); |
This file has been truncated, but you can view the full file.
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){ | |
(function (process){ | |
// Copyright Joyent, Inc. and other Node contributors. | |
// | |
// Permission is hereby granted, free of charge, to any person obtaining a | |
// copy of this software and associated documentation files (the | |
// "Software"), to deal in the Software without restriction, including | |
// without limitation the rights to use, copy, modify, merge, publish, | |
// distribute, sublicense, and/or sell copies of the Software, and to permit | |
// persons to whom the Software is furnished to do so, subject to the | |
// following conditions: | |
// | |
// The above copyright notice and this permission notice shall be included | |
// in all copies or substantial portions of the Software. | |
// | |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
// USE OR OTHER DEALINGS IN THE SOFTWARE. | |
// resolves . and .. elements in a path array with directory names there | |
// must be no slashes, empty elements, or device names (c:\) in the array | |
// (so also no leading and trailing slashes - it does not distinguish | |
// relative and absolute paths) | |
function normalizeArray(parts, allowAboveRoot) { | |
// if the path tries to go above the root, `up` ends up > 0 | |
var up = 0; | |
for (var i = parts.length - 1; i >= 0; i--) { | |
var last = parts[i]; | |
if (last === '.') { | |
parts.splice(i, 1); | |
} else if (last === '..') { | |
parts.splice(i, 1); | |
up++; | |
} else if (up) { | |
parts.splice(i, 1); | |
up--; | |
} | |
} | |
// if the path is allowed to go above the root, restore leading ..s | |
if (allowAboveRoot) { | |
for (; up--; up) { | |
parts.unshift('..'); | |
} | |
} | |
return parts; | |
} | |
// Split a filename into [root, dir, basename, ext], unix version | |
// 'root' is just a slash, or nothing. | |
var splitPathRe = | |
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; | |
var splitPath = function(filename) { | |
return splitPathRe.exec(filename).slice(1); | |
}; | |
// path.resolve([from ...], to) | |
// posix version | |
exports.resolve = function() { | |
var resolvedPath = '', | |
resolvedAbsolute = false; | |
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { | |
var path = (i >= 0) ? arguments[i] : process.cwd(); | |
// Skip empty and invalid entries | |
if (typeof path !== 'string') { | |
throw new TypeError('Arguments to path.resolve must be strings'); | |
} else if (!path) { | |
continue; | |
} | |
resolvedPath = path + '/' + resolvedPath; | |
resolvedAbsolute = path.charAt(0) === '/'; | |
} | |
// At this point the path should be resolved to a full absolute path, but | |
// handle relative paths to be safe (might happen when process.cwd() fails) | |
// Normalize the path | |
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { | |
return !!p; | |
}), !resolvedAbsolute).join('/'); | |
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; | |
}; | |
// path.normalize(path) | |
// posix version | |
exports.normalize = function(path) { | |
var isAbsolute = exports.isAbsolute(path), | |
trailingSlash = substr(path, -1) === '/'; | |
// Normalize the path | |
path = normalizeArray(filter(path.split('/'), function(p) { | |
return !!p; | |
}), !isAbsolute).join('/'); | |
if (!path && !isAbsolute) { | |
path = '.'; | |
} | |
if (path && trailingSlash) { | |
path += '/'; | |
} | |
return (isAbsolute ? '/' : '') + path; | |
}; | |
// posix version | |
exports.isAbsolute = function(path) { | |
return path.charAt(0) === '/'; | |
}; | |
// posix version | |
exports.join = function() { | |
var paths = Array.prototype.slice.call(arguments, 0); | |
return exports.normalize(filter(paths, function(p, index) { | |
if (typeof p !== 'string') { | |
throw new TypeError('Arguments to path.join must be strings'); | |
} | |
return p; | |
}).join('/')); | |
}; | |
// path.relative(from, to) | |
// posix version | |
exports.relative = function(from, to) { | |
from = exports.resolve(from).substr(1); | |
to = exports.resolve(to).substr(1); | |
function trim(arr) { | |
var start = 0; | |
for (; start < arr.length; start++) { | |
if (arr[start] !== '') break; | |
} | |
var end = arr.length - 1; | |
for (; end >= 0; end--) { | |
if (arr[end] !== '') break; | |
} | |
if (start > end) return []; | |
return arr.slice(start, end - start + 1); | |
} | |
var fromParts = trim(from.split('/')); | |
var toParts = trim(to.split('/')); | |
var length = Math.min(fromParts.length, toParts.length); | |
var samePartsLength = length; | |
for (var i = 0; i < length; i++) { | |
if (fromParts[i] !== toParts[i]) { | |
samePartsLength = i; | |
break; | |
} | |
} | |
var outputParts = []; | |
for (var i = samePartsLength; i < fromParts.length; i++) { | |
outputParts.push('..'); | |
} | |
outputParts = outputParts.concat(toParts.slice(samePartsLength)); | |
return outputParts.join('/'); | |
}; | |
exports.sep = '/'; | |
exports.delimiter = ':'; | |
exports.dirname = function(path) { | |
var result = splitPath(path), | |
root = result[0], | |
dir = result[1]; | |
if (!root && !dir) { | |
// No dirname whatsoever | |
return '.'; | |
} | |
if (dir) { | |
// It has a dirname, strip trailing slash | |
dir = dir.substr(0, dir.length - 1); | |
} | |
return root + dir; | |
}; | |
exports.basename = function(path, ext) { | |
var f = splitPath(path)[2]; | |
// TODO: make this comparison case-insensitive on windows? | |
if (ext && f.substr(-1 * ext.length) === ext) { | |
f = f.substr(0, f.length - ext.length); | |
} | |
return f; | |
}; | |
exports.extname = function(path) { | |
return splitPath(path)[3]; | |
}; | |
function filter (xs, f) { | |
if (xs.filter) return xs.filter(f); | |
var res = []; | |
for (var i = 0; i < xs.length; i++) { | |
if (f(xs[i], i, xs)) res.push(xs[i]); | |
} | |
return res; | |
} | |
// String.prototype.substr - negative index don't work in IE8 | |
var substr = 'ab'.substr(-1) === 'b' | |
? function (str, start, len) { return str.substr(start, len) } | |
: function (str, start, len) { | |
if (start < 0) start = str.length + start; | |
return str.substr(start, len); | |
} | |
; | |
}).call(this,require('_process')) | |
},{"_process":2}],2:[function(require,module,exports){ | |
// shim for using process in browser | |
var process = module.exports = {}; | |
// cached from whatever global is present so that test runners that stub it | |
// don't break things. But we need to wrap it in a try catch in case it is | |
// wrapped in strict mode code which doesn't define any globals. It's inside a | |
// function because try/catches deoptimize in certain engines. | |
var cachedSetTimeout; | |
var cachedClearTimeout; | |
function defaultSetTimout() { | |
throw new Error('setTimeout has not been defined'); | |
} | |
function defaultClearTimeout () { | |
throw new Error('clearTimeout has not been defined'); | |
} | |
(function () { | |
try { | |
if (typeof setTimeout === 'function') { | |
cachedSetTimeout = setTimeout; | |
} else { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
} catch (e) { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
try { | |
if (typeof clearTimeout === 'function') { | |
cachedClearTimeout = clearTimeout; | |
} else { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} catch (e) { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} ()) | |
function runTimeout(fun) { | |
if (cachedSetTimeout === setTimeout) { | |
//normal enviroments in sane situations | |
return setTimeout(fun, 0); | |
} | |
// if setTimeout wasn't available but was latter defined | |
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { | |
cachedSetTimeout = setTimeout; | |
return setTimeout(fun, 0); | |
} | |
try { | |
// when when somebody has screwed with setTimeout but no I.E. maddness | |
return cachedSetTimeout(fun, 0); | |
} catch(e){ | |
try { | |
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | |
return cachedSetTimeout.call(null, fun, 0); | |
} catch(e){ | |
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error | |
return cachedSetTimeout.call(this, fun, 0); | |
} | |
} | |
} | |
function runClearTimeout(marker) { | |
if (cachedClearTimeout === clearTimeout) { | |
//normal enviroments in sane situations | |
return clearTimeout(marker); | |
} | |
// if clearTimeout wasn't available but was latter defined | |
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { | |
cachedClearTimeout = clearTimeout; | |
return clearTimeout(marker); | |
} | |
try { | |
// when when somebody has screwed with setTimeout but no I.E. maddness | |
return cachedClearTimeout(marker); | |
} catch (e){ | |
try { | |
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | |
return cachedClearTimeout.call(null, marker); | |
} catch (e){ | |
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. | |
// Some versions of I.E. have different rules for clearTimeout vs setTimeout | |
return cachedClearTimeout.call(this, marker); | |
} | |
} | |
} | |
var queue = []; | |
var draining = false; | |
var currentQueue; | |
var queueIndex = -1; | |
function cleanUpNextTick() { | |
if (!draining || !currentQueue) { | |
return; | |
} | |
draining = false; | |
if (currentQueue.length) { | |
queue = currentQueue.concat(queue); | |
} else { | |
queueIndex = -1; | |
} | |
if (queue.length) { | |
drainQueue(); | |
} | |
} | |
function drainQueue() { | |
if (draining) { | |
return; | |
} | |
var timeout = runTimeout(cleanUpNextTick); | |
draining = true; | |
var len = queue.length; | |
while(len) { | |
currentQueue = queue; | |
queue = []; | |
while (++queueIndex < len) { | |
if (currentQueue) { | |
currentQueue[queueIndex].run(); | |
} | |
} | |
queueIndex = -1; | |
len = queue.length; | |
} | |
currentQueue = null; | |
draining = false; | |
runClearTimeout(timeout); | |
} | |
process.nextTick = function (fun) { | |
var args = new Array(arguments.length - 1); | |
if (arguments.length > 1) { | |
for (var i = 1; i < arguments.length; i++) { | |
args[i - 1] = arguments[i]; | |
} | |
} | |
queue.push(new Item(fun, args)); | |
if (queue.length === 1 && !draining) { | |
runTimeout(drainQueue); | |
} | |
}; | |
// v8 likes predictible objects | |
function Item(fun, array) { | |
this.fun = fun; | |
this.array = array; | |
} | |
Item.prototype.run = function () { | |
this.fun.apply(null, this.array); | |
}; | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
process.version = ''; // empty string to avoid regexp issues | |
process.versions = {}; | |
function noop() {} | |
process.on = noop; | |
process.addListener = noop; | |
process.once = noop; | |
process.off = noop; | |
process.removeListener = noop; | |
process.removeAllListeners = noop; | |
process.emit = noop; | |
process.binding = function (name) { | |
throw new Error('process.binding is not supported'); | |
}; | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
process.umask = function() { return 0; }; | |
},{}],3:[function(require,module,exports){ | |
'use strict'; | |
module.exports = bail; | |
function bail(err) { | |
if (err) { | |
throw err; | |
} | |
} | |
},{}],4:[function(require,module,exports){ | |
'use strict'; | |
var hasOwn = Object.prototype.hasOwnProperty; | |
var toStr = Object.prototype.toString; | |
var isArray = function isArray(arr) { | |
if (typeof Array.isArray === 'function') { | |
return Array.isArray(arr); | |
} | |
return toStr.call(arr) === '[object Array]'; | |
}; | |
var isPlainObject = function isPlainObject(obj) { | |
if (!obj || toStr.call(obj) !== '[object Object]') { | |
return false; | |
} | |
var hasOwnConstructor = hasOwn.call(obj, 'constructor'); | |
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); | |
// Not own constructor property must be Object | |
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { | |
return false; | |
} | |
// Own properties are enumerated firstly, so to speed up, | |
// if last one is own, then all properties are own. | |
var key; | |
for (key in obj) { /**/ } | |
return typeof key === 'undefined' || hasOwn.call(obj, key); | |
}; | |
module.exports = function extend() { | |
var options, name, src, copy, copyIsArray, clone; | |
var target = arguments[0]; | |
var i = 1; | |
var length = arguments.length; | |
var deep = false; | |
// Handle a deep copy situation | |
if (typeof target === 'boolean') { | |
deep = target; | |
target = arguments[1] || {}; | |
// skip the boolean and the target | |
i = 2; | |
} | |
if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { | |
target = {}; | |
} | |
for (; i < length; ++i) { | |
options = arguments[i]; | |
// Only deal with non-null/undefined values | |
if (options != null) { | |
// Extend the base object | |
for (name in options) { | |
src = target[name]; | |
copy = options[name]; | |
// Prevent never-ending loop | |
if (target !== copy) { | |
// Recurse if we're merging plain objects or arrays | |
if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { | |
if (copyIsArray) { | |
copyIsArray = false; | |
clone = src && isArray(src) ? src : []; | |
} else { | |
clone = src && isPlainObject(src) ? src : {}; | |
} | |
// Never move original objects, clone them | |
target[name] = extend(deep, clone, copy); | |
// Don't bring in undefined values | |
} else if (typeof copy !== 'undefined') { | |
target[name] = copy; | |
} | |
} | |
} | |
} | |
} | |
// Return the modified object | |
return target; | |
}; | |
},{}],5:[function(require,module,exports){ | |
'use strict'; | |
var toString = Object.prototype.toString; | |
module.exports = function (x) { | |
var prototype; | |
return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); | |
}; | |
},{}],6:[function(require,module,exports){ | |
'use strict'; | |
/* Expose. */ | |
module.exports = trough; | |
/* Methods. */ | |
var slice = [].slice; | |
/* Create new middleware. */ | |
function trough() { | |
var fns = []; | |
var middleware = {}; | |
middleware.run = run; | |
middleware.use = use; | |
return middleware; | |
/* Run `fns`. Last argument must be | |
* a completion handler. */ | |
function run() { | |
var index = -1; | |
var input = slice.call(arguments, 0, -1); | |
var done = arguments[arguments.length - 1]; | |
if (typeof done !== 'function') { | |
throw new Error('Expected function as last argument, not ' + done); | |
} | |
next.apply(null, [null].concat(input)); | |
/* Run the next `fn`, if any. */ | |
function next(err) { | |
var fn = fns[++index]; | |
var params = slice.call(arguments, 0); | |
var values = params.slice(1); | |
var length = input.length; | |
var pos = -1; | |
if (err) { | |
done(err); | |
return; | |
} | |
/* Copy non-nully input into values. */ | |
while (++pos < length) { | |
if (values[pos] === null || values[pos] === undefined) { | |
values[pos] = input[pos]; | |
} | |
} | |
input = values; | |
/* Next or done. */ | |
if (fn) { | |
wrap(fn, next).apply(null, input); | |
} else { | |
done.apply(null, [null].concat(input)); | |
} | |
} | |
} | |
/* Add `fn` to the list. */ | |
function use(fn) { | |
if (typeof fn !== 'function') { | |
throw new Error('Expected `fn` to be a function, not ' + fn); | |
} | |
fns.push(fn); | |
return middleware; | |
} | |
} | |
/* Wrap `fn`. Can be sync or async; return a promise, | |
* receive a completion handler, return new values and | |
* errors. */ | |
function wrap(fn, next) { | |
var invoked; | |
return wrapped; | |
function wrapped() { | |
var params = slice.call(arguments, 0); | |
var callback = fn.length > params.length; | |
var result; | |
if (callback) { | |
params.push(done); | |
} | |
try { | |
result = fn.apply(null, params); | |
} catch (err) { | |
/* Well, this is quite the pickle. `fn` received | |
* a callback and invoked it (thus continuing the | |
* pipeline), but later also threw an error. | |
* We’re not about to restart the pipeline again, | |
* so the only thing left to do is to throw the | |
* thing instea. */ | |
if (callback && invoked) { | |
throw err; | |
} | |
return done(err); | |
} | |
if (!callback) { | |
if (result && typeof result.then === 'function') { | |
result.then(then, done); | |
} else if (result instanceof Error) { | |
done(result); | |
} else { | |
then(result); | |
} | |
} | |
} | |
/* Invoke `next`, only once. */ | |
function done() { | |
if (!invoked) { | |
invoked = true; | |
next.apply(null, arguments); | |
} | |
} | |
/* Invoke `done` with one value. | |
* Tracks if an error is passed, too. */ | |
function then(value) { | |
done(null, value); | |
} | |
} | |
},{}],7:[function(require,module,exports){ | |
(function (process){ | |
'use strict'; | |
var path = require('path'); | |
var replace = require('replace-ext'); | |
var stringify = require('unist-util-stringify-position'); | |
var buffer = require('is-buffer'); | |
module.exports = VFile; | |
var own = {}.hasOwnProperty; | |
var proto = VFile.prototype; | |
proto.toString = toString; | |
proto.message = message; | |
proto.info = info; | |
proto.fail = fail; | |
/* Slight backwards compatibility. Remove in the future. */ | |
proto.warn = message; | |
/* Order of setting (least specific to most), we need this because | |
* otherwise `{stem: 'a', path: '~/b.js'}` would throw, as a path | |
* is needed before a stem can be set. */ | |
var order = [ | |
'history', | |
'path', | |
'basename', | |
'stem', | |
'extname', | |
'dirname' | |
]; | |
/* Construct a new file. */ | |
function VFile(options) { | |
var prop; | |
var index; | |
var length; | |
if (!options) { | |
options = {}; | |
} else if (typeof options === 'string' || buffer(options)) { | |
options = {contents: options}; | |
} else if ('message' in options && 'messages' in options) { | |
return options; | |
} | |
if (!(this instanceof VFile)) { | |
return new VFile(options); | |
} | |
this.data = {}; | |
this.messages = []; | |
this.history = []; | |
this.cwd = process.cwd(); | |
/* Set path related properties in the correct order. */ | |
index = -1; | |
length = order.length; | |
while (++index < length) { | |
prop = order[index]; | |
if (own.call(options, prop)) { | |
this[prop] = options[prop]; | |
} | |
} | |
/* Set non-path related properties. */ | |
for (prop in options) { | |
if (order.indexOf(prop) === -1) { | |
this[prop] = options[prop]; | |
} | |
} | |
} | |
/* Access full path (`~/index.min.js`). */ | |
Object.defineProperty(proto, 'path', { | |
get: function () { | |
return this.history[this.history.length - 1]; | |
}, | |
set: function (path) { | |
assertNonEmpty(path, 'path'); | |
if (path !== this.path) { | |
this.history.push(path); | |
} | |
} | |
}); | |
/* Access parent path (`~`). */ | |
Object.defineProperty(proto, 'dirname', { | |
get: function () { | |
return typeof this.path === 'string' ? path.dirname(this.path) : undefined; | |
}, | |
set: function (dirname) { | |
assertPath(this.path, 'dirname'); | |
this.path = path.join(dirname || '', this.basename); | |
} | |
}); | |
/* Access basename (`index.min.js`). */ | |
Object.defineProperty(proto, 'basename', { | |
get: function () { | |
return typeof this.path === 'string' ? path.basename(this.path) : undefined; | |
}, | |
set: function (basename) { | |
assertNonEmpty(basename, 'basename'); | |
assertPart(basename, 'basename'); | |
this.path = path.join(this.dirname || '', basename); | |
} | |
}); | |
/* Access extname (`.js`). */ | |
Object.defineProperty(proto, 'extname', { | |
get: function () { | |
return typeof this.path === 'string' ? path.extname(this.path) : undefined; | |
}, | |
set: function (extname) { | |
var ext = extname || ''; | |
assertPart(ext, 'extname'); | |
assertPath(this.path, 'extname'); | |
if (ext) { | |
if (ext.charAt(0) !== '.') { | |
throw new Error('`extname` must start with `.`'); | |
} | |
if (ext.indexOf('.', 1) !== -1) { | |
throw new Error('`extname` cannot contain multiple dots'); | |
} | |
} | |
this.path = replace(this.path, ext); | |
} | |
}); | |
/* Access stem (`index.min`). */ | |
Object.defineProperty(proto, 'stem', { | |
get: function () { | |
return typeof this.path === 'string' ? path.basename(this.path, this.extname) : undefined; | |
}, | |
set: function (stem) { | |
assertNonEmpty(stem, 'stem'); | |
assertPart(stem, 'stem'); | |
this.path = path.join(this.dirname || '', stem + (this.extname || '')); | |
} | |
}); | |
/* Get the value of the file. */ | |
function toString(encoding) { | |
var value = this.contents || ''; | |
return buffer(value) ? value.toString(encoding) : String(value); | |
} | |
/* Create a message with `reason` at `position`. | |
* When an error is passed in as `reason`, copies the stack. */ | |
function message(reason, position, ruleId) { | |
var filePath = this.path; | |
var range = stringify(position) || '1:1'; | |
var location; | |
var err; | |
location = { | |
start: {line: null, column: null}, | |
end: {line: null, column: null} | |
}; | |
if (position && position.position) { | |
position = position.position; | |
} | |
if (position) { | |
/* Location. */ | |
if (position.start) { | |
location = position; | |
position = position.start; | |
} else { | |
/* Position. */ | |
location.start = position; | |
} | |
} | |
err = new VMessage(reason.message || reason); | |
err.name = (filePath ? filePath + ':' : '') + range; | |
err.file = filePath || ''; | |
err.reason = reason.message || reason; | |
err.line = position ? position.line : null; | |
err.column = position ? position.column : null; | |
err.location = location; | |
err.ruleId = ruleId || null; | |
err.source = null; | |
err.fatal = false; | |
if (reason.stack) { | |
err.stack = reason.stack; | |
} | |
this.messages.push(err); | |
return err; | |
} | |
/* Fail. Creates a vmessage, associates it with the file, | |
* and throws it. */ | |
function fail() { | |
var message = this.message.apply(this, arguments); | |
message.fatal = true; | |
throw message; | |
} | |
/* Info. Creates a vmessage, associates it with the file, | |
* and marks the fatality as null. */ | |
function info() { | |
var message = this.message.apply(this, arguments); | |
message.fatal = null; | |
return message; | |
} | |
/* Inherit from `Error#`. */ | |
function VMessagePrototype() {} | |
VMessagePrototype.prototype = Error.prototype; | |
VMessage.prototype = new VMessagePrototype(); | |
/* Message properties. */ | |
proto = VMessage.prototype; | |
proto.file = ''; | |
proto.name = ''; | |
proto.reason = ''; | |
proto.message = ''; | |
proto.stack = ''; | |
proto.fatal = null; | |
proto.column = null; | |
proto.line = null; | |
/* Construct a new file message. | |
* | |
* Note: We cannot invoke `Error` on the created context, | |
* as that adds readonly `line` and `column` attributes on | |
* Safari 9, thus throwing and failing the data. */ | |
function VMessage(reason) { | |
this.message = reason; | |
} | |
/* Assert that `part` is not a path (i.e., does | |
* not contain `path.sep`). */ | |
function assertPart(part, name) { | |
if (part.indexOf(path.sep) !== -1) { | |
throw new Error('`' + name + '` cannot be a path: did not expect `' + path.sep + '`'); | |
} | |
} | |
/* Assert that `part` is not empty. */ | |
function assertNonEmpty(part, name) { | |
if (!part) { | |
throw new Error('`' + name + '` cannot be empty'); | |
} | |
} | |
/* Assert `path` exists. */ | |
function assertPath(path, name) { | |
if (!path) { | |
throw new Error('Setting `' + name + '` requires `path` to be set too'); | |
} | |
} | |
}).call(this,require('_process')) | |
},{"_process":2,"is-buffer":8,"path":1,"replace-ext":9,"unist-util-stringify-position":10}],8:[function(require,module,exports){ | |
/*! | |
* Determine if an object is a Buffer | |
* | |
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> | |
* @license MIT | |
*/ | |
// The _isBuffer check is for Safari 5-7 support, because it's missing | |
// Object.prototype.constructor. Remove this eventually | |
module.exports = function (obj) { | |
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) | |
} | |
function isBuffer (obj) { | |
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) | |
} | |
// For Node v0.10 support. Remove this eventually. | |
function isSlowBuffer (obj) { | |
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) | |
} | |
},{}],9:[function(require,module,exports){ | |
'use strict'; | |
var path = require('path'); | |
function replaceExt(npath, ext) { | |
if (typeof npath !== 'string') { | |
return npath; | |
} | |
if (npath.length === 0) { | |
return npath; | |
} | |
var nFileName = path.basename(npath, path.extname(npath)) + ext; | |
return path.join(path.dirname(npath), nFileName); | |
} | |
module.exports = replaceExt; | |
},{"path":1}],10:[function(require,module,exports){ | |
'use strict'; | |
var own = {}.hasOwnProperty; | |
module.exports = stringify; | |
function stringify(value) { | |
/* Nothing. */ | |
if (!value || typeof value !== 'object') { | |
return null; | |
} | |
/* Node. */ | |
if (own.call(value, 'position') || own.call(value, 'type')) { | |
return location(value.position); | |
} | |
/* Location. */ | |
if (own.call(value, 'start') || own.call(value, 'end')) { | |
return location(value); | |
} | |
/* Position. */ | |
if (own.call(value, 'line') || own.call(value, 'column')) { | |
return position(value); | |
} | |
/* ? */ | |
return null; | |
} | |
function position(pos) { | |
if (!pos || typeof pos !== 'object') { | |
pos = {}; | |
} | |
return index(pos.line) + ':' + index(pos.column); | |
} | |
function location(loc) { | |
if (!loc || typeof loc !== 'object') { | |
loc = {}; | |
} | |
return position(loc.start) + '-' + position(loc.end); | |
} | |
function index(value) { | |
return value && typeof value === 'number' ? value : 1; | |
} | |
},{}],11:[function(require,module,exports){ | |
module.exports = function isFunction (fn) { | |
return Object.prototype.toString.call(fn) === '[object Function]' | |
} | |
},{}],12:[function(require,module,exports){ | |
var toString = Object.prototype.toString | |
module.exports = isString | |
function isString(obj) { | |
return toString.call(obj) === "[object String]" | |
} | |
},{}],"unified":[function(require,module,exports){ | |
'use strict'; | |
/* Dependencies. */ | |
var extend = require('extend'); | |
var bail = require('bail'); | |
var vfile = require('vfile'); | |
var trough = require('trough'); | |
var string = require('x-is-string'); | |
var func = require('x-is-function'); | |
var plain = require('is-plain-obj'); | |
/* Expose a frozen processor. */ | |
module.exports = unified().freeze(); | |
var slice = [].slice; | |
var own = {}.hasOwnProperty; | |
/* Process pipeline. */ | |
var pipeline = trough().use(pipelineParse).use(pipelineRun).use(pipelineStringify); | |
function pipelineParse(p, ctx) { | |
ctx.tree = p.parse(ctx.file); | |
} | |
function pipelineRun(p, ctx, next) { | |
p.run(ctx.tree, ctx.file, done); | |
function done(err, tree, file) { | |
if (err) { | |
next(err); | |
} else { | |
ctx.tree = tree; | |
ctx.file = file; | |
next(); | |
} | |
} | |
} | |
function pipelineStringify(p, ctx) { | |
ctx.file.contents = p.stringify(ctx.tree, ctx.file); | |
} | |
/* Function to create the first processor. */ | |
function unified() { | |
var attachers = []; | |
var transformers = trough(); | |
var namespace = {}; | |
var frozen = false; | |
var freezeIndex = -1; | |
/* Data management. */ | |
processor.data = data; | |
/* Lock. */ | |
processor.freeze = freeze; | |
/* Plug-ins. */ | |
processor.attachers = attachers; | |
processor.use = use; | |
/* API. */ | |
processor.parse = parse; | |
processor.stringify = stringify; | |
processor.run = run; | |
processor.runSync = runSync; | |
processor.process = process; | |
processor.processSync = processSync; | |
/* Expose. */ | |
return processor; | |
/* Create a new processor based on the processor | |
* in the current scope. */ | |
function processor() { | |
var destination = unified(); | |
var length = attachers.length; | |
var index = -1; | |
while (++index < length) { | |
destination.use.apply(null, attachers[index]); | |
} | |
destination.data(extend(true, {}, namespace)); | |
return destination; | |
} | |
/* Freeze: used to signal a processor that has finished | |
* configuration. | |
* | |
* For example, take unified itself. It’s frozen. | |
* Plug-ins should not be added to it. Rather, it should | |
* be extended, by invoking it, before modifying it. | |
* | |
* In essence, always invoke this when exporting a | |
* processor. */ | |
function freeze() { | |
var values; | |
var plugin; | |
var options; | |
var transformer; | |
if (frozen) { | |
return processor; | |
} | |
while (++freezeIndex < attachers.length) { | |
values = attachers[freezeIndex]; | |
plugin = values[0]; | |
options = values[1]; | |
transformer = null; | |
if (options === false) { | |
continue; | |
} | |
if (options === true) { | |
values[1] = undefined; | |
} | |
transformer = plugin.apply(processor, values.slice(1)); | |
if (func(transformer)) { | |
transformers.use(transformer); | |
} | |
} | |
frozen = true; | |
freezeIndex = Infinity; | |
return processor; | |
} | |
/* Data management. | |
* Getter / setter for processor-specific informtion. */ | |
function data(key, value) { | |
if (string(key)) { | |
/* Set `key`. */ | |
if (arguments.length === 2) { | |
assertUnfrozen('data', frozen); | |
namespace[key] = value; | |
return processor; | |
} | |
/* Get `key`. */ | |
return (own.call(namespace, key) && namespace[key]) || null; | |
} | |
/* Set space. */ | |
if (key) { | |
assertUnfrozen('data', frozen); | |
namespace = key; | |
return processor; | |
} | |
/* Get space. */ | |
return namespace; | |
} | |
/* Plug-in management. | |
* | |
* Pass it: | |
* * an attacher and options, | |
* * a preset, | |
* * a list of presets, attachers, and arguments (list | |
* of attachers and options). */ | |
function use(value) { | |
var settings; | |
assertUnfrozen('use', frozen); | |
if (value === null || value === undefined) { | |
/* Empty */ | |
} else if (func(value)) { | |
addPlugin.apply(null, arguments); | |
} else if (typeof value === 'object') { | |
if ('length' in value) { | |
addList(value); | |
} else { | |
addPreset(value); | |
} | |
} else { | |
throw new Error('Expected usable value, not `' + value + '`'); | |
} | |
if (settings) { | |
namespace.settings = extend(namespace.settings || {}, settings); | |
} | |
return processor; | |
function addPreset(result) { | |
addList(result.plugins); | |
if (result.settings) { | |
settings = extend(settings || {}, result.settings); | |
} | |
} | |
function add(value) { | |
if (func(value)) { | |
addPlugin(value); | |
} else if (typeof value === 'object') { | |
if ('length' in value) { | |
addPlugin.apply(null, value); | |
} else { | |
addPreset(value); | |
} | |
} else { | |
throw new Error('Expected usable value, not `' + value + '`'); | |
} | |
} | |
function addList(plugins) { | |
var length; | |
var index; | |
if (plugins === null || plugins === undefined) { | |
/* Empty */ | |
} else if (typeof plugins === 'object' && 'length' in plugins) { | |
length = plugins.length; | |
index = -1; | |
while (++index < length) { | |
add(plugins[index]); | |
} | |
} else { | |
throw new Error('Expected a list of plugins, not `' + plugins + '`'); | |
} | |
} | |
function addPlugin(plugin, value) { | |
var entry = find(plugin); | |
if (entry) { | |
if (plain(entry[1]) && plain(value)) { | |
value = extend(entry[1], value); | |
} | |
entry[1] = value; | |
} else { | |
attachers.push(slice.call(arguments)); | |
} | |
} | |
} | |
function find(plugin) { | |
var length = attachers.length; | |
var index = -1; | |
var entry; | |
while (++index < length) { | |
entry = attachers[index]; | |
if (entry[0] === plugin) { | |
return entry; | |
} | |
} | |
} | |
/* Parse a file (in string or VFile representation) | |
* into a Unist node using the `Parser` on the | |
* processor. */ | |
function parse(doc) { | |
var file = vfile(doc); | |
var Parser; | |
freeze(); | |
Parser = processor.Parser; | |
assertParser('parse', Parser); | |
if (newable(Parser)) { | |
return new Parser(String(file), file).parse(); | |
} | |
return Parser(String(file), file); // eslint-disable-line new-cap | |
} | |
/* Run transforms on a Unist node representation of a file | |
* (in string or VFile representation), async. */ | |
function run(node, file, cb) { | |
assertNode(node); | |
freeze(); | |
if (!cb && func(file)) { | |
cb = file; | |
file = null; | |
} | |
if (!cb) { | |
return new Promise(executor); | |
} | |
executor(null, cb); | |
function executor(resolve, reject) { | |
transformers.run(node, vfile(file), done); | |
function done(err, tree, file) { | |
tree = tree || node; | |
if (err) { | |
reject(err); | |
} else if (resolve) { | |
resolve(tree); | |
} else { | |
cb(null, tree, file); | |
} | |
} | |
} | |
} | |
/* Run transforms on a Unist node representation of a file | |
* (in string or VFile representation), sync. */ | |
function runSync(node, file) { | |
var complete = false; | |
var result; | |
run(node, file, done); | |
assertDone('runSync', 'run', complete); | |
return result; | |
function done(err, tree) { | |
complete = true; | |
bail(err); | |
result = tree; | |
} | |
} | |
/* Stringify a Unist node representation of a file | |
* (in string or VFile representation) into a string | |
* using the `Compiler` on the processor. */ | |
function stringify(node, doc) { | |
var file = vfile(doc); | |
var Compiler; | |
freeze(); | |
Compiler = processor.Compiler; | |
assertCompiler('stringify', Compiler); | |
assertNode(node); | |
if (newable(Compiler)) { | |
return new Compiler(node, file).compile(); | |
} | |
return Compiler(node, file); // eslint-disable-line new-cap | |
} | |
/* Parse a file (in string or VFile representation) | |
* into a Unist node using the `Parser` on the processor, | |
* then run transforms on that node, and compile the | |
* resulting node using the `Compiler` on the processor, | |
* and store that result on the VFile. */ | |
function process(doc, cb) { | |
freeze(); | |
assertParser('process', processor.Parser); | |
assertCompiler('process', processor.Compiler); | |
if (!cb) { | |
return new Promise(executor); | |
} | |
executor(null, cb); | |
function executor(resolve, reject) { | |
var file = vfile(doc); | |
pipeline.run(processor, {file: file}, done); | |
function done(err) { | |
if (err) { | |
reject(err); | |
} else if (resolve) { | |
resolve(file); | |
} else { | |
cb(null, file); | |
} | |
} | |
} | |
} | |
/* Process the given document (in string or VFile | |
* representation), sync. */ | |
function processSync(doc) { | |
var complete = false; | |
var file; | |
freeze(); | |
assertParser('processSync', processor.Parser); | |
assertCompiler('processSync', processor.Compiler); | |
file = vfile(doc); | |
process(file, done); | |
assertDone('processSync', 'process', complete); | |
return file; | |
function done(err) { | |
complete = true; | |
bail(err); | |
} | |
} | |
} | |
/* Check if `func` is a constructor. */ | |
function newable(value) { | |
return func(value) && keys(value.prototype); | |
} | |
/* Check if `value` is an object with keys. */ | |
function keys(value) { | |
var key; | |
for (key in value) { | |
return true; | |
} | |
return false; | |
} | |
/* Assert a parser is available. */ | |
function assertParser(name, Parser) { | |
if (!func(Parser)) { | |
throw new Error('Cannot `' + name + '` without `Parser`'); | |
} | |
} | |
/* Assert a compiler is available. */ | |
function assertCompiler(name, Compiler) { | |
if (!func(Compiler)) { | |
throw new Error('Cannot `' + name + '` without `Compiler`'); | |
} | |
} | |
/* Assert the processor is not frozen. */ | |
function assertUnfrozen(name, frozen) { | |
if (frozen) { | |
throw new Error( | |
'Cannot invoke `' + name + '` on a frozen processor.\n' + | |
'Create a new processor first, by invoking it: ' + | |
'use `processor()` instead of `processor`.' | |
); | |
} | |
} | |
/* Assert `node` is a Unist node. */ | |
function assertNode(node) { | |
if (!node || !string(node.type)) { | |
throw new Error('Expected node, got `' + node + '`'); | |
} | |
} | |
/* Assert that `complete` is `true`. */ | |
function assertDone(name, asyncName, complete) { | |
if (!complete) { | |
throw new Error('`' + name + '` finished async. Use `' + asyncName + '` instead'); | |
} | |
} | |
},{"bail":3,"extend":4,"is-plain-obj":5,"trough":6,"vfile":7,"x-is-function":11,"x-is-string":12}]},{},[]) | |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9iYWlsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmZpbGUvbm9kZV9tb2R1bGVzL3JlcGxhY2UtZXh0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94LWlzLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3gtaXMtc3RyaW5nL2luZGV4LmpzIiwidW5pZmllZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9RQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBiYWlsO1xuXG5mdW5jdGlvbiBiYWlsKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycikge1xuXHRpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpO1xuXHR9XG5cblx0cmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcblx0aWYgKCFvYmogfHwgdG9TdHIuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgJ2NvbnN0cnVjdG9yJyk7XG5cdHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKTtcblx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFoYXNPd25Db25zdHJ1Y3RvciAmJiAhaGFzSXNQcm90b3R5cGVPZikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gb2JqKSB7IC8qKi8gfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lO1xuXHR2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdO1xuXHR2YXIgaSA9IDE7XG5cdHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXHR2YXIgZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHRpID0gMjtcblx0fVxuXHRpZiAodGFyZ2V0ID09IG51bGwgfHwgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0W25hbWVdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1tuYW1lXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICh0YXJnZXQgIT09IGNvcHkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0XHRpZiAoZGVlcCAmJiBjb3B5ICYmIChpc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXkoY29weSkpKSkge1xuXHRcdFx0XHRcdFx0aWYgKGNvcHlJc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gY29weTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIHByb3RvdHlwZTtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmIChwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCksIHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB0cm91Z2g7XG5cbi8qIE1ldGhvZHMuICovXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuLyogQ3JlYXRlIG5ldyBtaWRkbGV3YXJlLiAqL1xuZnVuY3Rpb24gdHJvdWdoKCkge1xuICB2YXIgZm5zID0gW107XG4gIHZhciBtaWRkbGV3YXJlID0ge307XG5cbiAgbWlkZGxld2FyZS5ydW4gPSBydW47XG4gIG1pZGRsZXdhcmUudXNlID0gdXNlO1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xuXG4gIC8qIFJ1biBgZm5zYC4gIExhc3QgYXJndW1lbnQgbXVzdCBiZVxuICAgKiBhIGNvbXBsZXRpb24gaGFuZGxlci4gKi9cbiAgZnVuY3Rpb24gcnVuKCkge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBpbnB1dCA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7XG4gICAgdmFyIGRvbmUgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKHR5cGVvZiBkb25lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uIGFzIGxhc3QgYXJndW1lbnQsIG5vdCAnICsgZG9uZSk7XG4gICAgfVxuXG4gICAgbmV4dC5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG5cbiAgICAvKiBSdW4gdGhlIG5leHQgYGZuYCwgaWYgYW55LiAqL1xuICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICB2YXIgZm4gPSBmbnNbKytpbmRleF07XG4gICAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgdmFyIHZhbHVlcyA9IHBhcmFtcy5zbGljZSgxKTtcbiAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICB2YXIgcG9zID0gLTE7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZG9uZShlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIENvcHkgbm9uLW51bGx5IGlucHV0IGludG8gdmFsdWVzLiAqL1xuICAgICAgd2hpbGUgKCsrcG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbcG9zXSA9PT0gbnVsbCB8fCB2YWx1ZXNbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVzW3Bvc10gPSBpbnB1dFtwb3NdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0ID0gdmFsdWVzO1xuXG4gICAgICAvKiBOZXh0IG9yIGRvbmUuICovXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgd3JhcChmbiwgbmV4dCkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZS5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogQWRkIGBmbmAgdG8gdGhlIGxpc3QuICovXG4gIGZ1bmN0aW9uIHVzZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYGZuYCB0byBiZSBhIGZ1bmN0aW9uLCBub3QgJyArIGZuKTtcbiAgICB9XG5cbiAgICBmbnMucHVzaChmbik7XG5cbiAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgfVxufVxuXG4vKiBXcmFwIGBmbmAuICBDYW4gYmUgc3luYyBvciBhc3luYzsgcmV0dXJuIGEgcHJvbWlzZSxcbiAqIHJlY2VpdmUgYSBjb21wbGV0aW9uIGhhbmRsZXIsIHJldHVybiBuZXcgdmFsdWVzIGFuZFxuICogZXJyb3JzLiAqL1xuZnVuY3Rpb24gd3JhcChmbiwgbmV4dCkge1xuICB2YXIgaW52b2tlZDtcblxuICByZXR1cm4gd3JhcHBlZDtcblxuICBmdW5jdGlvbiB3cmFwcGVkKCkge1xuICAgIHZhciBwYXJhbXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdmFyIGNhbGxiYWNrID0gZm4ubGVuZ3RoID4gcGFyYW1zLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwYXJhbXMucHVzaChkb25lKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgcGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIFdlbGwsIHRoaXMgaXMgcXVpdGUgdGhlIHBpY2tsZS4gIGBmbmAgcmVjZWl2ZWRcbiAgICAgICAqIGEgY2FsbGJhY2sgYW5kIGludm9rZWQgaXQgKHRodXMgY29udGludWluZyB0aGVcbiAgICAgICAqIHBpcGVsaW5lKSwgYnV0IGxhdGVyIGFsc28gdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgKiBXZeKAmXJlIG5vdCBhYm91dCB0byByZXN0YXJ0IHRoZSBwaXBlbGluZSBhZ2FpbixcbiAgICAgICAqIHNvIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgdG8gdGhyb3cgdGhlXG4gICAgICAgKiB0aGluZyBpbnN0ZWEuICovXG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaW52b2tlZCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4odGhlbiwgZG9uZSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoZW4ocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBJbnZva2UgYG5leHRgLCBvbmx5IG9uY2UuICovXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaWYgKCFpbnZva2VkKSB7XG4gICAgICBpbnZva2VkID0gdHJ1ZTtcblxuICAgICAgbmV4dC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEludm9rZSBgZG9uZWAgd2l0aCBvbmUgdmFsdWUuXG4gICAqIFRyYWNrcyBpZiBhbiBlcnJvciBpcyBwYXNzZWQsIHRvby4gKi9cbiAgZnVuY3Rpb24gdGhlbih2YWx1ZSkge1xuICAgIGRvbmUobnVsbCwgdmFsdWUpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHJlcGxhY2UgPSByZXF1aXJlKCdyZXBsYWNlLWV4dCcpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGU7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm90byA9IFZGaWxlLnByb3RvdHlwZTtcblxucHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbnByb3RvLm1lc3NhZ2UgPSBtZXNzYWdlO1xucHJvdG8uaW5mbyA9IGluZm87XG5wcm90by5mYWlsID0gZmFpbDtcblxuLyogU2xpZ2h0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgUmVtb3ZlIGluIHRoZSBmdXR1cmUuICovXG5wcm90by53YXJuID0gbWVzc2FnZTtcblxuLyogT3JkZXIgb2Ygc2V0dGluZyAobGVhc3Qgc3BlY2lmaWMgdG8gbW9zdCksIHdlIG5lZWQgdGhpcyBiZWNhdXNlXG4gKiBvdGhlcndpc2UgYHtzdGVtOiAnYScsIHBhdGg6ICd+L2IuanMnfWAgd291bGQgdGhyb3csIGFzIGEgcGF0aFxuICogaXMgbmVlZGVkIGJlZm9yZSBhIHN0ZW0gY2FuIGJlIHNldC4gKi9cbnZhciBvcmRlciA9IFtcbiAgJ2hpc3RvcnknLFxuICAncGF0aCcsXG4gICdiYXNlbmFtZScsXG4gICdzdGVtJyxcbiAgJ2V4dG5hbWUnLFxuICAnZGlybmFtZSdcbl07XG5cbi8qIENvbnN0cnVjdCBhIG5ldyBmaWxlLiAqL1xuZnVuY3Rpb24gVkZpbGUob3B0aW9ucykge1xuICB2YXIgcHJvcDtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGVuZ3RoO1xuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgYnVmZmVyKG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IHtjb250ZW50czogb3B0aW9uc307XG4gIH0gZWxzZSBpZiAoJ21lc3NhZ2UnIGluIG9wdGlvbnMgJiYgJ21lc3NhZ2VzJyBpbiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVkZpbGUpKSB7XG4gICAgcmV0dXJuIG5ldyBWRmlsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuZGF0YSA9IHt9O1xuICB0aGlzLm1lc3NhZ2VzID0gW107XG4gIHRoaXMuaGlzdG9yeSA9IFtdO1xuICB0aGlzLmN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLyogU2V0IHBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAqL1xuICBpbmRleCA9IC0xO1xuICBsZW5ndGggPSBvcmRlci5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcm9wID0gb3JkZXJbaW5kZXhdO1xuXG4gICAgaWYgKG93bi5jYWxsKG9wdGlvbnMsIHByb3ApKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICB9XG4gIH1cblxuICAvKiBTZXQgbm9uLXBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzLiAqL1xuICBmb3IgKHByb3AgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcmRlci5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgdGhpc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG59XG5cbi8qIEFjY2VzcyBmdWxsIHBhdGggKGB+L2luZGV4Lm1pbi5qc2ApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAncGF0aCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV07XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBhc3NlcnROb25FbXB0eShwYXRoLCAncGF0aCcpO1xuXG4gICAgaWYgKHBhdGggIT09IHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGF0aCk7XG4gICAgfVxuICB9XG59KTtcblxuLyogQWNjZXNzIHBhcmVudCBwYXRoIChgfmApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnZGlybmFtZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5kaXJuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGRpcm5hbWUpIHtcbiAgICBhc3NlcnRQYXRoKHRoaXMucGF0aCwgJ2Rpcm5hbWUnKTtcbiAgICB0aGlzLnBhdGggPSBwYXRoLmpvaW4oZGlybmFtZSB8fCAnJywgdGhpcy5iYXNlbmFtZSk7XG4gIH1cbn0pO1xuXG4vKiBBY2Nlc3MgYmFzZW5hbWUgKGBpbmRleC5taW4uanNgKS4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ2Jhc2VuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGJhc2VuYW1lKSB7XG4gICAgYXNzZXJ0Tm9uRW1wdHkoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIGFzc2VydFBhcnQoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIGJhc2VuYW1lKTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBleHRuYW1lIChgLmpzYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdleHRuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmV4dG5hbWUodGhpcy5wYXRoKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoZXh0bmFtZSkge1xuICAgIHZhciBleHQgPSBleHRuYW1lIHx8ICcnO1xuXG4gICAgYXNzZXJ0UGFydChleHQsICdleHRuYW1lJyk7XG4gICAgYXNzZXJ0UGF0aCh0aGlzLnBhdGgsICdleHRuYW1lJyk7XG5cbiAgICBpZiAoZXh0KSB7XG4gICAgICBpZiAoZXh0LmNoYXJBdCgwKSAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIG11c3Qgc3RhcnQgd2l0aCBgLmAnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dC5pbmRleE9mKCcuJywgMSkgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIGNhbm5vdCBjb250YWluIG11bHRpcGxlIGRvdHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdGggPSByZXBsYWNlKHRoaXMucGF0aCwgZXh0KTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBzdGVtIChgaW5kZXgubWluYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzdGVtJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoc3RlbSkge1xuICAgIGFzc2VydE5vbkVtcHR5KHN0ZW0sICdzdGVtJyk7XG4gICAgYXNzZXJ0UGFydChzdGVtLCAnc3RlbScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIHN0ZW0gKyAodGhpcy5leHRuYW1lIHx8ICcnKSk7XG4gIH1cbn0pO1xuXG4vKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2RpbmcpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5jb250ZW50cyB8fCAnJztcbiAgcmV0dXJuIGJ1ZmZlcih2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZyhlbmNvZGluZykgOiBTdHJpbmcodmFsdWUpO1xufVxuXG4vKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYHJlYXNvbmAgYXQgYHBvc2l0aW9uYC5cbiAqIFdoZW4gYW4gZXJyb3IgaXMgcGFzc2VkIGluIGFzIGByZWFzb25gLCBjb3BpZXMgdGhlIHN0YWNrLiAqL1xuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uLCBydWxlSWQpIHtcbiAgdmFyIGZpbGVQYXRoID0gdGhpcy5wYXRoO1xuICB2YXIgcmFuZ2UgPSBzdHJpbmdpZnkocG9zaXRpb24pIHx8ICcxOjEnO1xuICB2YXIgbG9jYXRpb247XG4gIHZhciBlcnI7XG5cbiAgbG9jYXRpb24gPSB7XG4gICAgc3RhcnQ6IHtsaW5lOiBudWxsLCBjb2x1bW46IG51bGx9LFxuICAgIGVuZDoge2xpbmU6IG51bGwsIGNvbHVtbjogbnVsbH1cbiAgfTtcblxuICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24ucG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uO1xuICB9XG5cbiAgaWYgKHBvc2l0aW9uKSB7XG4gICAgLyogTG9jYXRpb24uICovXG4gICAgaWYgKHBvc2l0aW9uLnN0YXJ0KSB7XG4gICAgICBsb2NhdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi5zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUG9zaXRpb24uICovXG4gICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGVyciA9IG5ldyBWTWVzc2FnZShyZWFzb24ubWVzc2FnZSB8fCByZWFzb24pO1xuXG4gIGVyci5uYW1lID0gKGZpbGVQYXRoID8gZmlsZVBhdGggKyAnOicgOiAnJykgKyByYW5nZTtcbiAgZXJyLmZpbGUgPSBmaWxlUGF0aCB8fCAnJztcbiAgZXJyLnJlYXNvbiA9IHJlYXNvbi5tZXNzYWdlIHx8IHJlYXNvbjtcbiAgZXJyLmxpbmUgPSBwb3NpdGlvbiA/IHBvc2l0aW9uLmxpbmUgOiBudWxsO1xuICBlcnIuY29sdW1uID0gcG9zaXRpb24gPyBwb3NpdGlvbi5jb2x1bW4gOiBudWxsO1xuICBlcnIubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgZXJyLnJ1bGVJZCA9IHJ1bGVJZCB8fCBudWxsO1xuICBlcnIuc291cmNlID0gbnVsbDtcbiAgZXJyLmZhdGFsID0gZmFsc2U7XG5cbiAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgIGVyci5zdGFjayA9IHJlYXNvbi5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZXMucHVzaChlcnIpO1xuXG4gIHJldHVybiBlcnI7XG59XG5cbi8qIEZhaWwuIENyZWF0ZXMgYSB2bWVzc2FnZSwgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBmaWxlLFxuICogYW5kIHRocm93cyBpdC4gKi9cbmZ1bmN0aW9uIGZhaWwoKSB7XG4gIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgbWVzc2FnZS5mYXRhbCA9IHRydWU7XG5cbiAgdGhyb3cgbWVzc2FnZTtcbn1cblxuLyogSW5mby4gQ3JlYXRlcyBhIHZtZXNzYWdlLCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlIGZpbGUsXG4gKiBhbmQgbWFya3MgdGhlIGZhdGFsaXR5IGFzIG51bGwuICovXG5mdW5jdGlvbiBpbmZvKCkge1xuICB2YXIgbWVzc2FnZSA9IHRoaXMubWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIG1lc3NhZ2UuZmF0YWwgPSBudWxsO1xuXG4gIHJldHVybiBtZXNzYWdlO1xufVxuXG4vKiBJbmhlcml0IGZyb20gYEVycm9yI2AuICovXG5mdW5jdGlvbiBWTWVzc2FnZVByb3RvdHlwZSgpIHt9XG5WTWVzc2FnZVByb3RvdHlwZS5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5WTWVzc2FnZS5wcm90b3R5cGUgPSBuZXcgVk1lc3NhZ2VQcm90b3R5cGUoKTtcblxuLyogTWVzc2FnZSBwcm9wZXJ0aWVzLiAqL1xucHJvdG8gPSBWTWVzc2FnZS5wcm90b3R5cGU7XG5cbnByb3RvLmZpbGUgPSAnJztcbnByb3RvLm5hbWUgPSAnJztcbnByb3RvLnJlYXNvbiA9ICcnO1xucHJvdG8ubWVzc2FnZSA9ICcnO1xucHJvdG8uc3RhY2sgPSAnJztcbnByb3RvLmZhdGFsID0gbnVsbDtcbnByb3RvLmNvbHVtbiA9IG51bGw7XG5wcm90by5saW5lID0gbnVsbDtcblxuLyogQ29uc3RydWN0IGEgbmV3IGZpbGUgbWVzc2FnZS5cbiAqXG4gKiBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCxcbiAqIGFzIHRoYXQgYWRkcyByZWFkb25seSBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb25cbiAqIFNhZmFyaSA5LCB0aHVzIHRocm93aW5nIGFuZCBmYWlsaW5nIHRoZSBkYXRhLiAqL1xuZnVuY3Rpb24gVk1lc3NhZ2UocmVhc29uKSB7XG4gIHRoaXMubWVzc2FnZSA9IHJlYXNvbjtcbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBhIHBhdGggKGkuZS4sIGRvZXNcbiAqIG5vdCBjb250YWluIGBwYXRoLnNlcGApLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7XG4gIGlmIChwYXJ0LmluZGV4T2YocGF0aC5zZXApICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgY2Fubm90IGJlIGEgcGF0aDogZGlkIG5vdCBleHBlY3QgYCcgKyBwYXRoLnNlcCArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBlbXB0eS4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vbkVtcHR5KHBhcnQsIG5hbWUpIHtcbiAgaWYgKCFwYXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgJyArIG5hbWUgKyAnYCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgYHBhdGhgIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCwgbmFtZSkge1xuICBpZiAoIXBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgYCcgKyBuYW1lICsgJ2AgcmVxdWlyZXMgYHBhdGhgIHRvIGJlIHNldCB0b28nKTtcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuZnVuY3Rpb24gcmVwbGFjZUV4dChucGF0aCwgZXh0KSB7XG4gIGlmICh0eXBlb2YgbnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5wYXRoO1xuICB9XG5cbiAgaWYgKG5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBucGF0aDtcbiAgfVxuXG4gIHZhciBuRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKG5wYXRoLCBwYXRoLmV4dG5hbWUobnBhdGgpKSArIGV4dDtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUobnBhdGgpLCBuRmlsZU5hbWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGxhY2VFeHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAvKiBOb3RoaW5nLiAqL1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qIE5vZGUuICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3Bvc2l0aW9uJykgfHwgb3duLmNhbGwodmFsdWUsICd0eXBlJykpIHtcbiAgICByZXR1cm4gbG9jYXRpb24odmFsdWUucG9zaXRpb24pO1xuICB9XG5cbiAgLyogTG9jYXRpb24uICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3N0YXJ0JykgfHwgb3duLmNhbGwodmFsdWUsICdlbmQnKSkge1xuICAgIHJldHVybiBsb2NhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiBQb3NpdGlvbi4gKi9cbiAgaWYgKG93bi5jYWxsKHZhbHVlLCAnbGluZScpIHx8IG93bi5jYWxsKHZhbHVlLCAnY29sdW1uJykpIHtcbiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUpO1xuICB9XG5cbiAgLyogPyAqL1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb24ocG9zKSB7XG4gIGlmICghcG9zIHx8IHR5cGVvZiBwb3MgIT09ICdvYmplY3QnKSB7XG4gICAgcG9zID0ge307XG4gIH1cblxuICByZXR1cm4gaW5kZXgocG9zLmxpbmUpICsgJzonICsgaW5kZXgocG9zLmNvbHVtbik7XG59XG5cbmZ1bmN0aW9uIGxvY2F0aW9uKGxvYykge1xuICBpZiAoIWxvYyB8fCB0eXBlb2YgbG9jICE9PSAnb2JqZWN0Jykge1xuICAgIGxvYyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uKGxvYy5zdGFydCkgKyAnLScgKyBwb3NpdGlvbihsb2MuZW5kKTtcbn1cblxuZnVuY3Rpb24gaW5kZXgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IDE7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm4pID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmdcblxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIlxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBEZXBlbmRlbmNpZXMuICovXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJyk7XG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKTtcbnZhciB2ZmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJyk7XG52YXIgdHJvdWdoID0gcmVxdWlyZSgndHJvdWdoJyk7XG52YXIgc3RyaW5nID0gcmVxdWlyZSgneC1pcy1zdHJpbmcnKTtcbnZhciBmdW5jID0gcmVxdWlyZSgneC1pcy1mdW5jdGlvbicpO1xudmFyIHBsYWluID0gcmVxdWlyZSgnaXMtcGxhaW4tb2JqJyk7XG5cbi8qIEV4cG9zZSBhIGZyb3plbiBwcm9jZXNzb3IuICovXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWZpZWQoKS5mcmVlemUoKTtcblxudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qIFByb2Nlc3MgcGlwZWxpbmUuICovXG52YXIgcGlwZWxpbmUgPSB0cm91Z2goKS51c2UocGlwZWxpbmVQYXJzZSkudXNlKHBpcGVsaW5lUnVuKS51c2UocGlwZWxpbmVTdHJpbmdpZnkpO1xuXG5mdW5jdGlvbiBwaXBlbGluZVBhcnNlKHAsIGN0eCkge1xuICBjdHgudHJlZSA9IHAucGFyc2UoY3R4LmZpbGUpO1xufVxuXG5mdW5jdGlvbiBwaXBlbGluZVJ1bihwLCBjdHgsIG5leHQpIHtcbiAgcC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBkb25lKTtcblxuICBmdW5jdGlvbiBkb25lKGVyciwgdHJlZSwgZmlsZSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIG5leHQoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4LnRyZWUgPSB0cmVlO1xuICAgICAgY3R4LmZpbGUgPSBmaWxlO1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVN0cmluZ2lmeShwLCBjdHgpIHtcbiAgY3R4LmZpbGUuY29udGVudHMgPSBwLnN0cmluZ2lmeShjdHgudHJlZSwgY3R4LmZpbGUpO1xufVxuXG4vKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpcnN0IHByb2Nlc3Nvci4gKi9cbmZ1bmN0aW9uIHVuaWZpZWQoKSB7XG4gIHZhciBhdHRhY2hlcnMgPSBbXTtcbiAgdmFyIHRyYW5zZm9ybWVycyA9IHRyb3VnaCgpO1xuICB2YXIgbmFtZXNwYWNlID0ge307XG4gIHZhciBmcm96ZW4gPSBmYWxzZTtcbiAgdmFyIGZyZWV6ZUluZGV4ID0gLTE7XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LiAqL1xuICBwcm9jZXNzb3IuZGF0YSA9IGRhdGE7XG5cbiAgLyogTG9jay4gKi9cbiAgcHJvY2Vzc29yLmZyZWV6ZSA9IGZyZWV6ZTtcblxuICAvKiBQbHVnLWlucy4gKi9cbiAgcHJvY2Vzc29yLmF0dGFjaGVycyA9IGF0dGFjaGVycztcbiAgcHJvY2Vzc29yLnVzZSA9IHVzZTtcblxuICAvKiBBUEkuICovXG4gIHByb2Nlc3Nvci5wYXJzZSA9IHBhcnNlO1xuICBwcm9jZXNzb3Iuc3RyaW5naWZ5ID0gc3RyaW5naWZ5O1xuICBwcm9jZXNzb3IucnVuID0gcnVuO1xuICBwcm9jZXNzb3IucnVuU3luYyA9IHJ1blN5bmM7XG4gIHByb2Nlc3Nvci5wcm9jZXNzID0gcHJvY2VzcztcbiAgcHJvY2Vzc29yLnByb2Nlc3NTeW5jID0gcHJvY2Vzc1N5bmM7XG5cbiAgLyogRXhwb3NlLiAqL1xuICByZXR1cm4gcHJvY2Vzc29yO1xuXG4gIC8qIENyZWF0ZSBhIG5ldyBwcm9jZXNzb3IgYmFzZWQgb24gdGhlIHByb2Nlc3NvclxuICAgKiBpbiB0aGUgY3VycmVudCBzY29wZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc29yKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHVuaWZpZWQoKTtcbiAgICB2YXIgbGVuZ3RoID0gYXR0YWNoZXJzLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAtMTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBkZXN0aW5hdGlvbi51c2UuYXBwbHkobnVsbCwgYXR0YWNoZXJzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24uZGF0YShleHRlbmQodHJ1ZSwge30sIG5hbWVzcGFjZSkpO1xuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICB9XG5cbiAgLyogRnJlZXplOiB1c2VkIHRvIHNpZ25hbCBhIHByb2Nlc3NvciB0aGF0IGhhcyBmaW5pc2hlZFxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdGFrZSB1bmlmaWVkIGl0c2VsZi4gIEl04oCZcyBmcm96ZW4uXG4gICAqIFBsdWctaW5zIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gaXQuICBSYXRoZXIsIGl0IHNob3VsZFxuICAgKiBiZSBleHRlbmRlZCwgYnkgaW52b2tpbmcgaXQsIGJlZm9yZSBtb2RpZnlpbmcgaXQuXG4gICAqXG4gICAqIEluIGVzc2VuY2UsIGFsd2F5cyBpbnZva2UgdGhpcyB3aGVuIGV4cG9ydGluZyBhXG4gICAqIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gZnJlZXplKCkge1xuICAgIHZhciB2YWx1ZXM7XG4gICAgdmFyIHBsdWdpbjtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgdHJhbnNmb3JtZXI7XG5cbiAgICBpZiAoZnJvemVuKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2ZyZWV6ZUluZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgdmFsdWVzID0gYXR0YWNoZXJzW2ZyZWV6ZUluZGV4XTtcbiAgICAgIHBsdWdpbiA9IHZhbHVlc1swXTtcbiAgICAgIG9wdGlvbnMgPSB2YWx1ZXNbMV07XG4gICAgICB0cmFuc2Zvcm1lciA9IG51bGw7XG5cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWVzWzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lciA9IHBsdWdpbi5hcHBseShwcm9jZXNzb3IsIHZhbHVlcy5zbGljZSgxKSk7XG5cbiAgICAgIGlmIChmdW5jKHRyYW5zZm9ybWVyKSkge1xuICAgICAgICB0cmFuc2Zvcm1lcnMudXNlKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmcm96ZW4gPSB0cnVlO1xuICAgIGZyZWV6ZUluZGV4ID0gSW5maW5pdHk7XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yO1xuICB9XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LlxuICAgKiBHZXR0ZXIgLyBzZXR0ZXIgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBpbmZvcm10aW9uLiAqL1xuICBmdW5jdGlvbiBkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoc3RyaW5nKGtleSkpIHtcbiAgICAgIC8qIFNldCBga2V5YC4gKi9cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGFzc2VydFVuZnJvemVuKCdkYXRhJywgZnJvemVuKTtcblxuICAgICAgICBuYW1lc3BhY2Vba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzb3I7XG4gICAgICB9XG5cbiAgICAgIC8qIEdldCBga2V5YC4gKi9cbiAgICAgIHJldHVybiAob3duLmNhbGwobmFtZXNwYWNlLCBrZXkpICYmIG5hbWVzcGFjZVtrZXldKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qIFNldCBzcGFjZS4gKi9cbiAgICBpZiAoa2V5KSB7XG4gICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIGZyb3plbik7XG4gICAgICBuYW1lc3BhY2UgPSBrZXk7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIC8qIEdldCBzcGFjZS4gKi9cbiAgICByZXR1cm4gbmFtZXNwYWNlO1xuICB9XG5cbiAgLyogUGx1Zy1pbiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBQYXNzIGl0OlxuICAgKiAqICAgYW4gYXR0YWNoZXIgYW5kIG9wdGlvbnMsXG4gICAqICogICBhIHByZXNldCxcbiAgICogKiAgIGEgbGlzdCBvZiBwcmVzZXRzLCBhdHRhY2hlcnMsIGFuZCBhcmd1bWVudHMgKGxpc3RcbiAgICogICAgIG9mIGF0dGFjaGVycyBhbmQgb3B0aW9ucykuICovXG4gIGZ1bmN0aW9uIHVzZSh2YWx1ZSkge1xuICAgIHZhciBzZXR0aW5ncztcblxuICAgIGFzc2VydFVuZnJvemVuKCd1c2UnLCBmcm96ZW4pO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBlbHNlIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgYWRkUGx1Z2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICAgICAgYWRkTGlzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRQcmVzZXQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgbmFtZXNwYWNlLnNldHRpbmdzID0gZXh0ZW5kKG5hbWVzcGFjZS5zZXR0aW5ncyB8fCB7fSwgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzb3I7XG5cbiAgICBmdW5jdGlvbiBhZGRQcmVzZXQocmVzdWx0KSB7XG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKTtcblxuICAgICAgaWYgKHJlc3VsdC5zZXR0aW5ncykge1xuICAgICAgICBzZXR0aW5ncyA9IGV4dGVuZChzZXR0aW5ncyB8fCB7fSwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgICBhZGRQbHVnaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICgnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgICAgIGFkZFBsdWdpbi5hcHBseShudWxsLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkUHJlc2V0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgJyArIHZhbHVlICsgJ2AnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHtcbiAgICAgIHZhciBsZW5ndGg7XG4gICAgICB2YXIgaW5kZXg7XG5cbiAgICAgIGlmIChwbHVnaW5zID09PSBudWxsIHx8IHBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2lucyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gcGx1Z2lucykge1xuICAgICAgICBsZW5ndGggPSBwbHVnaW5zLmxlbmd0aDtcbiAgICAgICAgaW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFkZChwbHVnaW5zW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFBsdWdpbihwbHVnaW4sIHZhbHVlKSB7XG4gICAgICB2YXIgZW50cnkgPSBmaW5kKHBsdWdpbik7XG5cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBpZiAocGxhaW4oZW50cnlbMV0pICYmIHBsYWluKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gZXh0ZW5kKGVudHJ5WzFdLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbnRyeVsxXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0YWNoZXJzLnB1c2goc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kKHBsdWdpbikge1xuICAgIHZhciBsZW5ndGggPSBhdHRhY2hlcnMubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBlbnRyeTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGF0dGFjaGVyc1tpbmRleF07XG5cbiAgICAgIGlmIChlbnRyeVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZVxuICAgKiBwcm9jZXNzb3IuICovXG4gIGZ1bmN0aW9uIHBhcnNlKGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgUGFyc2VyO1xuXG4gICAgZnJlZXplKCk7XG4gICAgUGFyc2VyID0gcHJvY2Vzc29yLlBhcnNlcjtcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgUGFyc2VyKTtcblxuICAgIGlmIChuZXdhYmxlKFBhcnNlcikpIHtcbiAgICAgIHJldHVybiBuZXcgUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSkucGFyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgYXN5bmMuICovXG4gIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBjYikge1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG4gICAgZnJlZXplKCk7XG5cbiAgICBpZiAoIWNiICYmIGZ1bmMoZmlsZSkpIHtcbiAgICAgIGNiID0gZmlsZTtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghY2IpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShleGVjdXRvcik7XG4gICAgfVxuXG4gICAgZXhlY3V0b3IobnVsbCwgY2IpO1xuXG4gICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0cmFuc2Zvcm1lcnMucnVuKG5vZGUsIHZmaWxlKGZpbGUpLCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIHRyZWUsIGZpbGUpIHtcbiAgICAgICAgdHJlZSA9IHRyZWUgfHwgbm9kZTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKHRyZWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIHRyZWUsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgc3luYy4gKi9cbiAgZnVuY3Rpb24gcnVuU3luYyhub2RlLCBmaWxlKSB7XG4gICAgdmFyIGNvbXBsZXRlID0gZmFsc2U7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHJ1bihub2RlLCBmaWxlLCBkb25lKTtcblxuICAgIGFzc2VydERvbmUoJ3J1blN5bmMnLCAncnVuJywgY29tcGxldGUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCB0cmVlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICBiYWlsKGVycik7XG4gICAgICByZXN1bHQgPSB0cmVlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0cmluZ2lmeSBhIFVuaXN0IG5vZGUgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlXG4gICAqIChpbiBzdHJpbmcgb3IgVkZpbGUgcmVwcmVzZW50YXRpb24pIGludG8gYSBzdHJpbmdcbiAgICogdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUsIGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgQ29tcGlsZXI7XG5cbiAgICBmcmVlemUoKTtcbiAgICBDb21waWxlciA9IHByb2Nlc3Nvci5Db21waWxlcjtcbiAgICBhc3NlcnRDb21waWxlcignc3RyaW5naWZ5JywgQ29tcGlsZXIpO1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG5cbiAgICBpZiAobmV3YWJsZShDb21waWxlcikpIHtcbiAgICAgIHJldHVybiBuZXcgQ29tcGlsZXIobm9kZSwgZmlsZSkuY29tcGlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21waWxlcihub2RlLCBmaWxlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZSBwcm9jZXNzb3IsXG4gICAqIHRoZW4gcnVuIHRyYW5zZm9ybXMgb24gdGhhdCBub2RlLCBhbmQgY29tcGlsZSB0aGVcbiAgICogcmVzdWx0aW5nIG5vZGUgdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3NvcixcbiAgICogYW5kIHN0b3JlIHRoYXQgcmVzdWx0IG9uIHRoZSBWRmlsZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzcyhkb2MsIGNiKSB7XG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzJywgcHJvY2Vzc29yLlBhcnNlcik7XG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3Byb2Nlc3MnLCBwcm9jZXNzb3IuQ29tcGlsZXIpO1xuXG4gICAgaWYgKCFjYikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGV4ZWN1dG9yKTtcbiAgICB9XG5cbiAgICBleGVjdXRvcihudWxsLCBjYik7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcblxuICAgICAgcGlwZWxpbmUucnVuKHByb2Nlc3Nvciwge2ZpbGU6IGZpbGV9LCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUHJvY2VzcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgKGluIHN0cmluZyBvciBWRmlsZVxuICAgKiByZXByZXNlbnRhdGlvbiksIHN5bmMuICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NTeW5jKGRvYykge1xuICAgIHZhciBjb21wbGV0ZSA9IGZhbHNlO1xuICAgIHZhciBmaWxlO1xuXG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5QYXJzZXIpO1xuICAgIGFzc2VydENvbXBpbGVyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5Db21waWxlcik7XG4gICAgZmlsZSA9IHZmaWxlKGRvYyk7XG5cbiAgICBwcm9jZXNzKGZpbGUsIGRvbmUpO1xuXG4gICAgYXNzZXJ0RG9uZSgncHJvY2Vzc1N5bmMnLCAncHJvY2VzcycsIGNvbXBsZXRlKTtcblxuICAgIHJldHVybiBmaWxlO1xuXG4gICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGJhaWwoZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuLyogQ2hlY2sgaWYgYGZ1bmNgIGlzIGEgY29uc3RydWN0b3IuICovXG5mdW5jdGlvbiBuZXdhYmxlKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jKHZhbHVlKSAmJiBrZXlzKHZhbHVlLnByb3RvdHlwZSk7XG59XG5cbi8qIENoZWNrIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IHdpdGgga2V5cy4gKi9cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qIEFzc2VydCBhIHBhcnNlciBpcyBhdmFpbGFibGUuICovXG5mdW5jdGlvbiBhc3NlcnRQYXJzZXIobmFtZSwgUGFyc2VyKSB7XG4gIGlmICghZnVuYyhQYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgUGFyc2VyYCcpO1xuICB9XG59XG5cbi8qIEFzc2VydCBhIGNvbXBpbGVyIGlzIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIENvbXBpbGVyKSB7XG4gIGlmICghZnVuYyhDb21waWxlcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBDb21waWxlcmAnKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgdGhlIHByb2Nlc3NvciBpcyBub3QgZnJvemVuLiAqL1xuZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7XG4gIGlmIChmcm96ZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGludm9rZSBgJyArIG5hbWUgKyAnYCBvbiBhIGZyb3plbiBwcm9jZXNzb3IuXFxuJyArXG4gICAgICAnQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgaW52b2tpbmcgaXQ6ICcgK1xuICAgICAgJ3VzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuJ1xuICAgICk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IGBub2RlYCBpcyBhIFVuaXN0IG5vZGUuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlKG5vZGUpIHtcbiAgaWYgKCFub2RlIHx8ICFzdHJpbmcobm9kZS50eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9kZSwgZ290IGAnICsgbm9kZSArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYGNvbXBsZXRlYCBpcyBgdHJ1ZWAuICovXG5mdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHtcbiAgaWYgKCFjb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgZmluaXNoZWQgYXN5bmMuIFVzZSBgJyArIGFzeW5jTmFtZSArICdgIGluc3RlYWQnKTtcbiAgfVxufVxuIl19 | |
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){ | |
module.exports=[ | |
"address", | |
"article", | |
"aside", | |
"base", | |
"basefont", | |
"blockquote", | |
"body", | |
"caption", | |
"center", | |
"col", | |
"colgroup", | |
"dd", | |
"details", | |
"dialog", | |
"dir", | |
"div", | |
"dl", | |
"dt", | |
"fieldset", | |
"figcaption", | |
"figure", | |
"footer", | |
"form", | |
"frame", | |
"frameset", | |
"h1", | |
"h2", | |
"h3", | |
"h4", | |
"h5", | |
"h6", | |
"head", | |
"header", | |
"hgroup", | |
"hr", | |
"html", | |
"iframe", | |
"legend", | |
"li", | |
"link", | |
"main", | |
"menu", | |
"menuitem", | |
"meta", | |
"nav", | |
"noframes", | |
"ol", | |
"optgroup", | |
"option", | |
"p", | |
"param", | |
"pre", | |
"section", | |
"source", | |
"title", | |
"summary", | |
"table", | |
"tbody", | |
"td", | |
"tfoot", | |
"th", | |
"thead", | |
"title", | |
"tr", | |
"track", | |
"ul" | |
] | |
},{}],2:[function(require,module,exports){ | |
'use strict'; | |
var entities = require('parse-entities'); | |
module.exports = factory; | |
/* Factory to create an entity decoder. */ | |
function factory(ctx) { | |
decoder.raw = decodeRaw; | |
return decoder; | |
/* Normalize `position` to add an `indent`. */ | |
function normalize(position) { | |
var offsets = ctx.offset; | |
var line = position.line; | |
var result = []; | |
while (++line) { | |
if (!(line in offsets)) { | |
break; | |
} | |
result.push((offsets[line] || 0) + 1); | |
} | |
return { | |
start: position, | |
indent: result | |
}; | |
} | |
/* Handle a warning. | |
* See https://github.com/wooorm/parse-entities | |
* for the warnings. */ | |
function handleWarning(reason, position, code) { | |
if (code === 3) { | |
return; | |
} | |
ctx.file.message(reason, position); | |
} | |
/* Decode `value` (at `position`) into text-nodes. */ | |
function decoder(value, position, handler) { | |
entities(value, { | |
position: normalize(position), | |
warning: handleWarning, | |
text: handler, | |
reference: handler, | |
textContext: ctx, | |
referenceContext: ctx | |
}); | |
} | |
/* Decode `value` (at `position`) into a string. */ | |
function decodeRaw(value, position) { | |
return entities(value, { | |
position: normalize(position), | |
warning: handleWarning | |
}); | |
} | |
} | |
},{"parse-entities":54}],3:[function(require,module,exports){ | |
'use strict'; | |
module.exports = { | |
position: true, | |
gfm: true, | |
commonmark: false, | |
footnotes: false, | |
pedantic: false, | |
blocks: require('./block-elements.json') | |
}; | |
},{"./block-elements.json":1}],4:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
var index = value.indexOf('\n', fromIndex); | |
while (index > fromIndex) { | |
if (value.charAt(index - 1) !== ' ') { | |
break; | |
} | |
index--; | |
} | |
return index; | |
} | |
},{}],5:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
return value.indexOf('`', fromIndex); | |
} | |
},{}],6:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
return value.indexOf('~~', fromIndex); | |
} | |
},{}],7:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
var asterisk = value.indexOf('*', fromIndex); | |
var underscore = value.indexOf('_', fromIndex); | |
if (underscore === -1) { | |
return asterisk; | |
} | |
if (asterisk === -1) { | |
return underscore; | |
} | |
return underscore < asterisk ? underscore : asterisk; | |
} | |
},{}],8:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
return value.indexOf('\\', fromIndex); | |
} | |
},{}],9:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
var link = value.indexOf('[', fromIndex); | |
var image = value.indexOf('![', fromIndex); | |
if (image === -1) { | |
return link; | |
} | |
/* Link can never be `-1` if an image is found, so we don’t need | |
* to check for that :) */ | |
return link < image ? link : image; | |
} | |
},{}],10:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
var asterisk = value.indexOf('**', fromIndex); | |
var underscore = value.indexOf('__', fromIndex); | |
if (underscore === -1) { | |
return asterisk; | |
} | |
if (asterisk === -1) { | |
return underscore; | |
} | |
return underscore < asterisk ? underscore : asterisk; | |
} | |
},{}],11:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
function locate(value, fromIndex) { | |
return value.indexOf('<', fromIndex); | |
} | |
},{}],12:[function(require,module,exports){ | |
'use strict'; | |
module.exports = locate; | |
var PROTOCOLS = ['https://', 'http://', 'mailto:']; | |
function locate(value, fromIndex) { | |
var length = PROTOCOLS.length; | |
var index = -1; | |
var min = -1; | |
var position; | |
if (!this.options.gfm) { | |
return -1; | |
} | |
while (++index < length) { | |
position = value.indexOf(PROTOCOLS[index], fromIndex); | |
if (position !== -1 && (position < min || min === -1)) { | |
min = position; | |
} | |
} | |
return min; | |
} | |
},{}],13:[function(require,module,exports){ | |
'use strict'; | |
var xtend = require('xtend'); | |
var removePosition = require('unist-util-remove-position'); | |
module.exports = parse; | |
var C_NEWLINE = '\n'; | |
var EXPRESSION_LINE_BREAKS = /\r\n|\r/g; | |
/* Parse the bound file. */ | |
function parse() { | |
var self = this; | |
var value = String(self.file); | |
var start = {line: 1, column: 1, offset: 0}; | |
var content = xtend(start); | |
var node; | |
/* Clean non-unix newlines: `\r\n` and `\r` are all | |
* changed to `\n`. This should not affect positional | |
* information. */ | |
value = value.replace(EXPRESSION_LINE_BREAKS, C_NEWLINE); | |
if (value.charCodeAt(0) === 0xFEFF) { | |
value = value.slice(1); | |
content.column++; | |
content.offset++; | |
} | |
node = { | |
type: 'root', | |
children: self.tokenizeBlock(value, content), | |
position: { | |
start: start, | |
end: self.eof || xtend(start) | |
} | |
}; | |
if (!self.options.position) { | |
removePosition(node, true); | |
} | |
return node; | |
} | |
},{"unist-util-remove-position":66,"xtend":69}],14:[function(require,module,exports){ | |
'use strict'; | |
var xtend = require('xtend'); | |
var toggle = require('state-toggle'); | |
var vfileLocation = require('vfile-location'); | |
var unescape = require('./unescape'); | |
var decode = require('./decode'); | |
var tokenizer = require('./tokenizer'); | |
module.exports = Parser; | |
function Parser(doc, file) { | |
this.file = file; | |
this.offset = {}; | |
this.options = xtend(this.options); | |
this.setOptions({}); | |
this.inList = false; | |
this.inBlock = false; | |
this.inLink = false; | |
this.atStart = true; | |
this.toOffset = vfileLocation(file).toOffset; | |
this.unescape = unescape(this, 'escape'); | |
this.decode = decode(this); | |
} | |
var proto = Parser.prototype; | |
/* Expose core. */ | |
proto.setOptions = require('./set-options'); | |
proto.parse = require('./parse'); | |
/* Expose `defaults`. */ | |
proto.options = require('./defaults'); | |
/* Enter and exit helpers. */ | |
proto.exitStart = toggle('atStart', true); | |
proto.enterList = toggle('inList', false); | |
proto.enterLink = toggle('inLink', false); | |
proto.enterBlock = toggle('inBlock', false); | |
/* Nodes that can interupt a paragraph: | |
* | |
* ```markdown | |
* A paragraph, followed by a thematic break. | |
* ___ | |
* ``` | |
* | |
* In the above example, the thematic break “interupts” | |
* the paragraph. */ | |
proto.interruptParagraph = [ | |
['thematicBreak'], | |
['atxHeading'], | |
['fencedCode'], | |
['blockquote'], | |
['html'], | |
['setextHeading', {commonmark: false}], | |
['definition', {commonmark: false}], | |
['footnote', {commonmark: false}] | |
]; | |
/* Nodes that can interupt a list: | |
* | |
* ```markdown | |
* - One | |
* ___ | |
* ``` | |
* | |
* In the above example, the thematic break “interupts” | |
* the list. */ | |
proto.interruptList = [ | |
['fencedCode', {pedantic: false}], | |
['thematicBreak', {pedantic: false}], | |
['definition', {commonmark: false}], | |
['footnote', {commonmark: false}] | |
]; | |
/* Nodes that can interupt a blockquote: | |
* | |
* ```markdown | |
* > A paragraph. | |
* ___ | |
* ``` | |
* | |
* In the above example, the thematic break “interupts” | |
* the blockquote. */ | |
proto.interruptBlockquote = [ | |
['indentedCode', {commonmark: true}], | |
['fencedCode', {commonmark: true}], | |
['atxHeading', {commonmark: true}], | |
['setextHeading', {commonmark: true}], | |
['thematicBreak', {commonmark: true}], | |
['html', {commonmark: true}], | |
['list', {commonmark: true}], | |
['definition', {commonmark: false}], | |
['footnote', {commonmark: false}] | |
]; | |
/* Handlers. */ | |
proto.blockTokenizers = { | |
newline: require('./tokenize/newline'), | |
indentedCode: require('./tokenize/code-indented'), | |
fencedCode: require('./tokenize/code-fenced'), | |
blockquote: require('./tokenize/blockquote'), | |
atxHeading: require('./tokenize/heading-atx'), | |
thematicBreak: require('./tokenize/thematic-break'), | |
list: require('./tokenize/list'), | |
setextHeading: require('./tokenize/heading-setext'), | |
html: require('./tokenize/html-block'), | |
footnote: require('./tokenize/footnote-definition'), | |
definition: require('./tokenize/definition'), | |
table: require('./tokenize/table'), | |
paragraph: require('./tokenize/paragraph') | |
}; | |
proto.inlineTokenizers = { | |
escape: require('./tokenize/escape'), | |
autoLink: require('./tokenize/auto-link'), | |
url: require('./tokenize/url'), | |
html: require('./tokenize/html-inline'), | |
link: require('./tokenize/link'), | |
reference: require('./tokenize/reference'), | |
strong: require('./tokenize/strong'), | |
emphasis: require('./tokenize/emphasis'), | |
deletion: require('./tokenize/delete'), | |
code: require('./tokenize/code-inline'), | |
break: require('./tokenize/break'), | |
text: require('./tokenize/text') | |
}; | |
/* Expose precedence. */ | |
proto.blockMethods = keys(proto.blockTokenizers); | |
proto.inlineMethods = keys(proto.inlineTokenizers); | |
/* Tokenizers. */ | |
proto.tokenizeBlock = tokenizer('block'); | |
proto.tokenizeInline = tokenizer('inline'); | |
proto.tokenizeFactory = tokenizer; | |
/* Get all keys in `value`. */ | |
function keys(value) { | |
var result = []; | |
var key; | |
for (key in value) { | |
result.push(key); | |
} | |
return result; | |
} | |
},{"./decode":2,"./defaults":3,"./parse":13,"./set-options":15,"./tokenize/auto-link":16,"./tokenize/blockquote":17,"./tokenize/break":18,"./tokenize/code-fenced":19,"./tokenize/code-indented":20,"./tokenize/code-inline":21,"./tokenize/definition":22,"./tokenize/delete":23,"./tokenize/emphasis":24,"./tokenize/escape":25,"./tokenize/footnote-definition":26,"./tokenize/heading-atx":27,"./tokenize/heading-setext":28,"./tokenize/html-block":29,"./tokenize/html-inline":30,"./tokenize/link":31,"./tokenize/list":32,"./tokenize/newline":33,"./tokenize/paragraph":34,"./tokenize/reference":35,"./tokenize/strong":36,"./tokenize/table":37,"./tokenize/text":38,"./tokenize/thematic-break":39,"./tokenize/url":40,"./tokenizer":41,"./unescape":42,"state-toggle":61,"vfile-location":68,"xtend":69}],15:[function(require,module,exports){ | |
'use strict'; | |
var xtend = require('xtend'); | |
var escapes = require('markdown-escapes'); | |
var defaults = require('./defaults'); | |
module.exports = setOptions; | |
function setOptions(options) { | |
var self = this; | |
var current = self.options; | |
var key; | |
var value; | |
if (options == null) { | |
options = {}; | |
} else if (typeof options === 'object') { | |
options = xtend(options); | |
} else { | |
throw new Error( | |
'Invalid value `' + options + '` ' + | |
'for setting `options`' | |
); | |
} | |
for (key in defaults) { | |
value = options[key]; | |
if (value == null) { | |
value = current[key]; | |
} | |
if ( | |
(key !== 'blocks' && typeof value !== 'boolean') || | |
(key === 'blocks' && typeof value !== 'object') | |
) { | |
throw new Error('Invalid value `' + value + '` for setting `options.' + key + '`'); | |
} | |
options[key] = value; | |
} | |
self.options = options; | |
self.escape = escapes(options); | |
return self; | |
} | |
},{"./defaults":3,"markdown-escapes":53,"xtend":69}],16:[function(require,module,exports){ | |
'use strict'; | |
var whitespace = require('is-whitespace-character'); | |
var decode = require('parse-entities'); | |
var locate = require('../locate/tag'); | |
module.exports = autoLink; | |
autoLink.locator = locate; | |
autoLink.notInLink = true; | |
var C_LT = '<'; | |
var C_GT = '>'; | |
var C_AT_SIGN = '@'; | |
var C_SLASH = '/'; | |
var MAILTO = 'mailto:'; | |
var MAILTO_LENGTH = MAILTO.length; | |
/* Tokenise a link. */ | |
function autoLink(eat, value, silent) { | |
var self; | |
var subvalue; | |
var length; | |
var index; | |
var queue; | |
var character; | |
var hasAtCharacter; | |
var link; | |
var now; | |
var content; | |
var tokenize; | |
var exit; | |
if (value.charAt(0) !== C_LT) { | |
return; | |
} | |
self = this; | |
subvalue = ''; | |
length = value.length; | |
index = 0; | |
queue = ''; | |
hasAtCharacter = false; | |
link = ''; | |
index++; | |
subvalue = C_LT; | |
while (index < length) { | |
character = value.charAt(index); | |
if ( | |
whitespace(character) || | |
character === C_GT || | |
character === C_AT_SIGN || | |
(character === ':' && value.charAt(index + 1) === C_SLASH) | |
) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
if (!queue) { | |
return; | |
} | |
link += queue; | |
queue = ''; | |
character = value.charAt(index); | |
link += character; | |
index++; | |
if (character === C_AT_SIGN) { | |
hasAtCharacter = true; | |
} else { | |
if ( | |
character !== ':' || | |
value.charAt(index + 1) !== C_SLASH | |
) { | |
return; | |
} | |
link += C_SLASH; | |
index++; | |
} | |
while (index < length) { | |
character = value.charAt(index); | |
if (whitespace(character) || character === C_GT) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
if (!queue || character !== C_GT) { | |
return; | |
} | |
/* istanbul ignore if - never used (yet) */ | |
if (silent) { | |
return true; | |
} | |
link += queue; | |
content = link; | |
subvalue += link + character; | |
now = eat.now(); | |
now.column++; | |
now.offset++; | |
if (hasAtCharacter) { | |
if (link.slice(0, MAILTO_LENGTH).toLowerCase() === MAILTO) { | |
content = content.substr(MAILTO_LENGTH); | |
now.column += MAILTO_LENGTH; | |
now.offset += MAILTO_LENGTH; | |
} else { | |
link = MAILTO + link; | |
} | |
} | |
/* Temporarily remove support for escapes in autolinks. */ | |
tokenize = self.inlineTokenizers.escape; | |
self.inlineTokenizers.escape = null; | |
exit = self.enterLink(); | |
content = self.tokenizeInline(content, now); | |
self.inlineTokenizers.escape = tokenize; | |
exit(); | |
return eat(subvalue)({ | |
type: 'link', | |
title: null, | |
url: decode(link), | |
children: content | |
}); | |
} | |
},{"../locate/tag":11,"is-whitespace-character":51,"parse-entities":54}],17:[function(require,module,exports){ | |
'use strict'; | |
var trim = require('trim'); | |
var interrupt = require('../util/interrupt'); | |
module.exports = blockquote; | |
var C_NEWLINE = '\n'; | |
var C_TAB = '\t'; | |
var C_SPACE = ' '; | |
var C_GT = '>'; | |
/* Tokenise a blockquote. */ | |
function blockquote(eat, value, silent) { | |
var self = this; | |
var offsets = self.offset; | |
var tokenizers = self.blockTokenizers; | |
var interruptors = self.interruptBlockquote; | |
var now = eat.now(); | |
var currentLine = now.line; | |
var length = value.length; | |
var values = []; | |
var contents = []; | |
var indents = []; | |
var add; | |
var index = 0; | |
var character; | |
var rest; | |
var nextIndex; | |
var content; | |
var line; | |
var startIndex; | |
var prefixed; | |
var exit; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
index++; | |
} | |
if (value.charAt(index) !== C_GT) { | |
return; | |
} | |
if (silent) { | |
return true; | |
} | |
index = 0; | |
while (index < length) { | |
nextIndex = value.indexOf(C_NEWLINE, index); | |
startIndex = index; | |
prefixed = false; | |
if (nextIndex === -1) { | |
nextIndex = length; | |
} | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
index++; | |
} | |
if (value.charAt(index) === C_GT) { | |
index++; | |
prefixed = true; | |
if (value.charAt(index) === C_SPACE) { | |
index++; | |
} | |
} else { | |
index = startIndex; | |
} | |
content = value.slice(index, nextIndex); | |
if (!prefixed && !trim(content)) { | |
index = startIndex; | |
break; | |
} | |
if (!prefixed) { | |
rest = value.slice(index); | |
/* Check if the following code contains a possible | |
* block. */ | |
if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) { | |
break; | |
} | |
} | |
line = startIndex === index ? content : value.slice(startIndex, nextIndex); | |
indents.push(index - startIndex); | |
values.push(line); | |
contents.push(content); | |
index = nextIndex + 1; | |
} | |
index = -1; | |
length = indents.length; | |
add = eat(values.join(C_NEWLINE)); | |
while (++index < length) { | |
offsets[currentLine] = (offsets[currentLine] || 0) + indents[index]; | |
currentLine++; | |
} | |
exit = self.enterBlock(); | |
contents = self.tokenizeBlock(contents.join(C_NEWLINE), now); | |
exit(); | |
return add({ | |
type: 'blockquote', | |
children: contents | |
}); | |
} | |
},{"../util/interrupt":45,"trim":63}],18:[function(require,module,exports){ | |
'use strict'; | |
var locate = require('../locate/break'); | |
module.exports = hardBreak; | |
hardBreak.locator = locate; | |
var MIN_BREAK_LENGTH = 2; | |
function hardBreak(eat, value, silent) { | |
var length = value.length; | |
var index = -1; | |
var queue = ''; | |
var character; | |
while (++index < length) { | |
character = value.charAt(index); | |
if (character === '\n') { | |
if (index < MIN_BREAK_LENGTH) { | |
return; | |
} | |
/* istanbul ignore if - never used (yet) */ | |
if (silent) { | |
return true; | |
} | |
queue += character; | |
return eat(queue)({type: 'break'}); | |
} | |
if (character !== ' ') { | |
return; | |
} | |
queue += character; | |
} | |
} | |
},{"../locate/break":4}],19:[function(require,module,exports){ | |
'use strict'; | |
var trim = require('trim-trailing-lines'); | |
module.exports = fencedCode; | |
var C_NEWLINE = '\n'; | |
var C_TAB = '\t'; | |
var C_SPACE = ' '; | |
var C_TILDE = '~'; | |
var C_TICK = '`'; | |
var MIN_FENCE_COUNT = 3; | |
var CODE_INDENT_COUNT = 4; | |
function fencedCode(eat, value, silent) { | |
var self = this; | |
var settings = self.options; | |
var length = value.length + 1; | |
var index = 0; | |
var subvalue = ''; | |
var fenceCount; | |
var marker; | |
var character; | |
var flag; | |
var queue; | |
var content; | |
var exdentedContent; | |
var closing; | |
var exdentedClosing; | |
var indent; | |
var now; | |
if (!settings.gfm) { | |
return; | |
} | |
/* Eat initial spacing. */ | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
subvalue += character; | |
index++; | |
} | |
indent = index; | |
/* Eat the fence. */ | |
character = value.charAt(index); | |
if (character !== C_TILDE && character !== C_TICK) { | |
return; | |
} | |
index++; | |
marker = character; | |
fenceCount = 1; | |
subvalue += character; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== marker) { | |
break; | |
} | |
subvalue += character; | |
fenceCount++; | |
index++; | |
} | |
if (fenceCount < MIN_FENCE_COUNT) { | |
return; | |
} | |
/* Eat spacing before flag. */ | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
subvalue += character; | |
index++; | |
} | |
/* Eat flag. */ | |
flag = ''; | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if ( | |
character === C_NEWLINE || | |
character === C_TILDE || | |
character === C_TICK | |
) { | |
break; | |
} | |
if (character === C_SPACE || character === C_TAB) { | |
queue += character; | |
} else { | |
flag += queue + character; | |
queue = ''; | |
} | |
index++; | |
} | |
character = value.charAt(index); | |
if (character && character !== C_NEWLINE) { | |
return; | |
} | |
if (silent) { | |
return true; | |
} | |
now = eat.now(); | |
now.column += subvalue.length; | |
now.offset += subvalue.length; | |
subvalue += flag; | |
flag = self.decode.raw(self.unescape(flag), now); | |
if (queue) { | |
subvalue += queue; | |
} | |
queue = ''; | |
closing = ''; | |
exdentedClosing = ''; | |
content = ''; | |
exdentedContent = ''; | |
/* Eat content. */ | |
while (index < length) { | |
character = value.charAt(index); | |
content += closing; | |
exdentedContent += exdentedClosing; | |
closing = ''; | |
exdentedClosing = ''; | |
if (character !== C_NEWLINE) { | |
content += character; | |
exdentedClosing += character; | |
index++; | |
continue; | |
} | |
/* Add the newline to `subvalue` if its the first | |
* character. Otherwise, add it to the `closing` | |
* queue. */ | |
if (content) { | |
closing += character; | |
exdentedClosing += character; | |
} else { | |
subvalue += character; | |
} | |
queue = ''; | |
index++; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
closing += queue; | |
exdentedClosing += queue.slice(indent); | |
if (queue.length >= CODE_INDENT_COUNT) { | |
continue; | |
} | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== marker) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
closing += queue; | |
exdentedClosing += queue; | |
if (queue.length < fenceCount) { | |
continue; | |
} | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
closing += character; | |
exdentedClosing += character; | |
index++; | |
} | |
if (!character || character === C_NEWLINE) { | |
break; | |
} | |
} | |
subvalue += content + closing; | |
return eat(subvalue)({ | |
type: 'code', | |
lang: flag || null, | |
value: trim(exdentedContent) | |
}); | |
} | |
},{"trim-trailing-lines":62}],20:[function(require,module,exports){ | |
'use strict'; | |
var repeat = require('repeat-string'); | |
var trim = require('trim-trailing-lines'); | |
module.exports = indentedCode; | |
var C_NEWLINE = '\n'; | |
var C_TAB = '\t'; | |
var C_SPACE = ' '; | |
var CODE_INDENT_COUNT = 4; | |
var CODE_INDENT = repeat(C_SPACE, CODE_INDENT_COUNT); | |
/* Tokenise indented code. */ | |
function indentedCode(eat, value, silent) { | |
var index = -1; | |
var length = value.length; | |
var subvalue = ''; | |
var content = ''; | |
var subvalueQueue = ''; | |
var contentQueue = ''; | |
var character; | |
var blankQueue; | |
var indent; | |
while (++index < length) { | |
character = value.charAt(index); | |
if (indent) { | |
indent = false; | |
subvalue += subvalueQueue; | |
content += contentQueue; | |
subvalueQueue = ''; | |
contentQueue = ''; | |
if (character === C_NEWLINE) { | |
subvalueQueue = character; | |
contentQueue = character; | |
} else { | |
subvalue += character; | |
content += character; | |
while (++index < length) { | |
character = value.charAt(index); | |
if (!character || character === C_NEWLINE) { | |
contentQueue = character; | |
subvalueQueue = character; | |
break; | |
} | |
subvalue += character; | |
content += character; | |
} | |
} | |
} else if ( | |
character === C_SPACE && | |
value.charAt(index + 1) === character && | |
value.charAt(index + 2) === character && | |
value.charAt(index + 3) === character | |
) { | |
subvalueQueue += CODE_INDENT; | |
index += 3; | |
indent = true; | |
} else if (character === C_TAB) { | |
subvalueQueue += character; | |
indent = true; | |
} else { | |
blankQueue = ''; | |
while (character === C_TAB || character === C_SPACE) { | |
blankQueue += character; | |
character = value.charAt(++index); | |
} | |
if (character !== C_NEWLINE) { | |
break; | |
} | |
subvalueQueue += blankQueue + character; | |
contentQueue += character; | |
} | |
} | |
if (content) { | |
if (silent) { | |
return true; | |
} | |
return eat(subvalue)({ | |
type: 'code', | |
lang: null, | |
value: trim(content) | |
}); | |
} | |
} | |
},{"repeat-string":60,"trim-trailing-lines":62}],21:[function(require,module,exports){ | |
'use strict'; | |
var whitespace = require('is-whitespace-character'); | |
var locate = require('../locate/code-inline'); | |
module.exports = inlineCode; | |
inlineCode.locator = locate; | |
var C_TICK = '`'; | |
/* Tokenise inline code. */ | |
function inlineCode(eat, value, silent) { | |
var length = value.length; | |
var index = 0; | |
var queue = ''; | |
var tickQueue = ''; | |
var contentQueue; | |
var subqueue; | |
var count; | |
var openingCount; | |
var subvalue; | |
var character; | |
var found; | |
var next; | |
while (index < length) { | |
if (value.charAt(index) !== C_TICK) { | |
break; | |
} | |
queue += C_TICK; | |
index++; | |
} | |
if (!queue) { | |
return; | |
} | |
subvalue = queue; | |
openingCount = index; | |
queue = ''; | |
next = value.charAt(index); | |
count = 0; | |
while (index < length) { | |
character = next; | |
next = value.charAt(index + 1); | |
if (character === C_TICK) { | |
count++; | |
tickQueue += character; | |
} else { | |
count = 0; | |
queue += character; | |
} | |
if (count && next !== C_TICK) { | |
if (count === openingCount) { | |
subvalue += queue + tickQueue; | |
found = true; | |
break; | |
} | |
queue += tickQueue; | |
tickQueue = ''; | |
} | |
index++; | |
} | |
if (!found) { | |
if (openingCount % 2 !== 0) { | |
return; | |
} | |
queue = ''; | |
} | |
/* istanbul ignore if - never used (yet) */ | |
if (silent) { | |
return true; | |
} | |
contentQueue = ''; | |
subqueue = ''; | |
length = queue.length; | |
index = -1; | |
while (++index < length) { | |
character = queue.charAt(index); | |
if (whitespace(character)) { | |
subqueue += character; | |
continue; | |
} | |
if (subqueue) { | |
if (contentQueue) { | |
contentQueue += subqueue; | |
} | |
subqueue = ''; | |
} | |
contentQueue += character; | |
} | |
return eat(subvalue)({ | |
type: 'inlineCode', | |
value: contentQueue | |
}); | |
} | |
},{"../locate/code-inline":5,"is-whitespace-character":51}],22:[function(require,module,exports){ | |
'use strict'; | |
var whitespace = require('is-whitespace-character'); | |
var normalize = require('../util/normalize'); | |
module.exports = definition; | |
definition.notInList = true; | |
definition.notInBlock = true; | |
var C_DOUBLE_QUOTE = '"'; | |
var C_SINGLE_QUOTE = '\''; | |
var C_BACKSLASH = '\\'; | |
var C_NEWLINE = '\n'; | |
var C_TAB = '\t'; | |
var C_SPACE = ' '; | |
var C_BRACKET_OPEN = '['; | |
var C_BRACKET_CLOSE = ']'; | |
var C_PAREN_OPEN = '('; | |
var C_PAREN_CLOSE = ')'; | |
var C_COLON = ':'; | |
var C_LT = '<'; | |
var C_GT = '>'; | |
function definition(eat, value, silent) { | |
var self = this; | |
var commonmark = self.options.commonmark; | |
var index = 0; | |
var length = value.length; | |
var subvalue = ''; | |
var beforeURL; | |
var beforeTitle; | |
var queue; | |
var character; | |
var test; | |
var identifier; | |
var url; | |
var title; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_SPACE && character !== C_TAB) { | |
break; | |
} | |
subvalue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
if (character !== C_BRACKET_OPEN) { | |
return; | |
} | |
index++; | |
subvalue += character; | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character === C_BRACKET_CLOSE) { | |
break; | |
} else if (character === C_BACKSLASH) { | |
queue += character; | |
index++; | |
character = value.charAt(index); | |
} | |
queue += character; | |
index++; | |
} | |
if ( | |
!queue || | |
value.charAt(index) !== C_BRACKET_CLOSE || | |
value.charAt(index + 1) !== C_COLON | |
) { | |
return; | |
} | |
identifier = queue; | |
subvalue += queue + C_BRACKET_CLOSE + C_COLON; | |
index = subvalue.length; | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if ( | |
character !== C_TAB && | |
character !== C_SPACE && | |
character !== C_NEWLINE | |
) { | |
break; | |
} | |
subvalue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
queue = ''; | |
beforeURL = subvalue; | |
if (character === C_LT) { | |
index++; | |
while (index < length) { | |
character = value.charAt(index); | |
if (!isEnclosedURLCharacter(character)) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
if (character === isEnclosedURLCharacter.delimiter) { | |
subvalue += C_LT + queue + character; | |
index++; | |
} else { | |
if (commonmark) { | |
return; | |
} | |
index -= queue.length + 1; | |
queue = ''; | |
} | |
} | |
if (!queue) { | |
while (index < length) { | |
character = value.charAt(index); | |
if (!isUnclosedURLCharacter(character)) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
subvalue += queue; | |
} | |
if (!queue) { | |
return; | |
} | |
url = queue; | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if ( | |
character !== C_TAB && | |
character !== C_SPACE && | |
character !== C_NEWLINE | |
) { | |
break; | |
} | |
queue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
test = null; | |
if (character === C_DOUBLE_QUOTE) { | |
test = C_DOUBLE_QUOTE; | |
} else if (character === C_SINGLE_QUOTE) { | |
test = C_SINGLE_QUOTE; | |
} else if (character === C_PAREN_OPEN) { | |
test = C_PAREN_CLOSE; | |
} | |
if (!test) { | |
queue = ''; | |
index = subvalue.length; | |
} else if (queue) { | |
subvalue += queue + character; | |
index = subvalue.length; | |
queue = ''; | |
while (index < length) { | |
character = value.charAt(index); | |
if (character === test) { | |
break; | |
} | |
if (character === C_NEWLINE) { | |
index++; | |
character = value.charAt(index); | |
if (character === C_NEWLINE || character === test) { | |
return; | |
} | |
queue += C_NEWLINE; | |
} | |
queue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
if (character !== test) { | |
return; | |
} | |
beforeTitle = subvalue; | |
subvalue += queue + character; | |
index++; | |
title = queue; | |
queue = ''; | |
} else { | |
return; | |
} | |
while (index < length) { | |
character = value.charAt(index); | |
if (character !== C_TAB && character !== C_SPACE) { | |
break; | |
} | |
subvalue += character; | |
index++; | |
} | |
character = value.charAt(index); | |
if (!character || character === C_NEWLINE) { | |
if (silent) { | |
return true; | |
} | |
beforeURL = eat(beforeURL).test().end; | |
url = self.decode.raw(self.unescape(url), beforeURL); | |
if (title) { | |
beforeTitle = eat(beforeTitle).test().end; | |
title = self.decode.raw(self.unescape(title), beforeTitle); | |
} | |
return eat(subvalue)({ | |
type: 'definition', | |
identifier: normalize(identifier), | |
title: title || null, | |
url: url | |
}); | |
} | |
} | |
/* Check if `character` can be inside an enclosed URI. */ | |
function isEnclosedURLCharacter(character) { | |
return character !== C_GT && | |
character !== C_BRACKET_OPEN && | |
character !== C_BRACKET_CLOSE; | |
} | |
isEnclosedURLCharacter.delimiter = C_GT; | |
/* Check if `character` can be inside an unclosed URI. */ | |
function isUnclosedURLCharacter(character) { | |
return character !== C_BRACKET_OPEN && | |
character !== C_BRACKET_CLOSE && | |
!whitespace(character); | |
} | |
},{"../util/normalize":46,"is-whitespace-character":51}],23:[function(require,module,exports){ | |
'use strict'; | |
var whitespace = require('is-whitespace-character'); | |
var locate = require('../locate/delete'); | |
module.exports = strikethrough; | |
strikethrough.locator = locate; | |
var C_TILDE = '~'; | |
var DOUBLE = '~~'; | |
function strikethrough(eat, value, silent) { | |
var self = this; | |
var character = ''; | |
var previous = ''; | |
var preceding = ''; | |
var subvalue = ''; | |
var index; | |
var length; | |
var now; | |
if ( | |
!self.options.gfm || | |
value.charAt(0) !== C_TILDE || | |
value.charAt(1) !== C_TILDE || | |
whitespace(value.charAt(2)) | |
) { | |
return; | |
} | |
index = 1; | |
length = value.length; | |
now = eat.now(); | |
now.column += 2; | |
now.offset += 2; | |
while (++index < length) { | |
character = value.charAt(index); | |
if ( | |
character === C_TILDE && | |
previous === C_TILDE && | |
(!preceding || !whitespace(preceding)) | |
) { | |
/* istanbul ignore if - never used (yet) */ | |
if (silent) { | |
return true; | |
} | |
return eat(DOUBLE + subvalue + DOUBLE)({ | |
type: 'delete', | |
children: self.tokenizeInline(subvalue, now) | |
}); | |
} | |
subvalue += previous; | |
preceding = previous; | |
previous = character; | |
} | |
} | |
},{"../locate/delete":6,"is-whitespace-character":51}],24:[function(require,module,exports){ | |
'use strict'; | |
var trim = require('trim'); | |
var word = require('is-word-character'); | |
var whitespace = require('is-whitespace-character'); | |
var locate = require('../locate/emphasis'); | |
module.exports = emphasis; | |
emphasis.locator = locate; | |
var C_ASTERISK = '*'; | |
var C_UNDERSCORE = '_'; | |
function emphasis(eat, value, silent) { | |
var self = this; | |
var index = 0; | |
var character = value.charAt(index); | |
var now; | |
var pedantic; | |
var marker; | |
var queue; | |
var subvalue; | |
var length; | |
var prev; | |
if (character !== C_ASTERISK && character !== C_UNDERSCORE) { | |
return; | |
} | |
pedantic = self.options.pedantic; | |
subvalue = character; | |
marker = character; | |
length = value.length; | |
index++; | |
queue = ''; | |
character = ''; | |
if (pedantic && whitespace(value.charAt(index))) { | |
return; | |
} | |
while (index < length) { | |
prev = character; | |
character = value.charAt(index); | |
if (character === marker && (!pedantic || !whitespace(prev))) { | |
character = value.charAt(++index); | |
if (character !== marker) { | |
if (!trim(queue) || prev === marker) { | |
return; | |
} | |
if (!pedantic && marker === C_UNDERSCORE && word(character)) { | |
queue += marker; | |
continue; | |
} | |
/* istanbul ignore if - never used (yet) */ | |
if (silent) { | |
return true; | |
} | |
now = eat.now(); | |
now.column++; | |
now.offset++; | |