30097 lines
3.0 MiB
30097 lines
3.0 MiB
/******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // identity function for calling harmony imports with the correct context
|
|
/******/ __webpack_require__.i = function(value) { return value; };
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, {
|
|
/******/ configurable: false,
|
|
/******/ enumerable: true,
|
|
/******/ get: getter
|
|
/******/ });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "";
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = 276);
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ([
|
|
/* 0 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
// 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.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) {
|
|
return [];
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 1 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Use invariant() to assert state which your program assumes to be true.
|
|
*
|
|
* Provide sprintf-style format (only %s is supported) and arguments
|
|
* to provide information about what broke and what you were
|
|
* expecting.
|
|
*
|
|
* The invariant message will be stripped in production, but the invariant
|
|
* will remain to ensure logic does not differ in production.
|
|
*/
|
|
|
|
var validateFormat = function validateFormat(format) {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateFormat = function validateFormat(format) {
|
|
if (format === undefined) {
|
|
throw new Error('invariant requires an error message argument');
|
|
}
|
|
};
|
|
}
|
|
|
|
function invariant(condition, format, a, b, c, d, e, f) {
|
|
validateFormat(format);
|
|
|
|
if (!condition) {
|
|
var error;
|
|
if (format === undefined) {
|
|
error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
|
|
} else {
|
|
var args = [a, b, c, d, e, f];
|
|
var argIndex = 0;
|
|
error = new Error(format.replace(/%s/g, function () {
|
|
return args[argIndex++];
|
|
}));
|
|
error.name = 'Invariant Violation';
|
|
}
|
|
|
|
error.framesToPop = 1; // we don't care about invariant's own frame
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
module.exports = invariant;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 2 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-2015, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
|
|
/**
|
|
* Similar to invariant but only logs a warning if the condition is not met.
|
|
* This can be used to log issues in development environments in critical
|
|
* paths. Removing the logging code for production environments will keep the
|
|
* same logic and follow the same code paths.
|
|
*/
|
|
|
|
var warning = emptyFunction;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
(function () {
|
|
var printWarning = function printWarning(format) {
|
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
var argIndex = 0;
|
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
|
return args[argIndex++];
|
|
});
|
|
if (typeof console !== 'undefined') {
|
|
console.error(message);
|
|
}
|
|
try {
|
|
// --- Welcome to debugging React ---
|
|
// This error was thrown as a convenience so that you can use this stack
|
|
// to find the callsite that caused this warning to fire.
|
|
throw new Error(message);
|
|
} catch (x) {}
|
|
};
|
|
|
|
warning = function warning(condition, format) {
|
|
if (format === undefined) {
|
|
throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
|
|
}
|
|
|
|
if (format.indexOf('Failed Composite propType: ') === 0) {
|
|
return; // Ignore CompositeComponent proptype check.
|
|
}
|
|
|
|
if (!condition) {
|
|
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
|
args[_key2 - 2] = arguments[_key2];
|
|
}
|
|
|
|
printWarning.apply(undefined, [format].concat(args));
|
|
}
|
|
};
|
|
})();
|
|
}
|
|
|
|
module.exports = warning;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 3 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* WARNING: DO NOT manually require this module.
|
|
* This is a replacement for `invariant(...)` used by the error code system
|
|
* and will _only_ be required by the corresponding babel pass.
|
|
* It always throws.
|
|
*/
|
|
|
|
function reactProdInvariant(code) {
|
|
var argCount = arguments.length - 1;
|
|
|
|
var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;
|
|
|
|
for (var argIdx = 0; argIdx < argCount; argIdx++) {
|
|
message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);
|
|
}
|
|
|
|
message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';
|
|
|
|
var error = new Error(message);
|
|
error.name = 'Invariant Violation';
|
|
error.framesToPop = 1; // we don't care about reactProdInvariant's own frame
|
|
|
|
throw error;
|
|
}
|
|
|
|
module.exports = reactProdInvariant;
|
|
|
|
/***/ }),
|
|
/* 4 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = __webpack_require__(23);
|
|
|
|
/***/ }),
|
|
/* 5 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/*
|
|
object-assign
|
|
(c) Sindre Sorhus
|
|
@license MIT
|
|
*/
|
|
|
|
|
|
/* eslint-disable no-unused-vars */
|
|
|
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
|
|
function toObject(val) {
|
|
if (val === null || val === undefined) {
|
|
throw new TypeError('Object.assign cannot be called with null or undefined');
|
|
}
|
|
|
|
return Object(val);
|
|
}
|
|
|
|
function shouldUseNative() {
|
|
try {
|
|
if (!Object.assign) {
|
|
return false;
|
|
}
|
|
|
|
// Detect buggy property enumeration order in older V8 versions.
|
|
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
|
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
|
test1[5] = 'de';
|
|
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
|
return false;
|
|
}
|
|
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
var test2 = {};
|
|
for (var i = 0; i < 10; i++) {
|
|
test2['_' + String.fromCharCode(i)] = i;
|
|
}
|
|
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
|
return test2[n];
|
|
});
|
|
if (order2.join('') !== '0123456789') {
|
|
return false;
|
|
}
|
|
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
var test3 = {};
|
|
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
|
test3[letter] = letter;
|
|
});
|
|
if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
} catch (err) {
|
|
// We don't expect any of the above to throw, but better to be safe.
|
|
return false;
|
|
}
|
|
}
|
|
|
|
module.exports = shouldUseNative() ? Object.assign : function (target, source) {
|
|
var from;
|
|
var to = toObject(target);
|
|
var symbols;
|
|
|
|
for (var s = 1; s < arguments.length; s++) {
|
|
from = Object(arguments[s]);
|
|
|
|
for (var key in from) {
|
|
if (hasOwnProperty.call(from, key)) {
|
|
to[key] = from[key];
|
|
}
|
|
}
|
|
|
|
if (getOwnPropertySymbols) {
|
|
symbols = getOwnPropertySymbols(from);
|
|
for (var i = 0; i < symbols.length; i++) {
|
|
if (propIsEnumerable.call(from, symbols[i])) {
|
|
to[symbols[i]] = from[symbols[i]];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return to;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 6 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
var ReactDOMComponentFlags = __webpack_require__(76);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;
|
|
var Flags = ReactDOMComponentFlags;
|
|
|
|
var internalInstanceKey = '__reactInternalInstance$' + Math.random().toString(36).slice(2);
|
|
|
|
/**
|
|
* Check if a given node should be cached.
|
|
*/
|
|
function shouldPrecacheNode(node, nodeID) {
|
|
return node.nodeType === 1 && node.getAttribute(ATTR_NAME) === String(nodeID) || node.nodeType === 8 && node.nodeValue === ' react-text: ' + nodeID + ' ' || node.nodeType === 8 && node.nodeValue === ' react-empty: ' + nodeID + ' ';
|
|
}
|
|
|
|
/**
|
|
* Drill down (through composites and empty components) until we get a host or
|
|
* host text component.
|
|
*
|
|
* This is pretty polymorphic but unavoidable with the current structure we have
|
|
* for `_renderedChildren`.
|
|
*/
|
|
function getRenderedHostOrTextFromComponent(component) {
|
|
var rendered;
|
|
while (rendered = component._renderedComponent) {
|
|
component = rendered;
|
|
}
|
|
return component;
|
|
}
|
|
|
|
/**
|
|
* Populate `_hostNode` on the rendered host/text component with the given
|
|
* DOM node. The passed `inst` can be a composite.
|
|
*/
|
|
function precacheNode(inst, node) {
|
|
var hostInst = getRenderedHostOrTextFromComponent(inst);
|
|
hostInst._hostNode = node;
|
|
node[internalInstanceKey] = hostInst;
|
|
}
|
|
|
|
function uncacheNode(inst) {
|
|
var node = inst._hostNode;
|
|
if (node) {
|
|
delete node[internalInstanceKey];
|
|
inst._hostNode = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Populate `_hostNode` on each child of `inst`, assuming that the children
|
|
* match up with the DOM (element) children of `node`.
|
|
*
|
|
* We cache entire levels at once to avoid an n^2 problem where we access the
|
|
* children of a node sequentially and have to walk from the start to our target
|
|
* node every time.
|
|
*
|
|
* Since we update `_renderedChildren` and the actual DOM at (slightly)
|
|
* different times, we could race here and see a newer `_renderedChildren` than
|
|
* the DOM nodes we see. To avoid this, ReactMultiChild calls
|
|
* `prepareToManageChildren` before we change `_renderedChildren`, at which
|
|
* time the container's child nodes are always cached (until it unmounts).
|
|
*/
|
|
function precacheChildNodes(inst, node) {
|
|
if (inst._flags & Flags.hasCachedChildNodes) {
|
|
return;
|
|
}
|
|
var children = inst._renderedChildren;
|
|
var childNode = node.firstChild;
|
|
outer: for (var name in children) {
|
|
if (!children.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
var childInst = children[name];
|
|
var childID = getRenderedHostOrTextFromComponent(childInst)._domID;
|
|
if (childID === 0) {
|
|
// We're currently unmounting this child in ReactMultiChild; skip it.
|
|
continue;
|
|
}
|
|
// We assume the child nodes are in the same order as the child instances.
|
|
for (; childNode !== null; childNode = childNode.nextSibling) {
|
|
if (shouldPrecacheNode(childNode, childID)) {
|
|
precacheNode(childInst, childNode);
|
|
continue outer;
|
|
}
|
|
}
|
|
// We reached the end of the DOM children without finding an ID match.
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Unable to find element with ID %s.', childID) : _prodInvariant('32', childID) : void 0;
|
|
}
|
|
inst._flags |= Flags.hasCachedChildNodes;
|
|
}
|
|
|
|
/**
|
|
* Given a DOM node, return the closest ReactDOMComponent or
|
|
* ReactDOMTextComponent instance ancestor.
|
|
*/
|
|
function getClosestInstanceFromNode(node) {
|
|
if (node[internalInstanceKey]) {
|
|
return node[internalInstanceKey];
|
|
}
|
|
|
|
// Walk up the tree until we find an ancestor whose instance we have cached.
|
|
var parents = [];
|
|
while (!node[internalInstanceKey]) {
|
|
parents.push(node);
|
|
if (node.parentNode) {
|
|
node = node.parentNode;
|
|
} else {
|
|
// Top of the tree. This node must not be part of a React tree (or is
|
|
// unmounted, potentially).
|
|
return null;
|
|
}
|
|
}
|
|
|
|
var closest;
|
|
var inst;
|
|
for (; node && (inst = node[internalInstanceKey]); node = parents.pop()) {
|
|
closest = inst;
|
|
if (parents.length) {
|
|
precacheChildNodes(inst, node);
|
|
}
|
|
}
|
|
|
|
return closest;
|
|
}
|
|
|
|
/**
|
|
* Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
|
|
* instance, or null if the node was not rendered by this React.
|
|
*/
|
|
function getInstanceFromNode(node) {
|
|
var inst = getClosestInstanceFromNode(node);
|
|
if (inst != null && inst._hostNode === node) {
|
|
return inst;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
|
|
* DOM node.
|
|
*/
|
|
function getNodeFromInstance(inst) {
|
|
// Without this first invariant, passing a non-DOM-component triggers the next
|
|
// invariant for a missing parent, which is super confusing.
|
|
!(inst._hostNode !== undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;
|
|
|
|
if (inst._hostNode) {
|
|
return inst._hostNode;
|
|
}
|
|
|
|
// Walk up the tree until we find an ancestor whose DOM node we have cached.
|
|
var parents = [];
|
|
while (!inst._hostNode) {
|
|
parents.push(inst);
|
|
!inst._hostParent ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React DOM tree root should always have a node reference.') : _prodInvariant('34') : void 0;
|
|
inst = inst._hostParent;
|
|
}
|
|
|
|
// Now parents contains each ancestor that does *not* have a cached native
|
|
// node, and `inst` is the deepest ancestor that does.
|
|
for (; parents.length; inst = parents.pop()) {
|
|
precacheChildNodes(inst, inst._hostNode);
|
|
}
|
|
|
|
return inst._hostNode;
|
|
}
|
|
|
|
var ReactDOMComponentTree = {
|
|
getClosestInstanceFromNode: getClosestInstanceFromNode,
|
|
getInstanceFromNode: getInstanceFromNode,
|
|
getNodeFromInstance: getNodeFromInstance,
|
|
precacheChildNodes: precacheChildNodes,
|
|
precacheNode: precacheNode,
|
|
uncacheNode: uncacheNode
|
|
};
|
|
|
|
module.exports = ReactDOMComponentTree;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 7 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
|
|
|
/**
|
|
* Simple, lightweight module assisting with the detection and context of
|
|
* Worker. Helps avoid circular dependencies and allows code to reason about
|
|
* whether or not they are in a Worker, even if they never include the main
|
|
* `ReactWorker` dependency.
|
|
*/
|
|
var ExecutionEnvironment = {
|
|
|
|
canUseDOM: canUseDOM,
|
|
|
|
canUseWorkers: typeof Worker !== 'undefined',
|
|
|
|
canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),
|
|
|
|
canUseViewport: canUseDOM && !!window.screen,
|
|
|
|
isInWorker: !canUseDOM // For now, this is true - might change in the future.
|
|
|
|
};
|
|
|
|
module.exports = ExecutionEnvironment;
|
|
|
|
/***/ }),
|
|
/* 8 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element') || 0xeac7;
|
|
|
|
var isValidElement = function isValidElement(object) {
|
|
return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
};
|
|
|
|
// By explicitly using `prop-types` you are opting into new development behavior.
|
|
// http://fb.me/prop-types-in-prod
|
|
var throwOnDirectAccess = true;
|
|
module.exports = __webpack_require__(72)(isValidElement, throwOnDirectAccess);
|
|
} else {
|
|
// By explicitly using `prop-types` you are opting into new production behavior.
|
|
// http://fb.me/prop-types-in-prod
|
|
module.exports = __webpack_require__(144)();
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 9 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(24);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
function isNative(fn) {
|
|
// Based on isNative() from Lodash
|
|
var funcToString = Function.prototype.toString;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
var reIsNative = RegExp('^' + funcToString
|
|
// Take an example native function source for comparison
|
|
.call(hasOwnProperty
|
|
// Strip regex characters so we can use it for regex
|
|
).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'
|
|
// Remove hasOwnProperty from the template to make it generic
|
|
).replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
|
|
try {
|
|
var source = funcToString.call(fn);
|
|
return reIsNative.test(source);
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
var canUseCollections =
|
|
// Array.from
|
|
typeof Array.from === 'function' &&
|
|
// Map
|
|
typeof Map === 'function' && isNative(Map) &&
|
|
// Map.prototype.keys
|
|
Map.prototype != null && typeof Map.prototype.keys === 'function' && isNative(Map.prototype.keys) &&
|
|
// Set
|
|
typeof Set === 'function' && isNative(Set) &&
|
|
// Set.prototype.keys
|
|
Set.prototype != null && typeof Set.prototype.keys === 'function' && isNative(Set.prototype.keys);
|
|
|
|
var setItem;
|
|
var getItem;
|
|
var removeItem;
|
|
var getItemIDs;
|
|
var addRoot;
|
|
var removeRoot;
|
|
var getRootIDs;
|
|
|
|
if (canUseCollections) {
|
|
var itemMap = new Map();
|
|
var rootIDSet = new Set();
|
|
|
|
setItem = function setItem(id, item) {
|
|
itemMap.set(id, item);
|
|
};
|
|
getItem = function getItem(id) {
|
|
return itemMap.get(id);
|
|
};
|
|
removeItem = function removeItem(id) {
|
|
itemMap['delete'](id);
|
|
};
|
|
getItemIDs = function getItemIDs() {
|
|
return Array.from(itemMap.keys());
|
|
};
|
|
|
|
addRoot = function addRoot(id) {
|
|
rootIDSet.add(id);
|
|
};
|
|
removeRoot = function removeRoot(id) {
|
|
rootIDSet['delete'](id);
|
|
};
|
|
getRootIDs = function getRootIDs() {
|
|
return Array.from(rootIDSet.keys());
|
|
};
|
|
} else {
|
|
var itemByKey = {};
|
|
var rootByKey = {};
|
|
|
|
// Use non-numeric keys to prevent V8 performance issues:
|
|
// https://github.com/facebook/react/pull/7232
|
|
var getKeyFromID = function getKeyFromID(id) {
|
|
return '.' + id;
|
|
};
|
|
var getIDFromKey = function getIDFromKey(key) {
|
|
return parseInt(key.substr(1), 10);
|
|
};
|
|
|
|
setItem = function setItem(id, item) {
|
|
var key = getKeyFromID(id);
|
|
itemByKey[key] = item;
|
|
};
|
|
getItem = function getItem(id) {
|
|
var key = getKeyFromID(id);
|
|
return itemByKey[key];
|
|
};
|
|
removeItem = function removeItem(id) {
|
|
var key = getKeyFromID(id);
|
|
delete itemByKey[key];
|
|
};
|
|
getItemIDs = function getItemIDs() {
|
|
return Object.keys(itemByKey).map(getIDFromKey);
|
|
};
|
|
|
|
addRoot = function addRoot(id) {
|
|
var key = getKeyFromID(id);
|
|
rootByKey[key] = true;
|
|
};
|
|
removeRoot = function removeRoot(id) {
|
|
var key = getKeyFromID(id);
|
|
delete rootByKey[key];
|
|
};
|
|
getRootIDs = function getRootIDs() {
|
|
return Object.keys(rootByKey).map(getIDFromKey);
|
|
};
|
|
}
|
|
|
|
var unmountedIDs = [];
|
|
|
|
function purgeDeep(id) {
|
|
var item = getItem(id);
|
|
if (item) {
|
|
var childIDs = item.childIDs;
|
|
|
|
removeItem(id);
|
|
childIDs.forEach(purgeDeep);
|
|
}
|
|
}
|
|
|
|
function describeComponentFrame(name, source, ownerName) {
|
|
return '\n in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : '');
|
|
}
|
|
|
|
function _getDisplayName(element) {
|
|
if (element == null) {
|
|
return '#empty';
|
|
} else if (typeof element === 'string' || typeof element === 'number') {
|
|
return '#text';
|
|
} else if (typeof element.type === 'string') {
|
|
return element.type;
|
|
} else {
|
|
return element.type.displayName || element.type.name || 'Unknown';
|
|
}
|
|
}
|
|
|
|
function describeID(id) {
|
|
var name = ReactComponentTreeHook.getDisplayName(id);
|
|
var element = ReactComponentTreeHook.getElement(id);
|
|
var ownerID = ReactComponentTreeHook.getOwnerID(id);
|
|
var ownerName;
|
|
if (ownerID) {
|
|
ownerName = ReactComponentTreeHook.getDisplayName(ownerID);
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(element, 'ReactComponentTreeHook: Missing React element for debugID %s when ' + 'building stack', id) : void 0;
|
|
return describeComponentFrame(name, element && element._source, ownerName);
|
|
}
|
|
|
|
var ReactComponentTreeHook = {
|
|
onSetChildren: function onSetChildren(id, nextChildIDs) {
|
|
var item = getItem(id);
|
|
!item ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Item must have been set') : _prodInvariant('144') : void 0;
|
|
item.childIDs = nextChildIDs;
|
|
|
|
for (var i = 0; i < nextChildIDs.length; i++) {
|
|
var nextChildID = nextChildIDs[i];
|
|
var nextChild = getItem(nextChildID);
|
|
!nextChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected hook events to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('140') : void 0;
|
|
!(nextChild.childIDs != null || _typeof(nextChild.element) !== 'object' || nextChild.element == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().') : _prodInvariant('141') : void 0;
|
|
!nextChild.isMounted ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('71') : void 0;
|
|
if (nextChild.parentID == null) {
|
|
nextChild.parentID = id;
|
|
// TODO: This shouldn't be necessary but mounting a new root during in
|
|
// componentWillMount currently causes not-yet-mounted components to
|
|
// be purged from our tree data so their parent id is missing.
|
|
}
|
|
!(nextChild.parentID === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).', nextChildID, nextChild.parentID, id) : _prodInvariant('142', nextChildID, nextChild.parentID, id) : void 0;
|
|
}
|
|
},
|
|
onBeforeMountComponent: function onBeforeMountComponent(id, element, parentID) {
|
|
var item = {
|
|
element: element,
|
|
parentID: parentID,
|
|
text: null,
|
|
childIDs: [],
|
|
isMounted: false,
|
|
updateCount: 0
|
|
};
|
|
setItem(id, item);
|
|
},
|
|
onBeforeUpdateComponent: function onBeforeUpdateComponent(id, element) {
|
|
var item = getItem(id);
|
|
if (!item || !item.isMounted) {
|
|
// We may end up here as a result of setState() in componentWillUnmount().
|
|
// In this case, ignore the element.
|
|
return;
|
|
}
|
|
item.element = element;
|
|
},
|
|
onMountComponent: function onMountComponent(id) {
|
|
var item = getItem(id);
|
|
!item ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Item must have been set') : _prodInvariant('144') : void 0;
|
|
item.isMounted = true;
|
|
var isRoot = item.parentID === 0;
|
|
if (isRoot) {
|
|
addRoot(id);
|
|
}
|
|
},
|
|
onUpdateComponent: function onUpdateComponent(id) {
|
|
var item = getItem(id);
|
|
if (!item || !item.isMounted) {
|
|
// We may end up here as a result of setState() in componentWillUnmount().
|
|
// In this case, ignore the element.
|
|
return;
|
|
}
|
|
item.updateCount++;
|
|
},
|
|
onUnmountComponent: function onUnmountComponent(id) {
|
|
var item = getItem(id);
|
|
if (item) {
|
|
// We need to check if it exists.
|
|
// `item` might not exist if it is inside an error boundary, and a sibling
|
|
// error boundary child threw while mounting. Then this instance never
|
|
// got a chance to mount, but it still gets an unmounting event during
|
|
// the error boundary cleanup.
|
|
item.isMounted = false;
|
|
var isRoot = item.parentID === 0;
|
|
if (isRoot) {
|
|
removeRoot(id);
|
|
}
|
|
}
|
|
unmountedIDs.push(id);
|
|
},
|
|
purgeUnmountedComponents: function purgeUnmountedComponents() {
|
|
if (ReactComponentTreeHook._preventPurging) {
|
|
// Should only be used for testing.
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < unmountedIDs.length; i++) {
|
|
var id = unmountedIDs[i];
|
|
purgeDeep(id);
|
|
}
|
|
unmountedIDs.length = 0;
|
|
},
|
|
isMounted: function isMounted(id) {
|
|
var item = getItem(id);
|
|
return item ? item.isMounted : false;
|
|
},
|
|
getCurrentStackAddendum: function getCurrentStackAddendum(topElement) {
|
|
var info = '';
|
|
if (topElement) {
|
|
var name = _getDisplayName(topElement);
|
|
var owner = topElement._owner;
|
|
info += describeComponentFrame(name, topElement._source, owner && owner.getName());
|
|
}
|
|
|
|
var currentOwner = ReactCurrentOwner.current;
|
|
var id = currentOwner && currentOwner._debugID;
|
|
|
|
info += ReactComponentTreeHook.getStackAddendumByID(id);
|
|
return info;
|
|
},
|
|
getStackAddendumByID: function getStackAddendumByID(id) {
|
|
var info = '';
|
|
while (id) {
|
|
info += describeID(id);
|
|
id = ReactComponentTreeHook.getParentID(id);
|
|
}
|
|
return info;
|
|
},
|
|
getChildIDs: function getChildIDs(id) {
|
|
var item = getItem(id);
|
|
return item ? item.childIDs : [];
|
|
},
|
|
getDisplayName: function getDisplayName(id) {
|
|
var element = ReactComponentTreeHook.getElement(id);
|
|
if (!element) {
|
|
return null;
|
|
}
|
|
return _getDisplayName(element);
|
|
},
|
|
getElement: function getElement(id) {
|
|
var item = getItem(id);
|
|
return item ? item.element : null;
|
|
},
|
|
getOwnerID: function getOwnerID(id) {
|
|
var element = ReactComponentTreeHook.getElement(id);
|
|
if (!element || !element._owner) {
|
|
return null;
|
|
}
|
|
return element._owner._debugID;
|
|
},
|
|
getParentID: function getParentID(id) {
|
|
var item = getItem(id);
|
|
return item ? item.parentID : null;
|
|
},
|
|
getSource: function getSource(id) {
|
|
var item = getItem(id);
|
|
var element = item ? item.element : null;
|
|
var source = element != null ? element._source : null;
|
|
return source;
|
|
},
|
|
getText: function getText(id) {
|
|
var element = ReactComponentTreeHook.getElement(id);
|
|
if (typeof element === 'string') {
|
|
return element;
|
|
} else if (typeof element === 'number') {
|
|
return '' + element;
|
|
} else {
|
|
return null;
|
|
}
|
|
},
|
|
getUpdateCount: function getUpdateCount(id) {
|
|
var item = getItem(id);
|
|
return item ? item.updateCount : 0;
|
|
},
|
|
|
|
getRootIDs: getRootIDs,
|
|
getRegisteredIDs: getItemIDs,
|
|
|
|
pushNonStandardWarningStack: function pushNonStandardWarningStack(isCreatingElement, currentSource) {
|
|
if (typeof console.reactStack !== 'function') {
|
|
return;
|
|
}
|
|
|
|
var stack = [];
|
|
var currentOwner = ReactCurrentOwner.current;
|
|
var id = currentOwner && currentOwner._debugID;
|
|
|
|
try {
|
|
if (isCreatingElement) {
|
|
stack.push({
|
|
name: id ? ReactComponentTreeHook.getDisplayName(id) : null,
|
|
fileName: currentSource ? currentSource.fileName : null,
|
|
lineNumber: currentSource ? currentSource.lineNumber : null
|
|
});
|
|
}
|
|
|
|
while (id) {
|
|
var element = ReactComponentTreeHook.getElement(id);
|
|
var parentID = ReactComponentTreeHook.getParentID(id);
|
|
var ownerID = ReactComponentTreeHook.getOwnerID(id);
|
|
var ownerName = ownerID ? ReactComponentTreeHook.getDisplayName(ownerID) : null;
|
|
var source = element && element._source;
|
|
stack.push({
|
|
name: ownerName,
|
|
fileName: source ? source.fileName : null,
|
|
lineNumber: source ? source.lineNumber : null
|
|
});
|
|
id = parentID;
|
|
}
|
|
} catch (err) {
|
|
// Internal state is messed up.
|
|
// Stop building the stack (it's just a nice to have).
|
|
}
|
|
|
|
console.reactStack(stack);
|
|
},
|
|
popNonStandardWarningStack: function popNonStandardWarningStack() {
|
|
if (typeof console.reactStackEnd !== 'function') {
|
|
return;
|
|
}
|
|
console.reactStackEnd();
|
|
}
|
|
};
|
|
|
|
module.exports = ReactComponentTreeHook;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 10 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
function makeEmptyFunction(arg) {
|
|
return function () {
|
|
return arg;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This function accepts and discards inputs; it has no side effects. This is
|
|
* primarily useful idiomatically for overridable function endpoints which
|
|
* always need to be callable, since JS lacks a null-call idiom ala Cocoa.
|
|
*/
|
|
var emptyFunction = function emptyFunction() {};
|
|
|
|
emptyFunction.thatReturns = makeEmptyFunction;
|
|
emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
|
|
emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
|
|
emptyFunction.thatReturnsNull = makeEmptyFunction(null);
|
|
emptyFunction.thatReturnsThis = function () {
|
|
return this;
|
|
};
|
|
emptyFunction.thatReturnsArgument = function (arg) {
|
|
return arg;
|
|
};
|
|
|
|
module.exports = emptyFunction;
|
|
|
|
/***/ }),
|
|
/* 11 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
// Trust the developer to only use ReactInstrumentation with a __DEV__ check
|
|
|
|
var debugTool = null;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var ReactDebugTool = __webpack_require__(173);
|
|
debugTool = ReactDebugTool;
|
|
}
|
|
|
|
module.exports = { debugTool: debugTool };
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 12 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.withRouter = exports.matchPath = exports.Switch = exports.StaticRouter = exports.Router = exports.Route = exports.Redirect = exports.Prompt = exports.MemoryRouter = undefined;
|
|
|
|
var _MemoryRouter2 = __webpack_require__(237);
|
|
|
|
var _MemoryRouter3 = _interopRequireDefault(_MemoryRouter2);
|
|
|
|
var _Prompt2 = __webpack_require__(238);
|
|
|
|
var _Prompt3 = _interopRequireDefault(_Prompt2);
|
|
|
|
var _Redirect2 = __webpack_require__(239);
|
|
|
|
var _Redirect3 = _interopRequireDefault(_Redirect2);
|
|
|
|
var _Route2 = __webpack_require__(100);
|
|
|
|
var _Route3 = _interopRequireDefault(_Route2);
|
|
|
|
var _Router2 = __webpack_require__(61);
|
|
|
|
var _Router3 = _interopRequireDefault(_Router2);
|
|
|
|
var _StaticRouter2 = __webpack_require__(240);
|
|
|
|
var _StaticRouter3 = _interopRequireDefault(_StaticRouter2);
|
|
|
|
var _Switch2 = __webpack_require__(241);
|
|
|
|
var _Switch3 = _interopRequireDefault(_Switch2);
|
|
|
|
var _matchPath2 = __webpack_require__(62);
|
|
|
|
var _matchPath3 = _interopRequireDefault(_matchPath2);
|
|
|
|
var _withRouter2 = __webpack_require__(242);
|
|
|
|
var _withRouter3 = _interopRequireDefault(_withRouter2);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
exports.MemoryRouter = _MemoryRouter3.default;
|
|
exports.Prompt = _Prompt3.default;
|
|
exports.Redirect = _Redirect3.default;
|
|
exports.Route = _Route3.default;
|
|
exports.Router = _Router3.default;
|
|
exports.StaticRouter = _StaticRouter3.default;
|
|
exports.Switch = _Switch3.default;
|
|
exports.matchPath = _matchPath3.default;
|
|
exports.withRouter = _withRouter3.default;
|
|
|
|
/***/ }),
|
|
/* 13 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.connect = exports.connectAdvanced = exports.createProvider = exports.Provider = undefined;
|
|
|
|
var _Provider = __webpack_require__(216);
|
|
|
|
var _Provider2 = _interopRequireDefault(_Provider);
|
|
|
|
var _connectAdvanced = __webpack_require__(95);
|
|
|
|
var _connectAdvanced2 = _interopRequireDefault(_connectAdvanced);
|
|
|
|
var _connect = __webpack_require__(217);
|
|
|
|
var _connect2 = _interopRequireDefault(_connect);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
exports.Provider = _Provider2.default;
|
|
exports.createProvider = _Provider.createProvider;
|
|
exports.connectAdvanced = _connectAdvanced2.default;
|
|
exports.connect = _connect2.default;
|
|
|
|
/***/ }),
|
|
/* 14 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var CallbackQueue = __webpack_require__(74);
|
|
var PooledClass = __webpack_require__(18);
|
|
var ReactFeatureFlags = __webpack_require__(79);
|
|
var ReactReconciler = __webpack_require__(22);
|
|
var Transaction = __webpack_require__(36);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var dirtyComponents = [];
|
|
var updateBatchNumber = 0;
|
|
var asapCallbackQueue = CallbackQueue.getPooled();
|
|
var asapEnqueued = false;
|
|
|
|
var batchingStrategy = null;
|
|
|
|
function ensureInjected() {
|
|
!(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching strategy') : _prodInvariant('123') : void 0;
|
|
}
|
|
|
|
var NESTED_UPDATES = {
|
|
initialize: function initialize() {
|
|
this.dirtyComponentsLength = dirtyComponents.length;
|
|
},
|
|
close: function close() {
|
|
if (this.dirtyComponentsLength !== dirtyComponents.length) {
|
|
// Additional updates were enqueued by componentDidUpdate handlers or
|
|
// similar; before our own UPDATE_QUEUEING wrapper closes, we want to run
|
|
// these new updates so that if A's componentDidUpdate calls setState on
|
|
// B, B will update before the callback A's updater provided when calling
|
|
// setState.
|
|
dirtyComponents.splice(0, this.dirtyComponentsLength);
|
|
flushBatchedUpdates();
|
|
} else {
|
|
dirtyComponents.length = 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
var UPDATE_QUEUEING = {
|
|
initialize: function initialize() {
|
|
this.callbackQueue.reset();
|
|
},
|
|
close: function close() {
|
|
this.callbackQueue.notifyAll();
|
|
}
|
|
};
|
|
|
|
var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];
|
|
|
|
function ReactUpdatesFlushTransaction() {
|
|
this.reinitializeTransaction();
|
|
this.dirtyComponentsLength = null;
|
|
this.callbackQueue = CallbackQueue.getPooled();
|
|
this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled(
|
|
/* useCreateElement */true);
|
|
}
|
|
|
|
_assign(ReactUpdatesFlushTransaction.prototype, Transaction, {
|
|
getTransactionWrappers: function getTransactionWrappers() {
|
|
return TRANSACTION_WRAPPERS;
|
|
},
|
|
|
|
destructor: function destructor() {
|
|
this.dirtyComponentsLength = null;
|
|
CallbackQueue.release(this.callbackQueue);
|
|
this.callbackQueue = null;
|
|
ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);
|
|
this.reconcileTransaction = null;
|
|
},
|
|
|
|
perform: function perform(method, scope, a) {
|
|
// Essentially calls `this.reconcileTransaction.perform(method, scope, a)`
|
|
// with this transaction's wrappers around it.
|
|
return Transaction.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a);
|
|
}
|
|
});
|
|
|
|
PooledClass.addPoolingTo(ReactUpdatesFlushTransaction);
|
|
|
|
function batchedUpdates(callback, a, b, c, d, e) {
|
|
ensureInjected();
|
|
return batchingStrategy.batchedUpdates(callback, a, b, c, d, e);
|
|
}
|
|
|
|
/**
|
|
* Array comparator for ReactComponents by mount ordering.
|
|
*
|
|
* @param {ReactComponent} c1 first component you're comparing
|
|
* @param {ReactComponent} c2 second component you're comparing
|
|
* @return {number} Return value usable by Array.prototype.sort().
|
|
*/
|
|
function mountOrderComparator(c1, c2) {
|
|
return c1._mountOrder - c2._mountOrder;
|
|
}
|
|
|
|
function runBatchedUpdates(transaction) {
|
|
var len = transaction.dirtyComponentsLength;
|
|
!(len === dirtyComponents.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected flush transaction\'s stored dirty-components length (%s) to match dirty-components array length (%s).', len, dirtyComponents.length) : _prodInvariant('124', len, dirtyComponents.length) : void 0;
|
|
|
|
// Since reconciling a component higher in the owner hierarchy usually (not
|
|
// always -- see shouldComponentUpdate()) will reconcile children, reconcile
|
|
// them before their children by sorting the array.
|
|
dirtyComponents.sort(mountOrderComparator);
|
|
|
|
// Any updates enqueued while reconciling must be performed after this entire
|
|
// batch. Otherwise, if dirtyComponents is [A, B] where A has children B and
|
|
// C, B could update twice in a single batch if C's render enqueues an update
|
|
// to B (since B would have already updated, we should skip it, and the only
|
|
// way we can know to do so is by checking the batch counter).
|
|
updateBatchNumber++;
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
// If a component is unmounted before pending changes apply, it will still
|
|
// be here, but we assume that it has cleared its _pendingCallbacks and
|
|
// that performUpdateIfNecessary is a noop.
|
|
var component = dirtyComponents[i];
|
|
|
|
// If performUpdateIfNecessary happens to enqueue any new updates, we
|
|
// shouldn't execute the callbacks until the next render happens, so
|
|
// stash the callbacks first
|
|
var callbacks = component._pendingCallbacks;
|
|
component._pendingCallbacks = null;
|
|
|
|
var markerName;
|
|
if (ReactFeatureFlags.logTopLevelRenders) {
|
|
var namedComponent = component;
|
|
// Duck type TopLevelWrapper. This is probably always true.
|
|
if (component._currentElement.type.isReactTopLevelWrapper) {
|
|
namedComponent = component._renderedComponent;
|
|
}
|
|
markerName = 'React update: ' + namedComponent.getName();
|
|
console.time(markerName);
|
|
}
|
|
|
|
ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction, updateBatchNumber);
|
|
|
|
if (markerName) {
|
|
console.timeEnd(markerName);
|
|
}
|
|
|
|
if (callbacks) {
|
|
for (var j = 0; j < callbacks.length; j++) {
|
|
transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var flushBatchedUpdates = function flushBatchedUpdates() {
|
|
// ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents
|
|
// array and perform any updates enqueued by mount-ready handlers (i.e.,
|
|
// componentDidUpdate) but we need to check here too in order to catch
|
|
// updates enqueued by setState callbacks and asap calls.
|
|
while (dirtyComponents.length || asapEnqueued) {
|
|
if (dirtyComponents.length) {
|
|
var transaction = ReactUpdatesFlushTransaction.getPooled();
|
|
transaction.perform(runBatchedUpdates, null, transaction);
|
|
ReactUpdatesFlushTransaction.release(transaction);
|
|
}
|
|
|
|
if (asapEnqueued) {
|
|
asapEnqueued = false;
|
|
var queue = asapCallbackQueue;
|
|
asapCallbackQueue = CallbackQueue.getPooled();
|
|
queue.notifyAll();
|
|
CallbackQueue.release(queue);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Mark a component as needing a rerender, adding an optional callback to a
|
|
* list of functions which will be executed once the rerender occurs.
|
|
*/
|
|
function enqueueUpdate(component) {
|
|
ensureInjected();
|
|
|
|
// Various parts of our code (such as ReactCompositeComponent's
|
|
// _renderValidatedComponent) assume that calls to render aren't nested;
|
|
// verify that that's the case. (This is called by each top-level update
|
|
// function, like setState, forceUpdate, etc.; creation and
|
|
// destruction of top-level components is guarded in ReactMount.)
|
|
|
|
if (!batchingStrategy.isBatchingUpdates) {
|
|
batchingStrategy.batchedUpdates(enqueueUpdate, component);
|
|
return;
|
|
}
|
|
|
|
dirtyComponents.push(component);
|
|
if (component._updateBatchNumber == null) {
|
|
component._updateBatchNumber = updateBatchNumber + 1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enqueue a callback to be run at the end of the current batching cycle. Throws
|
|
* if no updates are currently being performed.
|
|
*/
|
|
function asap(callback, context) {
|
|
!batchingStrategy.isBatchingUpdates ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates.asap: Can\'t enqueue an asap callback in a context whereupdates are not being batched.') : _prodInvariant('125') : void 0;
|
|
asapCallbackQueue.enqueue(callback, context);
|
|
asapEnqueued = true;
|
|
}
|
|
|
|
var ReactUpdatesInjection = {
|
|
injectReconcileTransaction: function injectReconcileTransaction(ReconcileTransaction) {
|
|
!ReconcileTransaction ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : _prodInvariant('126') : void 0;
|
|
ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;
|
|
},
|
|
|
|
injectBatchingStrategy: function injectBatchingStrategy(_batchingStrategy) {
|
|
!_batchingStrategy ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batching strategy') : _prodInvariant('127') : void 0;
|
|
!(typeof _batchingStrategy.batchedUpdates === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : _prodInvariant('128') : void 0;
|
|
!(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : _prodInvariant('129') : void 0;
|
|
batchingStrategy = _batchingStrategy;
|
|
}
|
|
};
|
|
|
|
var ReactUpdates = {
|
|
/**
|
|
* React references `ReactReconcileTransaction` using this property in order
|
|
* to allow dependency injection.
|
|
*
|
|
* @internal
|
|
*/
|
|
ReactReconcileTransaction: null,
|
|
|
|
batchedUpdates: batchedUpdates,
|
|
enqueueUpdate: enqueueUpdate,
|
|
flushBatchedUpdates: flushBatchedUpdates,
|
|
injection: ReactUpdatesInjection,
|
|
asap: asap
|
|
};
|
|
|
|
module.exports = ReactUpdates;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 15 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Keeps track of the current owner.
|
|
*
|
|
* The current owner is the component who should own any components that are
|
|
* currently being constructed.
|
|
*/
|
|
|
|
var ReactCurrentOwner = {
|
|
/**
|
|
* @internal
|
|
* @type {ReactComponent}
|
|
*/
|
|
current: null
|
|
};
|
|
|
|
module.exports = ReactCurrentOwner;
|
|
|
|
/***/ }),
|
|
/* 16 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var PooledClass = __webpack_require__(18);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var didWarnForAddedNewProperty = false;
|
|
var isProxySupported = typeof Proxy === 'function';
|
|
|
|
var shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances'];
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var EventInterface = {
|
|
type: null,
|
|
target: null,
|
|
// currentTarget is set when dispatching; no use in copying it here
|
|
currentTarget: emptyFunction.thatReturnsNull,
|
|
eventPhase: null,
|
|
bubbles: null,
|
|
cancelable: null,
|
|
timeStamp: function timeStamp(event) {
|
|
return event.timeStamp || Date.now();
|
|
},
|
|
defaultPrevented: null,
|
|
isTrusted: null
|
|
};
|
|
|
|
/**
|
|
* Synthetic events are dispatched by event plugins, typically in response to a
|
|
* top-level event delegation handler.
|
|
*
|
|
* These systems should generally use pooling to reduce the frequency of garbage
|
|
* collection. The system should check `isPersistent` to determine whether the
|
|
* event should be released into the pool after being dispatched. Users that
|
|
* need a persisted event should invoke `persist`.
|
|
*
|
|
* Synthetic events (and subclasses) implement the DOM Level 3 Events API by
|
|
* normalizing browser quirks. Subclasses do not necessarily have to implement a
|
|
* DOM interface; custom application-specific events can also subclass this.
|
|
*
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {*} targetInst Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @param {DOMEventTarget} nativeEventTarget Target node.
|
|
*/
|
|
function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// these have a getter/setter for warnings
|
|
delete this.nativeEvent;
|
|
delete this.preventDefault;
|
|
delete this.stopPropagation;
|
|
}
|
|
|
|
this.dispatchConfig = dispatchConfig;
|
|
this._targetInst = targetInst;
|
|
this.nativeEvent = nativeEvent;
|
|
|
|
var Interface = this.constructor.Interface;
|
|
for (var propName in Interface) {
|
|
if (!Interface.hasOwnProperty(propName)) {
|
|
continue;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
delete this[propName]; // this has a getter/setter for warnings
|
|
}
|
|
var normalize = Interface[propName];
|
|
if (normalize) {
|
|
this[propName] = normalize(nativeEvent);
|
|
} else {
|
|
if (propName === 'target') {
|
|
this.target = nativeEventTarget;
|
|
} else {
|
|
this[propName] = nativeEvent[propName];
|
|
}
|
|
}
|
|
}
|
|
|
|
var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
|
|
if (defaultPrevented) {
|
|
this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
|
|
} else {
|
|
this.isDefaultPrevented = emptyFunction.thatReturnsFalse;
|
|
}
|
|
this.isPropagationStopped = emptyFunction.thatReturnsFalse;
|
|
return this;
|
|
}
|
|
|
|
_assign(SyntheticEvent.prototype, {
|
|
preventDefault: function preventDefault() {
|
|
this.defaultPrevented = true;
|
|
var event = this.nativeEvent;
|
|
if (!event) {
|
|
return;
|
|
}
|
|
|
|
if (event.preventDefault) {
|
|
event.preventDefault();
|
|
// eslint-disable-next-line valid-typeof
|
|
} else if (typeof event.returnValue !== 'unknown') {
|
|
event.returnValue = false;
|
|
}
|
|
this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
|
|
},
|
|
|
|
stopPropagation: function stopPropagation() {
|
|
var event = this.nativeEvent;
|
|
if (!event) {
|
|
return;
|
|
}
|
|
|
|
if (event.stopPropagation) {
|
|
event.stopPropagation();
|
|
// eslint-disable-next-line valid-typeof
|
|
} else if (typeof event.cancelBubble !== 'unknown') {
|
|
// The ChangeEventPlugin registers a "propertychange" event for
|
|
// IE. This event does not support bubbling or cancelling, and
|
|
// any references to cancelBubble throw "Member not found". A
|
|
// typeof check of "unknown" circumvents this issue (and is also
|
|
// IE specific).
|
|
event.cancelBubble = true;
|
|
}
|
|
|
|
this.isPropagationStopped = emptyFunction.thatReturnsTrue;
|
|
},
|
|
|
|
/**
|
|
* We release all dispatched `SyntheticEvent`s after each event loop, adding
|
|
* them back into the pool. This allows a way to hold onto a reference that
|
|
* won't be added back into the pool.
|
|
*/
|
|
persist: function persist() {
|
|
this.isPersistent = emptyFunction.thatReturnsTrue;
|
|
},
|
|
|
|
/**
|
|
* Checks if this event should be released back into the pool.
|
|
*
|
|
* @return {boolean} True if this should not be released, false otherwise.
|
|
*/
|
|
isPersistent: emptyFunction.thatReturnsFalse,
|
|
|
|
/**
|
|
* `PooledClass` looks for `destructor` on each instance it releases.
|
|
*/
|
|
destructor: function destructor() {
|
|
var Interface = this.constructor.Interface;
|
|
for (var propName in Interface) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
|
|
} else {
|
|
this[propName] = null;
|
|
}
|
|
}
|
|
for (var i = 0; i < shouldBeReleasedProperties.length; i++) {
|
|
this[shouldBeReleasedProperties[i]] = null;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));
|
|
Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', emptyFunction));
|
|
Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', emptyFunction));
|
|
}
|
|
}
|
|
});
|
|
|
|
SyntheticEvent.Interface = EventInterface;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (isProxySupported) {
|
|
/*eslint-disable no-func-assign */
|
|
SyntheticEvent = new Proxy(SyntheticEvent, {
|
|
construct: function construct(target, args) {
|
|
return this.apply(target, Object.create(target.prototype), args);
|
|
},
|
|
apply: function apply(constructor, that, args) {
|
|
return new Proxy(constructor.apply(that, args), {
|
|
set: function set(target, prop, value) {
|
|
if (prop !== 'isPersistent' && !target.constructor.Interface.hasOwnProperty(prop) && shouldBeReleasedProperties.indexOf(prop) === -1) {
|
|
process.env.NODE_ENV !== 'production' ? warning(didWarnForAddedNewProperty || target.isPersistent(), "This synthetic event is reused for performance reasons. If you're " + "seeing this, you're adding a new property in the synthetic event object. " + 'The property is never released. See ' + 'https://fb.me/react-event-pooling for more information.') : void 0;
|
|
didWarnForAddedNewProperty = true;
|
|
}
|
|
target[prop] = value;
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
/*eslint-enable no-func-assign */
|
|
}
|
|
}
|
|
/**
|
|
* Helper to reduce boilerplate when creating subclasses.
|
|
*
|
|
* @param {function} Class
|
|
* @param {?object} Interface
|
|
*/
|
|
SyntheticEvent.augmentClass = function (Class, Interface) {
|
|
var Super = this;
|
|
|
|
var E = function E() {};
|
|
E.prototype = Super.prototype;
|
|
var prototype = new E();
|
|
|
|
_assign(prototype, Class.prototype);
|
|
Class.prototype = prototype;
|
|
Class.prototype.constructor = Class;
|
|
|
|
Class.Interface = _assign({}, Super.Interface, Interface);
|
|
Class.augmentClass = Super.augmentClass;
|
|
|
|
PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler);
|
|
};
|
|
|
|
PooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler);
|
|
|
|
module.exports = SyntheticEvent;
|
|
|
|
/**
|
|
* Helper to nullify syntheticEvent instance properties when destructing
|
|
*
|
|
* @param {object} SyntheticEvent
|
|
* @param {String} propName
|
|
* @return {object} defineProperty object
|
|
*/
|
|
function getPooledWarningPropertyDefinition(propName, getVal) {
|
|
var isFunction = typeof getVal === 'function';
|
|
return {
|
|
configurable: true,
|
|
set: set,
|
|
get: get
|
|
};
|
|
|
|
function set(val) {
|
|
var action = isFunction ? 'setting the method' : 'setting the property';
|
|
warn(action, 'This is effectively a no-op');
|
|
return val;
|
|
}
|
|
|
|
function get() {
|
|
var action = isFunction ? 'accessing the method' : 'accessing the property';
|
|
var result = isFunction ? 'This is a no-op function' : 'This is set to null';
|
|
warn(action, result);
|
|
return getVal;
|
|
}
|
|
|
|
function warn(action, result) {
|
|
var warningCondition = false;
|
|
process.env.NODE_ENV !== 'production' ? warning(warningCondition, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0;
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 17 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
function checkMask(value, bitmask) {
|
|
return (value & bitmask) === bitmask;
|
|
}
|
|
|
|
var DOMPropertyInjection = {
|
|
/**
|
|
* Mapping from normalized, camelcased property names to a configuration that
|
|
* specifies how the associated DOM property should be accessed or rendered.
|
|
*/
|
|
MUST_USE_PROPERTY: 0x1,
|
|
HAS_BOOLEAN_VALUE: 0x4,
|
|
HAS_NUMERIC_VALUE: 0x8,
|
|
HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
|
|
HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,
|
|
|
|
/**
|
|
* Inject some specialized knowledge about the DOM. This takes a config object
|
|
* with the following properties:
|
|
*
|
|
* isCustomAttribute: function that given an attribute name will return true
|
|
* if it can be inserted into the DOM verbatim. Useful for data-* or aria-*
|
|
* attributes where it's impossible to enumerate all of the possible
|
|
* attribute names,
|
|
*
|
|
* Properties: object mapping DOM property name to one of the
|
|
* DOMPropertyInjection constants or null. If your attribute isn't in here,
|
|
* it won't get written to the DOM.
|
|
*
|
|
* DOMAttributeNames: object mapping React attribute name to the DOM
|
|
* attribute name. Attribute names not specified use the **lowercase**
|
|
* normalized name.
|
|
*
|
|
* DOMAttributeNamespaces: object mapping React attribute name to the DOM
|
|
* attribute namespace URL. (Attribute names not specified use no namespace.)
|
|
*
|
|
* DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
|
|
* Property names not specified use the normalized name.
|
|
*
|
|
* DOMMutationMethods: Properties that require special mutation methods. If
|
|
* `value` is undefined, the mutation method should unset the property.
|
|
*
|
|
* @param {object} domPropertyConfig the config as described above.
|
|
*/
|
|
injectDOMPropertyConfig: function injectDOMPropertyConfig(domPropertyConfig) {
|
|
var Injection = DOMPropertyInjection;
|
|
var Properties = domPropertyConfig.Properties || {};
|
|
var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};
|
|
var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};
|
|
var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};
|
|
var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
|
|
|
|
if (domPropertyConfig.isCustomAttribute) {
|
|
DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);
|
|
}
|
|
|
|
for (var propName in Properties) {
|
|
!!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property \'%s\' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.', propName) : _prodInvariant('48', propName) : void 0;
|
|
|
|
var lowerCased = propName.toLowerCase();
|
|
var propConfig = Properties[propName];
|
|
|
|
var propertyInfo = {
|
|
attributeName: lowerCased,
|
|
attributeNamespace: null,
|
|
propertyName: propName,
|
|
mutationMethod: null,
|
|
|
|
mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
|
|
hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
|
|
hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
|
|
hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
|
|
hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)
|
|
};
|
|
!(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s', propName) : _prodInvariant('50', propName) : void 0;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
DOMProperty.getPossibleStandardName[lowerCased] = propName;
|
|
}
|
|
|
|
if (DOMAttributeNames.hasOwnProperty(propName)) {
|
|
var attributeName = DOMAttributeNames[propName];
|
|
propertyInfo.attributeName = attributeName;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
DOMProperty.getPossibleStandardName[attributeName] = propName;
|
|
}
|
|
}
|
|
|
|
if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
|
|
propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];
|
|
}
|
|
|
|
if (DOMPropertyNames.hasOwnProperty(propName)) {
|
|
propertyInfo.propertyName = DOMPropertyNames[propName];
|
|
}
|
|
|
|
if (DOMMutationMethods.hasOwnProperty(propName)) {
|
|
propertyInfo.mutationMethod = DOMMutationMethods[propName];
|
|
}
|
|
|
|
DOMProperty.properties[propName] = propertyInfo;
|
|
}
|
|
}
|
|
};
|
|
|
|
/* eslint-disable max-len */
|
|
var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';
|
|
/* eslint-enable max-len */
|
|
|
|
/**
|
|
* DOMProperty exports lookup objects that can be used like functions:
|
|
*
|
|
* > DOMProperty.isValid['id']
|
|
* true
|
|
* > DOMProperty.isValid['foobar']
|
|
* undefined
|
|
*
|
|
* Although this may be confusing, it performs better in general.
|
|
*
|
|
* @see http://jsperf.com/key-exists
|
|
* @see http://jsperf.com/key-missing
|
|
*/
|
|
var DOMProperty = {
|
|
ID_ATTRIBUTE_NAME: 'data-reactid',
|
|
ROOT_ATTRIBUTE_NAME: 'data-reactroot',
|
|
|
|
ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR,
|
|
ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040',
|
|
|
|
/**
|
|
* Map from property "standard name" to an object with info about how to set
|
|
* the property in the DOM. Each object contains:
|
|
*
|
|
* attributeName:
|
|
* Used when rendering markup or with `*Attribute()`.
|
|
* attributeNamespace
|
|
* propertyName:
|
|
* Used on DOM node instances. (This includes properties that mutate due to
|
|
* external factors.)
|
|
* mutationMethod:
|
|
* If non-null, used instead of the property or `setAttribute()` after
|
|
* initial render.
|
|
* mustUseProperty:
|
|
* Whether the property must be accessed and mutated as an object property.
|
|
* hasBooleanValue:
|
|
* Whether the property should be removed when set to a falsey value.
|
|
* hasNumericValue:
|
|
* Whether the property must be numeric or parse as a numeric and should be
|
|
* removed when set to a falsey value.
|
|
* hasPositiveNumericValue:
|
|
* Whether the property must be positive numeric or parse as a positive
|
|
* numeric and should be removed when set to a falsey value.
|
|
* hasOverloadedBooleanValue:
|
|
* Whether the property can be used as a flag as well as with a value.
|
|
* Removed when strictly equal to false; present without a value when
|
|
* strictly equal to true; present with a value otherwise.
|
|
*/
|
|
properties: {},
|
|
|
|
/**
|
|
* Mapping from lowercase property names to the properly cased version, used
|
|
* to warn in the case of missing properties. Available only in __DEV__.
|
|
*
|
|
* autofocus is predefined, because adding it to the property whitelist
|
|
* causes unintended side effects.
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
getPossibleStandardName: process.env.NODE_ENV !== 'production' ? { autofocus: 'autoFocus' } : null,
|
|
|
|
/**
|
|
* All of the isCustomAttribute() functions that have been injected.
|
|
*/
|
|
_isCustomAttributeFunctions: [],
|
|
|
|
/**
|
|
* Checks whether a property name is a custom attribute.
|
|
* @method
|
|
*/
|
|
isCustomAttribute: function isCustomAttribute(attributeName) {
|
|
for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {
|
|
var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];
|
|
if (isCustomAttributeFn(attributeName)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
injection: DOMPropertyInjection
|
|
};
|
|
|
|
module.exports = DOMProperty;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 18 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Static poolers. Several custom versions for each potential number of
|
|
* arguments. A completely generic pooler is easy to implement, but would
|
|
* require accessing the `arguments` object. In each of these, `this` refers to
|
|
* the Class itself, not an instance. If any others are needed, simply add them
|
|
* here, or in their own files.
|
|
*/
|
|
var oneArgumentPooler = function oneArgumentPooler(copyFieldsFrom) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, copyFieldsFrom);
|
|
return instance;
|
|
} else {
|
|
return new Klass(copyFieldsFrom);
|
|
}
|
|
};
|
|
|
|
var twoArgumentPooler = function twoArgumentPooler(a1, a2) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2);
|
|
}
|
|
};
|
|
|
|
var threeArgumentPooler = function threeArgumentPooler(a1, a2, a3) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2, a3);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2, a3);
|
|
}
|
|
};
|
|
|
|
var fourArgumentPooler = function fourArgumentPooler(a1, a2, a3, a4) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2, a3, a4);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2, a3, a4);
|
|
}
|
|
};
|
|
|
|
var standardReleaser = function standardReleaser(instance) {
|
|
var Klass = this;
|
|
!(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;
|
|
instance.destructor();
|
|
if (Klass.instancePool.length < Klass.poolSize) {
|
|
Klass.instancePool.push(instance);
|
|
}
|
|
};
|
|
|
|
var DEFAULT_POOL_SIZE = 10;
|
|
var DEFAULT_POOLER = oneArgumentPooler;
|
|
|
|
/**
|
|
* Augments `CopyConstructor` to be a poolable class, augmenting only the class
|
|
* itself (statically) not adding any prototypical fields. Any CopyConstructor
|
|
* you give this may have a `poolSize` property, and will look for a
|
|
* prototypical `destructor` on instances.
|
|
*
|
|
* @param {Function} CopyConstructor Constructor that can be used to reset.
|
|
* @param {Function} pooler Customizable pooler.
|
|
*/
|
|
var addPoolingTo = function addPoolingTo(CopyConstructor, pooler) {
|
|
// Casting as any so that flow ignores the actual implementation and trusts
|
|
// it to match the type we declared
|
|
var NewKlass = CopyConstructor;
|
|
NewKlass.instancePool = [];
|
|
NewKlass.getPooled = pooler || DEFAULT_POOLER;
|
|
if (!NewKlass.poolSize) {
|
|
NewKlass.poolSize = DEFAULT_POOL_SIZE;
|
|
}
|
|
NewKlass.release = standardReleaser;
|
|
return NewKlass;
|
|
};
|
|
|
|
var PooledClass = {
|
|
addPoolingTo: addPoolingTo,
|
|
oneArgumentPooler: oneArgumentPooler,
|
|
twoArgumentPooler: twoArgumentPooler,
|
|
threeArgumentPooler: threeArgumentPooler,
|
|
fourArgumentPooler: fourArgumentPooler
|
|
};
|
|
|
|
module.exports = PooledClass;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 19 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
|
|
var warning = __webpack_require__(2);
|
|
var canDefineProperty = __webpack_require__(39);
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
var REACT_ELEMENT_TYPE = __webpack_require__(102);
|
|
|
|
var RESERVED_PROPS = {
|
|
key: true,
|
|
ref: true,
|
|
__self: true,
|
|
__source: true
|
|
};
|
|
|
|
var specialPropKeyWarningShown, specialPropRefWarningShown;
|
|
|
|
function hasValidRef(config) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (hasOwnProperty.call(config, 'ref')) {
|
|
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
|
|
if (getter && getter.isReactWarning) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return config.ref !== undefined;
|
|
}
|
|
|
|
function hasValidKey(config) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (hasOwnProperty.call(config, 'key')) {
|
|
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
|
|
if (getter && getter.isReactWarning) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return config.key !== undefined;
|
|
}
|
|
|
|
function defineKeyPropWarningGetter(props, displayName) {
|
|
var warnAboutAccessingKey = function warnAboutAccessingKey() {
|
|
if (!specialPropKeyWarningShown) {
|
|
specialPropKeyWarningShown = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0;
|
|
}
|
|
};
|
|
warnAboutAccessingKey.isReactWarning = true;
|
|
Object.defineProperty(props, 'key', {
|
|
get: warnAboutAccessingKey,
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
function defineRefPropWarningGetter(props, displayName) {
|
|
var warnAboutAccessingRef = function warnAboutAccessingRef() {
|
|
if (!specialPropRefWarningShown) {
|
|
specialPropRefWarningShown = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0;
|
|
}
|
|
};
|
|
warnAboutAccessingRef.isReactWarning = true;
|
|
Object.defineProperty(props, 'ref', {
|
|
get: warnAboutAccessingRef,
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Factory method to create a new React element. This no longer adheres to
|
|
* the class pattern, so do not use new to call it. Also, no instanceof check
|
|
* will work. Instead test $$typeof field against Symbol.for('react.element') to check
|
|
* if something is a React Element.
|
|
*
|
|
* @param {*} type
|
|
* @param {*} key
|
|
* @param {string|object} ref
|
|
* @param {*} self A *temporary* helper to detect places where `this` is
|
|
* different from the `owner` when React.createElement is called, so that we
|
|
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
|
* functions, and as long as `this` and owner are the same, there will be no
|
|
* change in behavior.
|
|
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
|
* indicating filename, line number, and/or other information.
|
|
* @param {*} owner
|
|
* @param {*} props
|
|
* @internal
|
|
*/
|
|
var ReactElement = function ReactElement(type, key, ref, self, source, owner, props) {
|
|
var element = {
|
|
// This tag allow us to uniquely identify this as a React Element
|
|
$$typeof: REACT_ELEMENT_TYPE,
|
|
|
|
// Built-in properties that belong on the element
|
|
type: type,
|
|
key: key,
|
|
ref: ref,
|
|
props: props,
|
|
|
|
// Record the component responsible for creating this element.
|
|
_owner: owner
|
|
};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// The validation flag is currently mutative. We put it on
|
|
// an external backing store so that we can freeze the whole object.
|
|
// This can be replaced with a WeakMap once they are implemented in
|
|
// commonly used development environments.
|
|
element._store = {};
|
|
|
|
// To make comparing ReactElements easier for testing purposes, we make
|
|
// the validation flag non-enumerable (where possible, which should
|
|
// include every environment we run tests in), so the test framework
|
|
// ignores it.
|
|
if (canDefineProperty) {
|
|
Object.defineProperty(element._store, 'validated', {
|
|
configurable: false,
|
|
enumerable: false,
|
|
writable: true,
|
|
value: false
|
|
});
|
|
// self and source are DEV only properties.
|
|
Object.defineProperty(element, '_self', {
|
|
configurable: false,
|
|
enumerable: false,
|
|
writable: false,
|
|
value: self
|
|
});
|
|
// Two elements created in two different places should be considered
|
|
// equal for testing purposes and therefore we hide it from enumeration.
|
|
Object.defineProperty(element, '_source', {
|
|
configurable: false,
|
|
enumerable: false,
|
|
writable: false,
|
|
value: source
|
|
});
|
|
} else {
|
|
element._store.validated = false;
|
|
element._self = self;
|
|
element._source = source;
|
|
}
|
|
if (Object.freeze) {
|
|
Object.freeze(element.props);
|
|
Object.freeze(element);
|
|
}
|
|
}
|
|
|
|
return element;
|
|
};
|
|
|
|
/**
|
|
* Create and return a new ReactElement of the given type.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.createelement
|
|
*/
|
|
ReactElement.createElement = function (type, config, children) {
|
|
var propName;
|
|
|
|
// Reserved names are extracted
|
|
var props = {};
|
|
|
|
var key = null;
|
|
var ref = null;
|
|
var self = null;
|
|
var source = null;
|
|
|
|
if (config != null) {
|
|
if (hasValidRef(config)) {
|
|
ref = config.ref;
|
|
}
|
|
if (hasValidKey(config)) {
|
|
key = '' + config.key;
|
|
}
|
|
|
|
self = config.__self === undefined ? null : config.__self;
|
|
source = config.__source === undefined ? null : config.__source;
|
|
// Remaining properties are added to a new props object
|
|
for (propName in config) {
|
|
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
props[propName] = config[propName];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Children can be more than one argument, and those are transferred onto
|
|
// the newly allocated props object.
|
|
var childrenLength = arguments.length - 2;
|
|
if (childrenLength === 1) {
|
|
props.children = children;
|
|
} else if (childrenLength > 1) {
|
|
var childArray = Array(childrenLength);
|
|
for (var i = 0; i < childrenLength; i++) {
|
|
childArray[i] = arguments[i + 2];
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (Object.freeze) {
|
|
Object.freeze(childArray);
|
|
}
|
|
}
|
|
props.children = childArray;
|
|
}
|
|
|
|
// Resolve default props
|
|
if (type && type.defaultProps) {
|
|
var defaultProps = type.defaultProps;
|
|
for (propName in defaultProps) {
|
|
if (props[propName] === undefined) {
|
|
props[propName] = defaultProps[propName];
|
|
}
|
|
}
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (key || ref) {
|
|
if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) {
|
|
var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
|
|
if (key) {
|
|
defineKeyPropWarningGetter(props, displayName);
|
|
}
|
|
if (ref) {
|
|
defineRefPropWarningGetter(props, displayName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
|
};
|
|
|
|
/**
|
|
* Return a function that produces ReactElements of a given type.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory
|
|
*/
|
|
ReactElement.createFactory = function (type) {
|
|
var factory = ReactElement.createElement.bind(null, type);
|
|
// Expose the type on the factory and the prototype so that it can be
|
|
// easily accessed on elements. E.g. `<Foo />.type === Foo`.
|
|
// This should not be named `constructor` since this may not be the function
|
|
// that created the element, and it may not even be a constructor.
|
|
// Legacy hook TODO: Warn if this is accessed
|
|
factory.type = type;
|
|
return factory;
|
|
};
|
|
|
|
ReactElement.cloneAndReplaceKey = function (oldElement, newKey) {
|
|
var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
|
|
|
|
return newElement;
|
|
};
|
|
|
|
/**
|
|
* Clone and return a new ReactElement using element as the starting point.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement
|
|
*/
|
|
ReactElement.cloneElement = function (element, config, children) {
|
|
var propName;
|
|
|
|
// Original props are copied
|
|
var props = _assign({}, element.props);
|
|
|
|
// Reserved names are extracted
|
|
var key = element.key;
|
|
var ref = element.ref;
|
|
// Self is preserved since the owner is preserved.
|
|
var self = element._self;
|
|
// Source is preserved since cloneElement is unlikely to be targeted by a
|
|
// transpiler, and the original source is probably a better indicator of the
|
|
// true owner.
|
|
var source = element._source;
|
|
|
|
// Owner will be preserved, unless ref is overridden
|
|
var owner = element._owner;
|
|
|
|
if (config != null) {
|
|
if (hasValidRef(config)) {
|
|
// Silently steal the ref from the parent.
|
|
ref = config.ref;
|
|
owner = ReactCurrentOwner.current;
|
|
}
|
|
if (hasValidKey(config)) {
|
|
key = '' + config.key;
|
|
}
|
|
|
|
// Remaining properties override existing props
|
|
var defaultProps;
|
|
if (element.type && element.type.defaultProps) {
|
|
defaultProps = element.type.defaultProps;
|
|
}
|
|
for (propName in config) {
|
|
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
if (config[propName] === undefined && defaultProps !== undefined) {
|
|
// Resolve default props
|
|
props[propName] = defaultProps[propName];
|
|
} else {
|
|
props[propName] = config[propName];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Children can be more than one argument, and those are transferred onto
|
|
// the newly allocated props object.
|
|
var childrenLength = arguments.length - 2;
|
|
if (childrenLength === 1) {
|
|
props.children = children;
|
|
} else if (childrenLength > 1) {
|
|
var childArray = Array(childrenLength);
|
|
for (var i = 0; i < childrenLength; i++) {
|
|
childArray[i] = arguments[i + 2];
|
|
}
|
|
props.children = childArray;
|
|
}
|
|
|
|
return ReactElement(element.type, key, ref, self, source, owner, props);
|
|
};
|
|
|
|
/**
|
|
* Verifies the object is a ReactElement.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement
|
|
* @param {?object} object
|
|
* @return {boolean} True if `object` is a valid component.
|
|
* @final
|
|
*/
|
|
ReactElement.isValidElement = function (object) {
|
|
return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
};
|
|
|
|
module.exports = ReactElement;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 20 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-2015, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Similar to invariant but only logs a warning if the condition is not met.
|
|
* This can be used to log issues in development environments in critical
|
|
* paths. Removing the logging code for production environments will keep the
|
|
* same logic and follow the same code paths.
|
|
*/
|
|
|
|
var warning = function warning() {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning = function warning(condition, format, args) {
|
|
var len = arguments.length;
|
|
args = new Array(len > 2 ? len - 2 : 0);
|
|
for (var key = 2; key < len; key++) {
|
|
args[key - 2] = arguments[key];
|
|
}
|
|
if (format === undefined) {
|
|
throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
|
|
}
|
|
|
|
if (format.length < 10 || /^[s\W]*$/.test(format)) {
|
|
throw new Error('The warning format should be able to uniquely identify this ' + 'warning. Please, use a more descriptive format than: ' + format);
|
|
}
|
|
|
|
if (!condition) {
|
|
var argIndex = 0;
|
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
|
return args[argIndex++];
|
|
});
|
|
if (typeof console !== 'undefined') {
|
|
console.error(message);
|
|
}
|
|
try {
|
|
// This error was thrown as a convenience so that you can use this stack
|
|
// to find the callsite that caused this warning to fire.
|
|
throw new Error(message);
|
|
} catch (x) {}
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = warning;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 21 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMNamespaces = __webpack_require__(46);
|
|
var setInnerHTML = __webpack_require__(38);
|
|
|
|
var createMicrosoftUnsafeLocalFunction = __webpack_require__(53);
|
|
var setTextContent = __webpack_require__(93);
|
|
|
|
var ELEMENT_NODE_TYPE = 1;
|
|
var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
|
|
|
|
/**
|
|
* In IE (8-11) and Edge, appending nodes with no children is dramatically
|
|
* faster than appending a full subtree, so we essentially queue up the
|
|
* .appendChild calls here and apply them so each node is added to its parent
|
|
* before any children are added.
|
|
*
|
|
* In other browsers, doing so is slower or neutral compared to the other order
|
|
* (in Firefox, twice as slow) so we only do this inversion in IE.
|
|
*
|
|
* See https://github.com/spicyj/innerhtml-vs-createelement-vs-clonenode.
|
|
*/
|
|
var enableLazy = typeof document !== 'undefined' && typeof document.documentMode === 'number' || typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && /\bEdge\/\d/.test(navigator.userAgent);
|
|
|
|
function insertTreeChildren(tree) {
|
|
if (!enableLazy) {
|
|
return;
|
|
}
|
|
var node = tree.node;
|
|
var children = tree.children;
|
|
if (children.length) {
|
|
for (var i = 0; i < children.length; i++) {
|
|
insertTreeBefore(node, children[i], null);
|
|
}
|
|
} else if (tree.html != null) {
|
|
setInnerHTML(node, tree.html);
|
|
} else if (tree.text != null) {
|
|
setTextContent(node, tree.text);
|
|
}
|
|
}
|
|
|
|
var insertTreeBefore = createMicrosoftUnsafeLocalFunction(function (parentNode, tree, referenceNode) {
|
|
// DocumentFragments aren't actually part of the DOM after insertion so
|
|
// appending children won't update the DOM. We need to ensure the fragment
|
|
// is properly populated first, breaking out of our lazy approach for just
|
|
// this level. Also, some <object> plugins (like Flash Player) will read
|
|
// <param> nodes immediately upon insertion into the DOM, so <object>
|
|
// must also be populated prior to insertion into the DOM.
|
|
if (tree.node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE || tree.node.nodeType === ELEMENT_NODE_TYPE && tree.node.nodeName.toLowerCase() === 'object' && (tree.node.namespaceURI == null || tree.node.namespaceURI === DOMNamespaces.html)) {
|
|
insertTreeChildren(tree);
|
|
parentNode.insertBefore(tree.node, referenceNode);
|
|
} else {
|
|
parentNode.insertBefore(tree.node, referenceNode);
|
|
insertTreeChildren(tree);
|
|
}
|
|
});
|
|
|
|
function replaceChildWithTree(oldNode, newTree) {
|
|
oldNode.parentNode.replaceChild(newTree.node, oldNode);
|
|
insertTreeChildren(newTree);
|
|
}
|
|
|
|
function queueChild(parentTree, childTree) {
|
|
if (enableLazy) {
|
|
parentTree.children.push(childTree);
|
|
} else {
|
|
parentTree.node.appendChild(childTree.node);
|
|
}
|
|
}
|
|
|
|
function queueHTML(tree, html) {
|
|
if (enableLazy) {
|
|
tree.html = html;
|
|
} else {
|
|
setInnerHTML(tree.node, html);
|
|
}
|
|
}
|
|
|
|
function queueText(tree, text) {
|
|
if (enableLazy) {
|
|
tree.text = text;
|
|
} else {
|
|
setTextContent(tree.node, text);
|
|
}
|
|
}
|
|
|
|
function toString() {
|
|
return this.node.nodeName;
|
|
}
|
|
|
|
function DOMLazyTree(node) {
|
|
return {
|
|
node: node,
|
|
children: [],
|
|
html: null,
|
|
text: null,
|
|
toString: toString
|
|
};
|
|
}
|
|
|
|
DOMLazyTree.insertTreeBefore = insertTreeBefore;
|
|
DOMLazyTree.replaceChildWithTree = replaceChildWithTree;
|
|
DOMLazyTree.queueChild = queueChild;
|
|
DOMLazyTree.queueHTML = queueHTML;
|
|
DOMLazyTree.queueText = queueText;
|
|
|
|
module.exports = DOMLazyTree;
|
|
|
|
/***/ }),
|
|
/* 22 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactRef = __webpack_require__(187);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
/**
|
|
* Helper to call ReactRef.attachRefs with this composite component, split out
|
|
* to avoid allocations in the transaction mount-ready queue.
|
|
*/
|
|
function attachRefs() {
|
|
ReactRef.attachRefs(this, this._currentElement);
|
|
}
|
|
|
|
var ReactReconciler = {
|
|
/**
|
|
* Initializes the component, renders markup, and registers event listeners.
|
|
*
|
|
* @param {ReactComponent} internalInstance
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {?object} the containing host component instance
|
|
* @param {?object} info about the host container
|
|
* @return {?string} Rendered markup to be inserted into the DOM.
|
|
* @final
|
|
* @internal
|
|
*/
|
|
mountComponent: function mountComponent(internalInstance, transaction, hostParent, hostContainerInfo, context, parentDebugID) // 0 in production and for roots
|
|
{
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onBeforeMountComponent(internalInstance._debugID, internalInstance._currentElement, parentDebugID);
|
|
}
|
|
}
|
|
var markup = internalInstance.mountComponent(transaction, hostParent, hostContainerInfo, context, parentDebugID);
|
|
if (internalInstance._currentElement && internalInstance._currentElement.ref != null) {
|
|
transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onMountComponent(internalInstance._debugID);
|
|
}
|
|
}
|
|
return markup;
|
|
},
|
|
|
|
/**
|
|
* Returns a value that can be passed to
|
|
* ReactComponentEnvironment.replaceNodeWithMarkup.
|
|
*/
|
|
getHostNode: function getHostNode(internalInstance) {
|
|
return internalInstance.getHostNode();
|
|
},
|
|
|
|
/**
|
|
* Releases any resources allocated by `mountComponent`.
|
|
*
|
|
* @final
|
|
* @internal
|
|
*/
|
|
unmountComponent: function unmountComponent(internalInstance, safely) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onBeforeUnmountComponent(internalInstance._debugID);
|
|
}
|
|
}
|
|
ReactRef.detachRefs(internalInstance, internalInstance._currentElement);
|
|
internalInstance.unmountComponent(safely);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onUnmountComponent(internalInstance._debugID);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Update a component using a new element.
|
|
*
|
|
* @param {ReactComponent} internalInstance
|
|
* @param {ReactElement} nextElement
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {object} context
|
|
* @internal
|
|
*/
|
|
receiveComponent: function receiveComponent(internalInstance, nextElement, transaction, context) {
|
|
var prevElement = internalInstance._currentElement;
|
|
|
|
if (nextElement === prevElement && context === internalInstance._context) {
|
|
// Since elements are immutable after the owner is rendered,
|
|
// we can do a cheap identity compare here to determine if this is a
|
|
// superfluous reconcile. It's possible for state to be mutable but such
|
|
// change should trigger an update of the owner which would recreate
|
|
// the element. We explicitly check for the existence of an owner since
|
|
// it's possible for an element created outside a composite to be
|
|
// deeply mutated and reused.
|
|
|
|
// TODO: Bailing out early is just a perf optimization right?
|
|
// TODO: Removing the return statement should affect correctness?
|
|
return;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, nextElement);
|
|
}
|
|
}
|
|
|
|
var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement);
|
|
|
|
if (refsChanged) {
|
|
ReactRef.detachRefs(internalInstance, prevElement);
|
|
}
|
|
|
|
internalInstance.receiveComponent(nextElement, transaction, context);
|
|
|
|
if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) {
|
|
transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Flush any dirty changes in a component.
|
|
*
|
|
* @param {ReactComponent} internalInstance
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
*/
|
|
performUpdateIfNecessary: function performUpdateIfNecessary(internalInstance, transaction, updateBatchNumber) {
|
|
if (internalInstance._updateBatchNumber !== updateBatchNumber) {
|
|
// The component's enqueued batch number should always be the current
|
|
// batch or the following one.
|
|
process.env.NODE_ENV !== 'production' ? warning(internalInstance._updateBatchNumber == null || internalInstance._updateBatchNumber === updateBatchNumber + 1, 'performUpdateIfNecessary: Unexpected batch number (current %s, ' + 'pending %s)', updateBatchNumber, internalInstance._updateBatchNumber) : void 0;
|
|
return;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, internalInstance._currentElement);
|
|
}
|
|
}
|
|
internalInstance.performUpdateIfNecessary(transaction);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (internalInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactReconciler;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 23 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var ReactBaseClasses = __webpack_require__(101);
|
|
var ReactChildren = __webpack_require__(247);
|
|
var ReactDOMFactories = __webpack_require__(248);
|
|
var ReactElement = __webpack_require__(19);
|
|
var ReactPropTypes = __webpack_require__(250);
|
|
var ReactVersion = __webpack_require__(252);
|
|
|
|
var createReactClass = __webpack_require__(254);
|
|
var onlyChild = __webpack_require__(256);
|
|
|
|
var createElement = ReactElement.createElement;
|
|
var createFactory = ReactElement.createFactory;
|
|
var cloneElement = ReactElement.cloneElement;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var lowPriorityWarning = __webpack_require__(63);
|
|
var canDefineProperty = __webpack_require__(39);
|
|
var ReactElementValidator = __webpack_require__(103);
|
|
var didWarnPropTypesDeprecated = false;
|
|
createElement = ReactElementValidator.createElement;
|
|
createFactory = ReactElementValidator.createFactory;
|
|
cloneElement = ReactElementValidator.cloneElement;
|
|
}
|
|
|
|
var __spread = _assign;
|
|
var createMixin = function createMixin(mixin) {
|
|
return mixin;
|
|
};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var warnedForSpread = false;
|
|
var warnedForCreateMixin = false;
|
|
__spread = function __spread() {
|
|
lowPriorityWarning(warnedForSpread, 'React.__spread is deprecated and should not be used. Use ' + 'Object.assign directly or another helper function with similar ' + 'semantics. You may be seeing this warning due to your compiler. ' + 'See https://fb.me/react-spread-deprecation for more details.');
|
|
warnedForSpread = true;
|
|
return _assign.apply(null, arguments);
|
|
};
|
|
|
|
createMixin = function createMixin(mixin) {
|
|
lowPriorityWarning(warnedForCreateMixin, 'React.createMixin is deprecated and should not be used. ' + 'In React v16.0, it will be removed. ' + 'You can use this mixin directly instead. ' + 'See https://fb.me/createmixin-was-never-implemented for more info.');
|
|
warnedForCreateMixin = true;
|
|
return mixin;
|
|
};
|
|
}
|
|
|
|
var React = {
|
|
// Modern
|
|
|
|
Children: {
|
|
map: ReactChildren.map,
|
|
forEach: ReactChildren.forEach,
|
|
count: ReactChildren.count,
|
|
toArray: ReactChildren.toArray,
|
|
only: onlyChild
|
|
},
|
|
|
|
Component: ReactBaseClasses.Component,
|
|
PureComponent: ReactBaseClasses.PureComponent,
|
|
|
|
createElement: createElement,
|
|
cloneElement: cloneElement,
|
|
isValidElement: ReactElement.isValidElement,
|
|
|
|
// Classic
|
|
|
|
PropTypes: ReactPropTypes,
|
|
createClass: createReactClass,
|
|
createFactory: createFactory,
|
|
createMixin: createMixin,
|
|
|
|
// This looks DOM specific but these are actually isomorphic helpers
|
|
// since they are just generating DOM strings.
|
|
DOM: ReactDOMFactories,
|
|
|
|
version: ReactVersion,
|
|
|
|
// Deprecated hook for JSX spread, don't use this for anything.
|
|
__spread: __spread
|
|
};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var warnedForCreateClass = false;
|
|
if (canDefineProperty) {
|
|
Object.defineProperty(React, 'PropTypes', {
|
|
get: function get() {
|
|
lowPriorityWarning(didWarnPropTypesDeprecated, 'Accessing PropTypes via the main React package is deprecated,' + ' and will be removed in React v16.0.' + ' Use the latest available v15.* prop-types package from npm instead.' + ' For info on usage, compatibility, migration and more, see ' + 'https://fb.me/prop-types-docs');
|
|
didWarnPropTypesDeprecated = true;
|
|
return ReactPropTypes;
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(React, 'createClass', {
|
|
get: function get() {
|
|
lowPriorityWarning(warnedForCreateClass, 'Accessing createClass via the main React package is deprecated,' + ' and will be removed in React v16.0.' + " Use a plain JavaScript class instead. If you're not yet " + 'ready to migrate, create-react-class v15.* is available ' + 'on npm as a temporary, drop-in replacement. ' + 'For more info see https://fb.me/react-create-class');
|
|
warnedForCreateClass = true;
|
|
return createReactClass;
|
|
}
|
|
});
|
|
}
|
|
|
|
// React.DOM factories are deprecated. Wrap these methods so that
|
|
// invocations of the React.DOM namespace and alert users to switch
|
|
// to the `react-dom-factories` package.
|
|
React.DOM = {};
|
|
var warnedForFactories = false;
|
|
Object.keys(ReactDOMFactories).forEach(function (factory) {
|
|
React.DOM[factory] = function () {
|
|
if (!warnedForFactories) {
|
|
lowPriorityWarning(false, 'Accessing factories like React.DOM.%s has been deprecated ' + 'and will be removed in v16.0+. Use the ' + 'react-dom-factories package instead. ' + ' Version 1.0 provides a drop-in replacement.' + ' For more info, see https://fb.me/react-dom-factories', factory);
|
|
warnedForFactories = true;
|
|
}
|
|
return ReactDOMFactories[factory].apply(ReactDOMFactories, arguments);
|
|
};
|
|
});
|
|
}
|
|
|
|
module.exports = React;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 24 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* WARNING: DO NOT manually require this module.
|
|
* This is a replacement for `invariant(...)` used by the error code system
|
|
* and will _only_ be required by the corresponding babel pass.
|
|
* It always throws.
|
|
*/
|
|
|
|
function reactProdInvariant(code) {
|
|
var argCount = arguments.length - 1;
|
|
|
|
var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;
|
|
|
|
for (var argIdx = 0; argIdx < argCount; argIdx++) {
|
|
message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);
|
|
}
|
|
|
|
message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';
|
|
|
|
var error = new Error(message);
|
|
error.name = 'Invariant Violation';
|
|
error.framesToPop = 1; // we don't care about reactProdInvariant's own frame
|
|
|
|
throw error;
|
|
}
|
|
|
|
module.exports = reactProdInvariant;
|
|
|
|
/***/ }),
|
|
/* 25 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.__esModule = true;
|
|
var addLeadingSlash = exports.addLeadingSlash = function addLeadingSlash(path) {
|
|
return path.charAt(0) === '/' ? path : '/' + path;
|
|
};
|
|
|
|
var stripLeadingSlash = exports.stripLeadingSlash = function stripLeadingSlash(path) {
|
|
return path.charAt(0) === '/' ? path.substr(1) : path;
|
|
};
|
|
|
|
var hasBasename = exports.hasBasename = function hasBasename(path, prefix) {
|
|
return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
|
|
};
|
|
|
|
var stripBasename = exports.stripBasename = function stripBasename(path, prefix) {
|
|
return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
|
|
};
|
|
|
|
var stripTrailingSlash = exports.stripTrailingSlash = function stripTrailingSlash(path) {
|
|
return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;
|
|
};
|
|
|
|
var parsePath = exports.parsePath = function parsePath(path) {
|
|
var pathname = path || '/';
|
|
var search = '';
|
|
var hash = '';
|
|
|
|
var hashIndex = pathname.indexOf('#');
|
|
if (hashIndex !== -1) {
|
|
hash = pathname.substr(hashIndex);
|
|
pathname = pathname.substr(0, hashIndex);
|
|
}
|
|
|
|
var searchIndex = pathname.indexOf('?');
|
|
if (searchIndex !== -1) {
|
|
search = pathname.substr(searchIndex);
|
|
pathname = pathname.substr(0, searchIndex);
|
|
}
|
|
|
|
return {
|
|
pathname: pathname,
|
|
search: search === '?' ? '' : search,
|
|
hash: hash === '#' ? '' : hash
|
|
};
|
|
};
|
|
|
|
var createPath = exports.createPath = function createPath(location) {
|
|
var pathname = location.pathname,
|
|
search = location.search,
|
|
hash = location.hash;
|
|
|
|
var path = pathname || '/';
|
|
|
|
if (search && search !== '?') path += search.charAt(0) === '?' ? search : '?' + search;
|
|
|
|
if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : '#' + hash;
|
|
|
|
return path;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 26 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-2015, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Use invariant() to assert state which your program assumes to be true.
|
|
*
|
|
* Provide sprintf-style format (only %s is supported) and arguments
|
|
* to provide information about what broke and what you were
|
|
* expecting.
|
|
*
|
|
* The invariant message will be stripped in production, but the invariant
|
|
* will remain to ensure logic does not differ in production.
|
|
*/
|
|
|
|
var invariant = function invariant(condition, format, a, b, c, d, e, f) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (format === undefined) {
|
|
throw new Error('invariant requires an error message argument');
|
|
}
|
|
}
|
|
|
|
if (!condition) {
|
|
var error;
|
|
if (format === undefined) {
|
|
error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
|
|
} else {
|
|
var args = [a, b, c, d, e, f];
|
|
var argIndex = 0;
|
|
error = new Error(format.replace(/%s/g, function () {
|
|
return args[argIndex++];
|
|
}));
|
|
error.name = 'Invariant Violation';
|
|
}
|
|
|
|
error.framesToPop = 1; // we don't care about invariant's own frame
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
module.exports = invariant;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 27 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var EventPluginRegistry = __webpack_require__(33);
|
|
var EventPluginUtils = __webpack_require__(47);
|
|
var ReactErrorUtils = __webpack_require__(51);
|
|
|
|
var accumulateInto = __webpack_require__(86);
|
|
var forEachAccumulated = __webpack_require__(87);
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Internal store for event listeners
|
|
*/
|
|
var listenerBank = {};
|
|
|
|
/**
|
|
* Internal queue of events that have accumulated their dispatches and are
|
|
* waiting to have their dispatches executed.
|
|
*/
|
|
var eventQueue = null;
|
|
|
|
/**
|
|
* Dispatches an event and releases it back into the pool, unless persistent.
|
|
*
|
|
* @param {?object} event Synthetic event to be dispatched.
|
|
* @param {boolean} simulated If the event is simulated (changes exn behavior)
|
|
* @private
|
|
*/
|
|
var executeDispatchesAndRelease = function executeDispatchesAndRelease(event, simulated) {
|
|
if (event) {
|
|
EventPluginUtils.executeDispatchesInOrder(event, simulated);
|
|
|
|
if (!event.isPersistent()) {
|
|
event.constructor.release(event);
|
|
}
|
|
}
|
|
};
|
|
var executeDispatchesAndReleaseSimulated = function executeDispatchesAndReleaseSimulated(e) {
|
|
return executeDispatchesAndRelease(e, true);
|
|
};
|
|
var executeDispatchesAndReleaseTopLevel = function executeDispatchesAndReleaseTopLevel(e) {
|
|
return executeDispatchesAndRelease(e, false);
|
|
};
|
|
|
|
var getDictionaryKey = function getDictionaryKey(inst) {
|
|
// Prevents V8 performance issue:
|
|
// https://github.com/facebook/react/pull/7232
|
|
return '.' + inst._rootNodeID;
|
|
};
|
|
|
|
function isInteractive(tag) {
|
|
return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
|
|
}
|
|
|
|
function shouldPreventMouseEvent(name, type, props) {
|
|
switch (name) {
|
|
case 'onClick':
|
|
case 'onClickCapture':
|
|
case 'onDoubleClick':
|
|
case 'onDoubleClickCapture':
|
|
case 'onMouseDown':
|
|
case 'onMouseDownCapture':
|
|
case 'onMouseMove':
|
|
case 'onMouseMoveCapture':
|
|
case 'onMouseUp':
|
|
case 'onMouseUpCapture':
|
|
return !!(props.disabled && isInteractive(type));
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This is a unified interface for event plugins to be installed and configured.
|
|
*
|
|
* Event plugins can implement the following properties:
|
|
*
|
|
* `extractEvents` {function(string, DOMEventTarget, string, object): *}
|
|
* Required. When a top-level event is fired, this method is expected to
|
|
* extract synthetic events that will in turn be queued and dispatched.
|
|
*
|
|
* `eventTypes` {object}
|
|
* Optional, plugins that fire events must publish a mapping of registration
|
|
* names that are used to register listeners. Values of this mapping must
|
|
* be objects that contain `registrationName` or `phasedRegistrationNames`.
|
|
*
|
|
* `executeDispatch` {function(object, function, string)}
|
|
* Optional, allows plugins to override how an event gets dispatched. By
|
|
* default, the listener is simply invoked.
|
|
*
|
|
* Each plugin that is injected into `EventsPluginHub` is immediately operable.
|
|
*
|
|
* @public
|
|
*/
|
|
var EventPluginHub = {
|
|
/**
|
|
* Methods for injecting dependencies.
|
|
*/
|
|
injection: {
|
|
/**
|
|
* @param {array} InjectedEventPluginOrder
|
|
* @public
|
|
*/
|
|
injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,
|
|
|
|
/**
|
|
* @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
|
*/
|
|
injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName
|
|
},
|
|
|
|
/**
|
|
* Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent.
|
|
*
|
|
* @param {object} inst The instance, which is the source of events.
|
|
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
|
* @param {function} listener The callback to store.
|
|
*/
|
|
putListener: function putListener(inst, registrationName, listener) {
|
|
!(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener === 'undefined' ? 'undefined' : _typeof(listener)) : _prodInvariant('94', registrationName, typeof listener === 'undefined' ? 'undefined' : _typeof(listener)) : void 0;
|
|
|
|
var key = getDictionaryKey(inst);
|
|
var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});
|
|
bankForRegistrationName[key] = listener;
|
|
|
|
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
|
if (PluginModule && PluginModule.didPutListener) {
|
|
PluginModule.didPutListener(inst, registrationName, listener);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @param {object} inst The instance, which is the source of events.
|
|
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
|
* @return {?function} The stored callback.
|
|
*/
|
|
getListener: function getListener(inst, registrationName) {
|
|
// TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
|
|
// live here; needs to be moved to a better place soon
|
|
var bankForRegistrationName = listenerBank[registrationName];
|
|
if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, inst._currentElement.props)) {
|
|
return null;
|
|
}
|
|
var key = getDictionaryKey(inst);
|
|
return bankForRegistrationName && bankForRegistrationName[key];
|
|
},
|
|
|
|
/**
|
|
* Deletes a listener from the registration bank.
|
|
*
|
|
* @param {object} inst The instance, which is the source of events.
|
|
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
|
*/
|
|
deleteListener: function deleteListener(inst, registrationName) {
|
|
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
|
if (PluginModule && PluginModule.willDeleteListener) {
|
|
PluginModule.willDeleteListener(inst, registrationName);
|
|
}
|
|
|
|
var bankForRegistrationName = listenerBank[registrationName];
|
|
// TODO: This should never be null -- when is it?
|
|
if (bankForRegistrationName) {
|
|
var key = getDictionaryKey(inst);
|
|
delete bankForRegistrationName[key];
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Deletes all listeners for the DOM element with the supplied ID.
|
|
*
|
|
* @param {object} inst The instance, which is the source of events.
|
|
*/
|
|
deleteAllListeners: function deleteAllListeners(inst) {
|
|
var key = getDictionaryKey(inst);
|
|
for (var registrationName in listenerBank) {
|
|
if (!listenerBank.hasOwnProperty(registrationName)) {
|
|
continue;
|
|
}
|
|
|
|
if (!listenerBank[registrationName][key]) {
|
|
continue;
|
|
}
|
|
|
|
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
|
if (PluginModule && PluginModule.willDeleteListener) {
|
|
PluginModule.willDeleteListener(inst, registrationName);
|
|
}
|
|
|
|
delete listenerBank[registrationName][key];
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Allows registered plugins an opportunity to extract events from top-level
|
|
* native browser events.
|
|
*
|
|
* @return {*} An accumulation of synthetic events.
|
|
* @internal
|
|
*/
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var events;
|
|
var plugins = EventPluginRegistry.plugins;
|
|
for (var i = 0; i < plugins.length; i++) {
|
|
// Not every plugin in the ordering may be loaded at runtime.
|
|
var possiblePlugin = plugins[i];
|
|
if (possiblePlugin) {
|
|
var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
|
|
if (extractedEvents) {
|
|
events = accumulateInto(events, extractedEvents);
|
|
}
|
|
}
|
|
}
|
|
return events;
|
|
},
|
|
|
|
/**
|
|
* Enqueues a synthetic event that should be dispatched when
|
|
* `processEventQueue` is invoked.
|
|
*
|
|
* @param {*} events An accumulation of synthetic events.
|
|
* @internal
|
|
*/
|
|
enqueueEvents: function enqueueEvents(events) {
|
|
if (events) {
|
|
eventQueue = accumulateInto(eventQueue, events);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Dispatches all synthetic events on the event queue.
|
|
*
|
|
* @internal
|
|
*/
|
|
processEventQueue: function processEventQueue(simulated) {
|
|
// Set `eventQueue` to null before processing it so that we can tell if more
|
|
// events get enqueued while processing.
|
|
var processingEventQueue = eventQueue;
|
|
eventQueue = null;
|
|
if (simulated) {
|
|
forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);
|
|
} else {
|
|
forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
|
|
}
|
|
!!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : _prodInvariant('95') : void 0;
|
|
// This would be a good time to rethrow if any of the event handlers threw.
|
|
ReactErrorUtils.rethrowCaughtError();
|
|
},
|
|
|
|
/**
|
|
* These are needed for tests only. Do not use!
|
|
*/
|
|
__purge: function __purge() {
|
|
listenerBank = {};
|
|
},
|
|
|
|
__getListenerBank: function __getListenerBank() {
|
|
return listenerBank;
|
|
}
|
|
};
|
|
|
|
module.exports = EventPluginHub;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 28 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var EventPluginHub = __webpack_require__(27);
|
|
var EventPluginUtils = __webpack_require__(47);
|
|
|
|
var accumulateInto = __webpack_require__(86);
|
|
var forEachAccumulated = __webpack_require__(87);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var getListener = EventPluginHub.getListener;
|
|
|
|
/**
|
|
* Some event types have a notion of different registration names for different
|
|
* "phases" of propagation. This finds listeners by a given phase.
|
|
*/
|
|
function listenerAtPhase(inst, event, propagationPhase) {
|
|
var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
|
|
return getListener(inst, registrationName);
|
|
}
|
|
|
|
/**
|
|
* Tags a `SyntheticEvent` with dispatched listeners. Creating this function
|
|
* here, allows us to not have to bind or create functions for each event.
|
|
* Mutating the event's members allows us to not have to create a wrapping
|
|
* "dispatch" object that pairs the event with the listener.
|
|
*/
|
|
function accumulateDirectionalDispatches(inst, phase, event) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(inst, 'Dispatching inst must not be null') : void 0;
|
|
}
|
|
var listener = listenerAtPhase(inst, event, phase);
|
|
if (listener) {
|
|
event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
|
|
event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Collect dispatches (must be entirely collected before dispatching - see unit
|
|
* tests). Lazily allocate the array to conserve memory. We must loop through
|
|
* each event and perform the traversal for each one. We cannot perform a
|
|
* single traversal for the entire collection of events because each event may
|
|
* have a different target.
|
|
*/
|
|
function accumulateTwoPhaseDispatchesSingle(event) {
|
|
if (event && event.dispatchConfig.phasedRegistrationNames) {
|
|
EventPluginUtils.traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.
|
|
*/
|
|
function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
|
|
if (event && event.dispatchConfig.phasedRegistrationNames) {
|
|
var targetInst = event._targetInst;
|
|
var parentInst = targetInst ? EventPluginUtils.getParentInstance(targetInst) : null;
|
|
EventPluginUtils.traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Accumulates without regard to direction, does not look for phased
|
|
* registration names. Same as `accumulateDirectDispatchesSingle` but without
|
|
* requiring that the `dispatchMarker` be the same as the dispatched ID.
|
|
*/
|
|
function accumulateDispatches(inst, ignoredDirection, event) {
|
|
if (event && event.dispatchConfig.registrationName) {
|
|
var registrationName = event.dispatchConfig.registrationName;
|
|
var listener = getListener(inst, registrationName);
|
|
if (listener) {
|
|
event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
|
|
event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Accumulates dispatches on an `SyntheticEvent`, but only for the
|
|
* `dispatchMarker`.
|
|
* @param {SyntheticEvent} event
|
|
*/
|
|
function accumulateDirectDispatchesSingle(event) {
|
|
if (event && event.dispatchConfig.registrationName) {
|
|
accumulateDispatches(event._targetInst, null, event);
|
|
}
|
|
}
|
|
|
|
function accumulateTwoPhaseDispatches(events) {
|
|
forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
|
|
}
|
|
|
|
function accumulateTwoPhaseDispatchesSkipTarget(events) {
|
|
forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);
|
|
}
|
|
|
|
function accumulateEnterLeaveDispatches(leave, enter, from, to) {
|
|
EventPluginUtils.traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
|
|
}
|
|
|
|
function accumulateDirectDispatches(events) {
|
|
forEachAccumulated(events, accumulateDirectDispatchesSingle);
|
|
}
|
|
|
|
/**
|
|
* A small set of propagation patterns, each of which will accept a small amount
|
|
* of information, and generate a set of "dispatch ready event objects" - which
|
|
* are sets of events that have already been annotated with a set of dispatched
|
|
* listener functions/ids. The API is designed this way to discourage these
|
|
* propagation strategies from actually executing the dispatches, since we
|
|
* always want to collect the entire set of dispatches before executing event a
|
|
* single one.
|
|
*
|
|
* @constructor EventPropagators
|
|
*/
|
|
var EventPropagators = {
|
|
accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
|
|
accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
|
|
accumulateDirectDispatches: accumulateDirectDispatches,
|
|
accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches
|
|
};
|
|
|
|
module.exports = EventPropagators;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 29 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* `ReactInstanceMap` maintains a mapping from a public facing stateful
|
|
* instance (key) and the internal representation (value). This allows public
|
|
* methods to accept the user facing instance as an argument and map them back
|
|
* to internal methods.
|
|
*/
|
|
|
|
// TODO: Replace this with ES6: var ReactInstanceMap = new Map();
|
|
|
|
var ReactInstanceMap = {
|
|
/**
|
|
* This API should be called `delete` but we'd have to make sure to always
|
|
* transform these to strings for IE support. When this transform is fully
|
|
* supported we can rename it.
|
|
*/
|
|
remove: function remove(key) {
|
|
key._reactInternalInstance = undefined;
|
|
},
|
|
|
|
get: function get(key) {
|
|
return key._reactInternalInstance;
|
|
},
|
|
|
|
has: function has(key) {
|
|
return key._reactInternalInstance !== undefined;
|
|
},
|
|
|
|
set: function set(key, value) {
|
|
key._reactInternalInstance = value;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactInstanceMap;
|
|
|
|
/***/ }),
|
|
/* 30 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
var getEventTarget = __webpack_require__(56);
|
|
|
|
/**
|
|
* @interface UIEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var UIEventInterface = {
|
|
view: function view(event) {
|
|
if (event.view) {
|
|
return event.view;
|
|
}
|
|
|
|
var target = getEventTarget(event);
|
|
if (target.window === target) {
|
|
// target is a window object
|
|
return target;
|
|
}
|
|
|
|
var doc = target.ownerDocument;
|
|
// TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
|
|
if (doc) {
|
|
return doc.defaultView || doc.parentWindow;
|
|
} else {
|
|
return window;
|
|
}
|
|
},
|
|
detail: function detail(event) {
|
|
return event.detail || 0;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticEvent}
|
|
*/
|
|
function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);
|
|
|
|
module.exports = SyntheticUIEvent;
|
|
|
|
/***/ }),
|
|
/* 31 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = ItemList;
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _item = __webpack_require__(269);
|
|
|
|
var _item2 = _interopRequireDefault(_item);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function ItemList(_ref) {
|
|
var items = _ref.items,
|
|
title = _ref.title,
|
|
headerExtras = _ref.headerExtras,
|
|
handleItemClick = _ref.handleItemClick;
|
|
|
|
var elements = items.map(function (item, idx) {
|
|
return _react2.default.createElement(_item2.default, { item: item, key: idx, selectMode: false, handleClick: handleItemClick || function () {} });
|
|
});
|
|
|
|
return _react2.default.createElement(
|
|
'div',
|
|
{ className: title.toLowerCase() },
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: title.toLowerCase() + '-intro' },
|
|
_react2.default.createElement(
|
|
'span',
|
|
null,
|
|
title
|
|
),
|
|
headerExtras || ''
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'content' },
|
|
elements
|
|
)
|
|
);
|
|
}
|
|
|
|
/***/ }),
|
|
/* 32 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var emptyObject = {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Object.freeze(emptyObject);
|
|
}
|
|
|
|
module.exports = emptyObject;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 33 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Injectable ordering of event plugins.
|
|
*/
|
|
var eventPluginOrder = null;
|
|
|
|
/**
|
|
* Injectable mapping from names to event plugin modules.
|
|
*/
|
|
var namesToPlugins = {};
|
|
|
|
/**
|
|
* Recomputes the plugin list using the injected plugins and plugin ordering.
|
|
*
|
|
* @private
|
|
*/
|
|
function recomputePluginOrdering() {
|
|
if (!eventPluginOrder) {
|
|
// Wait until an `eventPluginOrder` is injected.
|
|
return;
|
|
}
|
|
for (var pluginName in namesToPlugins) {
|
|
var pluginModule = namesToPlugins[pluginName];
|
|
var pluginIndex = eventPluginOrder.indexOf(pluginName);
|
|
!(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : _prodInvariant('96', pluginName) : void 0;
|
|
if (EventPluginRegistry.plugins[pluginIndex]) {
|
|
continue;
|
|
}
|
|
!pluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : _prodInvariant('97', pluginName) : void 0;
|
|
EventPluginRegistry.plugins[pluginIndex] = pluginModule;
|
|
var publishedEvents = pluginModule.eventTypes;
|
|
for (var eventName in publishedEvents) {
|
|
!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : _prodInvariant('98', eventName, pluginName) : void 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Publishes an event so that it can be dispatched by the supplied plugin.
|
|
*
|
|
* @param {object} dispatchConfig Dispatch configuration for the event.
|
|
* @param {object} PluginModule Plugin publishing the event.
|
|
* @return {boolean} True if the event was successfully published.
|
|
* @private
|
|
*/
|
|
function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
|
|
!!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : _prodInvariant('99', eventName) : void 0;
|
|
EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;
|
|
|
|
var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
|
if (phasedRegistrationNames) {
|
|
for (var phaseName in phasedRegistrationNames) {
|
|
if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
|
|
var phasedRegistrationName = phasedRegistrationNames[phaseName];
|
|
publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
|
|
}
|
|
}
|
|
return true;
|
|
} else if (dispatchConfig.registrationName) {
|
|
publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Publishes a registration name that is used to identify dispatched events and
|
|
* can be used with `EventPluginHub.putListener` to register listeners.
|
|
*
|
|
* @param {string} registrationName Registration name to add.
|
|
* @param {object} PluginModule Plugin publishing the event.
|
|
* @private
|
|
*/
|
|
function publishRegistrationName(registrationName, pluginModule, eventName) {
|
|
!!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : _prodInvariant('100', registrationName) : void 0;
|
|
EventPluginRegistry.registrationNameModules[registrationName] = pluginModule;
|
|
EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var lowerCasedName = registrationName.toLowerCase();
|
|
EventPluginRegistry.possibleRegistrationNames[lowerCasedName] = registrationName;
|
|
|
|
if (registrationName === 'onDoubleClick') {
|
|
EventPluginRegistry.possibleRegistrationNames.ondblclick = registrationName;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers plugins so that they can extract and dispatch events.
|
|
*
|
|
* @see {EventPluginHub}
|
|
*/
|
|
var EventPluginRegistry = {
|
|
/**
|
|
* Ordered list of injected plugins.
|
|
*/
|
|
plugins: [],
|
|
|
|
/**
|
|
* Mapping from event name to dispatch config
|
|
*/
|
|
eventNameDispatchConfigs: {},
|
|
|
|
/**
|
|
* Mapping from registration name to plugin module
|
|
*/
|
|
registrationNameModules: {},
|
|
|
|
/**
|
|
* Mapping from registration name to event name
|
|
*/
|
|
registrationNameDependencies: {},
|
|
|
|
/**
|
|
* Mapping from lowercase registration names to the properly cased version,
|
|
* used to warn in the case of missing event handlers. Available
|
|
* only in __DEV__.
|
|
* @type {Object}
|
|
*/
|
|
possibleRegistrationNames: process.env.NODE_ENV !== 'production' ? {} : null,
|
|
// Trust the developer to only use possibleRegistrationNames in __DEV__
|
|
|
|
/**
|
|
* Injects an ordering of plugins (by plugin name). This allows the ordering
|
|
* to be decoupled from injection of the actual plugins so that ordering is
|
|
* always deterministic regardless of packaging, on-the-fly injection, etc.
|
|
*
|
|
* @param {array} InjectedEventPluginOrder
|
|
* @internal
|
|
* @see {EventPluginHub.injection.injectEventPluginOrder}
|
|
*/
|
|
injectEventPluginOrder: function injectEventPluginOrder(injectedEventPluginOrder) {
|
|
!!eventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : _prodInvariant('101') : void 0;
|
|
// Clone the ordering so it cannot be dynamically mutated.
|
|
eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
|
|
recomputePluginOrdering();
|
|
},
|
|
|
|
/**
|
|
* Injects plugins to be used by `EventPluginHub`. The plugin names must be
|
|
* in the ordering injected by `injectEventPluginOrder`.
|
|
*
|
|
* Plugins can be injected as part of page initialization or on-the-fly.
|
|
*
|
|
* @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
|
* @internal
|
|
* @see {EventPluginHub.injection.injectEventPluginsByName}
|
|
*/
|
|
injectEventPluginsByName: function injectEventPluginsByName(injectedNamesToPlugins) {
|
|
var isOrderingDirty = false;
|
|
for (var pluginName in injectedNamesToPlugins) {
|
|
if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
|
|
continue;
|
|
}
|
|
var pluginModule = injectedNamesToPlugins[pluginName];
|
|
if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
|
|
!!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : _prodInvariant('102', pluginName) : void 0;
|
|
namesToPlugins[pluginName] = pluginModule;
|
|
isOrderingDirty = true;
|
|
}
|
|
}
|
|
if (isOrderingDirty) {
|
|
recomputePluginOrdering();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Looks up the plugin for the supplied event.
|
|
*
|
|
* @param {object} event A synthetic event.
|
|
* @return {?object} The plugin that created the supplied event.
|
|
* @internal
|
|
*/
|
|
getPluginModuleForEvent: function getPluginModuleForEvent(event) {
|
|
var dispatchConfig = event.dispatchConfig;
|
|
if (dispatchConfig.registrationName) {
|
|
return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;
|
|
}
|
|
if (dispatchConfig.phasedRegistrationNames !== undefined) {
|
|
// pulling phasedRegistrationNames out of dispatchConfig helps Flow see
|
|
// that it is not undefined.
|
|
var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
|
|
|
for (var phase in phasedRegistrationNames) {
|
|
if (!phasedRegistrationNames.hasOwnProperty(phase)) {
|
|
continue;
|
|
}
|
|
var pluginModule = EventPluginRegistry.registrationNameModules[phasedRegistrationNames[phase]];
|
|
if (pluginModule) {
|
|
return pluginModule;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
/**
|
|
* Exposed for unit testing.
|
|
* @private
|
|
*/
|
|
_resetEventPlugins: function _resetEventPlugins() {
|
|
eventPluginOrder = null;
|
|
for (var pluginName in namesToPlugins) {
|
|
if (namesToPlugins.hasOwnProperty(pluginName)) {
|
|
delete namesToPlugins[pluginName];
|
|
}
|
|
}
|
|
EventPluginRegistry.plugins.length = 0;
|
|
|
|
var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;
|
|
for (var eventName in eventNameDispatchConfigs) {
|
|
if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {
|
|
delete eventNameDispatchConfigs[eventName];
|
|
}
|
|
}
|
|
|
|
var registrationNameModules = EventPluginRegistry.registrationNameModules;
|
|
for (var registrationName in registrationNameModules) {
|
|
if (registrationNameModules.hasOwnProperty(registrationName)) {
|
|
delete registrationNameModules[registrationName];
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var possibleRegistrationNames = EventPluginRegistry.possibleRegistrationNames;
|
|
for (var lowerCasedName in possibleRegistrationNames) {
|
|
if (possibleRegistrationNames.hasOwnProperty(lowerCasedName)) {
|
|
delete possibleRegistrationNames[lowerCasedName];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = EventPluginRegistry;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 34 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var EventPluginRegistry = __webpack_require__(33);
|
|
var ReactEventEmitterMixin = __webpack_require__(177);
|
|
var ViewportMetrics = __webpack_require__(85);
|
|
|
|
var getVendorPrefixedEventName = __webpack_require__(212);
|
|
var isEventSupported = __webpack_require__(57);
|
|
|
|
/**
|
|
* Summary of `ReactBrowserEventEmitter` event handling:
|
|
*
|
|
* - Top-level delegation is used to trap most native browser events. This
|
|
* may only occur in the main thread and is the responsibility of
|
|
* ReactEventListener, which is injected and can therefore support pluggable
|
|
* event sources. This is the only work that occurs in the main thread.
|
|
*
|
|
* - We normalize and de-duplicate events to account for browser quirks. This
|
|
* may be done in the worker thread.
|
|
*
|
|
* - Forward these native events (with the associated top-level type used to
|
|
* trap it) to `EventPluginHub`, which in turn will ask plugins if they want
|
|
* to extract any synthetic events.
|
|
*
|
|
* - The `EventPluginHub` will then process each event by annotating them with
|
|
* "dispatches", a sequence of listeners and IDs that care about that event.
|
|
*
|
|
* - The `EventPluginHub` then dispatches the events.
|
|
*
|
|
* Overview of React and the event system:
|
|
*
|
|
* +------------+ .
|
|
* | DOM | .
|
|
* +------------+ .
|
|
* | .
|
|
* v .
|
|
* +------------+ .
|
|
* | ReactEvent | .
|
|
* | Listener | .
|
|
* +------------+ . +-----------+
|
|
* | . +--------+|SimpleEvent|
|
|
* | . | |Plugin |
|
|
* +-----|------+ . v +-----------+
|
|
* | | | . +--------------+ +------------+
|
|
* | +-----------.--->|EventPluginHub| | Event |
|
|
* | | . | | +-----------+ | Propagators|
|
|
* | ReactEvent | . | | |TapEvent | |------------|
|
|
* | Emitter | . | |<---+|Plugin | |other plugin|
|
|
* | | . | | +-----------+ | utilities |
|
|
* | +-----------.--->| | +------------+
|
|
* | | | . +--------------+
|
|
* +-----|------+ . ^ +-----------+
|
|
* | . | |Enter/Leave|
|
|
* + . +-------+|Plugin |
|
|
* +-------------+ . +-----------+
|
|
* | application | .
|
|
* |-------------| .
|
|
* | | .
|
|
* | | .
|
|
* +-------------+ .
|
|
* .
|
|
* React Core . General Purpose Event Plugin System
|
|
*/
|
|
|
|
var hasEventPageXY;
|
|
var alreadyListeningTo = {};
|
|
var isMonitoringScrollValue = false;
|
|
var reactTopListenersCounter = 0;
|
|
|
|
// For events like 'submit' which don't consistently bubble (which we trap at a
|
|
// lower node than `document`), binding at `document` would cause duplicate
|
|
// events so we don't include them here
|
|
var topEventMapping = {
|
|
topAbort: 'abort',
|
|
topAnimationEnd: getVendorPrefixedEventName('animationend') || 'animationend',
|
|
topAnimationIteration: getVendorPrefixedEventName('animationiteration') || 'animationiteration',
|
|
topAnimationStart: getVendorPrefixedEventName('animationstart') || 'animationstart',
|
|
topBlur: 'blur',
|
|
topCanPlay: 'canplay',
|
|
topCanPlayThrough: 'canplaythrough',
|
|
topChange: 'change',
|
|
topClick: 'click',
|
|
topCompositionEnd: 'compositionend',
|
|
topCompositionStart: 'compositionstart',
|
|
topCompositionUpdate: 'compositionupdate',
|
|
topContextMenu: 'contextmenu',
|
|
topCopy: 'copy',
|
|
topCut: 'cut',
|
|
topDoubleClick: 'dblclick',
|
|
topDrag: 'drag',
|
|
topDragEnd: 'dragend',
|
|
topDragEnter: 'dragenter',
|
|
topDragExit: 'dragexit',
|
|
topDragLeave: 'dragleave',
|
|
topDragOver: 'dragover',
|
|
topDragStart: 'dragstart',
|
|
topDrop: 'drop',
|
|
topDurationChange: 'durationchange',
|
|
topEmptied: 'emptied',
|
|
topEncrypted: 'encrypted',
|
|
topEnded: 'ended',
|
|
topError: 'error',
|
|
topFocus: 'focus',
|
|
topInput: 'input',
|
|
topKeyDown: 'keydown',
|
|
topKeyPress: 'keypress',
|
|
topKeyUp: 'keyup',
|
|
topLoadedData: 'loadeddata',
|
|
topLoadedMetadata: 'loadedmetadata',
|
|
topLoadStart: 'loadstart',
|
|
topMouseDown: 'mousedown',
|
|
topMouseMove: 'mousemove',
|
|
topMouseOut: 'mouseout',
|
|
topMouseOver: 'mouseover',
|
|
topMouseUp: 'mouseup',
|
|
topPaste: 'paste',
|
|
topPause: 'pause',
|
|
topPlay: 'play',
|
|
topPlaying: 'playing',
|
|
topProgress: 'progress',
|
|
topRateChange: 'ratechange',
|
|
topScroll: 'scroll',
|
|
topSeeked: 'seeked',
|
|
topSeeking: 'seeking',
|
|
topSelectionChange: 'selectionchange',
|
|
topStalled: 'stalled',
|
|
topSuspend: 'suspend',
|
|
topTextInput: 'textInput',
|
|
topTimeUpdate: 'timeupdate',
|
|
topTouchCancel: 'touchcancel',
|
|
topTouchEnd: 'touchend',
|
|
topTouchMove: 'touchmove',
|
|
topTouchStart: 'touchstart',
|
|
topTransitionEnd: getVendorPrefixedEventName('transitionend') || 'transitionend',
|
|
topVolumeChange: 'volumechange',
|
|
topWaiting: 'waiting',
|
|
topWheel: 'wheel'
|
|
};
|
|
|
|
/**
|
|
* To ensure no conflicts with other potential React instances on the page
|
|
*/
|
|
var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);
|
|
|
|
function getListeningForDocument(mountAt) {
|
|
// In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`
|
|
// directly.
|
|
if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {
|
|
mountAt[topListenersIDKey] = reactTopListenersCounter++;
|
|
alreadyListeningTo[mountAt[topListenersIDKey]] = {};
|
|
}
|
|
return alreadyListeningTo[mountAt[topListenersIDKey]];
|
|
}
|
|
|
|
/**
|
|
* `ReactBrowserEventEmitter` is used to attach top-level event listeners. For
|
|
* example:
|
|
*
|
|
* EventPluginHub.putListener('myID', 'onClick', myFunction);
|
|
*
|
|
* This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.
|
|
*
|
|
* @internal
|
|
*/
|
|
var ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, {
|
|
/**
|
|
* Injectable event backend
|
|
*/
|
|
ReactEventListener: null,
|
|
|
|
injection: {
|
|
/**
|
|
* @param {object} ReactEventListener
|
|
*/
|
|
injectReactEventListener: function injectReactEventListener(ReactEventListener) {
|
|
ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);
|
|
ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Sets whether or not any created callbacks should be enabled.
|
|
*
|
|
* @param {boolean} enabled True if callbacks should be enabled.
|
|
*/
|
|
setEnabled: function setEnabled(enabled) {
|
|
if (ReactBrowserEventEmitter.ReactEventListener) {
|
|
ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @return {boolean} True if callbacks are enabled.
|
|
*/
|
|
isEnabled: function isEnabled() {
|
|
return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());
|
|
},
|
|
|
|
/**
|
|
* We listen for bubbled touch events on the document object.
|
|
*
|
|
* Firefox v8.01 (and possibly others) exhibited strange behavior when
|
|
* mounting `onmousemove` events at some node that was not the document
|
|
* element. The symptoms were that if your mouse is not moving over something
|
|
* contained within that mount point (for example on the background) the
|
|
* top-level listeners for `onmousemove` won't be called. However, if you
|
|
* register the `mousemove` on the document object, then it will of course
|
|
* catch all `mousemove`s. This along with iOS quirks, justifies restricting
|
|
* top-level listeners to the document object only, at least for these
|
|
* movement types of events and possibly all events.
|
|
*
|
|
* @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
|
|
*
|
|
* Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
|
|
* they bubble to document.
|
|
*
|
|
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
|
* @param {object} contentDocumentHandle Document which owns the container
|
|
*/
|
|
listenTo: function listenTo(registrationName, contentDocumentHandle) {
|
|
var mountAt = contentDocumentHandle;
|
|
var isListening = getListeningForDocument(mountAt);
|
|
var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];
|
|
|
|
for (var i = 0; i < dependencies.length; i++) {
|
|
var dependency = dependencies[i];
|
|
if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
|
|
if (dependency === 'topWheel') {
|
|
if (isEventSupported('wheel')) {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'wheel', mountAt);
|
|
} else if (isEventSupported('mousewheel')) {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'mousewheel', mountAt);
|
|
} else {
|
|
// Firefox needs to capture a different mouse scroll event.
|
|
// @see http://www.quirksmode.org/dom/events/tests/scroll.html
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'DOMMouseScroll', mountAt);
|
|
}
|
|
} else if (dependency === 'topScroll') {
|
|
if (isEventSupported('scroll', true)) {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topScroll', 'scroll', mountAt);
|
|
} else {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topScroll', 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);
|
|
}
|
|
} else if (dependency === 'topFocus' || dependency === 'topBlur') {
|
|
if (isEventSupported('focus', true)) {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topFocus', 'focus', mountAt);
|
|
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topBlur', 'blur', mountAt);
|
|
} else if (isEventSupported('focusin')) {
|
|
// IE has `focusin` and `focusout` events which bubble.
|
|
// @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topFocus', 'focusin', mountAt);
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topBlur', 'focusout', mountAt);
|
|
}
|
|
|
|
// to make sure blur and focus event listeners are only attached once
|
|
isListening.topBlur = true;
|
|
isListening.topFocus = true;
|
|
} else if (topEventMapping.hasOwnProperty(dependency)) {
|
|
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);
|
|
}
|
|
|
|
isListening[dependency] = true;
|
|
}
|
|
}
|
|
},
|
|
|
|
trapBubbledEvent: function trapBubbledEvent(topLevelType, handlerBaseName, handle) {
|
|
return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);
|
|
},
|
|
|
|
trapCapturedEvent: function trapCapturedEvent(topLevelType, handlerBaseName, handle) {
|
|
return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);
|
|
},
|
|
|
|
/**
|
|
* Protect against document.createEvent() returning null
|
|
* Some popup blocker extensions appear to do this:
|
|
* https://github.com/facebook/react/issues/6887
|
|
*/
|
|
supportsEventPageXY: function supportsEventPageXY() {
|
|
if (!document.createEvent) {
|
|
return false;
|
|
}
|
|
var ev = document.createEvent('MouseEvent');
|
|
return ev != null && 'pageX' in ev;
|
|
},
|
|
|
|
/**
|
|
* Listens to window scroll and resize events. We cache scroll values so that
|
|
* application code can access them without triggering reflows.
|
|
*
|
|
* ViewportMetrics is only used by SyntheticMouse/TouchEvent and only when
|
|
* pageX/pageY isn't supported (legacy browsers).
|
|
*
|
|
* NOTE: Scroll events do not bubble.
|
|
*
|
|
* @see http://www.quirksmode.org/dom/events/scroll.html
|
|
*/
|
|
ensureScrollValueMonitoring: function ensureScrollValueMonitoring() {
|
|
if (hasEventPageXY === undefined) {
|
|
hasEventPageXY = ReactBrowserEventEmitter.supportsEventPageXY();
|
|
}
|
|
if (!hasEventPageXY && !isMonitoringScrollValue) {
|
|
var refresh = ViewportMetrics.refreshScrollValues;
|
|
ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);
|
|
isMonitoringScrollValue = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
module.exports = ReactBrowserEventEmitter;
|
|
|
|
/***/ }),
|
|
/* 35 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticUIEvent = __webpack_require__(30);
|
|
var ViewportMetrics = __webpack_require__(85);
|
|
|
|
var getEventModifierState = __webpack_require__(55);
|
|
|
|
/**
|
|
* @interface MouseEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var MouseEventInterface = {
|
|
screenX: null,
|
|
screenY: null,
|
|
clientX: null,
|
|
clientY: null,
|
|
ctrlKey: null,
|
|
shiftKey: null,
|
|
altKey: null,
|
|
metaKey: null,
|
|
getModifierState: getEventModifierState,
|
|
button: function button(event) {
|
|
// Webkit, Firefox, IE9+
|
|
// which: 1 2 3
|
|
// button: 0 1 2 (standard)
|
|
var button = event.button;
|
|
if ('which' in event) {
|
|
return button;
|
|
}
|
|
// IE<9
|
|
// which: undefined
|
|
// button: 0 0 0
|
|
// button: 1 4 2 (onmouseup)
|
|
return button === 2 ? 2 : button === 4 ? 1 : 0;
|
|
},
|
|
buttons: null,
|
|
relatedTarget: function relatedTarget(event) {
|
|
return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
|
|
},
|
|
// "Proprietary" Interface.
|
|
pageX: function pageX(event) {
|
|
return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft;
|
|
},
|
|
pageY: function pageY(event) {
|
|
return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);
|
|
|
|
module.exports = SyntheticMouseEvent;
|
|
|
|
/***/ }),
|
|
/* 36 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var OBSERVED_ERROR = {};
|
|
|
|
/**
|
|
* `Transaction` creates a black box that is able to wrap any method such that
|
|
* certain invariants are maintained before and after the method is invoked
|
|
* (Even if an exception is thrown while invoking the wrapped method). Whoever
|
|
* instantiates a transaction can provide enforcers of the invariants at
|
|
* creation time. The `Transaction` class itself will supply one additional
|
|
* automatic invariant for you - the invariant that any transaction instance
|
|
* should not be run while it is already being run. You would typically create a
|
|
* single instance of a `Transaction` for reuse multiple times, that potentially
|
|
* is used to wrap several different methods. Wrappers are extremely simple -
|
|
* they only require implementing two methods.
|
|
*
|
|
* <pre>
|
|
* wrappers (injected at creation time)
|
|
* + +
|
|
* | |
|
|
* +-----------------|--------|--------------+
|
|
* | v | |
|
|
* | +---------------+ | |
|
|
* | +--| wrapper1 |---|----+ |
|
|
* | | +---------------+ v | |
|
|
* | | +-------------+ | |
|
|
* | | +----| wrapper2 |--------+ |
|
|
* | | | +-------------+ | | |
|
|
* | | | | | |
|
|
* | v v v v | wrapper
|
|
* | +---+ +---+ +---------+ +---+ +---+ | invariants
|
|
* perform(anyMethod) | | | | | | | | | | | | maintained
|
|
* +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
|
|
* | | | | | | | | | | | |
|
|
* | | | | | | | | | | | |
|
|
* | | | | | | | | | | | |
|
|
* | +---+ +---+ +---------+ +---+ +---+ |
|
|
* | initialize close |
|
|
* +-----------------------------------------+
|
|
* </pre>
|
|
*
|
|
* Use cases:
|
|
* - Preserving the input selection ranges before/after reconciliation.
|
|
* Restoring selection even in the event of an unexpected error.
|
|
* - Deactivating events while rearranging the DOM, preventing blurs/focuses,
|
|
* while guaranteeing that afterwards, the event system is reactivated.
|
|
* - Flushing a queue of collected DOM mutations to the main UI thread after a
|
|
* reconciliation takes place in a worker thread.
|
|
* - Invoking any collected `componentDidUpdate` callbacks after rendering new
|
|
* content.
|
|
* - (Future use case): Wrapping particular flushes of the `ReactWorker` queue
|
|
* to preserve the `scrollTop` (an automatic scroll aware DOM).
|
|
* - (Future use case): Layout calculations before and after DOM updates.
|
|
*
|
|
* Transactional plugin API:
|
|
* - A module that has an `initialize` method that returns any precomputation.
|
|
* - and a `close` method that accepts the precomputation. `close` is invoked
|
|
* when the wrapped process is completed, or has failed.
|
|
*
|
|
* @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules
|
|
* that implement `initialize` and `close`.
|
|
* @return {Transaction} Single transaction for reuse in thread.
|
|
*
|
|
* @class Transaction
|
|
*/
|
|
var TransactionImpl = {
|
|
/**
|
|
* Sets up this instance so that it is prepared for collecting metrics. Does
|
|
* so such that this setup method may be used on an instance that is already
|
|
* initialized, in a way that does not consume additional memory upon reuse.
|
|
* That can be useful if you decide to make your subclass of this mixin a
|
|
* "PooledClass".
|
|
*/
|
|
reinitializeTransaction: function reinitializeTransaction() {
|
|
this.transactionWrappers = this.getTransactionWrappers();
|
|
if (this.wrapperInitData) {
|
|
this.wrapperInitData.length = 0;
|
|
} else {
|
|
this.wrapperInitData = [];
|
|
}
|
|
this._isInTransaction = false;
|
|
},
|
|
|
|
_isInTransaction: false,
|
|
|
|
/**
|
|
* @abstract
|
|
* @return {Array<TransactionWrapper>} Array of transaction wrappers.
|
|
*/
|
|
getTransactionWrappers: null,
|
|
|
|
isInTransaction: function isInTransaction() {
|
|
return !!this._isInTransaction;
|
|
},
|
|
|
|
/* eslint-disable space-before-function-paren */
|
|
|
|
/**
|
|
* Executes the function within a safety window. Use this for the top level
|
|
* methods that result in large amounts of computation/mutations that would
|
|
* need to be safety checked. The optional arguments helps prevent the need
|
|
* to bind in many cases.
|
|
*
|
|
* @param {function} method Member of scope to call.
|
|
* @param {Object} scope Scope to invoke from.
|
|
* @param {Object?=} a Argument to pass to the method.
|
|
* @param {Object?=} b Argument to pass to the method.
|
|
* @param {Object?=} c Argument to pass to the method.
|
|
* @param {Object?=} d Argument to pass to the method.
|
|
* @param {Object?=} e Argument to pass to the method.
|
|
* @param {Object?=} f Argument to pass to the method.
|
|
*
|
|
* @return {*} Return value from `method`.
|
|
*/
|
|
perform: function perform(method, scope, a, b, c, d, e, f) {
|
|
/* eslint-enable space-before-function-paren */
|
|
!!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.') : _prodInvariant('27') : void 0;
|
|
var errorThrown;
|
|
var ret;
|
|
try {
|
|
this._isInTransaction = true;
|
|
// Catching errors makes debugging more difficult, so we start with
|
|
// errorThrown set to true before setting it to false after calling
|
|
// close -- if it's still set to true in the finally block, it means
|
|
// one of these calls threw.
|
|
errorThrown = true;
|
|
this.initializeAll(0);
|
|
ret = method.call(scope, a, b, c, d, e, f);
|
|
errorThrown = false;
|
|
} finally {
|
|
try {
|
|
if (errorThrown) {
|
|
// If `method` throws, prefer to show that stack trace over any thrown
|
|
// by invoking `closeAll`.
|
|
try {
|
|
this.closeAll(0);
|
|
} catch (err) {}
|
|
} else {
|
|
// Since `method` didn't throw, we don't want to silence the exception
|
|
// here.
|
|
this.closeAll(0);
|
|
}
|
|
} finally {
|
|
this._isInTransaction = false;
|
|
}
|
|
}
|
|
return ret;
|
|
},
|
|
|
|
initializeAll: function initializeAll(startIndex) {
|
|
var transactionWrappers = this.transactionWrappers;
|
|
for (var i = startIndex; i < transactionWrappers.length; i++) {
|
|
var wrapper = transactionWrappers[i];
|
|
try {
|
|
// Catching errors makes debugging more difficult, so we start with the
|
|
// OBSERVED_ERROR state before overwriting it with the real return value
|
|
// of initialize -- if it's still set to OBSERVED_ERROR in the finally
|
|
// block, it means wrapper.initialize threw.
|
|
this.wrapperInitData[i] = OBSERVED_ERROR;
|
|
this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;
|
|
} finally {
|
|
if (this.wrapperInitData[i] === OBSERVED_ERROR) {
|
|
// The initializer for wrapper i threw an error; initialize the
|
|
// remaining wrappers but silence any exceptions from them to ensure
|
|
// that the first error is the one to bubble up.
|
|
try {
|
|
this.initializeAll(i + 1);
|
|
} catch (err) {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Invokes each of `this.transactionWrappers.close[i]` functions, passing into
|
|
* them the respective return values of `this.transactionWrappers.init[i]`
|
|
* (`close`rs that correspond to initializers that failed will not be
|
|
* invoked).
|
|
*/
|
|
closeAll: function closeAll(startIndex) {
|
|
!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : _prodInvariant('28') : void 0;
|
|
var transactionWrappers = this.transactionWrappers;
|
|
for (var i = startIndex; i < transactionWrappers.length; i++) {
|
|
var wrapper = transactionWrappers[i];
|
|
var initData = this.wrapperInitData[i];
|
|
var errorThrown;
|
|
try {
|
|
// Catching errors makes debugging more difficult, so we start with
|
|
// errorThrown set to true before setting it to false after calling
|
|
// close -- if it's still set to true in the finally block, it means
|
|
// wrapper.close threw.
|
|
errorThrown = true;
|
|
if (initData !== OBSERVED_ERROR && wrapper.close) {
|
|
wrapper.close.call(this, initData);
|
|
}
|
|
errorThrown = false;
|
|
} finally {
|
|
if (errorThrown) {
|
|
// The closer for wrapper i threw an error; close the remaining
|
|
// wrappers but silence any exceptions from them to ensure that the
|
|
// first error is the one to bubble up.
|
|
try {
|
|
this.closeAll(i + 1);
|
|
} catch (e) {}
|
|
}
|
|
}
|
|
}
|
|
this.wrapperInitData.length = 0;
|
|
}
|
|
};
|
|
|
|
module.exports = TransactionImpl;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 37 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* Based on the escape-html library, which is used under the MIT License below:
|
|
*
|
|
* Copyright (c) 2012-2013 TJ Holowaychuk
|
|
* Copyright (c) 2015 Andreas Lubbe
|
|
* Copyright (c) 2015 Tiancheng "Timothy" Gu
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
// code copied and modified from escape-html
|
|
/**
|
|
* Module variables.
|
|
* @private
|
|
*/
|
|
|
|
var matchHtmlRegExp = /["'&<>]/;
|
|
|
|
/**
|
|
* Escape special characters in the given string of html.
|
|
*
|
|
* @param {string} string The string to escape for inserting into HTML
|
|
* @return {string}
|
|
* @public
|
|
*/
|
|
|
|
function escapeHtml(string) {
|
|
var str = '' + string;
|
|
var match = matchHtmlRegExp.exec(str);
|
|
|
|
if (!match) {
|
|
return str;
|
|
}
|
|
|
|
var escape;
|
|
var html = '';
|
|
var index = 0;
|
|
var lastIndex = 0;
|
|
|
|
for (index = match.index; index < str.length; index++) {
|
|
switch (str.charCodeAt(index)) {
|
|
case 34:
|
|
// "
|
|
escape = '"';
|
|
break;
|
|
case 38:
|
|
// &
|
|
escape = '&';
|
|
break;
|
|
case 39:
|
|
// '
|
|
escape = '''; // modified from escape-html; used to be '''
|
|
break;
|
|
case 60:
|
|
// <
|
|
escape = '<';
|
|
break;
|
|
case 62:
|
|
// >
|
|
escape = '>';
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
|
|
if (lastIndex !== index) {
|
|
html += str.substring(lastIndex, index);
|
|
}
|
|
|
|
lastIndex = index + 1;
|
|
html += escape;
|
|
}
|
|
|
|
return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
|
|
}
|
|
// end code copied and modified from escape-html
|
|
|
|
/**
|
|
* Escapes text to prevent scripting attacks.
|
|
*
|
|
* @param {*} text Text value to escape.
|
|
* @return {string} An escaped string.
|
|
*/
|
|
function escapeTextContentForBrowser(text) {
|
|
if (typeof text === 'boolean' || typeof text === 'number') {
|
|
// this shortcircuit helps perf for types that we know will never have
|
|
// special characters, especially given that this function is used often
|
|
// for numeric dom ids.
|
|
return '' + text;
|
|
}
|
|
return escapeHtml(text);
|
|
}
|
|
|
|
module.exports = escapeTextContentForBrowser;
|
|
|
|
/***/ }),
|
|
/* 38 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var DOMNamespaces = __webpack_require__(46);
|
|
|
|
var WHITESPACE_TEST = /^[ \r\n\t\f]/;
|
|
var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/;
|
|
|
|
var createMicrosoftUnsafeLocalFunction = __webpack_require__(53);
|
|
|
|
// SVG temp container for IE lacking innerHTML
|
|
var reusableSVGContainer;
|
|
|
|
/**
|
|
* Set the innerHTML property of a node, ensuring that whitespace is preserved
|
|
* even in IE8.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {string} html
|
|
* @internal
|
|
*/
|
|
var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
|
|
// IE does not have innerHTML for SVG nodes, so instead we inject the
|
|
// new markup in a temp node and then move the child nodes across into
|
|
// the target node
|
|
if (node.namespaceURI === DOMNamespaces.svg && !('innerHTML' in node)) {
|
|
reusableSVGContainer = reusableSVGContainer || document.createElement('div');
|
|
reusableSVGContainer.innerHTML = '<svg>' + html + '</svg>';
|
|
var svgNode = reusableSVGContainer.firstChild;
|
|
while (svgNode.firstChild) {
|
|
node.appendChild(svgNode.firstChild);
|
|
}
|
|
} else {
|
|
node.innerHTML = html;
|
|
}
|
|
});
|
|
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
// IE8: When updating a just created node with innerHTML only leading
|
|
// whitespace is removed. When updating an existing node with innerHTML
|
|
// whitespace in root TextNodes is also collapsed.
|
|
// @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
|
|
|
|
// Feature detection; only IE8 is known to behave improperly like this.
|
|
var testElement = document.createElement('div');
|
|
testElement.innerHTML = ' ';
|
|
if (testElement.innerHTML === '') {
|
|
setInnerHTML = function setInnerHTML(node, html) {
|
|
// Magic theory: IE8 supposedly differentiates between added and updated
|
|
// nodes when processing innerHTML, innerHTML on updated nodes suffers
|
|
// from worse whitespace behavior. Re-adding a node like this triggers
|
|
// the initial and more favorable whitespace behavior.
|
|
// TODO: What to do on a detached node?
|
|
if (node.parentNode) {
|
|
node.parentNode.replaceChild(node, node);
|
|
}
|
|
|
|
// We also implement a workaround for non-visible tags disappearing into
|
|
// thin air on IE8, this only happens if there is no visible text
|
|
// in-front of the non-visible tags. Piggyback on the whitespace fix
|
|
// and simply check if any non-visible tags appear in the source.
|
|
if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) {
|
|
// Recover leading whitespace by temporarily prepending any character.
|
|
// \uFEFF has the potential advantage of being zero-width/invisible.
|
|
// UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode
|
|
// in hopes that this is preserved even if "\uFEFF" is transformed to
|
|
// the actual Unicode character (by Babel, for example).
|
|
// https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216
|
|
node.innerHTML = String.fromCharCode(0xfeff) + html;
|
|
|
|
// deleteData leaves an empty `TextNode` which offsets the index of all
|
|
// children. Definitely want to avoid this.
|
|
var textNode = node.firstChild;
|
|
if (textNode.data.length === 1) {
|
|
node.removeChild(textNode);
|
|
} else {
|
|
textNode.deleteData(0, 1);
|
|
}
|
|
} else {
|
|
node.innerHTML = html;
|
|
}
|
|
};
|
|
}
|
|
testElement = null;
|
|
}
|
|
|
|
module.exports = setInnerHTML;
|
|
|
|
/***/ }),
|
|
/* 39 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var canDefineProperty = false;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
try {
|
|
// $FlowFixMe https://github.com/facebook/flow/issues/285
|
|
Object.defineProperty({}, 'x', { get: function get() {} });
|
|
canDefineProperty = true;
|
|
} catch (x) {
|
|
// IE will fail on defineProperty
|
|
}
|
|
}
|
|
|
|
module.exports = canDefineProperty;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 40 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*
|
|
*/
|
|
|
|
/*eslint-disable no-self-compare */
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
/**
|
|
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
*/
|
|
function is(x, y) {
|
|
// SameValue algorithm
|
|
if (x === y) {
|
|
// Steps 1-5, 7-10
|
|
// Steps 6.b-6.e: +0 != -0
|
|
// Added the nonzero y check to make Flow happy, but it is redundant
|
|
return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
|
} else {
|
|
// Step 6.a: NaN == NaN
|
|
return x !== x && y !== y;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Performs equality by iterating through keys on an object and returning false
|
|
* when any key has values which are not strictly equal between the arguments.
|
|
* Returns true when the values of all keys are strictly equal.
|
|
*/
|
|
function shallowEqual(objA, objB) {
|
|
if (is(objA, objB)) {
|
|
return true;
|
|
}
|
|
|
|
if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {
|
|
return false;
|
|
}
|
|
|
|
var keysA = Object.keys(objA);
|
|
var keysB = Object.keys(objB);
|
|
|
|
if (keysA.length !== keysB.length) {
|
|
return false;
|
|
}
|
|
|
|
// Test for A's keys different from B.
|
|
for (var i = 0; i < keysA.length; i++) {
|
|
if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
module.exports = shallowEqual;
|
|
|
|
/***/ }),
|
|
/* 41 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.__esModule = true;
|
|
exports.locationsAreEqual = exports.createLocation = undefined;
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
var _resolvePathname = __webpack_require__(261);
|
|
|
|
var _resolvePathname2 = _interopRequireDefault(_resolvePathname);
|
|
|
|
var _valueEqual = __webpack_require__(265);
|
|
|
|
var _valueEqual2 = _interopRequireDefault(_valueEqual);
|
|
|
|
var _PathUtils = __webpack_require__(25);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
}
|
|
|
|
var createLocation = exports.createLocation = function createLocation(path, state, key, currentLocation) {
|
|
var location = void 0;
|
|
if (typeof path === 'string') {
|
|
// Two-arg form: push(path, state)
|
|
location = (0, _PathUtils.parsePath)(path);
|
|
location.state = state;
|
|
} else {
|
|
// One-arg form: push(location)
|
|
location = _extends({}, path);
|
|
|
|
if (location.pathname === undefined) location.pathname = '';
|
|
|
|
if (location.search) {
|
|
if (location.search.charAt(0) !== '?') location.search = '?' + location.search;
|
|
} else {
|
|
location.search = '';
|
|
}
|
|
|
|
if (location.hash) {
|
|
if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;
|
|
} else {
|
|
location.hash = '';
|
|
}
|
|
|
|
if (state !== undefined && location.state === undefined) location.state = state;
|
|
}
|
|
|
|
try {
|
|
location.pathname = decodeURI(location.pathname);
|
|
} catch (e) {
|
|
if (e instanceof URIError) {
|
|
throw new URIError('Pathname "' + location.pathname + '" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');
|
|
} else {
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
if (key) location.key = key;
|
|
|
|
if (currentLocation) {
|
|
// Resolve incomplete/relative pathname relative to current location.
|
|
if (!location.pathname) {
|
|
location.pathname = currentLocation.pathname;
|
|
} else if (location.pathname.charAt(0) !== '/') {
|
|
location.pathname = (0, _resolvePathname2.default)(location.pathname, currentLocation.pathname);
|
|
}
|
|
} else {
|
|
// When there is no prior location and pathname is empty, set it to /
|
|
if (!location.pathname) {
|
|
location.pathname = '/';
|
|
}
|
|
}
|
|
|
|
return location;
|
|
};
|
|
|
|
var locationsAreEqual = exports.locationsAreEqual = function locationsAreEqual(a, b) {
|
|
return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && (0, _valueEqual2.default)(a.state, b.state);
|
|
};
|
|
|
|
/***/ }),
|
|
/* 42 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
}
|
|
|
|
var createTransitionManager = function createTransitionManager() {
|
|
var prompt = null;
|
|
|
|
var setPrompt = function setPrompt(nextPrompt) {
|
|
(0, _warning2.default)(prompt == null, 'A history supports only one prompt at a time');
|
|
|
|
prompt = nextPrompt;
|
|
|
|
return function () {
|
|
if (prompt === nextPrompt) prompt = null;
|
|
};
|
|
};
|
|
|
|
var confirmTransitionTo = function confirmTransitionTo(location, action, getUserConfirmation, callback) {
|
|
// TODO: If another transition starts while we're still confirming
|
|
// the previous one, we may end up in a weird state. Figure out the
|
|
// best way to handle this.
|
|
if (prompt != null) {
|
|
var result = typeof prompt === 'function' ? prompt(location, action) : prompt;
|
|
|
|
if (typeof result === 'string') {
|
|
if (typeof getUserConfirmation === 'function') {
|
|
getUserConfirmation(result, callback);
|
|
} else {
|
|
(0, _warning2.default)(false, 'A history needs a getUserConfirmation function in order to use a prompt message');
|
|
|
|
callback(true);
|
|
}
|
|
} else {
|
|
// Return false from a transition hook to cancel the transition.
|
|
callback(result !== false);
|
|
}
|
|
} else {
|
|
callback(true);
|
|
}
|
|
};
|
|
|
|
var listeners = [];
|
|
|
|
var appendListener = function appendListener(fn) {
|
|
var isActive = true;
|
|
|
|
var listener = function listener() {
|
|
if (isActive) fn.apply(undefined, arguments);
|
|
};
|
|
|
|
listeners.push(listener);
|
|
|
|
return function () {
|
|
isActive = false;
|
|
listeners = listeners.filter(function (item) {
|
|
return item !== listener;
|
|
});
|
|
};
|
|
};
|
|
|
|
var notifyListeners = function notifyListeners() {
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
listeners.forEach(function (listener) {
|
|
return listener.apply(undefined, args);
|
|
});
|
|
};
|
|
|
|
return {
|
|
setPrompt: setPrompt,
|
|
confirmTransitionTo: confirmTransitionTo,
|
|
appendListener: appendListener,
|
|
notifyListeners: notifyListeners
|
|
};
|
|
};
|
|
|
|
exports.default = createTransitionManager;
|
|
|
|
/***/ }),
|
|
/* 43 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _baseGetTag = __webpack_require__(135);
|
|
|
|
var _baseGetTag2 = _interopRequireDefault(_baseGetTag);
|
|
|
|
var _getPrototype = __webpack_require__(137);
|
|
|
|
var _getPrototype2 = _interopRequireDefault(_getPrototype);
|
|
|
|
var _isObjectLike = __webpack_require__(142);
|
|
|
|
var _isObjectLike2 = _interopRequireDefault(_isObjectLike);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** `Object#toString` result references. */
|
|
var objectTag = '[object Object]';
|
|
|
|
/** Used for built-in method references. */
|
|
var funcProto = Function.prototype,
|
|
objectProto = Object.prototype;
|
|
|
|
/** Used to resolve the decompiled source of functions. */
|
|
var funcToString = funcProto.toString;
|
|
|
|
/** Used to check objects for own properties. */
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
/** Used to infer the `Object` constructor. */
|
|
var objectCtorString = funcToString.call(Object);
|
|
|
|
/**
|
|
* Checks if `value` is a plain object, that is, an object created by the
|
|
* `Object` constructor or one with a `[[Prototype]]` of `null`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.8.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* }
|
|
*
|
|
* _.isPlainObject(new Foo);
|
|
* // => false
|
|
*
|
|
* _.isPlainObject([1, 2, 3]);
|
|
* // => false
|
|
*
|
|
* _.isPlainObject({ 'x': 0, 'y': 0 });
|
|
* // => true
|
|
*
|
|
* _.isPlainObject(Object.create(null));
|
|
* // => true
|
|
*/
|
|
function isPlainObject(value) {
|
|
if (!(0, _isObjectLike2.default)(value) || (0, _baseGetTag2.default)(value) != objectTag) {
|
|
return false;
|
|
}
|
|
var proto = (0, _getPrototype2.default)(value);
|
|
if (proto === null) {
|
|
return true;
|
|
}
|
|
var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
|
|
return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
|
|
}
|
|
|
|
exports.default = isPlainObject;
|
|
|
|
/***/ }),
|
|
/* 44 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
|
|
|
module.exports = ReactPropTypesSecret;
|
|
|
|
/***/ }),
|
|
/* 45 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var Danger = __webpack_require__(150);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
|
|
var createMicrosoftUnsafeLocalFunction = __webpack_require__(53);
|
|
var setInnerHTML = __webpack_require__(38);
|
|
var setTextContent = __webpack_require__(93);
|
|
|
|
function getNodeAfter(parentNode, node) {
|
|
// Special case for text components, which return [open, close] comments
|
|
// from getHostNode.
|
|
if (Array.isArray(node)) {
|
|
node = node[1];
|
|
}
|
|
return node ? node.nextSibling : parentNode.firstChild;
|
|
}
|
|
|
|
/**
|
|
* Inserts `childNode` as a child of `parentNode` at the `index`.
|
|
*
|
|
* @param {DOMElement} parentNode Parent node in which to insert.
|
|
* @param {DOMElement} childNode Child node to insert.
|
|
* @param {number} index Index at which to insert the child.
|
|
* @internal
|
|
*/
|
|
var insertChildAt = createMicrosoftUnsafeLocalFunction(function (parentNode, childNode, referenceNode) {
|
|
// We rely exclusively on `insertBefore(node, null)` instead of also using
|
|
// `appendChild(node)`. (Using `undefined` is not allowed by all browsers so
|
|
// we are careful to use `null`.)
|
|
parentNode.insertBefore(childNode, referenceNode);
|
|
});
|
|
|
|
function insertLazyTreeChildAt(parentNode, childTree, referenceNode) {
|
|
DOMLazyTree.insertTreeBefore(parentNode, childTree, referenceNode);
|
|
}
|
|
|
|
function moveChild(parentNode, childNode, referenceNode) {
|
|
if (Array.isArray(childNode)) {
|
|
moveDelimitedText(parentNode, childNode[0], childNode[1], referenceNode);
|
|
} else {
|
|
insertChildAt(parentNode, childNode, referenceNode);
|
|
}
|
|
}
|
|
|
|
function removeChild(parentNode, childNode) {
|
|
if (Array.isArray(childNode)) {
|
|
var closingComment = childNode[1];
|
|
childNode = childNode[0];
|
|
removeDelimitedText(parentNode, childNode, closingComment);
|
|
parentNode.removeChild(closingComment);
|
|
}
|
|
parentNode.removeChild(childNode);
|
|
}
|
|
|
|
function moveDelimitedText(parentNode, openingComment, closingComment, referenceNode) {
|
|
var node = openingComment;
|
|
while (true) {
|
|
var nextNode = node.nextSibling;
|
|
insertChildAt(parentNode, node, referenceNode);
|
|
if (node === closingComment) {
|
|
break;
|
|
}
|
|
node = nextNode;
|
|
}
|
|
}
|
|
|
|
function removeDelimitedText(parentNode, startNode, closingComment) {
|
|
while (true) {
|
|
var node = startNode.nextSibling;
|
|
if (node === closingComment) {
|
|
// The closing comment is removed by ReactMultiChild.
|
|
break;
|
|
} else {
|
|
parentNode.removeChild(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
function replaceDelimitedText(openingComment, closingComment, stringText) {
|
|
var parentNode = openingComment.parentNode;
|
|
var nodeAfterComment = openingComment.nextSibling;
|
|
if (nodeAfterComment === closingComment) {
|
|
// There are no text nodes between the opening and closing comments; insert
|
|
// a new one if stringText isn't empty.
|
|
if (stringText) {
|
|
insertChildAt(parentNode, document.createTextNode(stringText), nodeAfterComment);
|
|
}
|
|
} else {
|
|
if (stringText) {
|
|
// Set the text content of the first node after the opening comment, and
|
|
// remove all following nodes up until the closing comment.
|
|
setTextContent(nodeAfterComment, stringText);
|
|
removeDelimitedText(parentNode, nodeAfterComment, closingComment);
|
|
} else {
|
|
removeDelimitedText(parentNode, openingComment, closingComment);
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: ReactDOMComponentTree.getInstanceFromNode(openingComment)._debugID,
|
|
type: 'replace text',
|
|
payload: stringText
|
|
});
|
|
}
|
|
}
|
|
|
|
var dangerouslyReplaceNodeWithMarkup = Danger.dangerouslyReplaceNodeWithMarkup;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
dangerouslyReplaceNodeWithMarkup = function dangerouslyReplaceNodeWithMarkup(oldChild, markup, prevInstance) {
|
|
Danger.dangerouslyReplaceNodeWithMarkup(oldChild, markup);
|
|
if (prevInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: prevInstance._debugID,
|
|
type: 'replace with',
|
|
payload: markup.toString()
|
|
});
|
|
} else {
|
|
var nextInstance = ReactDOMComponentTree.getInstanceFromNode(markup.node);
|
|
if (nextInstance._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: nextInstance._debugID,
|
|
type: 'mount',
|
|
payload: markup.toString()
|
|
});
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Operations for updating with DOM children.
|
|
*/
|
|
var DOMChildrenOperations = {
|
|
dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup,
|
|
|
|
replaceDelimitedText: replaceDelimitedText,
|
|
|
|
/**
|
|
* Updates a component's children by processing a series of updates. The
|
|
* update configurations are each expected to have a `parentNode` property.
|
|
*
|
|
* @param {array<object>} updates List of update configurations.
|
|
* @internal
|
|
*/
|
|
processUpdates: function processUpdates(parentNode, updates) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var parentNodeDebugID = ReactDOMComponentTree.getInstanceFromNode(parentNode)._debugID;
|
|
}
|
|
|
|
for (var k = 0; k < updates.length; k++) {
|
|
var update = updates[k];
|
|
switch (update.type) {
|
|
case 'INSERT_MARKUP':
|
|
insertLazyTreeChildAt(parentNode, update.content, getNodeAfter(parentNode, update.afterNode));
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: parentNodeDebugID,
|
|
type: 'insert child',
|
|
payload: {
|
|
toIndex: update.toIndex,
|
|
content: update.content.toString()
|
|
}
|
|
});
|
|
}
|
|
break;
|
|
case 'MOVE_EXISTING':
|
|
moveChild(parentNode, update.fromNode, getNodeAfter(parentNode, update.afterNode));
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: parentNodeDebugID,
|
|
type: 'move child',
|
|
payload: { fromIndex: update.fromIndex, toIndex: update.toIndex }
|
|
});
|
|
}
|
|
break;
|
|
case 'SET_MARKUP':
|
|
setInnerHTML(parentNode, update.content);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: parentNodeDebugID,
|
|
type: 'replace children',
|
|
payload: update.content.toString()
|
|
});
|
|
}
|
|
break;
|
|
case 'TEXT_CONTENT':
|
|
setTextContent(parentNode, update.content);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: parentNodeDebugID,
|
|
type: 'replace text',
|
|
payload: update.content.toString()
|
|
});
|
|
}
|
|
break;
|
|
case 'REMOVE_NODE':
|
|
removeChild(parentNode, update.fromNode);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: parentNodeDebugID,
|
|
type: 'remove child',
|
|
payload: { fromIndex: update.fromIndex }
|
|
});
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = DOMChildrenOperations;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 46 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMNamespaces = {
|
|
html: 'http://www.w3.org/1999/xhtml',
|
|
mathml: 'http://www.w3.org/1998/Math/MathML',
|
|
svg: 'http://www.w3.org/2000/svg'
|
|
};
|
|
|
|
module.exports = DOMNamespaces;
|
|
|
|
/***/ }),
|
|
/* 47 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactErrorUtils = __webpack_require__(51);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
/**
|
|
* Injected dependencies:
|
|
*/
|
|
|
|
/**
|
|
* - `ComponentTree`: [required] Module that can convert between React instances
|
|
* and actual node references.
|
|
*/
|
|
var ComponentTree;
|
|
var TreeTraversal;
|
|
var injection = {
|
|
injectComponentTree: function injectComponentTree(Injected) {
|
|
ComponentTree = Injected;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(Injected && Injected.getNodeFromInstance && Injected.getInstanceFromNode, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;
|
|
}
|
|
},
|
|
injectTreeTraversal: function injectTreeTraversal(Injected) {
|
|
TreeTraversal = Injected;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(Injected && Injected.isAncestor && Injected.getLowestCommonAncestor, 'EventPluginUtils.injection.injectTreeTraversal(...): Injected ' + 'module is missing isAncestor or getLowestCommonAncestor.') : void 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
function isEndish(topLevelType) {
|
|
return topLevelType === 'topMouseUp' || topLevelType === 'topTouchEnd' || topLevelType === 'topTouchCancel';
|
|
}
|
|
|
|
function isMoveish(topLevelType) {
|
|
return topLevelType === 'topMouseMove' || topLevelType === 'topTouchMove';
|
|
}
|
|
function isStartish(topLevelType) {
|
|
return topLevelType === 'topMouseDown' || topLevelType === 'topTouchStart';
|
|
}
|
|
|
|
var validateEventDispatches;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateEventDispatches = function validateEventDispatches(event) {
|
|
var dispatchListeners = event._dispatchListeners;
|
|
var dispatchInstances = event._dispatchInstances;
|
|
|
|
var listenersIsArr = Array.isArray(dispatchListeners);
|
|
var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
|
|
|
|
var instancesIsArr = Array.isArray(dispatchInstances);
|
|
var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : void 0;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Dispatch the event to the listener.
|
|
* @param {SyntheticEvent} event SyntheticEvent to handle
|
|
* @param {boolean} simulated If the event is simulated (changes exn behavior)
|
|
* @param {function} listener Application-level callback
|
|
* @param {*} inst Internal component instance
|
|
*/
|
|
function executeDispatch(event, simulated, listener, inst) {
|
|
var type = event.type || 'unknown-event';
|
|
event.currentTarget = EventPluginUtils.getNodeFromInstance(inst);
|
|
if (simulated) {
|
|
ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event);
|
|
} else {
|
|
ReactErrorUtils.invokeGuardedCallback(type, listener, event);
|
|
}
|
|
event.currentTarget = null;
|
|
}
|
|
|
|
/**
|
|
* Standard/simple iteration through an event's collected dispatches.
|
|
*/
|
|
function executeDispatchesInOrder(event, simulated) {
|
|
var dispatchListeners = event._dispatchListeners;
|
|
var dispatchInstances = event._dispatchInstances;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateEventDispatches(event);
|
|
}
|
|
if (Array.isArray(dispatchListeners)) {
|
|
for (var i = 0; i < dispatchListeners.length; i++) {
|
|
if (event.isPropagationStopped()) {
|
|
break;
|
|
}
|
|
// Listeners and Instances are two parallel arrays that are always in sync.
|
|
executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]);
|
|
}
|
|
} else if (dispatchListeners) {
|
|
executeDispatch(event, simulated, dispatchListeners, dispatchInstances);
|
|
}
|
|
event._dispatchListeners = null;
|
|
event._dispatchInstances = null;
|
|
}
|
|
|
|
/**
|
|
* Standard/simple iteration through an event's collected dispatches, but stops
|
|
* at the first dispatch execution returning true, and returns that id.
|
|
*
|
|
* @return {?string} id of the first dispatch execution who's listener returns
|
|
* true, or null if no listener returned true.
|
|
*/
|
|
function executeDispatchesInOrderStopAtTrueImpl(event) {
|
|
var dispatchListeners = event._dispatchListeners;
|
|
var dispatchInstances = event._dispatchInstances;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateEventDispatches(event);
|
|
}
|
|
if (Array.isArray(dispatchListeners)) {
|
|
for (var i = 0; i < dispatchListeners.length; i++) {
|
|
if (event.isPropagationStopped()) {
|
|
break;
|
|
}
|
|
// Listeners and Instances are two parallel arrays that are always in sync.
|
|
if (dispatchListeners[i](event, dispatchInstances[i])) {
|
|
return dispatchInstances[i];
|
|
}
|
|
}
|
|
} else if (dispatchListeners) {
|
|
if (dispatchListeners(event, dispatchInstances)) {
|
|
return dispatchInstances;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @see executeDispatchesInOrderStopAtTrueImpl
|
|
*/
|
|
function executeDispatchesInOrderStopAtTrue(event) {
|
|
var ret = executeDispatchesInOrderStopAtTrueImpl(event);
|
|
event._dispatchInstances = null;
|
|
event._dispatchListeners = null;
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Execution of a "direct" dispatch - there must be at most one dispatch
|
|
* accumulated on the event or it is considered an error. It doesn't really make
|
|
* sense for an event with multiple dispatches (bubbled) to keep track of the
|
|
* return values at each dispatch execution, but it does tend to make sense when
|
|
* dealing with "direct" dispatches.
|
|
*
|
|
* @return {*} The return value of executing the single dispatch.
|
|
*/
|
|
function executeDirectDispatch(event) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateEventDispatches(event);
|
|
}
|
|
var dispatchListener = event._dispatchListeners;
|
|
var dispatchInstance = event._dispatchInstances;
|
|
!!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : _prodInvariant('103') : void 0;
|
|
event.currentTarget = dispatchListener ? EventPluginUtils.getNodeFromInstance(dispatchInstance) : null;
|
|
var res = dispatchListener ? dispatchListener(event) : null;
|
|
event.currentTarget = null;
|
|
event._dispatchListeners = null;
|
|
event._dispatchInstances = null;
|
|
return res;
|
|
}
|
|
|
|
/**
|
|
* @param {SyntheticEvent} event
|
|
* @return {boolean} True iff number of dispatches accumulated is greater than 0.
|
|
*/
|
|
function hasDispatches(event) {
|
|
return !!event._dispatchListeners;
|
|
}
|
|
|
|
/**
|
|
* General utilities that are useful in creating custom Event Plugins.
|
|
*/
|
|
var EventPluginUtils = {
|
|
isEndish: isEndish,
|
|
isMoveish: isMoveish,
|
|
isStartish: isStartish,
|
|
|
|
executeDirectDispatch: executeDirectDispatch,
|
|
executeDispatchesInOrder: executeDispatchesInOrder,
|
|
executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
|
|
hasDispatches: hasDispatches,
|
|
|
|
getInstanceFromNode: function getInstanceFromNode(node) {
|
|
return ComponentTree.getInstanceFromNode(node);
|
|
},
|
|
getNodeFromInstance: function getNodeFromInstance(node) {
|
|
return ComponentTree.getNodeFromInstance(node);
|
|
},
|
|
isAncestor: function isAncestor(a, b) {
|
|
return TreeTraversal.isAncestor(a, b);
|
|
},
|
|
getLowestCommonAncestor: function getLowestCommonAncestor(a, b) {
|
|
return TreeTraversal.getLowestCommonAncestor(a, b);
|
|
},
|
|
getParentInstance: function getParentInstance(inst) {
|
|
return TreeTraversal.getParentInstance(inst);
|
|
},
|
|
traverseTwoPhase: function traverseTwoPhase(target, fn, arg) {
|
|
return TreeTraversal.traverseTwoPhase(target, fn, arg);
|
|
},
|
|
traverseEnterLeave: function traverseEnterLeave(from, to, fn, argFrom, argTo) {
|
|
return TreeTraversal.traverseEnterLeave(from, to, fn, argFrom, argTo);
|
|
},
|
|
|
|
injection: injection
|
|
};
|
|
|
|
module.exports = EventPluginUtils;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 48 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Escape and wrap key so it is safe to use as a reactid
|
|
*
|
|
* @param {string} key to be escaped.
|
|
* @return {string} the escaped key.
|
|
*/
|
|
|
|
function escape(key) {
|
|
var escapeRegex = /[=:]/g;
|
|
var escaperLookup = {
|
|
'=': '=0',
|
|
':': '=2'
|
|
};
|
|
var escapedString = ('' + key).replace(escapeRegex, function (match) {
|
|
return escaperLookup[match];
|
|
});
|
|
|
|
return '$' + escapedString;
|
|
}
|
|
|
|
/**
|
|
* Unescape and unwrap key for human-readable display
|
|
*
|
|
* @param {string} key to unescape.
|
|
* @return {string} the unescaped key.
|
|
*/
|
|
function unescape(key) {
|
|
var unescapeRegex = /(=0|=2)/g;
|
|
var unescaperLookup = {
|
|
'=0': '=',
|
|
'=2': ':'
|
|
};
|
|
var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);
|
|
|
|
return ('' + keySubstring).replace(unescapeRegex, function (match) {
|
|
return unescaperLookup[match];
|
|
});
|
|
}
|
|
|
|
var KeyEscapeUtils = {
|
|
escape: escape,
|
|
unescape: unescape
|
|
};
|
|
|
|
module.exports = KeyEscapeUtils;
|
|
|
|
/***/ }),
|
|
/* 49 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactPropTypesSecret = __webpack_require__(84);
|
|
var propTypesFactory = __webpack_require__(71);
|
|
|
|
var React = __webpack_require__(23);
|
|
var PropTypes = propTypesFactory(React.isValidElement);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var hasReadOnlyValue = {
|
|
button: true,
|
|
checkbox: true,
|
|
image: true,
|
|
hidden: true,
|
|
radio: true,
|
|
reset: true,
|
|
submit: true
|
|
};
|
|
|
|
function _assertSingleLink(inputProps) {
|
|
!(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don\'t want to use valueLink and vice versa.') : _prodInvariant('87') : void 0;
|
|
}
|
|
function _assertValueLink(inputProps) {
|
|
_assertSingleLink(inputProps);
|
|
!(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don\'t want to use valueLink.') : _prodInvariant('88') : void 0;
|
|
}
|
|
|
|
function _assertCheckedLink(inputProps) {
|
|
_assertSingleLink(inputProps);
|
|
!(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don\'t want to use checkedLink') : _prodInvariant('89') : void 0;
|
|
}
|
|
|
|
var propTypes = {
|
|
value: function value(props, propName, componentName) {
|
|
if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {
|
|
return null;
|
|
}
|
|
return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
|
},
|
|
checked: function checked(props, propName, componentName) {
|
|
if (!props[propName] || props.onChange || props.readOnly || props.disabled) {
|
|
return null;
|
|
}
|
|
return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
|
},
|
|
onChange: PropTypes.func
|
|
};
|
|
|
|
var loggedTypeFailures = {};
|
|
function getDeclarationErrorAddendum(owner) {
|
|
if (owner) {
|
|
var name = owner.getName();
|
|
if (name) {
|
|
return ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Provide a linked `value` attribute for controlled forms. You should not use
|
|
* this outside of the ReactDOM controlled form components.
|
|
*/
|
|
var LinkedValueUtils = {
|
|
checkPropTypes: function checkPropTypes(tagName, props, owner) {
|
|
for (var propName in propTypes) {
|
|
if (propTypes.hasOwnProperty(propName)) {
|
|
var error = propTypes[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret);
|
|
}
|
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
|
// Only monitor this failure once because there tends to be a lot of the
|
|
// same error.
|
|
loggedTypeFailures[error.message] = true;
|
|
|
|
var addendum = getDeclarationErrorAddendum(owner);
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : void 0;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @param {object} inputProps Props for form component
|
|
* @return {*} current value of the input either from value prop or link.
|
|
*/
|
|
getValue: function getValue(inputProps) {
|
|
if (inputProps.valueLink) {
|
|
_assertValueLink(inputProps);
|
|
return inputProps.valueLink.value;
|
|
}
|
|
return inputProps.value;
|
|
},
|
|
|
|
/**
|
|
* @param {object} inputProps Props for form component
|
|
* @return {*} current checked status of the input either from checked prop
|
|
* or link.
|
|
*/
|
|
getChecked: function getChecked(inputProps) {
|
|
if (inputProps.checkedLink) {
|
|
_assertCheckedLink(inputProps);
|
|
return inputProps.checkedLink.value;
|
|
}
|
|
return inputProps.checked;
|
|
},
|
|
|
|
/**
|
|
* @param {object} inputProps Props for form component
|
|
* @param {SyntheticEvent} event change event to handle
|
|
*/
|
|
executeOnChange: function executeOnChange(inputProps, event) {
|
|
if (inputProps.valueLink) {
|
|
_assertValueLink(inputProps);
|
|
return inputProps.valueLink.requestChange(event.target.value);
|
|
} else if (inputProps.checkedLink) {
|
|
_assertCheckedLink(inputProps);
|
|
return inputProps.checkedLink.requestChange(event.target.checked);
|
|
} else if (inputProps.onChange) {
|
|
return inputProps.onChange.call(undefined, event);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = LinkedValueUtils;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 50 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var injected = false;
|
|
|
|
var ReactComponentEnvironment = {
|
|
/**
|
|
* Optionally injectable hook for swapping out mount images in the middle of
|
|
* the tree.
|
|
*/
|
|
replaceNodeWithMarkup: null,
|
|
|
|
/**
|
|
* Optionally injectable hook for processing a queue of child updates. Will
|
|
* later move into MultiChildComponents.
|
|
*/
|
|
processChildrenUpdates: null,
|
|
|
|
injection: {
|
|
injectEnvironment: function injectEnvironment(environment) {
|
|
!!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : _prodInvariant('104') : void 0;
|
|
ReactComponentEnvironment.replaceNodeWithMarkup = environment.replaceNodeWithMarkup;
|
|
ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;
|
|
injected = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactComponentEnvironment;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 51 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var caughtError = null;
|
|
|
|
/**
|
|
* Call a function while guarding against errors that happens within it.
|
|
*
|
|
* @param {String} name of the guard to use for logging or debugging
|
|
* @param {Function} func The function to invoke
|
|
* @param {*} a First argument
|
|
* @param {*} b Second argument
|
|
*/
|
|
function invokeGuardedCallback(name, func, a) {
|
|
try {
|
|
func(a);
|
|
} catch (x) {
|
|
if (caughtError === null) {
|
|
caughtError = x;
|
|
}
|
|
}
|
|
}
|
|
|
|
var ReactErrorUtils = {
|
|
invokeGuardedCallback: invokeGuardedCallback,
|
|
|
|
/**
|
|
* Invoked by ReactTestUtils.Simulate so that any errors thrown by the event
|
|
* handler are sure to be rethrown by rethrowCaughtError.
|
|
*/
|
|
invokeGuardedCallbackWithCatch: invokeGuardedCallback,
|
|
|
|
/**
|
|
* During execution of guarded functions we will capture the first error which
|
|
* we will rethrow to be handled by the top level error handler.
|
|
*/
|
|
rethrowCaughtError: function rethrowCaughtError() {
|
|
if (caughtError) {
|
|
var error = caughtError;
|
|
caughtError = null;
|
|
throw error;
|
|
}
|
|
}
|
|
};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
/**
|
|
* To help development we can get better devtools integration by simulating a
|
|
* real browser event.
|
|
*/
|
|
if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
|
|
var fakeNode = document.createElement('react');
|
|
ReactErrorUtils.invokeGuardedCallback = function (name, func, a) {
|
|
var boundFunc = func.bind(null, a);
|
|
var evtType = 'react-' + name;
|
|
fakeNode.addEventListener(evtType, boundFunc, false);
|
|
var evt = document.createEvent('Event');
|
|
evt.initEvent(evtType, false, false);
|
|
fakeNode.dispatchEvent(evt);
|
|
fakeNode.removeEventListener(evtType, boundFunc, false);
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = ReactErrorUtils;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 52 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactInstanceMap = __webpack_require__(29);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
function enqueueUpdate(internalInstance) {
|
|
ReactUpdates.enqueueUpdate(internalInstance);
|
|
}
|
|
|
|
function formatUnexpectedArgument(arg) {
|
|
var type = typeof arg === 'undefined' ? 'undefined' : _typeof(arg);
|
|
if (type !== 'object') {
|
|
return type;
|
|
}
|
|
var displayName = arg.constructor && arg.constructor.name || type;
|
|
var keys = Object.keys(arg);
|
|
if (keys.length > 0 && keys.length < 20) {
|
|
return displayName + ' (keys: ' + keys.join(', ') + ')';
|
|
}
|
|
return displayName;
|
|
}
|
|
|
|
function getInternalInstanceReadyForUpdate(publicInstance, callerName) {
|
|
var internalInstance = ReactInstanceMap.get(publicInstance);
|
|
if (!internalInstance) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var ctor = publicInstance.constructor;
|
|
// Only warn when we have a callerName. Otherwise we should be silent.
|
|
// We're probably calling from enqueueCallback. We don't want to warn
|
|
// there because we already warned for the corresponding lifecycle method.
|
|
process.env.NODE_ENV !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, ctor && (ctor.displayName || ctor.name) || 'ReactClass') : void 0;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition (such as ' + "within `render` or another component's constructor). Render methods " + 'should be a pure function of props and state; constructor ' + 'side-effects are an anti-pattern, but can be moved to ' + '`componentWillMount`.', callerName) : void 0;
|
|
}
|
|
|
|
return internalInstance;
|
|
}
|
|
|
|
/**
|
|
* ReactUpdateQueue allows for state updates to be scheduled into a later
|
|
* reconciliation step.
|
|
*/
|
|
var ReactUpdateQueue = {
|
|
/**
|
|
* Checks whether or not this composite component is mounted.
|
|
* @param {ReactClass} publicInstance The instance we want to test.
|
|
* @return {boolean} True if mounted, false otherwise.
|
|
* @protected
|
|
* @final
|
|
*/
|
|
isMounted: function isMounted(publicInstance) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var owner = ReactCurrentOwner.current;
|
|
if (owner !== null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : void 0;
|
|
owner._warnedAboutRefsInRender = true;
|
|
}
|
|
}
|
|
var internalInstance = ReactInstanceMap.get(publicInstance);
|
|
if (internalInstance) {
|
|
// During componentWillMount and render this will still be null but after
|
|
// that will always render to something. At least for now. So we can use
|
|
// this hack.
|
|
return !!internalInstance._renderedComponent;
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Enqueue a callback that will be executed after all the pending updates
|
|
* have processed.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance to use as `this` context.
|
|
* @param {?function} callback Called after state is updated.
|
|
* @param {string} callerName Name of the calling function in the public API.
|
|
* @internal
|
|
*/
|
|
enqueueCallback: function enqueueCallback(publicInstance, callback, callerName) {
|
|
ReactUpdateQueue.validateCallback(callback, callerName);
|
|
var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);
|
|
|
|
// Previously we would throw an error if we didn't have an internal
|
|
// instance. Since we want to make it a no-op instead, we mirror the same
|
|
// behavior we have in other enqueue* methods.
|
|
// We also need to ignore callbacks in componentWillMount. See
|
|
// enqueueUpdates.
|
|
if (!internalInstance) {
|
|
return null;
|
|
}
|
|
|
|
if (internalInstance._pendingCallbacks) {
|
|
internalInstance._pendingCallbacks.push(callback);
|
|
} else {
|
|
internalInstance._pendingCallbacks = [callback];
|
|
}
|
|
// TODO: The callback here is ignored when setState is called from
|
|
// componentWillMount. Either fix it or disallow doing so completely in
|
|
// favor of getInitialState. Alternatively, we can disallow
|
|
// componentWillMount during server-side rendering.
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
enqueueCallbackInternal: function enqueueCallbackInternal(internalInstance, callback) {
|
|
if (internalInstance._pendingCallbacks) {
|
|
internalInstance._pendingCallbacks.push(callback);
|
|
} else {
|
|
internalInstance._pendingCallbacks = [callback];
|
|
}
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
/**
|
|
* Forces an update. This should only be invoked when it is known with
|
|
* certainty that we are **not** in a DOM transaction.
|
|
*
|
|
* You may want to call this when you know that some deeper aspect of the
|
|
* component's state has changed but `setState` was not called.
|
|
*
|
|
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
* `componentWillUpdate` and `componentDidUpdate`.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @internal
|
|
*/
|
|
enqueueForceUpdate: function enqueueForceUpdate(publicInstance) {
|
|
var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate');
|
|
|
|
if (!internalInstance) {
|
|
return;
|
|
}
|
|
|
|
internalInstance._pendingForceUpdate = true;
|
|
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
/**
|
|
* Replaces all of the state. Always use this or `setState` to mutate state.
|
|
* You should treat `this.state` as immutable.
|
|
*
|
|
* There is no guarantee that `this.state` will be immediately updated, so
|
|
* accessing `this.state` after calling this method may return the old value.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object} completeState Next state.
|
|
* @internal
|
|
*/
|
|
enqueueReplaceState: function enqueueReplaceState(publicInstance, completeState, callback) {
|
|
var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState');
|
|
|
|
if (!internalInstance) {
|
|
return;
|
|
}
|
|
|
|
internalInstance._pendingStateQueue = [completeState];
|
|
internalInstance._pendingReplaceState = true;
|
|
|
|
// Future-proof 15.5
|
|
if (callback !== undefined && callback !== null) {
|
|
ReactUpdateQueue.validateCallback(callback, 'replaceState');
|
|
if (internalInstance._pendingCallbacks) {
|
|
internalInstance._pendingCallbacks.push(callback);
|
|
} else {
|
|
internalInstance._pendingCallbacks = [callback];
|
|
}
|
|
}
|
|
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
/**
|
|
* Sets a subset of the state. This only exists because _pendingState is
|
|
* internal. This provides a merging strategy that is not available to deep
|
|
* properties which is confusing. TODO: Expose pendingState or don't use it
|
|
* during the merge.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object} partialState Next partial state to be merged with state.
|
|
* @internal
|
|
*/
|
|
enqueueSetState: function enqueueSetState(publicInstance, partialState) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onSetState();
|
|
process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : void 0;
|
|
}
|
|
|
|
var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState');
|
|
|
|
if (!internalInstance) {
|
|
return;
|
|
}
|
|
|
|
var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []);
|
|
queue.push(partialState);
|
|
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
enqueueElementInternal: function enqueueElementInternal(internalInstance, nextElement, nextContext) {
|
|
internalInstance._pendingElement = nextElement;
|
|
// TODO: introduce _pendingContext instead of setting it directly.
|
|
internalInstance._context = nextContext;
|
|
enqueueUpdate(internalInstance);
|
|
},
|
|
|
|
validateCallback: function validateCallback(callback, callerName) {
|
|
!(!callback || typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.', callerName, formatUnexpectedArgument(callback)) : _prodInvariant('122', callerName, formatUnexpectedArgument(callback)) : void 0;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactUpdateQueue;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 53 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/* globals MSApp */
|
|
|
|
|
|
|
|
/**
|
|
* Create a function which has 'unsafe' privileges (required by windows8 apps)
|
|
*/
|
|
|
|
var createMicrosoftUnsafeLocalFunction = function createMicrosoftUnsafeLocalFunction(func) {
|
|
if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
|
|
return function (arg0, arg1, arg2, arg3) {
|
|
MSApp.execUnsafeLocalFunction(function () {
|
|
return func(arg0, arg1, arg2, arg3);
|
|
});
|
|
};
|
|
} else {
|
|
return func;
|
|
}
|
|
};
|
|
|
|
module.exports = createMicrosoftUnsafeLocalFunction;
|
|
|
|
/***/ }),
|
|
/* 54 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* `charCode` represents the actual "character code" and is safe to use with
|
|
* `String.fromCharCode`. As such, only keys that correspond to printable
|
|
* characters produce a valid `charCode`, the only exception to this is Enter.
|
|
* The Tab-key is considered non-printable and does not have a `charCode`,
|
|
* presumably because it does not produce a tab-character in browsers.
|
|
*
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @return {number} Normalized `charCode` property.
|
|
*/
|
|
|
|
function getEventCharCode(nativeEvent) {
|
|
var charCode;
|
|
var keyCode = nativeEvent.keyCode;
|
|
|
|
if ('charCode' in nativeEvent) {
|
|
charCode = nativeEvent.charCode;
|
|
|
|
// FF does not set `charCode` for the Enter-key, check against `keyCode`.
|
|
if (charCode === 0 && keyCode === 13) {
|
|
charCode = 13;
|
|
}
|
|
} else {
|
|
// IE8 does not implement `charCode`, but `keyCode` has the correct value.
|
|
charCode = keyCode;
|
|
}
|
|
|
|
// Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
|
|
// Must not discard the (non-)printable Enter-key.
|
|
if (charCode >= 32 || charCode === 13) {
|
|
return charCode;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
module.exports = getEventCharCode;
|
|
|
|
/***/ }),
|
|
/* 55 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Translation from modifier key to the associated property in the event.
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
|
|
*/
|
|
|
|
var modifierKeyToProp = {
|
|
Alt: 'altKey',
|
|
Control: 'ctrlKey',
|
|
Meta: 'metaKey',
|
|
Shift: 'shiftKey'
|
|
};
|
|
|
|
// IE8 does not implement getModifierState so we simply map it to the only
|
|
// modifier keys exposed by the event itself, does not support Lock-keys.
|
|
// Currently, all major browsers except Chrome seems to support Lock-keys.
|
|
function modifierStateGetter(keyArg) {
|
|
var syntheticEvent = this;
|
|
var nativeEvent = syntheticEvent.nativeEvent;
|
|
if (nativeEvent.getModifierState) {
|
|
return nativeEvent.getModifierState(keyArg);
|
|
}
|
|
var keyProp = modifierKeyToProp[keyArg];
|
|
return keyProp ? !!nativeEvent[keyProp] : false;
|
|
}
|
|
|
|
function getEventModifierState(nativeEvent) {
|
|
return modifierStateGetter;
|
|
}
|
|
|
|
module.exports = getEventModifierState;
|
|
|
|
/***/ }),
|
|
/* 56 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Gets the target node from a native browser event by accounting for
|
|
* inconsistencies in browser DOM APIs.
|
|
*
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @return {DOMEventTarget} Target node.
|
|
*/
|
|
|
|
function getEventTarget(nativeEvent) {
|
|
var target = nativeEvent.target || nativeEvent.srcElement || window;
|
|
|
|
// Normalize SVG <use> element events #4963
|
|
if (target.correspondingUseElement) {
|
|
target = target.correspondingUseElement;
|
|
}
|
|
|
|
// Safari may fire events on text nodes (Node.TEXT_NODE is 3).
|
|
// @see http://www.quirksmode.org/js/events_properties.html
|
|
return target.nodeType === 3 ? target.parentNode : target;
|
|
}
|
|
|
|
module.exports = getEventTarget;
|
|
|
|
/***/ }),
|
|
/* 57 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var useHasFeature;
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
useHasFeature = document.implementation && document.implementation.hasFeature &&
|
|
// always returns true in newer browsers as per the standard.
|
|
// @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
|
|
document.implementation.hasFeature('', '') !== true;
|
|
}
|
|
|
|
/**
|
|
* Checks if an event is supported in the current execution environment.
|
|
*
|
|
* NOTE: This will not work correctly for non-generic events such as `change`,
|
|
* `reset`, `load`, `error`, and `select`.
|
|
*
|
|
* Borrows from Modernizr.
|
|
*
|
|
* @param {string} eventNameSuffix Event name, e.g. "click".
|
|
* @param {?boolean} capture Check if the capture phase is supported.
|
|
* @return {boolean} True if the event is supported.
|
|
* @internal
|
|
* @license Modernizr 3.0.0pre (Custom Build) | MIT
|
|
*/
|
|
function isEventSupported(eventNameSuffix, capture) {
|
|
if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) {
|
|
return false;
|
|
}
|
|
|
|
var eventName = 'on' + eventNameSuffix;
|
|
var isSupported = eventName in document;
|
|
|
|
if (!isSupported) {
|
|
var element = document.createElement('div');
|
|
element.setAttribute(eventName, 'return;');
|
|
isSupported = typeof element[eventName] === 'function';
|
|
}
|
|
|
|
if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {
|
|
// This is the only way to test support for the `wheel` event in IE9+.
|
|
isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
|
|
}
|
|
|
|
return isSupported;
|
|
}
|
|
|
|
module.exports = isEventSupported;
|
|
|
|
/***/ }),
|
|
/* 58 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Given a `prevElement` and `nextElement`, determines if the existing
|
|
* instance should be updated as opposed to being destroyed or replaced by a new
|
|
* instance. Both arguments are elements. This ensures that this logic can
|
|
* operate on stateless trees without any backing instance.
|
|
*
|
|
* @param {?object} prevElement
|
|
* @param {?object} nextElement
|
|
* @return {boolean} True if the existing instance should be updated.
|
|
* @protected
|
|
*/
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
function shouldUpdateReactComponent(prevElement, nextElement) {
|
|
var prevEmpty = prevElement === null || prevElement === false;
|
|
var nextEmpty = nextElement === null || nextElement === false;
|
|
if (prevEmpty || nextEmpty) {
|
|
return prevEmpty === nextEmpty;
|
|
}
|
|
|
|
var prevType = typeof prevElement === 'undefined' ? 'undefined' : _typeof(prevElement);
|
|
var nextType = typeof nextElement === 'undefined' ? 'undefined' : _typeof(nextElement);
|
|
if (prevType === 'string' || prevType === 'number') {
|
|
return nextType === 'string' || nextType === 'number';
|
|
} else {
|
|
return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;
|
|
}
|
|
}
|
|
|
|
module.exports = shouldUpdateReactComponent;
|
|
|
|
/***/ }),
|
|
/* 59 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var validateDOMNesting = emptyFunction;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// This validation code was written based on the HTML5 parsing spec:
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
|
|
//
|
|
// Note: this does not catch all invalid nesting, nor does it try to (as it's
|
|
// not clear what practical benefit doing so provides); instead, we warn only
|
|
// for cases where the parser will give a parse tree differing from what React
|
|
// intended. For example, <b><div></div></b> is invalid but we don't warn
|
|
// because it still parses correctly; we do warn for other cases like nested
|
|
// <p> tags where the beginning of the second element implicitly closes the
|
|
// first, causing a confusing mess.
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#special
|
|
var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
|
|
var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
|
|
// TODO: Distinguish by namespace here -- for <title>, including it here
|
|
// errs on the side of fewer warnings
|
|
'foreignObject', 'desc', 'title'];
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
|
|
var buttonScopeTags = inScopeTags.concat(['button']);
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
|
|
var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
|
|
|
|
var emptyAncestorInfo = {
|
|
current: null,
|
|
|
|
formTag: null,
|
|
aTagInScope: null,
|
|
buttonTagInScope: null,
|
|
nobrTagInScope: null,
|
|
pTagInButtonScope: null,
|
|
|
|
listItemTagAutoclosing: null,
|
|
dlItemTagAutoclosing: null
|
|
};
|
|
|
|
var updatedAncestorInfo = function updatedAncestorInfo(oldInfo, tag, instance) {
|
|
var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
|
|
var info = { tag: tag, instance: instance };
|
|
|
|
if (inScopeTags.indexOf(tag) !== -1) {
|
|
ancestorInfo.aTagInScope = null;
|
|
ancestorInfo.buttonTagInScope = null;
|
|
ancestorInfo.nobrTagInScope = null;
|
|
}
|
|
if (buttonScopeTags.indexOf(tag) !== -1) {
|
|
ancestorInfo.pTagInButtonScope = null;
|
|
}
|
|
|
|
// See rules for 'li', 'dd', 'dt' start tags in
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
|
|
if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
|
|
ancestorInfo.listItemTagAutoclosing = null;
|
|
ancestorInfo.dlItemTagAutoclosing = null;
|
|
}
|
|
|
|
ancestorInfo.current = info;
|
|
|
|
if (tag === 'form') {
|
|
ancestorInfo.formTag = info;
|
|
}
|
|
if (tag === 'a') {
|
|
ancestorInfo.aTagInScope = info;
|
|
}
|
|
if (tag === 'button') {
|
|
ancestorInfo.buttonTagInScope = info;
|
|
}
|
|
if (tag === 'nobr') {
|
|
ancestorInfo.nobrTagInScope = info;
|
|
}
|
|
if (tag === 'p') {
|
|
ancestorInfo.pTagInButtonScope = info;
|
|
}
|
|
if (tag === 'li') {
|
|
ancestorInfo.listItemTagAutoclosing = info;
|
|
}
|
|
if (tag === 'dd' || tag === 'dt') {
|
|
ancestorInfo.dlItemTagAutoclosing = info;
|
|
}
|
|
|
|
return ancestorInfo;
|
|
};
|
|
|
|
/**
|
|
* Returns whether
|
|
*/
|
|
var isTagValidWithParent = function isTagValidWithParent(tag, parentTag) {
|
|
// First, let's check if we're in an unusual parsing mode...
|
|
switch (parentTag) {
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
|
|
case 'select':
|
|
return tag === 'option' || tag === 'optgroup' || tag === '#text';
|
|
case 'optgroup':
|
|
return tag === 'option' || tag === '#text';
|
|
// Strictly speaking, seeing an <option> doesn't mean we're in a <select>
|
|
// but
|
|
case 'option':
|
|
return tag === '#text';
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
|
|
// No special behavior since these rules fall back to "in body" mode for
|
|
// all except special table nodes which cause bad parsing behavior anyway.
|
|
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
|
|
case 'tr':
|
|
return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
|
|
case 'tbody':
|
|
case 'thead':
|
|
case 'tfoot':
|
|
return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
|
|
case 'colgroup':
|
|
return tag === 'col' || tag === 'template';
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
|
|
case 'table':
|
|
return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
|
|
case 'head':
|
|
return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
|
|
// https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
|
|
case 'html':
|
|
return tag === 'head' || tag === 'body';
|
|
case '#document':
|
|
return tag === 'html';
|
|
}
|
|
|
|
// Probably in the "in body" parsing mode, so we outlaw only tag combos
|
|
// where the parsing rules cause implicit opens or closes to be added.
|
|
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
|
|
switch (tag) {
|
|
case 'h1':
|
|
case 'h2':
|
|
case 'h3':
|
|
case 'h4':
|
|
case 'h5':
|
|
case 'h6':
|
|
return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
|
|
|
|
case 'rp':
|
|
case 'rt':
|
|
return impliedEndTags.indexOf(parentTag) === -1;
|
|
|
|
case 'body':
|
|
case 'caption':
|
|
case 'col':
|
|
case 'colgroup':
|
|
case 'frame':
|
|
case 'head':
|
|
case 'html':
|
|
case 'tbody':
|
|
case 'td':
|
|
case 'tfoot':
|
|
case 'th':
|
|
case 'thead':
|
|
case 'tr':
|
|
// These tags are only valid with a few parents that have special child
|
|
// parsing rules -- if we're down here, then none of those matched and
|
|
// so we allow it only if we don't know what the parent is, as all other
|
|
// cases are invalid.
|
|
return parentTag == null;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
/**
|
|
* Returns whether
|
|
*/
|
|
var findInvalidAncestorForTag = function findInvalidAncestorForTag(tag, ancestorInfo) {
|
|
switch (tag) {
|
|
case 'address':
|
|
case 'article':
|
|
case 'aside':
|
|
case 'blockquote':
|
|
case 'center':
|
|
case 'details':
|
|
case 'dialog':
|
|
case 'dir':
|
|
case 'div':
|
|
case 'dl':
|
|
case 'fieldset':
|
|
case 'figcaption':
|
|
case 'figure':
|
|
case 'footer':
|
|
case 'header':
|
|
case 'hgroup':
|
|
case 'main':
|
|
case 'menu':
|
|
case 'nav':
|
|
case 'ol':
|
|
case 'p':
|
|
case 'section':
|
|
case 'summary':
|
|
case 'ul':
|
|
case 'pre':
|
|
case 'listing':
|
|
case 'table':
|
|
case 'hr':
|
|
case 'xmp':
|
|
case 'h1':
|
|
case 'h2':
|
|
case 'h3':
|
|
case 'h4':
|
|
case 'h5':
|
|
case 'h6':
|
|
return ancestorInfo.pTagInButtonScope;
|
|
|
|
case 'form':
|
|
return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
|
|
|
|
case 'li':
|
|
return ancestorInfo.listItemTagAutoclosing;
|
|
|
|
case 'dd':
|
|
case 'dt':
|
|
return ancestorInfo.dlItemTagAutoclosing;
|
|
|
|
case 'button':
|
|
return ancestorInfo.buttonTagInScope;
|
|
|
|
case 'a':
|
|
// Spec says something about storing a list of markers, but it sounds
|
|
// equivalent to this check.
|
|
return ancestorInfo.aTagInScope;
|
|
|
|
case 'nobr':
|
|
return ancestorInfo.nobrTagInScope;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
/**
|
|
* Given a ReactCompositeComponent instance, return a list of its recursive
|
|
* owners, starting at the root and ending with the instance itself.
|
|
*/
|
|
var findOwnerStack = function findOwnerStack(instance) {
|
|
if (!instance) {
|
|
return [];
|
|
}
|
|
|
|
var stack = [];
|
|
do {
|
|
stack.push(instance);
|
|
} while (instance = instance._currentElement._owner);
|
|
stack.reverse();
|
|
return stack;
|
|
};
|
|
|
|
var didWarn = {};
|
|
|
|
validateDOMNesting = function validateDOMNesting(childTag, childText, childInstance, ancestorInfo) {
|
|
ancestorInfo = ancestorInfo || emptyAncestorInfo;
|
|
var parentInfo = ancestorInfo.current;
|
|
var parentTag = parentInfo && parentInfo.tag;
|
|
|
|
if (childText != null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(childTag == null, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;
|
|
childTag = '#text';
|
|
}
|
|
|
|
var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
|
|
var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
|
|
var problematic = invalidParent || invalidAncestor;
|
|
|
|
if (problematic) {
|
|
var ancestorTag = problematic.tag;
|
|
var ancestorInstance = problematic.instance;
|
|
|
|
var childOwner = childInstance && childInstance._currentElement._owner;
|
|
var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner;
|
|
|
|
var childOwners = findOwnerStack(childOwner);
|
|
var ancestorOwners = findOwnerStack(ancestorOwner);
|
|
|
|
var minStackLen = Math.min(childOwners.length, ancestorOwners.length);
|
|
var i;
|
|
|
|
var deepestCommon = -1;
|
|
for (i = 0; i < minStackLen; i++) {
|
|
if (childOwners[i] === ancestorOwners[i]) {
|
|
deepestCommon = i;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
var UNKNOWN = '(unknown)';
|
|
var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) {
|
|
return inst.getName() || UNKNOWN;
|
|
});
|
|
var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) {
|
|
return inst.getName() || UNKNOWN;
|
|
});
|
|
var ownerInfo = [].concat(
|
|
// If the parent and child instances have a common owner ancestor, start
|
|
// with that -- otherwise we just start with the parent's owners.
|
|
deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag,
|
|
// If we're warning about an invalid (non-parent) ancestry, add '...'
|
|
invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > ');
|
|
|
|
var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo;
|
|
if (didWarn[warnKey]) {
|
|
return;
|
|
}
|
|
didWarn[warnKey] = true;
|
|
|
|
var tagDisplayName = childTag;
|
|
var whitespaceInfo = '';
|
|
if (childTag === '#text') {
|
|
if (/\S/.test(childText)) {
|
|
tagDisplayName = 'Text nodes';
|
|
} else {
|
|
tagDisplayName = 'Whitespace text nodes';
|
|
whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
|
|
}
|
|
} else {
|
|
tagDisplayName = '<' + childTag + '>';
|
|
}
|
|
|
|
if (invalidParent) {
|
|
var info = '';
|
|
if (ancestorTag === 'table' && childTag === 'tr') {
|
|
info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s ' + 'See %s.%s', tagDisplayName, ancestorTag, whitespaceInfo, ownerInfo, info) : void 0;
|
|
} else {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>. See %s.', tagDisplayName, ancestorTag, ownerInfo) : void 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo;
|
|
|
|
// For testing
|
|
validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) {
|
|
ancestorInfo = ancestorInfo || emptyAncestorInfo;
|
|
var parentInfo = ancestorInfo.current;
|
|
var parentTag = parentInfo && parentInfo.tag;
|
|
return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);
|
|
};
|
|
}
|
|
|
|
module.exports = validateDOMNesting;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 60 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = warning;
|
|
/**
|
|
* Prints a warning in the console if it exists.
|
|
*
|
|
* @param {String} message The warning message.
|
|
* @returns {void}
|
|
*/
|
|
function warning(message) {
|
|
/* eslint-disable no-console */
|
|
if (typeof console !== 'undefined' && typeof console.error === 'function') {
|
|
console.error(message);
|
|
}
|
|
/* eslint-enable no-console */
|
|
try {
|
|
// This error was thrown as a convenience so that if you enable
|
|
// "break on all exceptions" in your console,
|
|
// it would pause the execution at this line.
|
|
throw new Error(message);
|
|
/* eslint-disable no-empty */
|
|
} catch (e) {}
|
|
/* eslint-enable no-empty */
|
|
}
|
|
|
|
/***/ }),
|
|
/* 61 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _invariant = __webpack_require__(26);
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for putting history on context.
|
|
*/
|
|
|
|
var Router = function (_React$Component) {
|
|
_inherits(Router, _React$Component);
|
|
|
|
function Router() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, Router);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {
|
|
match: _this.computeMatch(_this.props.history.location.pathname)
|
|
}, _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
Router.prototype.getChildContext = function getChildContext() {
|
|
return {
|
|
router: _extends({}, this.context.router, {
|
|
history: this.props.history,
|
|
route: {
|
|
location: this.props.history.location,
|
|
match: this.state.match
|
|
}
|
|
})
|
|
};
|
|
};
|
|
|
|
Router.prototype.computeMatch = function computeMatch(pathname) {
|
|
return {
|
|
path: '/',
|
|
url: '/',
|
|
params: {},
|
|
isExact: pathname === '/'
|
|
};
|
|
};
|
|
|
|
Router.prototype.componentWillMount = function componentWillMount() {
|
|
var _this2 = this;
|
|
|
|
var _props = this.props,
|
|
children = _props.children,
|
|
history = _props.history;
|
|
|
|
(0, _invariant2.default)(children == null || _react2.default.Children.count(children) === 1, 'A <Router> may have only one child element');
|
|
|
|
// Do this here so we can setState when a <Redirect> changes the
|
|
// location in componentWillMount. This happens e.g. when doing
|
|
// server rendering using a <StaticRouter>.
|
|
this.unlisten = history.listen(function () {
|
|
_this2.setState({
|
|
match: _this2.computeMatch(history.location.pathname)
|
|
});
|
|
});
|
|
};
|
|
|
|
Router.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
|
(0, _warning2.default)(this.props.history === nextProps.history, 'You cannot change <Router history>');
|
|
};
|
|
|
|
Router.prototype.componentWillUnmount = function componentWillUnmount() {
|
|
this.unlisten();
|
|
};
|
|
|
|
Router.prototype.render = function render() {
|
|
var children = this.props.children;
|
|
|
|
return children ? _react2.default.Children.only(children) : null;
|
|
};
|
|
|
|
return Router;
|
|
}(_react2.default.Component);
|
|
|
|
Router.propTypes = {
|
|
history: _propTypes2.default.object.isRequired,
|
|
children: _propTypes2.default.node
|
|
};
|
|
Router.contextTypes = {
|
|
router: _propTypes2.default.object
|
|
};
|
|
Router.childContextTypes = {
|
|
router: _propTypes2.default.object.isRequired
|
|
};
|
|
|
|
exports.default = Router;
|
|
|
|
/***/ }),
|
|
/* 62 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _pathToRegexp = __webpack_require__(244);
|
|
|
|
var _pathToRegexp2 = _interopRequireDefault(_pathToRegexp);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var patternCache = {};
|
|
var cacheLimit = 10000;
|
|
var cacheCount = 0;
|
|
|
|
var compilePath = function compilePath(pattern, options) {
|
|
var cacheKey = '' + options.end + options.strict;
|
|
var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});
|
|
|
|
if (cache[pattern]) return cache[pattern];
|
|
|
|
var keys = [];
|
|
var re = (0, _pathToRegexp2.default)(pattern, keys, options);
|
|
var compiledPattern = { re: re, keys: keys };
|
|
|
|
if (cacheCount < cacheLimit) {
|
|
cache[pattern] = compiledPattern;
|
|
cacheCount++;
|
|
}
|
|
|
|
return compiledPattern;
|
|
};
|
|
|
|
/**
|
|
* Public API for matching a URL pathname to a path pattern.
|
|
*/
|
|
var matchPath = function matchPath(pathname) {
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
|
|
if (typeof options === 'string') options = { path: options };
|
|
|
|
var _options = options,
|
|
_options$path = _options.path,
|
|
path = _options$path === undefined ? '/' : _options$path,
|
|
_options$exact = _options.exact,
|
|
exact = _options$exact === undefined ? false : _options$exact,
|
|
_options$strict = _options.strict,
|
|
strict = _options$strict === undefined ? false : _options$strict;
|
|
|
|
var _compilePath = compilePath(path, { end: exact, strict: strict }),
|
|
re = _compilePath.re,
|
|
keys = _compilePath.keys;
|
|
|
|
var match = re.exec(pathname);
|
|
|
|
if (!match) return null;
|
|
|
|
var url = match[0],
|
|
values = match.slice(1);
|
|
|
|
var isExact = pathname === url;
|
|
|
|
if (exact && !isExact) return null;
|
|
|
|
return {
|
|
path: path, // the path pattern used to match
|
|
url: path === '/' && url === '' ? '/' : url, // the matched portion of the URL
|
|
isExact: isExact, // whether or not we matched exactly
|
|
params: keys.reduce(function (memo, key, index) {
|
|
memo[key.name] = values[index];
|
|
return memo;
|
|
}, {})
|
|
};
|
|
};
|
|
|
|
exports.default = matchPath;
|
|
|
|
/***/ }),
|
|
/* 63 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-2015, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Forked from fbjs/warning:
|
|
* https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
|
|
*
|
|
* Only change is we use console.warn instead of console.error,
|
|
* and do nothing when 'console' is not supported.
|
|
* This really simplifies the code.
|
|
* ---
|
|
* Similar to invariant but only logs a warning if the condition is not met.
|
|
* This can be used to log issues in development environments in critical
|
|
* paths. Removing the logging code for production environments will keep the
|
|
* same logic and follow the same code paths.
|
|
*/
|
|
|
|
var lowPriorityWarning = function lowPriorityWarning() {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var printWarning = function printWarning(format) {
|
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
var argIndex = 0;
|
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
|
return args[argIndex++];
|
|
});
|
|
if (typeof console !== 'undefined') {
|
|
console.warn(message);
|
|
}
|
|
try {
|
|
// --- Welcome to debugging React ---
|
|
// This error was thrown as a convenience so that you can use this stack
|
|
// to find the callsite that caused this warning to fire.
|
|
throw new Error(message);
|
|
} catch (x) {}
|
|
};
|
|
|
|
lowPriorityWarning = function lowPriorityWarning(condition, format) {
|
|
if (format === undefined) {
|
|
throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
|
|
}
|
|
if (!condition) {
|
|
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
|
args[_key2 - 2] = arguments[_key2];
|
|
}
|
|
|
|
printWarning.apply(undefined, [format].concat(args));
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = lowPriorityWarning;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 64 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;
|
|
|
|
var _createStore = __webpack_require__(107);
|
|
|
|
var _createStore2 = _interopRequireDefault(_createStore);
|
|
|
|
var _combineReducers = __webpack_require__(260);
|
|
|
|
var _combineReducers2 = _interopRequireDefault(_combineReducers);
|
|
|
|
var _bindActionCreators = __webpack_require__(259);
|
|
|
|
var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);
|
|
|
|
var _applyMiddleware = __webpack_require__(258);
|
|
|
|
var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);
|
|
|
|
var _compose = __webpack_require__(106);
|
|
|
|
var _compose2 = _interopRequireDefault(_compose);
|
|
|
|
var _warning = __webpack_require__(108);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/*
|
|
* This is a dummy function to check if the function name has been altered by minification.
|
|
* If the function has been minified and NODE_ENV !== 'production', warn the user.
|
|
*/
|
|
function isCrushed() {}
|
|
|
|
if (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {
|
|
(0, _warning2.default)('You are currently using minified code outside of NODE_ENV === \'production\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');
|
|
}
|
|
|
|
exports.createStore = _createStore2.default;
|
|
exports.combineReducers = _combineReducers2.default;
|
|
exports.bindActionCreators = _bindActionCreators2.default;
|
|
exports.applyMiddleware = _applyMiddleware2.default;
|
|
exports.compose = _compose2.default;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 65 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
|
|
/**
|
|
* Upstream version of event listener. Does not take into account specific
|
|
* nature of platform.
|
|
*/
|
|
var EventListener = {
|
|
/**
|
|
* Listen to DOM events during the bubble phase.
|
|
*
|
|
* @param {DOMEventTarget} target DOM element to register listener on.
|
|
* @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
|
|
* @param {function} callback Callback function.
|
|
* @return {object} Object with a `remove` method.
|
|
*/
|
|
listen: function listen(target, eventType, callback) {
|
|
if (target.addEventListener) {
|
|
target.addEventListener(eventType, callback, false);
|
|
return {
|
|
remove: function remove() {
|
|
target.removeEventListener(eventType, callback, false);
|
|
}
|
|
};
|
|
} else if (target.attachEvent) {
|
|
target.attachEvent('on' + eventType, callback);
|
|
return {
|
|
remove: function remove() {
|
|
target.detachEvent('on' + eventType, callback);
|
|
}
|
|
};
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Listen to DOM events during the capture phase.
|
|
*
|
|
* @param {DOMEventTarget} target DOM element to register listener on.
|
|
* @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
|
|
* @param {function} callback Callback function.
|
|
* @return {object} Object with a `remove` method.
|
|
*/
|
|
capture: function capture(target, eventType, callback) {
|
|
if (target.addEventListener) {
|
|
target.addEventListener(eventType, callback, true);
|
|
return {
|
|
remove: function remove() {
|
|
target.removeEventListener(eventType, callback, true);
|
|
}
|
|
};
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.');
|
|
}
|
|
return {
|
|
remove: emptyFunction
|
|
};
|
|
}
|
|
},
|
|
|
|
registerDefault: function registerDefault() {}
|
|
};
|
|
|
|
module.exports = EventListener;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 66 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* @param {DOMElement} node input/textarea to focus
|
|
*/
|
|
|
|
function focusNode(node) {
|
|
// IE8 can throw "Can't move focus to the control because it is invisible,
|
|
// not enabled, or of a type that does not accept the focus." for all kinds of
|
|
// reasons that are too expensive and fragile to test.
|
|
try {
|
|
node.focus();
|
|
} catch (e) {}
|
|
}
|
|
|
|
module.exports = focusNode;
|
|
|
|
/***/ }),
|
|
/* 67 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
/* eslint-disable fb-www/typeof-undefined */
|
|
|
|
/**
|
|
* Same as document.activeElement but wraps in a try-catch block. In IE it is
|
|
* not safe to call document.activeElement if there is nothing focused.
|
|
*
|
|
* The activeElement will be null only if the document or document body is not
|
|
* yet defined.
|
|
*
|
|
* @param {?DOMDocument} doc Defaults to current document.
|
|
* @return {?DOMElement}
|
|
*/
|
|
|
|
function getActiveElement(doc) /*?DOMElement*/{
|
|
doc = doc || (typeof document !== 'undefined' ? document : undefined);
|
|
if (typeof doc === 'undefined') {
|
|
return null;
|
|
}
|
|
try {
|
|
return doc.activeElement || doc.body;
|
|
} catch (e) {
|
|
return doc.body;
|
|
}
|
|
}
|
|
|
|
module.exports = getActiveElement;
|
|
|
|
/***/ }),
|
|
/* 68 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.__esModule = true;
|
|
var canUseDOM = exports.canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
|
|
|
var addEventListener = exports.addEventListener = function addEventListener(node, event, listener) {
|
|
return node.addEventListener ? node.addEventListener(event, listener, false) : node.attachEvent('on' + event, listener);
|
|
};
|
|
|
|
var removeEventListener = exports.removeEventListener = function removeEventListener(node, event, listener) {
|
|
return node.removeEventListener ? node.removeEventListener(event, listener, false) : node.detachEvent('on' + event, listener);
|
|
};
|
|
|
|
var getConfirmation = exports.getConfirmation = function getConfirmation(message, callback) {
|
|
return callback(window.confirm(message));
|
|
}; // eslint-disable-line no-alert
|
|
|
|
/**
|
|
* Returns true if the HTML5 history API is supported. Taken from Modernizr.
|
|
*
|
|
* https://github.com/Modernizr/Modernizr/blob/master/LICENSE
|
|
* https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
|
|
* changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586
|
|
*/
|
|
var supportsHistory = exports.supportsHistory = function supportsHistory() {
|
|
var ua = window.navigator.userAgent;
|
|
|
|
if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;
|
|
|
|
return window.history && 'pushState' in window.history;
|
|
};
|
|
|
|
/**
|
|
* Returns true if browser fires popstate on hash change.
|
|
* IE10 and IE11 do not.
|
|
*/
|
|
var supportsPopStateOnHashChange = exports.supportsPopStateOnHashChange = function supportsPopStateOnHashChange() {
|
|
return window.navigator.userAgent.indexOf('Trident') === -1;
|
|
};
|
|
|
|
/**
|
|
* Returns false if using go(n) with hash history causes a full page reload.
|
|
*/
|
|
var supportsGoWithoutReloadUsingHash = exports.supportsGoWithoutReloadUsingHash = function supportsGoWithoutReloadUsingHash() {
|
|
return window.navigator.userAgent.indexOf('Firefox') === -1;
|
|
};
|
|
|
|
/**
|
|
* Returns true if a given popstate event is an extraneous WebKit event.
|
|
* Accounts for the fact that Chrome on iOS fires real popstate events
|
|
* containing undefined state when pressing the back button.
|
|
*/
|
|
var isExtraneousPopstateEvent = exports.isExtraneousPopstateEvent = function isExtraneousPopstateEvent(event) {
|
|
return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 69 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2015, Yahoo! Inc.
|
|
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
|
*/
|
|
|
|
|
|
var REACT_STATICS = {
|
|
childContextTypes: true,
|
|
contextTypes: true,
|
|
defaultProps: true,
|
|
displayName: true,
|
|
getDefaultProps: true,
|
|
mixins: true,
|
|
propTypes: true,
|
|
type: true
|
|
};
|
|
|
|
var KNOWN_STATICS = {
|
|
name: true,
|
|
length: true,
|
|
prototype: true,
|
|
caller: true,
|
|
arguments: true,
|
|
arity: true
|
|
};
|
|
|
|
var isGetOwnPropertySymbolsAvailable = typeof Object.getOwnPropertySymbols === 'function';
|
|
|
|
module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, customStatics) {
|
|
if (typeof sourceComponent !== 'string') {
|
|
// don't hoist over string (html) components
|
|
var keys = Object.getOwnPropertyNames(sourceComponent);
|
|
|
|
/* istanbul ignore else */
|
|
if (isGetOwnPropertySymbolsAvailable) {
|
|
keys = keys.concat(Object.getOwnPropertySymbols(sourceComponent));
|
|
}
|
|
|
|
for (var i = 0; i < keys.length; ++i) {
|
|
if (!REACT_STATICS[keys[i]] && !KNOWN_STATICS[keys[i]] && (!customStatics || !customStatics[keys[i]])) {
|
|
try {
|
|
targetComponent[keys[i]] = sourceComponent[keys[i]];
|
|
} catch (error) {}
|
|
}
|
|
}
|
|
}
|
|
|
|
return targetComponent;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 70 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _root = __webpack_require__(141);
|
|
|
|
var _root2 = _interopRequireDefault(_root);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** Built-in value references. */
|
|
var _Symbol = _root2.default.Symbol;
|
|
|
|
exports.default = _Symbol;
|
|
|
|
/***/ }),
|
|
/* 71 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
// React 15.5 references this module, and assumes PropTypes are still callable in production.
|
|
// Therefore we re-export development-only version with all the PropTypes checks here.
|
|
// However if one is migrating to the `prop-types` npm library, they will go through the
|
|
// `index.js` entry point, and it will branch depending on the environment.
|
|
|
|
var factory = __webpack_require__(72);
|
|
module.exports = function (isValidElement) {
|
|
// It is still allowed in 15.5.
|
|
var throwOnDirectAccess = false;
|
|
return factory(isValidElement, throwOnDirectAccess);
|
|
};
|
|
|
|
/***/ }),
|
|
/* 72 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ReactPropTypesSecret = __webpack_require__(44);
|
|
var checkPropTypes = __webpack_require__(143);
|
|
|
|
module.exports = function (isValidElement, throwOnDirectAccess) {
|
|
/* global Symbol */
|
|
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
|
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
|
|
|
/**
|
|
* Returns the iterator method function contained on the iterable object.
|
|
*
|
|
* Be sure to invoke the function with the iterable as context:
|
|
*
|
|
* var iteratorFn = getIteratorFn(myIterable);
|
|
* if (iteratorFn) {
|
|
* var iterator = iteratorFn.call(myIterable);
|
|
* ...
|
|
* }
|
|
*
|
|
* @param {?object} maybeIterable
|
|
* @return {?function}
|
|
*/
|
|
function getIteratorFn(maybeIterable) {
|
|
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
|
if (typeof iteratorFn === 'function') {
|
|
return iteratorFn;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Collection of methods that allow declaration and validation of props that are
|
|
* supplied to React components. Example usage:
|
|
*
|
|
* var Props = require('ReactPropTypes');
|
|
* var MyArticle = React.createClass({
|
|
* propTypes: {
|
|
* // An optional string prop named "description".
|
|
* description: Props.string,
|
|
*
|
|
* // A required enum prop named "category".
|
|
* category: Props.oneOf(['News','Photos']).isRequired,
|
|
*
|
|
* // A prop named "dialog" that requires an instance of Dialog.
|
|
* dialog: Props.instanceOf(Dialog).isRequired
|
|
* },
|
|
* render: function() { ... }
|
|
* });
|
|
*
|
|
* A more formal specification of how these methods are used:
|
|
*
|
|
* type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
|
|
* decl := ReactPropTypes.{type}(.isRequired)?
|
|
*
|
|
* Each and every declaration produces a function with the same signature. This
|
|
* allows the creation of custom validation functions. For example:
|
|
*
|
|
* var MyLink = React.createClass({
|
|
* propTypes: {
|
|
* // An optional string or URI prop named "href".
|
|
* href: function(props, propName, componentName) {
|
|
* var propValue = props[propName];
|
|
* if (propValue != null && typeof propValue !== 'string' &&
|
|
* !(propValue instanceof URI)) {
|
|
* return new Error(
|
|
* 'Expected a string or an URI for ' + propName + ' in ' +
|
|
* componentName
|
|
* );
|
|
* }
|
|
* }
|
|
* },
|
|
* render: function() {...}
|
|
* });
|
|
*
|
|
* @internal
|
|
*/
|
|
|
|
var ANONYMOUS = '<<anonymous>>';
|
|
|
|
// Important!
|
|
// Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
|
|
var ReactPropTypes = {
|
|
array: createPrimitiveTypeChecker('array'),
|
|
bool: createPrimitiveTypeChecker('boolean'),
|
|
func: createPrimitiveTypeChecker('function'),
|
|
number: createPrimitiveTypeChecker('number'),
|
|
object: createPrimitiveTypeChecker('object'),
|
|
string: createPrimitiveTypeChecker('string'),
|
|
symbol: createPrimitiveTypeChecker('symbol'),
|
|
|
|
any: createAnyTypeChecker(),
|
|
arrayOf: createArrayOfTypeChecker,
|
|
element: createElementTypeChecker(),
|
|
instanceOf: createInstanceTypeChecker,
|
|
node: createNodeChecker(),
|
|
objectOf: createObjectOfTypeChecker,
|
|
oneOf: createEnumTypeChecker,
|
|
oneOfType: createUnionTypeChecker,
|
|
shape: createShapeTypeChecker
|
|
};
|
|
|
|
/**
|
|
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
*/
|
|
/*eslint-disable no-self-compare*/
|
|
function is(x, y) {
|
|
// SameValue algorithm
|
|
if (x === y) {
|
|
// Steps 1-5, 7-10
|
|
// Steps 6.b-6.e: +0 != -0
|
|
return x !== 0 || 1 / x === 1 / y;
|
|
} else {
|
|
// Step 6.a: NaN == NaN
|
|
return x !== x && y !== y;
|
|
}
|
|
}
|
|
/*eslint-enable no-self-compare*/
|
|
|
|
/**
|
|
* We use an Error-like object for backward compatibility as people may call
|
|
* PropTypes directly and inspect their output. However, we don't use real
|
|
* Errors anymore. We don't inspect their stack anyway, and creating them
|
|
* is prohibitively expensive if they are created too often, such as what
|
|
* happens in oneOfType() for any type before the one that matched.
|
|
*/
|
|
function PropTypeError(message) {
|
|
this.message = message;
|
|
this.stack = '';
|
|
}
|
|
// Make `instanceof Error` still work for returned errors.
|
|
PropTypeError.prototype = Error.prototype;
|
|
|
|
function createChainableTypeChecker(validate) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var manualPropTypeCallCache = {};
|
|
var manualPropTypeWarningCount = 0;
|
|
}
|
|
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
|
componentName = componentName || ANONYMOUS;
|
|
propFullName = propFullName || propName;
|
|
|
|
if (secret !== ReactPropTypesSecret) {
|
|
if (throwOnDirectAccess) {
|
|
// New behavior only for users of `prop-types` package
|
|
invariant(false, 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 'Use `PropTypes.checkPropTypes()` to call them. ' + 'Read more at http://fb.me/use-check-prop-types');
|
|
} else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {
|
|
// Old behavior for people using React.PropTypes
|
|
var cacheKey = componentName + ':' + propName;
|
|
if (!manualPropTypeCallCache[cacheKey] &&
|
|
// Avoid spamming the console because they are often not actionable except for lib authors
|
|
manualPropTypeWarningCount < 3) {
|
|
warning(false, 'You are manually calling a React.PropTypes validation ' + 'function for the `%s` prop on `%s`. This is deprecated ' + 'and will throw in the standalone `prop-types` package. ' + 'You may be seeing this warning due to a third-party PropTypes ' + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.', propFullName, componentName);
|
|
manualPropTypeCallCache[cacheKey] = true;
|
|
manualPropTypeWarningCount++;
|
|
}
|
|
}
|
|
}
|
|
if (props[propName] == null) {
|
|
if (isRequired) {
|
|
if (props[propName] === null) {
|
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
|
}
|
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
|
}
|
|
return null;
|
|
} else {
|
|
return validate(props, propName, componentName, location, propFullName);
|
|
}
|
|
}
|
|
|
|
var chainedCheckType = checkType.bind(null, false);
|
|
chainedCheckType.isRequired = checkType.bind(null, true);
|
|
|
|
return chainedCheckType;
|
|
}
|
|
|
|
function createPrimitiveTypeChecker(expectedType) {
|
|
function validate(props, propName, componentName, location, propFullName, secret) {
|
|
var propValue = props[propName];
|
|
var propType = getPropType(propValue);
|
|
if (propType !== expectedType) {
|
|
// `propValue` being instance of, say, date/regexp, pass the 'object'
|
|
// check, but we can offer a more precise error message here rather than
|
|
// 'of type `object`'.
|
|
var preciseType = getPreciseType(propValue);
|
|
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createAnyTypeChecker() {
|
|
return createChainableTypeChecker(emptyFunction.thatReturnsNull);
|
|
}
|
|
|
|
function createArrayOfTypeChecker(typeChecker) {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
if (typeof typeChecker !== 'function') {
|
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
|
}
|
|
var propValue = props[propName];
|
|
if (!Array.isArray(propValue)) {
|
|
var propType = getPropType(propValue);
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
|
|
}
|
|
for (var i = 0; i < propValue.length; i++) {
|
|
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
|
|
if (error instanceof Error) {
|
|
return error;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createElementTypeChecker() {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
var propValue = props[propName];
|
|
if (!isValidElement(propValue)) {
|
|
var propType = getPropType(propValue);
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createInstanceTypeChecker(expectedClass) {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
if (!(props[propName] instanceof expectedClass)) {
|
|
var expectedClassName = expectedClass.name || ANONYMOUS;
|
|
var actualClassName = getClassName(props[propName]);
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createEnumTypeChecker(expectedValues) {
|
|
if (!Array.isArray(expectedValues)) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.') : void 0;
|
|
return emptyFunction.thatReturnsNull;
|
|
}
|
|
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
var propValue = props[propName];
|
|
for (var i = 0; i < expectedValues.length; i++) {
|
|
if (is(propValue, expectedValues[i])) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
var valuesString = JSON.stringify(expectedValues);
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createObjectOfTypeChecker(typeChecker) {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
if (typeof typeChecker !== 'function') {
|
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
|
|
}
|
|
var propValue = props[propName];
|
|
var propType = getPropType(propValue);
|
|
if (propType !== 'object') {
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
|
|
}
|
|
for (var key in propValue) {
|
|
if (propValue.hasOwnProperty(key)) {
|
|
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
if (error instanceof Error) {
|
|
return error;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createUnionTypeChecker(arrayOfTypeCheckers) {
|
|
if (!Array.isArray(arrayOfTypeCheckers)) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
|
|
return emptyFunction.thatReturnsNull;
|
|
}
|
|
|
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
|
var checker = arrayOfTypeCheckers[i];
|
|
if (typeof checker !== 'function') {
|
|
warning(false, 'Invalid argument supplid to oneOfType. Expected an array of check functions, but ' + 'received %s at index %s.', getPostfixForTypeWarning(checker), i);
|
|
return emptyFunction.thatReturnsNull;
|
|
}
|
|
}
|
|
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
|
var checker = arrayOfTypeCheckers[i];
|
|
if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createNodeChecker() {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
if (!isNode(props[propName])) {
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function createShapeTypeChecker(shapeTypes) {
|
|
function validate(props, propName, componentName, location, propFullName) {
|
|
var propValue = props[propName];
|
|
var propType = getPropType(propValue);
|
|
if (propType !== 'object') {
|
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
|
}
|
|
for (var key in shapeTypes) {
|
|
var checker = shapeTypes[key];
|
|
if (!checker) {
|
|
continue;
|
|
}
|
|
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
if (error) {
|
|
return error;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
return createChainableTypeChecker(validate);
|
|
}
|
|
|
|
function isNode(propValue) {
|
|
switch (typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue)) {
|
|
case 'number':
|
|
case 'string':
|
|
case 'undefined':
|
|
return true;
|
|
case 'boolean':
|
|
return !propValue;
|
|
case 'object':
|
|
if (Array.isArray(propValue)) {
|
|
return propValue.every(isNode);
|
|
}
|
|
if (propValue === null || isValidElement(propValue)) {
|
|
return true;
|
|
}
|
|
|
|
var iteratorFn = getIteratorFn(propValue);
|
|
if (iteratorFn) {
|
|
var iterator = iteratorFn.call(propValue);
|
|
var step;
|
|
if (iteratorFn !== propValue.entries) {
|
|
while (!(step = iterator.next()).done) {
|
|
if (!isNode(step.value)) {
|
|
return false;
|
|
}
|
|
}
|
|
} else {
|
|
// Iterator will provide entry [k,v] tuples rather than values.
|
|
while (!(step = iterator.next()).done) {
|
|
var entry = step.value;
|
|
if (entry) {
|
|
if (!isNode(entry[1])) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function isSymbol(propType, propValue) {
|
|
// Native Symbol.
|
|
if (propType === 'symbol') {
|
|
return true;
|
|
}
|
|
|
|
// 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
|
|
if (propValue['@@toStringTag'] === 'Symbol') {
|
|
return true;
|
|
}
|
|
|
|
// Fallback for non-spec compliant Symbols which are polyfilled.
|
|
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Equivalent of `typeof` but with special handling for array and regexp.
|
|
function getPropType(propValue) {
|
|
var propType = typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue);
|
|
if (Array.isArray(propValue)) {
|
|
return 'array';
|
|
}
|
|
if (propValue instanceof RegExp) {
|
|
// Old webkits (at least until Android 4.0) return 'function' rather than
|
|
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
|
// passes PropTypes.object.
|
|
return 'object';
|
|
}
|
|
if (isSymbol(propType, propValue)) {
|
|
return 'symbol';
|
|
}
|
|
return propType;
|
|
}
|
|
|
|
// This handles more types than `getPropType`. Only used for error messages.
|
|
// See `createPrimitiveTypeChecker`.
|
|
function getPreciseType(propValue) {
|
|
if (typeof propValue === 'undefined' || propValue === null) {
|
|
return '' + propValue;
|
|
}
|
|
var propType = getPropType(propValue);
|
|
if (propType === 'object') {
|
|
if (propValue instanceof Date) {
|
|
return 'date';
|
|
} else if (propValue instanceof RegExp) {
|
|
return 'regexp';
|
|
}
|
|
}
|
|
return propType;
|
|
}
|
|
|
|
// Returns a string that is postfixed to a warning about an invalid type.
|
|
// For example, "undefined" or "of type array"
|
|
function getPostfixForTypeWarning(value) {
|
|
var type = getPreciseType(value);
|
|
switch (type) {
|
|
case 'array':
|
|
case 'object':
|
|
return 'an ' + type;
|
|
case 'boolean':
|
|
case 'date':
|
|
case 'regexp':
|
|
return 'a ' + type;
|
|
default:
|
|
return type;
|
|
}
|
|
}
|
|
|
|
// Returns class name of the object, if any.
|
|
function getClassName(propValue) {
|
|
if (!propValue.constructor || !propValue.constructor.name) {
|
|
return ANONYMOUS;
|
|
}
|
|
return propValue.constructor.name;
|
|
}
|
|
|
|
ReactPropTypes.checkPropTypes = checkPropTypes;
|
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
|
|
return ReactPropTypes;
|
|
};
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 73 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* CSS properties which accept numbers but are not in units of "px".
|
|
*/
|
|
|
|
var isUnitlessNumber = {
|
|
animationIterationCount: true,
|
|
borderImageOutset: true,
|
|
borderImageSlice: true,
|
|
borderImageWidth: true,
|
|
boxFlex: true,
|
|
boxFlexGroup: true,
|
|
boxOrdinalGroup: true,
|
|
columnCount: true,
|
|
flex: true,
|
|
flexGrow: true,
|
|
flexPositive: true,
|
|
flexShrink: true,
|
|
flexNegative: true,
|
|
flexOrder: true,
|
|
gridRow: true,
|
|
gridRowEnd: true,
|
|
gridRowSpan: true,
|
|
gridRowStart: true,
|
|
gridColumn: true,
|
|
gridColumnEnd: true,
|
|
gridColumnSpan: true,
|
|
gridColumnStart: true,
|
|
fontWeight: true,
|
|
lineClamp: true,
|
|
lineHeight: true,
|
|
opacity: true,
|
|
order: true,
|
|
orphans: true,
|
|
tabSize: true,
|
|
widows: true,
|
|
zIndex: true,
|
|
zoom: true,
|
|
|
|
// SVG-related properties
|
|
fillOpacity: true,
|
|
floodOpacity: true,
|
|
stopOpacity: true,
|
|
strokeDasharray: true,
|
|
strokeDashoffset: true,
|
|
strokeMiterlimit: true,
|
|
strokeOpacity: true,
|
|
strokeWidth: true
|
|
};
|
|
|
|
/**
|
|
* @param {string} prefix vendor-specific prefix, eg: Webkit
|
|
* @param {string} key style name, eg: transitionDuration
|
|
* @return {string} style name prefixed with `prefix`, properly camelCased, eg:
|
|
* WebkitTransitionDuration
|
|
*/
|
|
function prefixKey(prefix, key) {
|
|
return prefix + key.charAt(0).toUpperCase() + key.substring(1);
|
|
}
|
|
|
|
/**
|
|
* Support style names that may come passed in prefixed by adding permutations
|
|
* of vendor prefixes.
|
|
*/
|
|
var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
|
|
|
|
// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
|
|
// infinite loop, because it iterates over the newly added props too.
|
|
Object.keys(isUnitlessNumber).forEach(function (prop) {
|
|
prefixes.forEach(function (prefix) {
|
|
isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Most style properties can be unset by doing .style[prop] = '' but IE8
|
|
* doesn't like doing that with shorthand properties so for the properties that
|
|
* IE8 breaks on, which are listed here, we instead unset each of the
|
|
* individual properties. See http://bugs.jquery.com/ticket/12385.
|
|
* The 4-value 'clock' properties like margin, padding, border-width seem to
|
|
* behave without any problems. Curiously, list-style works too without any
|
|
* special prodding.
|
|
*/
|
|
var shorthandPropertyExpansions = {
|
|
background: {
|
|
backgroundAttachment: true,
|
|
backgroundColor: true,
|
|
backgroundImage: true,
|
|
backgroundPositionX: true,
|
|
backgroundPositionY: true,
|
|
backgroundRepeat: true
|
|
},
|
|
backgroundPosition: {
|
|
backgroundPositionX: true,
|
|
backgroundPositionY: true
|
|
},
|
|
border: {
|
|
borderWidth: true,
|
|
borderStyle: true,
|
|
borderColor: true
|
|
},
|
|
borderBottom: {
|
|
borderBottomWidth: true,
|
|
borderBottomStyle: true,
|
|
borderBottomColor: true
|
|
},
|
|
borderLeft: {
|
|
borderLeftWidth: true,
|
|
borderLeftStyle: true,
|
|
borderLeftColor: true
|
|
},
|
|
borderRight: {
|
|
borderRightWidth: true,
|
|
borderRightStyle: true,
|
|
borderRightColor: true
|
|
},
|
|
borderTop: {
|
|
borderTopWidth: true,
|
|
borderTopStyle: true,
|
|
borderTopColor: true
|
|
},
|
|
font: {
|
|
fontStyle: true,
|
|
fontVariant: true,
|
|
fontWeight: true,
|
|
fontSize: true,
|
|
lineHeight: true,
|
|
fontFamily: true
|
|
},
|
|
outline: {
|
|
outlineWidth: true,
|
|
outlineStyle: true,
|
|
outlineColor: true
|
|
}
|
|
};
|
|
|
|
var CSSProperty = {
|
|
isUnitlessNumber: isUnitlessNumber,
|
|
shorthandPropertyExpansions: shorthandPropertyExpansions
|
|
};
|
|
|
|
module.exports = CSSProperty;
|
|
|
|
/***/ }),
|
|
/* 74 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
var PooledClass = __webpack_require__(18);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* A specialized pseudo-event module to help keep track of components waiting to
|
|
* be notified when their DOM representations are available for use.
|
|
*
|
|
* This implements `PooledClass`, so you should never need to instantiate this.
|
|
* Instead, use `CallbackQueue.getPooled()`.
|
|
*
|
|
* @class ReactMountReady
|
|
* @implements PooledClass
|
|
* @internal
|
|
*/
|
|
|
|
var CallbackQueue = function () {
|
|
function CallbackQueue(arg) {
|
|
_classCallCheck(this, CallbackQueue);
|
|
|
|
this._callbacks = null;
|
|
this._contexts = null;
|
|
this._arg = arg;
|
|
}
|
|
|
|
/**
|
|
* Enqueues a callback to be invoked when `notifyAll` is invoked.
|
|
*
|
|
* @param {function} callback Invoked when `notifyAll` is invoked.
|
|
* @param {?object} context Context to call `callback` with.
|
|
* @internal
|
|
*/
|
|
|
|
CallbackQueue.prototype.enqueue = function enqueue(callback, context) {
|
|
this._callbacks = this._callbacks || [];
|
|
this._callbacks.push(callback);
|
|
this._contexts = this._contexts || [];
|
|
this._contexts.push(context);
|
|
};
|
|
|
|
/**
|
|
* Invokes all enqueued callbacks and clears the queue. This is invoked after
|
|
* the DOM representation of a component has been created or updated.
|
|
*
|
|
* @internal
|
|
*/
|
|
|
|
CallbackQueue.prototype.notifyAll = function notifyAll() {
|
|
var callbacks = this._callbacks;
|
|
var contexts = this._contexts;
|
|
var arg = this._arg;
|
|
if (callbacks && contexts) {
|
|
!(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : _prodInvariant('24') : void 0;
|
|
this._callbacks = null;
|
|
this._contexts = null;
|
|
for (var i = 0; i < callbacks.length; i++) {
|
|
callbacks[i].call(contexts[i], arg);
|
|
}
|
|
callbacks.length = 0;
|
|
contexts.length = 0;
|
|
}
|
|
};
|
|
|
|
CallbackQueue.prototype.checkpoint = function checkpoint() {
|
|
return this._callbacks ? this._callbacks.length : 0;
|
|
};
|
|
|
|
CallbackQueue.prototype.rollback = function rollback(len) {
|
|
if (this._callbacks && this._contexts) {
|
|
this._callbacks.length = len;
|
|
this._contexts.length = len;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Resets the internal queue.
|
|
*
|
|
* @internal
|
|
*/
|
|
|
|
CallbackQueue.prototype.reset = function reset() {
|
|
this._callbacks = null;
|
|
this._contexts = null;
|
|
};
|
|
|
|
/**
|
|
* `PooledClass` looks for this.
|
|
*/
|
|
|
|
CallbackQueue.prototype.destructor = function destructor() {
|
|
this.reset();
|
|
};
|
|
|
|
return CallbackQueue;
|
|
}();
|
|
|
|
module.exports = PooledClass.addPoolingTo(CallbackQueue);
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 75 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
|
|
var quoteAttributeValueForBrowser = __webpack_require__(213);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
var illegalAttributeNameCache = {};
|
|
var validatedAttributeNameCache = {};
|
|
|
|
function isAttributeNameSafe(attributeName) {
|
|
if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
|
|
return true;
|
|
}
|
|
if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
|
|
return false;
|
|
}
|
|
if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
|
|
validatedAttributeNameCache[attributeName] = true;
|
|
return true;
|
|
}
|
|
illegalAttributeNameCache[attributeName] = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : void 0;
|
|
return false;
|
|
}
|
|
|
|
function shouldIgnoreValue(propertyInfo, value) {
|
|
return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;
|
|
}
|
|
|
|
/**
|
|
* Operations for dealing with DOM properties.
|
|
*/
|
|
var DOMPropertyOperations = {
|
|
/**
|
|
* Creates markup for the ID property.
|
|
*
|
|
* @param {string} id Unescaped ID.
|
|
* @return {string} Markup string.
|
|
*/
|
|
createMarkupForID: function createMarkupForID(id) {
|
|
return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id);
|
|
},
|
|
|
|
setAttributeForID: function setAttributeForID(node, id) {
|
|
node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);
|
|
},
|
|
|
|
createMarkupForRoot: function createMarkupForRoot() {
|
|
return DOMProperty.ROOT_ATTRIBUTE_NAME + '=""';
|
|
},
|
|
|
|
setAttributeForRoot: function setAttributeForRoot(node) {
|
|
node.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME, '');
|
|
},
|
|
|
|
/**
|
|
* Creates markup for a property.
|
|
*
|
|
* @param {string} name
|
|
* @param {*} value
|
|
* @return {?string} Markup string, or null if the property was invalid.
|
|
*/
|
|
createMarkupForProperty: function createMarkupForProperty(name, value) {
|
|
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
|
if (propertyInfo) {
|
|
if (shouldIgnoreValue(propertyInfo, value)) {
|
|
return '';
|
|
}
|
|
var attributeName = propertyInfo.attributeName;
|
|
if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
|
return attributeName + '=""';
|
|
}
|
|
return attributeName + '=' + quoteAttributeValueForBrowser(value);
|
|
} else if (DOMProperty.isCustomAttribute(name)) {
|
|
if (value == null) {
|
|
return '';
|
|
}
|
|
return name + '=' + quoteAttributeValueForBrowser(value);
|
|
}
|
|
return null;
|
|
},
|
|
|
|
/**
|
|
* Creates markup for a custom property.
|
|
*
|
|
* @param {string} name
|
|
* @param {*} value
|
|
* @return {string} Markup string, or empty string if the property was invalid.
|
|
*/
|
|
createMarkupForCustomAttribute: function createMarkupForCustomAttribute(name, value) {
|
|
if (!isAttributeNameSafe(name) || value == null) {
|
|
return '';
|
|
}
|
|
return name + '=' + quoteAttributeValueForBrowser(value);
|
|
},
|
|
|
|
/**
|
|
* Sets the value for a property on a node.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {string} name
|
|
* @param {*} value
|
|
*/
|
|
setValueForProperty: function setValueForProperty(node, name, value) {
|
|
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
|
if (propertyInfo) {
|
|
var mutationMethod = propertyInfo.mutationMethod;
|
|
if (mutationMethod) {
|
|
mutationMethod(node, value);
|
|
} else if (shouldIgnoreValue(propertyInfo, value)) {
|
|
this.deleteValueForProperty(node, name);
|
|
return;
|
|
} else if (propertyInfo.mustUseProperty) {
|
|
// Contrary to `setAttribute`, object properties are properly
|
|
// `toString`ed by IE8/9.
|
|
node[propertyInfo.propertyName] = value;
|
|
} else {
|
|
var attributeName = propertyInfo.attributeName;
|
|
var namespace = propertyInfo.attributeNamespace;
|
|
// `setAttribute` with objects becomes only `[object]` in IE8/9,
|
|
// ('' + value) makes it output the correct toString()-value.
|
|
if (namespace) {
|
|
node.setAttributeNS(namespace, attributeName, '' + value);
|
|
} else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
|
node.setAttribute(attributeName, '');
|
|
} else {
|
|
node.setAttribute(attributeName, '' + value);
|
|
}
|
|
}
|
|
} else if (DOMProperty.isCustomAttribute(name)) {
|
|
DOMPropertyOperations.setValueForAttribute(node, name, value);
|
|
return;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var payload = {};
|
|
payload[name] = value;
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
|
|
type: 'update attribute',
|
|
payload: payload
|
|
});
|
|
}
|
|
},
|
|
|
|
setValueForAttribute: function setValueForAttribute(node, name, value) {
|
|
if (!isAttributeNameSafe(name)) {
|
|
return;
|
|
}
|
|
if (value == null) {
|
|
node.removeAttribute(name);
|
|
} else {
|
|
node.setAttribute(name, '' + value);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var payload = {};
|
|
payload[name] = value;
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
|
|
type: 'update attribute',
|
|
payload: payload
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Deletes an attributes from a node.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {string} name
|
|
*/
|
|
deleteValueForAttribute: function deleteValueForAttribute(node, name) {
|
|
node.removeAttribute(name);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
|
|
type: 'remove attribute',
|
|
payload: name
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Deletes the value for a property on a node.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {string} name
|
|
*/
|
|
deleteValueForProperty: function deleteValueForProperty(node, name) {
|
|
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
|
if (propertyInfo) {
|
|
var mutationMethod = propertyInfo.mutationMethod;
|
|
if (mutationMethod) {
|
|
mutationMethod(node, undefined);
|
|
} else if (propertyInfo.mustUseProperty) {
|
|
var propName = propertyInfo.propertyName;
|
|
if (propertyInfo.hasBooleanValue) {
|
|
node[propName] = false;
|
|
} else {
|
|
node[propName] = '';
|
|
}
|
|
} else {
|
|
node.removeAttribute(propertyInfo.attributeName);
|
|
}
|
|
} else if (DOMProperty.isCustomAttribute(name)) {
|
|
node.removeAttribute(name);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
|
|
type: 'remove attribute',
|
|
payload: name
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = DOMPropertyOperations;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 76 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactDOMComponentFlags = {
|
|
hasCachedChildNodes: 1 << 0
|
|
};
|
|
|
|
module.exports = ReactDOMComponentFlags;
|
|
|
|
/***/ }),
|
|
/* 77 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var LinkedValueUtils = __webpack_require__(49);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
var didWarnValueLink = false;
|
|
var didWarnValueDefaultValue = false;
|
|
|
|
function updateOptionsIfPendingUpdateAndMounted() {
|
|
if (this._rootNodeID && this._wrapperState.pendingUpdate) {
|
|
this._wrapperState.pendingUpdate = false;
|
|
|
|
var props = this._currentElement.props;
|
|
var value = LinkedValueUtils.getValue(props);
|
|
|
|
if (value != null) {
|
|
updateOptions(this, Boolean(props.multiple), value);
|
|
}
|
|
}
|
|
}
|
|
|
|
function getDeclarationErrorAddendum(owner) {
|
|
if (owner) {
|
|
var name = owner.getName();
|
|
if (name) {
|
|
return ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
var valuePropNames = ['value', 'defaultValue'];
|
|
|
|
/**
|
|
* Validation function for `value` and `defaultValue`.
|
|
* @private
|
|
*/
|
|
function checkSelectPropTypes(inst, props) {
|
|
var owner = inst._currentElement._owner;
|
|
LinkedValueUtils.checkPropTypes('select', props, owner);
|
|
|
|
if (props.valueLink !== undefined && !didWarnValueLink) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `select` is deprecated; set `value` and `onChange` instead.') : void 0;
|
|
didWarnValueLink = true;
|
|
}
|
|
|
|
for (var i = 0; i < valuePropNames.length; i++) {
|
|
var propName = valuePropNames[i];
|
|
if (props[propName] == null) {
|
|
continue;
|
|
}
|
|
var isArray = Array.isArray(props[propName]);
|
|
if (props.multiple && !isArray) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : void 0;
|
|
} else if (!props.multiple && isArray) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : void 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {ReactDOMComponent} inst
|
|
* @param {boolean} multiple
|
|
* @param {*} propValue A stringable (with `multiple`, a list of stringables).
|
|
* @private
|
|
*/
|
|
function updateOptions(inst, multiple, propValue) {
|
|
var selectedValue, i;
|
|
var options = ReactDOMComponentTree.getNodeFromInstance(inst).options;
|
|
|
|
if (multiple) {
|
|
selectedValue = {};
|
|
for (i = 0; i < propValue.length; i++) {
|
|
selectedValue['' + propValue[i]] = true;
|
|
}
|
|
for (i = 0; i < options.length; i++) {
|
|
var selected = selectedValue.hasOwnProperty(options[i].value);
|
|
if (options[i].selected !== selected) {
|
|
options[i].selected = selected;
|
|
}
|
|
}
|
|
} else {
|
|
// Do not set `select.value` as exact behavior isn't consistent across all
|
|
// browsers for all cases.
|
|
selectedValue = '' + propValue;
|
|
for (i = 0; i < options.length; i++) {
|
|
if (options[i].value === selectedValue) {
|
|
options[i].selected = true;
|
|
return;
|
|
}
|
|
}
|
|
if (options.length) {
|
|
options[0].selected = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements a <select> host component that allows optionally setting the
|
|
* props `value` and `defaultValue`. If `multiple` is false, the prop must be a
|
|
* stringable. If `multiple` is true, the prop must be an array of stringables.
|
|
*
|
|
* If `value` is not supplied (or null/undefined), user actions that change the
|
|
* selected option will trigger updates to the rendered options.
|
|
*
|
|
* If it is supplied (and not null/undefined), the rendered options will not
|
|
* update in response to user actions. Instead, the `value` prop must change in
|
|
* order for the rendered options to update.
|
|
*
|
|
* If `defaultValue` is provided, any options with the supplied values will be
|
|
* selected.
|
|
*/
|
|
var ReactDOMSelect = {
|
|
getHostProps: function getHostProps(inst, props) {
|
|
return _assign({}, props, {
|
|
onChange: inst._wrapperState.onChange,
|
|
value: undefined
|
|
});
|
|
},
|
|
|
|
mountWrapper: function mountWrapper(inst, props) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
checkSelectPropTypes(inst, props);
|
|
}
|
|
|
|
var value = LinkedValueUtils.getValue(props);
|
|
inst._wrapperState = {
|
|
pendingUpdate: false,
|
|
initialValue: value != null ? value : props.defaultValue,
|
|
listeners: null,
|
|
onChange: _handleChange.bind(inst),
|
|
wasMultiple: Boolean(props.multiple)
|
|
};
|
|
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components') : void 0;
|
|
didWarnValueDefaultValue = true;
|
|
}
|
|
},
|
|
|
|
getSelectValueContext: function getSelectValueContext(inst) {
|
|
// ReactDOMOption looks at this initial value so the initial generated
|
|
// markup has correct `selected` attributes
|
|
return inst._wrapperState.initialValue;
|
|
},
|
|
|
|
postUpdateWrapper: function postUpdateWrapper(inst) {
|
|
var props = inst._currentElement.props;
|
|
|
|
// After the initial mount, we control selected-ness manually so don't pass
|
|
// this value down
|
|
inst._wrapperState.initialValue = undefined;
|
|
|
|
var wasMultiple = inst._wrapperState.wasMultiple;
|
|
inst._wrapperState.wasMultiple = Boolean(props.multiple);
|
|
|
|
var value = LinkedValueUtils.getValue(props);
|
|
if (value != null) {
|
|
inst._wrapperState.pendingUpdate = false;
|
|
updateOptions(inst, Boolean(props.multiple), value);
|
|
} else if (wasMultiple !== Boolean(props.multiple)) {
|
|
// For simplicity, reapply `defaultValue` if `multiple` is toggled.
|
|
if (props.defaultValue != null) {
|
|
updateOptions(inst, Boolean(props.multiple), props.defaultValue);
|
|
} else {
|
|
// Revert the select back to its default unselected state.
|
|
updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
function _handleChange(event) {
|
|
var props = this._currentElement.props;
|
|
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
|
|
|
if (this._rootNodeID) {
|
|
this._wrapperState.pendingUpdate = true;
|
|
}
|
|
ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);
|
|
return returnValue;
|
|
}
|
|
|
|
module.exports = ReactDOMSelect;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 78 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var emptyComponentFactory;
|
|
|
|
var ReactEmptyComponentInjection = {
|
|
injectEmptyComponentFactory: function injectEmptyComponentFactory(factory) {
|
|
emptyComponentFactory = factory;
|
|
}
|
|
};
|
|
|
|
var ReactEmptyComponent = {
|
|
create: function create(instantiate) {
|
|
return emptyComponentFactory(instantiate);
|
|
}
|
|
};
|
|
|
|
ReactEmptyComponent.injection = ReactEmptyComponentInjection;
|
|
|
|
module.exports = ReactEmptyComponent;
|
|
|
|
/***/ }),
|
|
/* 79 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactFeatureFlags = {
|
|
// When true, call console.time() before and .timeEnd() after each top-level
|
|
// render (both initial renders and updates). Useful when looking at prod-mode
|
|
// timeline profiles in Chrome, for example.
|
|
logTopLevelRenders: false
|
|
};
|
|
|
|
module.exports = ReactFeatureFlags;
|
|
|
|
/***/ }),
|
|
/* 80 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var genericComponentClass = null;
|
|
var textComponentClass = null;
|
|
|
|
var ReactHostComponentInjection = {
|
|
// This accepts a class that receives the tag string. This is a catch all
|
|
// that can render any kind of tag.
|
|
injectGenericComponentClass: function injectGenericComponentClass(componentClass) {
|
|
genericComponentClass = componentClass;
|
|
},
|
|
// This accepts a text component class that takes the text string to be
|
|
// rendered as props.
|
|
injectTextComponentClass: function injectTextComponentClass(componentClass) {
|
|
textComponentClass = componentClass;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get a host internal component class for a specific tag.
|
|
*
|
|
* @param {ReactElement} element The element to create.
|
|
* @return {function} The internal class constructor function.
|
|
*/
|
|
function createInternalComponent(element) {
|
|
!genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : _prodInvariant('111', element.type) : void 0;
|
|
return new genericComponentClass(element);
|
|
}
|
|
|
|
/**
|
|
* @param {ReactText} text
|
|
* @return {ReactComponent}
|
|
*/
|
|
function createInstanceForText(text) {
|
|
return new textComponentClass(text);
|
|
}
|
|
|
|
/**
|
|
* @param {ReactComponent} component
|
|
* @return {boolean}
|
|
*/
|
|
function isTextComponent(component) {
|
|
return component instanceof textComponentClass;
|
|
}
|
|
|
|
var ReactHostComponent = {
|
|
createInternalComponent: createInternalComponent,
|
|
createInstanceForText: createInstanceForText,
|
|
isTextComponent: isTextComponent,
|
|
injection: ReactHostComponentInjection
|
|
};
|
|
|
|
module.exports = ReactHostComponent;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 81 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactDOMSelection = __webpack_require__(168);
|
|
|
|
var containsNode = __webpack_require__(120);
|
|
var focusNode = __webpack_require__(66);
|
|
var getActiveElement = __webpack_require__(67);
|
|
|
|
function isInDocument(node) {
|
|
return containsNode(document.documentElement, node);
|
|
}
|
|
|
|
/**
|
|
* @ReactInputSelection: React input selection module. Based on Selection.js,
|
|
* but modified to be suitable for react and has a couple of bug fixes (doesn't
|
|
* assume buttons have range selections allowed).
|
|
* Input selection module for React.
|
|
*/
|
|
var ReactInputSelection = {
|
|
hasSelectionCapabilities: function hasSelectionCapabilities(elem) {
|
|
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
|
return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');
|
|
},
|
|
|
|
getSelectionInformation: function getSelectionInformation() {
|
|
var focusedElem = getActiveElement();
|
|
return {
|
|
focusedElem: focusedElem,
|
|
selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null
|
|
};
|
|
},
|
|
|
|
/**
|
|
* @restoreSelection: If any selection information was potentially lost,
|
|
* restore it. This is useful when performing operations that could remove dom
|
|
* nodes and place them back in, resulting in focus being lost.
|
|
*/
|
|
restoreSelection: function restoreSelection(priorSelectionInformation) {
|
|
var curFocusedElem = getActiveElement();
|
|
var priorFocusedElem = priorSelectionInformation.focusedElem;
|
|
var priorSelectionRange = priorSelectionInformation.selectionRange;
|
|
if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
|
|
if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {
|
|
ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);
|
|
}
|
|
focusNode(priorFocusedElem);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @getSelection: Gets the selection bounds of a focused textarea, input or
|
|
* contentEditable node.
|
|
* -@input: Look up selection bounds of this input
|
|
* -@return {start: selectionStart, end: selectionEnd}
|
|
*/
|
|
getSelection: function getSelection(input) {
|
|
var selection;
|
|
|
|
if ('selectionStart' in input) {
|
|
// Modern browser with input or textarea.
|
|
selection = {
|
|
start: input.selectionStart,
|
|
end: input.selectionEnd
|
|
};
|
|
} else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {
|
|
// IE8 input.
|
|
var range = document.selection.createRange();
|
|
// There can only be one selection per document in IE, so it must
|
|
// be in our element.
|
|
if (range.parentElement() === input) {
|
|
selection = {
|
|
start: -range.moveStart('character', -input.value.length),
|
|
end: -range.moveEnd('character', -input.value.length)
|
|
};
|
|
}
|
|
} else {
|
|
// Content editable or old IE textarea.
|
|
selection = ReactDOMSelection.getOffsets(input);
|
|
}
|
|
|
|
return selection || { start: 0, end: 0 };
|
|
},
|
|
|
|
/**
|
|
* @setSelection: Sets the selection bounds of a textarea or input and focuses
|
|
* the input.
|
|
* -@input Set selection bounds of this input or textarea
|
|
* -@offsets Object of same form that is returned from get*
|
|
*/
|
|
setSelection: function setSelection(input, offsets) {
|
|
var start = offsets.start;
|
|
var end = offsets.end;
|
|
if (end === undefined) {
|
|
end = start;
|
|
}
|
|
|
|
if ('selectionStart' in input) {
|
|
input.selectionStart = start;
|
|
input.selectionEnd = Math.min(end, input.value.length);
|
|
} else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {
|
|
var range = input.createTextRange();
|
|
range.collapse(true);
|
|
range.moveStart('character', start);
|
|
range.moveEnd('character', end - start);
|
|
range.select();
|
|
} else {
|
|
ReactDOMSelection.setOffsets(input, offsets);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactInputSelection;
|
|
|
|
/***/ }),
|
|
/* 82 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var DOMProperty = __webpack_require__(17);
|
|
var React = __webpack_require__(23);
|
|
var ReactBrowserEventEmitter = __webpack_require__(34);
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactDOMContainerInfo = __webpack_require__(160);
|
|
var ReactDOMFeatureFlags = __webpack_require__(162);
|
|
var ReactFeatureFlags = __webpack_require__(79);
|
|
var ReactInstanceMap = __webpack_require__(29);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactMarkupChecksum = __webpack_require__(182);
|
|
var ReactReconciler = __webpack_require__(22);
|
|
var ReactUpdateQueue = __webpack_require__(52);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var emptyObject = __webpack_require__(32);
|
|
var instantiateReactComponent = __webpack_require__(91);
|
|
var invariant = __webpack_require__(1);
|
|
var setInnerHTML = __webpack_require__(38);
|
|
var shouldUpdateReactComponent = __webpack_require__(58);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;
|
|
var ROOT_ATTR_NAME = DOMProperty.ROOT_ATTRIBUTE_NAME;
|
|
|
|
var ELEMENT_NODE_TYPE = 1;
|
|
var DOC_NODE_TYPE = 9;
|
|
var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
|
|
|
|
var instancesByReactRootID = {};
|
|
|
|
/**
|
|
* Finds the index of the first character
|
|
* that's not common between the two given strings.
|
|
*
|
|
* @return {number} the index of the character where the strings diverge
|
|
*/
|
|
function firstDifferenceIndex(string1, string2) {
|
|
var minLen = Math.min(string1.length, string2.length);
|
|
for (var i = 0; i < minLen; i++) {
|
|
if (string1.charAt(i) !== string2.charAt(i)) {
|
|
return i;
|
|
}
|
|
}
|
|
return string1.length === string2.length ? -1 : minLen;
|
|
}
|
|
|
|
/**
|
|
* @param {DOMElement|DOMDocument} container DOM element that may contain
|
|
* a React component
|
|
* @return {?*} DOM element that may have the reactRoot ID, or null.
|
|
*/
|
|
function getReactRootElementInContainer(container) {
|
|
if (!container) {
|
|
return null;
|
|
}
|
|
|
|
if (container.nodeType === DOC_NODE_TYPE) {
|
|
return container.documentElement;
|
|
} else {
|
|
return container.firstChild;
|
|
}
|
|
}
|
|
|
|
function internalGetID(node) {
|
|
// If node is something like a window, document, or text node, none of
|
|
// which support attributes or a .getAttribute method, gracefully return
|
|
// the empty string, as if the attribute were missing.
|
|
return node.getAttribute && node.getAttribute(ATTR_NAME) || '';
|
|
}
|
|
|
|
/**
|
|
* Mounts this component and inserts it into the DOM.
|
|
*
|
|
* @param {ReactComponent} componentInstance The instance to mount.
|
|
* @param {DOMElement} container DOM element to mount into.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {boolean} shouldReuseMarkup If true, do not insert markup
|
|
*/
|
|
function mountComponentIntoNode(wrapperInstance, container, transaction, shouldReuseMarkup, context) {
|
|
var markerName;
|
|
if (ReactFeatureFlags.logTopLevelRenders) {
|
|
var wrappedElement = wrapperInstance._currentElement.props.child;
|
|
var type = wrappedElement.type;
|
|
markerName = 'React mount: ' + (typeof type === 'string' ? type : type.displayName || type.name);
|
|
console.time(markerName);
|
|
}
|
|
|
|
var markup = ReactReconciler.mountComponent(wrapperInstance, transaction, null, ReactDOMContainerInfo(wrapperInstance, container), context, 0 /* parentDebugID */
|
|
);
|
|
|
|
if (markerName) {
|
|
console.timeEnd(markerName);
|
|
}
|
|
|
|
wrapperInstance._renderedComponent._topLevelWrapper = wrapperInstance;
|
|
ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction);
|
|
}
|
|
|
|
/**
|
|
* Batched mount.
|
|
*
|
|
* @param {ReactComponent} componentInstance The instance to mount.
|
|
* @param {DOMElement} container DOM element to mount into.
|
|
* @param {boolean} shouldReuseMarkup If true, do not insert markup
|
|
*/
|
|
function batchedMountComponentIntoNode(componentInstance, container, shouldReuseMarkup, context) {
|
|
var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(
|
|
/* useCreateElement */
|
|
!shouldReuseMarkup && ReactDOMFeatureFlags.useCreateElement);
|
|
transaction.perform(mountComponentIntoNode, null, componentInstance, container, transaction, shouldReuseMarkup, context);
|
|
ReactUpdates.ReactReconcileTransaction.release(transaction);
|
|
}
|
|
|
|
/**
|
|
* Unmounts a component and removes it from the DOM.
|
|
*
|
|
* @param {ReactComponent} instance React component instance.
|
|
* @param {DOMElement} container DOM element to unmount from.
|
|
* @final
|
|
* @internal
|
|
* @see {ReactMount.unmountComponentAtNode}
|
|
*/
|
|
function unmountComponentFromNode(instance, container, safely) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onBeginFlush();
|
|
}
|
|
ReactReconciler.unmountComponent(instance, safely);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onEndFlush();
|
|
}
|
|
|
|
if (container.nodeType === DOC_NODE_TYPE) {
|
|
container = container.documentElement;
|
|
}
|
|
|
|
// http://jsperf.com/emptying-a-node
|
|
while (container.lastChild) {
|
|
container.removeChild(container.lastChild);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* True if the supplied DOM node has a direct React-rendered child that is
|
|
* not a React root element. Useful for warning in `render`,
|
|
* `unmountComponentAtNode`, etc.
|
|
*
|
|
* @param {?DOMElement} node The candidate DOM node.
|
|
* @return {boolean} True if the DOM element contains a direct child that was
|
|
* rendered by React but is not a root element.
|
|
* @internal
|
|
*/
|
|
function hasNonRootReactChild(container) {
|
|
var rootEl = getReactRootElementInContainer(container);
|
|
if (rootEl) {
|
|
var inst = ReactDOMComponentTree.getInstanceFromNode(rootEl);
|
|
return !!(inst && inst._hostParent);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* True if the supplied DOM node is a React DOM element and
|
|
* it has been rendered by another copy of React.
|
|
*
|
|
* @param {?DOMElement} node The candidate DOM node.
|
|
* @return {boolean} True if the DOM has been rendered by another copy of React
|
|
* @internal
|
|
*/
|
|
function nodeIsRenderedByOtherInstance(container) {
|
|
var rootEl = getReactRootElementInContainer(container);
|
|
return !!(rootEl && isReactNode(rootEl) && !ReactDOMComponentTree.getInstanceFromNode(rootEl));
|
|
}
|
|
|
|
/**
|
|
* True if the supplied DOM node is a valid node element.
|
|
*
|
|
* @param {?DOMElement} node The candidate DOM node.
|
|
* @return {boolean} True if the DOM is a valid DOM node.
|
|
* @internal
|
|
*/
|
|
function isValidContainer(node) {
|
|
return !!(node && (node.nodeType === ELEMENT_NODE_TYPE || node.nodeType === DOC_NODE_TYPE || node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE));
|
|
}
|
|
|
|
/**
|
|
* True if the supplied DOM node is a valid React node element.
|
|
*
|
|
* @param {?DOMElement} node The candidate DOM node.
|
|
* @return {boolean} True if the DOM is a valid React DOM node.
|
|
* @internal
|
|
*/
|
|
function isReactNode(node) {
|
|
return isValidContainer(node) && (node.hasAttribute(ROOT_ATTR_NAME) || node.hasAttribute(ATTR_NAME));
|
|
}
|
|
|
|
function getHostRootInstanceInContainer(container) {
|
|
var rootEl = getReactRootElementInContainer(container);
|
|
var prevHostInstance = rootEl && ReactDOMComponentTree.getInstanceFromNode(rootEl);
|
|
return prevHostInstance && !prevHostInstance._hostParent ? prevHostInstance : null;
|
|
}
|
|
|
|
function getTopLevelWrapperInContainer(container) {
|
|
var root = getHostRootInstanceInContainer(container);
|
|
return root ? root._hostContainerInfo._topLevelWrapper : null;
|
|
}
|
|
|
|
/**
|
|
* Temporary (?) hack so that we can store all top-level pending updates on
|
|
* composites instead of having to worry about different types of components
|
|
* here.
|
|
*/
|
|
var topLevelRootCounter = 1;
|
|
var TopLevelWrapper = function TopLevelWrapper() {
|
|
this.rootID = topLevelRootCounter++;
|
|
};
|
|
TopLevelWrapper.prototype.isReactComponent = {};
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
TopLevelWrapper.displayName = 'TopLevelWrapper';
|
|
}
|
|
TopLevelWrapper.prototype.render = function () {
|
|
return this.props.child;
|
|
};
|
|
TopLevelWrapper.isReactTopLevelWrapper = true;
|
|
|
|
/**
|
|
* Mounting is the process of initializing a React component by creating its
|
|
* representative DOM elements and inserting them into a supplied `container`.
|
|
* Any prior content inside `container` is destroyed in the process.
|
|
*
|
|
* ReactMount.render(
|
|
* component,
|
|
* document.getElementById('container')
|
|
* );
|
|
*
|
|
* <div id="container"> <-- Supplied `container`.
|
|
* <div data-reactid=".3"> <-- Rendered reactRoot of React
|
|
* // ... component.
|
|
* </div>
|
|
* </div>
|
|
*
|
|
* Inside of `container`, the first element rendered is the "reactRoot".
|
|
*/
|
|
var ReactMount = {
|
|
TopLevelWrapper: TopLevelWrapper,
|
|
|
|
/**
|
|
* Used by devtools. The keys are not important.
|
|
*/
|
|
_instancesByReactRootID: instancesByReactRootID,
|
|
|
|
/**
|
|
* This is a hook provided to support rendering React components while
|
|
* ensuring that the apparent scroll position of its `container` does not
|
|
* change.
|
|
*
|
|
* @param {DOMElement} container The `container` being rendered into.
|
|
* @param {function} renderCallback This must be called once to do the render.
|
|
*/
|
|
scrollMonitor: function scrollMonitor(container, renderCallback) {
|
|
renderCallback();
|
|
},
|
|
|
|
/**
|
|
* Take a component that's already mounted into the DOM and replace its props
|
|
* @param {ReactComponent} prevComponent component instance already in the DOM
|
|
* @param {ReactElement} nextElement component instance to render
|
|
* @param {DOMElement} container container to render into
|
|
* @param {?function} callback function triggered on completion
|
|
*/
|
|
_updateRootComponent: function _updateRootComponent(prevComponent, nextElement, nextContext, container, callback) {
|
|
ReactMount.scrollMonitor(container, function () {
|
|
ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement, nextContext);
|
|
if (callback) {
|
|
ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);
|
|
}
|
|
});
|
|
|
|
return prevComponent;
|
|
},
|
|
|
|
/**
|
|
* Render a new component into the DOM. Hooked by hooks!
|
|
*
|
|
* @param {ReactElement} nextElement element to render
|
|
* @param {DOMElement} container container to render into
|
|
* @param {boolean} shouldReuseMarkup if we should skip the markup insertion
|
|
* @return {ReactComponent} nextComponent
|
|
*/
|
|
_renderNewRootComponent: function _renderNewRootComponent(nextElement, container, shouldReuseMarkup, context) {
|
|
// Various parts of our code (such as ReactCompositeComponent's
|
|
// _renderValidatedComponent) assume that calls to render aren't nested;
|
|
// verify that that's the case.
|
|
process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0;
|
|
|
|
!isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : _prodInvariant('37') : void 0;
|
|
|
|
ReactBrowserEventEmitter.ensureScrollValueMonitoring();
|
|
var componentInstance = instantiateReactComponent(nextElement, false);
|
|
|
|
// The initial render is synchronous but any updates that happen during
|
|
// rendering, in componentWillMount or componentDidMount, will be batched
|
|
// according to the current batching strategy.
|
|
|
|
ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, container, shouldReuseMarkup, context);
|
|
|
|
var wrapperID = componentInstance._instance.rootID;
|
|
instancesByReactRootID[wrapperID] = componentInstance;
|
|
|
|
return componentInstance;
|
|
},
|
|
|
|
/**
|
|
* Renders a React component into the DOM in the supplied `container`.
|
|
*
|
|
* If the React component was previously rendered into `container`, this will
|
|
* perform an update on it and only mutate the DOM as necessary to reflect the
|
|
* latest React component.
|
|
*
|
|
* @param {ReactComponent} parentComponent The conceptual parent of this render tree.
|
|
* @param {ReactElement} nextElement Component element to render.
|
|
* @param {DOMElement} container DOM element to render into.
|
|
* @param {?function} callback function triggered on completion
|
|
* @return {ReactComponent} Component instance rendered in `container`.
|
|
*/
|
|
renderSubtreeIntoContainer: function renderSubtreeIntoContainer(parentComponent, nextElement, container, callback) {
|
|
!(parentComponent != null && ReactInstanceMap.has(parentComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : _prodInvariant('38') : void 0;
|
|
return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);
|
|
},
|
|
|
|
_renderSubtreeIntoContainer: function _renderSubtreeIntoContainer(parentComponent, nextElement, container, callback) {
|
|
ReactUpdateQueue.validateCallback(callback, 'ReactDOM.render');
|
|
!React.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? " Instead of passing a string like 'div', pass " + "React.createElement('div') or <div />." : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : // Check if it quacks like an element
|
|
nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : _prodInvariant('39', typeof nextElement === 'string' ? " Instead of passing a string like 'div', pass " + "React.createElement('div') or <div />." : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : void 0;
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0;
|
|
|
|
var nextWrappedElement = React.createElement(TopLevelWrapper, {
|
|
child: nextElement
|
|
});
|
|
|
|
var nextContext;
|
|
if (parentComponent) {
|
|
var parentInst = ReactInstanceMap.get(parentComponent);
|
|
nextContext = parentInst._processChildContext(parentInst._context);
|
|
} else {
|
|
nextContext = emptyObject;
|
|
}
|
|
|
|
var prevComponent = getTopLevelWrapperInContainer(container);
|
|
|
|
if (prevComponent) {
|
|
var prevWrappedElement = prevComponent._currentElement;
|
|
var prevElement = prevWrappedElement.props.child;
|
|
if (shouldUpdateReactComponent(prevElement, nextElement)) {
|
|
var publicInst = prevComponent._renderedComponent.getPublicInstance();
|
|
var updatedCallback = callback && function () {
|
|
callback.call(publicInst);
|
|
};
|
|
ReactMount._updateRootComponent(prevComponent, nextWrappedElement, nextContext, container, updatedCallback);
|
|
return publicInst;
|
|
} else {
|
|
ReactMount.unmountComponentAtNode(container);
|
|
}
|
|
}
|
|
|
|
var reactRootElement = getReactRootElementInContainer(container);
|
|
var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);
|
|
var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0;
|
|
|
|
if (!containerHasReactMarkup || reactRootElement.nextSibling) {
|
|
var rootElementSibling = reactRootElement;
|
|
while (rootElementSibling) {
|
|
if (internalGetID(rootElementSibling)) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : void 0;
|
|
break;
|
|
}
|
|
rootElementSibling = rootElementSibling.nextSibling;
|
|
}
|
|
}
|
|
}
|
|
|
|
var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;
|
|
var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)._renderedComponent.getPublicInstance();
|
|
if (callback) {
|
|
callback.call(component);
|
|
}
|
|
return component;
|
|
},
|
|
|
|
/**
|
|
* Renders a React component into the DOM in the supplied `container`.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#reactdom.render
|
|
*
|
|
* If the React component was previously rendered into `container`, this will
|
|
* perform an update on it and only mutate the DOM as necessary to reflect the
|
|
* latest React component.
|
|
*
|
|
* @param {ReactElement} nextElement Component element to render.
|
|
* @param {DOMElement} container DOM element to render into.
|
|
* @param {?function} callback function triggered on completion
|
|
* @return {ReactComponent} Component instance rendered in `container`.
|
|
*/
|
|
render: function render(nextElement, container, callback) {
|
|
return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);
|
|
},
|
|
|
|
/**
|
|
* Unmounts and destroys the React component rendered in the `container`.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#reactdom.unmountcomponentatnode
|
|
*
|
|
* @param {DOMElement} container DOM element containing a React component.
|
|
* @return {boolean} True if a component was found in and unmounted from
|
|
* `container`
|
|
*/
|
|
unmountComponentAtNode: function unmountComponentAtNode(container) {
|
|
// Various parts of our code (such as ReactCompositeComponent's
|
|
// _renderValidatedComponent) assume that calls to render aren't nested;
|
|
// verify that that's the case. (Strictly speaking, unmounting won't cause a
|
|
// render but we still don't expect to be in a render call here.)
|
|
process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0;
|
|
|
|
!isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : _prodInvariant('40') : void 0;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(!nodeIsRenderedByOtherInstance(container), "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
|
|
}
|
|
|
|
var prevComponent = getTopLevelWrapperInContainer(container);
|
|
if (!prevComponent) {
|
|
// Check if the node being unmounted was rendered by React, but isn't a
|
|
// root node.
|
|
var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
|
|
|
// Check if the container itself is a React root node.
|
|
var isContainerReactRoot = container.nodeType === 1 && container.hasAttribute(ROOT_ATTR_NAME);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : void 0;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
delete instancesByReactRootID[prevComponent._instance.rootID];
|
|
ReactUpdates.batchedUpdates(unmountComponentFromNode, prevComponent, container, false);
|
|
return true;
|
|
},
|
|
|
|
_mountImageIntoNode: function _mountImageIntoNode(markup, container, instance, shouldReuseMarkup, transaction) {
|
|
!isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : _prodInvariant('41') : void 0;
|
|
|
|
if (shouldReuseMarkup) {
|
|
var rootElement = getReactRootElementInContainer(container);
|
|
if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {
|
|
ReactDOMComponentTree.precacheNode(instance, rootElement);
|
|
return;
|
|
} else {
|
|
var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
|
rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
|
|
|
var rootMarkup = rootElement.outerHTML;
|
|
rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum);
|
|
|
|
var normalizedMarkup = markup;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// because rootMarkup is retrieved from the DOM, various normalizations
|
|
// will have occurred which will not be present in `markup`. Here,
|
|
// insert markup into a <div> or <iframe> depending on the container
|
|
// type to perform the same normalizations before comparing.
|
|
var normalizer;
|
|
if (container.nodeType === ELEMENT_NODE_TYPE) {
|
|
normalizer = document.createElement('div');
|
|
normalizer.innerHTML = markup;
|
|
normalizedMarkup = normalizer.innerHTML;
|
|
} else {
|
|
normalizer = document.createElement('iframe');
|
|
document.body.appendChild(normalizer);
|
|
normalizer.contentDocument.write(markup);
|
|
normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML;
|
|
document.body.removeChild(normalizer);
|
|
}
|
|
}
|
|
|
|
var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);
|
|
var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);
|
|
|
|
!(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\n%s', difference) : _prodInvariant('42', difference) : void 0;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\n%s', difference) : void 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
!(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document but you didn\'t use server rendering. We can\'t do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering.') : _prodInvariant('43') : void 0;
|
|
|
|
if (transaction.useCreateElement) {
|
|
while (container.lastChild) {
|
|
container.removeChild(container.lastChild);
|
|
}
|
|
DOMLazyTree.insertTreeBefore(container, markup, null);
|
|
} else {
|
|
setInnerHTML(container, markup);
|
|
ReactDOMComponentTree.precacheNode(instance, container.firstChild);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var hostNode = ReactDOMComponentTree.getInstanceFromNode(container.firstChild);
|
|
if (hostNode._debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: hostNode._debugID,
|
|
type: 'mount',
|
|
payload: markup.toString()
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactMount;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 83 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var React = __webpack_require__(23);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var ReactNodeTypes = {
|
|
HOST: 0,
|
|
COMPOSITE: 1,
|
|
EMPTY: 2,
|
|
|
|
getType: function getType(node) {
|
|
if (node === null || node === false) {
|
|
return ReactNodeTypes.EMPTY;
|
|
} else if (React.isValidElement(node)) {
|
|
if (typeof node.type === 'function') {
|
|
return ReactNodeTypes.COMPOSITE;
|
|
} else {
|
|
return ReactNodeTypes.HOST;
|
|
}
|
|
}
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Unexpected node: %s', node) : _prodInvariant('26', node) : void 0;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactNodeTypes;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 84 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
|
|
|
module.exports = ReactPropTypesSecret;
|
|
|
|
/***/ }),
|
|
/* 85 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ViewportMetrics = {
|
|
currentScrollLeft: 0,
|
|
|
|
currentScrollTop: 0,
|
|
|
|
refreshScrollValues: function refreshScrollValues(scrollPosition) {
|
|
ViewportMetrics.currentScrollLeft = scrollPosition.x;
|
|
ViewportMetrics.currentScrollTop = scrollPosition.y;
|
|
}
|
|
};
|
|
|
|
module.exports = ViewportMetrics;
|
|
|
|
/***/ }),
|
|
/* 86 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Accumulates items that must not be null or undefined into the first one. This
|
|
* is used to conserve memory by avoiding array allocations, and thus sacrifices
|
|
* API cleanness. Since `current` can be null before being passed in and not
|
|
* null after this function, make sure to assign it back to `current`:
|
|
*
|
|
* `a = accumulateInto(a, b);`
|
|
*
|
|
* This API should be sparingly used. Try `accumulate` for something cleaner.
|
|
*
|
|
* @return {*|array<*>} An accumulation of items.
|
|
*/
|
|
|
|
function accumulateInto(current, next) {
|
|
!(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : _prodInvariant('30') : void 0;
|
|
|
|
if (current == null) {
|
|
return next;
|
|
}
|
|
|
|
// Both are not empty. Warning: Never call x.concat(y) when you are not
|
|
// certain that x is an Array (x could be a string with concat method).
|
|
if (Array.isArray(current)) {
|
|
if (Array.isArray(next)) {
|
|
current.push.apply(current, next);
|
|
return current;
|
|
}
|
|
current.push(next);
|
|
return current;
|
|
}
|
|
|
|
if (Array.isArray(next)) {
|
|
// A bit too dangerous to mutate `next`.
|
|
return [current].concat(next);
|
|
}
|
|
|
|
return [current, next];
|
|
}
|
|
|
|
module.exports = accumulateInto;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 87 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* @param {array} arr an "accumulation" of items which is either an Array or
|
|
* a single item. Useful when paired with the `accumulate` module. This is a
|
|
* simple utility that allows us to reason about a collection of items, but
|
|
* handling the case when there is exactly one item (and we do not need to
|
|
* allocate an array).
|
|
*/
|
|
|
|
function forEachAccumulated(arr, cb, scope) {
|
|
if (Array.isArray(arr)) {
|
|
arr.forEach(cb, scope);
|
|
} else if (arr) {
|
|
cb.call(scope, arr);
|
|
}
|
|
}
|
|
|
|
module.exports = forEachAccumulated;
|
|
|
|
/***/ }),
|
|
/* 88 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactNodeTypes = __webpack_require__(83);
|
|
|
|
function getHostComponentFromComposite(inst) {
|
|
var type;
|
|
|
|
while ((type = inst._renderedNodeType) === ReactNodeTypes.COMPOSITE) {
|
|
inst = inst._renderedComponent;
|
|
}
|
|
|
|
if (type === ReactNodeTypes.HOST) {
|
|
return inst._renderedComponent;
|
|
} else if (type === ReactNodeTypes.EMPTY) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
module.exports = getHostComponentFromComposite;
|
|
|
|
/***/ }),
|
|
/* 89 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var contentKey = null;
|
|
|
|
/**
|
|
* Gets the key used to access text content on a DOM node.
|
|
*
|
|
* @return {?string} Key used to access text content.
|
|
* @internal
|
|
*/
|
|
function getTextContentAccessor() {
|
|
if (!contentKey && ExecutionEnvironment.canUseDOM) {
|
|
// Prefer textContent to innerText because many browsers support both but
|
|
// SVG <text> elements don't support innerText even when <div> does.
|
|
contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';
|
|
}
|
|
return contentKey;
|
|
}
|
|
|
|
module.exports = getTextContentAccessor;
|
|
|
|
/***/ }),
|
|
/* 90 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
|
|
function isCheckable(elem) {
|
|
var type = elem.type;
|
|
var nodeName = elem.nodeName;
|
|
return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
|
|
}
|
|
|
|
function getTracker(inst) {
|
|
return inst._wrapperState.valueTracker;
|
|
}
|
|
|
|
function attachTracker(inst, tracker) {
|
|
inst._wrapperState.valueTracker = tracker;
|
|
}
|
|
|
|
function detachTracker(inst) {
|
|
delete inst._wrapperState.valueTracker;
|
|
}
|
|
|
|
function getValueFromNode(node) {
|
|
var value;
|
|
if (node) {
|
|
value = isCheckable(node) ? '' + node.checked : node.value;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
var inputValueTracking = {
|
|
// exposed for testing
|
|
_getTrackerFromNode: function _getTrackerFromNode(node) {
|
|
return getTracker(ReactDOMComponentTree.getInstanceFromNode(node));
|
|
},
|
|
|
|
track: function track(inst) {
|
|
if (getTracker(inst)) {
|
|
return;
|
|
}
|
|
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
var valueField = isCheckable(node) ? 'checked' : 'value';
|
|
var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
|
|
|
|
var currentValue = '' + node[valueField];
|
|
|
|
// if someone has already defined a value or Safari, then bail
|
|
// and don't track value will cause over reporting of changes,
|
|
// but it's better then a hard failure
|
|
// (needed for certain tests that spyOn input values and Safari)
|
|
if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
|
|
return;
|
|
}
|
|
|
|
Object.defineProperty(node, valueField, {
|
|
enumerable: descriptor.enumerable,
|
|
configurable: true,
|
|
get: function get() {
|
|
return descriptor.get.call(this);
|
|
},
|
|
set: function set(value) {
|
|
currentValue = '' + value;
|
|
descriptor.set.call(this, value);
|
|
}
|
|
});
|
|
|
|
attachTracker(inst, {
|
|
getValue: function getValue() {
|
|
return currentValue;
|
|
},
|
|
setValue: function setValue(value) {
|
|
currentValue = '' + value;
|
|
},
|
|
stopTracking: function stopTracking() {
|
|
detachTracker(inst);
|
|
delete node[valueField];
|
|
}
|
|
});
|
|
},
|
|
|
|
updateValueIfChanged: function updateValueIfChanged(inst) {
|
|
if (!inst) {
|
|
return false;
|
|
}
|
|
var tracker = getTracker(inst);
|
|
|
|
if (!tracker) {
|
|
inputValueTracking.track(inst);
|
|
return true;
|
|
}
|
|
|
|
var lastValue = tracker.getValue();
|
|
var nextValue = getValueFromNode(ReactDOMComponentTree.getNodeFromInstance(inst));
|
|
|
|
if (nextValue !== lastValue) {
|
|
tracker.setValue(nextValue);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
stopTracking: function stopTracking(inst) {
|
|
var tracker = getTracker(inst);
|
|
if (tracker) {
|
|
tracker.stopTracking();
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = inputValueTracking;
|
|
|
|
/***/ }),
|
|
/* 91 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var ReactCompositeComponent = __webpack_require__(157);
|
|
var ReactEmptyComponent = __webpack_require__(78);
|
|
var ReactHostComponent = __webpack_require__(80);
|
|
|
|
var getNextDebugID = __webpack_require__(255);
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
// To avoid a cyclic dependency, we create the final class in this module
|
|
var ReactCompositeComponentWrapper = function ReactCompositeComponentWrapper(element) {
|
|
this.construct(element);
|
|
};
|
|
|
|
function getDeclarationErrorAddendum(owner) {
|
|
if (owner) {
|
|
var name = owner.getName();
|
|
if (name) {
|
|
return ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Check if the type reference is a known internal type. I.e. not a user
|
|
* provided composite type.
|
|
*
|
|
* @param {function} type
|
|
* @return {boolean} Returns true if this is a valid internal type.
|
|
*/
|
|
function isInternalComponentType(type) {
|
|
return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';
|
|
}
|
|
|
|
/**
|
|
* Given a ReactNode, create an instance that will actually be mounted.
|
|
*
|
|
* @param {ReactNode} node
|
|
* @param {boolean} shouldHaveDebugID
|
|
* @return {object} A new instance of the element's constructor.
|
|
* @protected
|
|
*/
|
|
function instantiateReactComponent(node, shouldHaveDebugID) {
|
|
var instance;
|
|
|
|
if (node === null || node === false) {
|
|
instance = ReactEmptyComponent.create(instantiateReactComponent);
|
|
} else if ((typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object') {
|
|
var element = node;
|
|
var type = element.type;
|
|
if (typeof type !== 'function' && typeof type !== 'string') {
|
|
var info = '';
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (type === undefined || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && type !== null && Object.keys(type).length === 0) {
|
|
info += ' You likely forgot to export your component from the file ' + "it's defined in.";
|
|
}
|
|
}
|
|
info += getDeclarationErrorAddendum(element._owner);
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', type == null ? type : typeof type === 'undefined' ? 'undefined' : _typeof(type), info) : _prodInvariant('130', type == null ? type : typeof type === 'undefined' ? 'undefined' : _typeof(type), info) : void 0;
|
|
}
|
|
|
|
// Special case string values
|
|
if (typeof element.type === 'string') {
|
|
instance = ReactHostComponent.createInternalComponent(element);
|
|
} else if (isInternalComponentType(element.type)) {
|
|
// This is temporarily available for custom components that are not string
|
|
// representations. I.e. ART. Once those are updated to use the string
|
|
// representation, we can drop this code path.
|
|
instance = new element.type(element);
|
|
|
|
// We renamed this. Allow the old name for compat. :(
|
|
if (!instance.getHostNode) {
|
|
instance.getHostNode = instance.getNativeNode;
|
|
}
|
|
} else {
|
|
instance = new ReactCompositeComponentWrapper(element);
|
|
}
|
|
} else if (typeof node === 'string' || typeof node === 'number') {
|
|
instance = ReactHostComponent.createInstanceForText(node);
|
|
} else {
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node === 'undefined' ? 'undefined' : _typeof(node)) : _prodInvariant('131', typeof node === 'undefined' ? 'undefined' : _typeof(node)) : void 0;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.getHostNode === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : void 0;
|
|
}
|
|
|
|
// These two fields are used by the DOM and ART diffing algorithms
|
|
// respectively. Instead of using expandos on components, we should be
|
|
// storing the state needed by the diffing algorithms elsewhere.
|
|
instance._mountIndex = 0;
|
|
instance._mountImage = null;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
instance._debugID = shouldHaveDebugID ? getNextDebugID() : 0;
|
|
}
|
|
|
|
// Internal instances should fully constructed at this point, so they should
|
|
// not get any new fields added to them at this point.
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (Object.preventExtensions) {
|
|
Object.preventExtensions(instance);
|
|
}
|
|
}
|
|
|
|
return instance;
|
|
}
|
|
|
|
_assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent, {
|
|
_instantiateReactComponent: instantiateReactComponent
|
|
});
|
|
|
|
module.exports = instantiateReactComponent;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 92 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
|
|
*/
|
|
|
|
var supportedInputTypes = {
|
|
color: true,
|
|
date: true,
|
|
datetime: true,
|
|
'datetime-local': true,
|
|
email: true,
|
|
month: true,
|
|
number: true,
|
|
password: true,
|
|
range: true,
|
|
search: true,
|
|
tel: true,
|
|
text: true,
|
|
time: true,
|
|
url: true,
|
|
week: true
|
|
};
|
|
|
|
function isTextInputElement(elem) {
|
|
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
|
|
|
if (nodeName === 'input') {
|
|
return !!supportedInputTypes[elem.type];
|
|
}
|
|
|
|
if (nodeName === 'textarea') {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
module.exports = isTextInputElement;
|
|
|
|
/***/ }),
|
|
/* 93 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var escapeTextContentForBrowser = __webpack_require__(37);
|
|
var setInnerHTML = __webpack_require__(38);
|
|
|
|
/**
|
|
* Set the textContent property of a node, ensuring that whitespace is preserved
|
|
* even in IE8. innerText is a poor substitute for textContent and, among many
|
|
* issues, inserts <br> instead of the literal newline chars. innerHTML behaves
|
|
* as it should.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {string} text
|
|
* @internal
|
|
*/
|
|
var setTextContent = function setTextContent(node, text) {
|
|
if (text) {
|
|
var firstChild = node.firstChild;
|
|
|
|
if (firstChild && firstChild === node.lastChild && firstChild.nodeType === 3) {
|
|
firstChild.nodeValue = text;
|
|
return;
|
|
}
|
|
}
|
|
node.textContent = text;
|
|
};
|
|
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
if (!('textContent' in document.documentElement)) {
|
|
setTextContent = function setTextContent(node, text) {
|
|
if (node.nodeType === 3) {
|
|
node.nodeValue = text;
|
|
return;
|
|
}
|
|
setInnerHTML(node, escapeTextContentForBrowser(text));
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = setTextContent;
|
|
|
|
/***/ }),
|
|
/* 94 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var REACT_ELEMENT_TYPE = __webpack_require__(176);
|
|
|
|
var getIteratorFn = __webpack_require__(210);
|
|
var invariant = __webpack_require__(1);
|
|
var KeyEscapeUtils = __webpack_require__(48);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var SEPARATOR = '.';
|
|
var SUBSEPARATOR = ':';
|
|
|
|
/**
|
|
* This is inlined from ReactElement since this file is shared between
|
|
* isomorphic and renderers. We could extract this to a
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* TODO: Test that a single child and an array with one item have the same key
|
|
* pattern.
|
|
*/
|
|
|
|
var didWarnAboutMaps = false;
|
|
|
|
/**
|
|
* Generate a key string that identifies a component within a set.
|
|
*
|
|
* @param {*} component A component that could contain a manual key.
|
|
* @param {number} index Index that is used if a manual key is not provided.
|
|
* @return {string}
|
|
*/
|
|
function getComponentKey(component, index) {
|
|
// Do some typechecking here since we call this blindly. We want to ensure
|
|
// that we don't block potential future ES APIs.
|
|
if (component && (typeof component === 'undefined' ? 'undefined' : _typeof(component)) === 'object' && component.key != null) {
|
|
// Explicit key
|
|
return KeyEscapeUtils.escape(component.key);
|
|
}
|
|
// Implicit key determined by the index in the set
|
|
return index.toString(36);
|
|
}
|
|
|
|
/**
|
|
* @param {?*} children Children tree container.
|
|
* @param {!string} nameSoFar Name of the key path so far.
|
|
* @param {!function} callback Callback to invoke with each child found.
|
|
* @param {?*} traverseContext Used to pass information throughout the traversal
|
|
* process.
|
|
* @return {!number} The number of children in this subtree.
|
|
*/
|
|
function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
|
|
var type = typeof children === 'undefined' ? 'undefined' : _typeof(children);
|
|
|
|
if (type === 'undefined' || type === 'boolean') {
|
|
// All of the above are perceived as null.
|
|
children = null;
|
|
}
|
|
|
|
if (children === null || type === 'string' || type === 'number' ||
|
|
// The following is inlined from ReactElement. This means we can optimize
|
|
// some checks. React Fiber also inlines this logic for similar purposes.
|
|
type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {
|
|
callback(traverseContext, children,
|
|
// If it's the only child, treat the name as if it was wrapped in an array
|
|
// so that it's consistent if the number of children grows.
|
|
nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
|
|
return 1;
|
|
}
|
|
|
|
var child;
|
|
var nextName;
|
|
var subtreeCount = 0; // Count of children found in the current subtree.
|
|
var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
|
|
|
if (Array.isArray(children)) {
|
|
for (var i = 0; i < children.length; i++) {
|
|
child = children[i];
|
|
nextName = nextNamePrefix + getComponentKey(child, i);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
} else {
|
|
var iteratorFn = getIteratorFn(children);
|
|
if (iteratorFn) {
|
|
var iterator = iteratorFn.call(children);
|
|
var step;
|
|
if (iteratorFn !== children.entries) {
|
|
var ii = 0;
|
|
while (!(step = iterator.next()).done) {
|
|
child = step.value;
|
|
nextName = nextNamePrefix + getComponentKey(child, ii++);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var mapsAsChildrenAddendum = '';
|
|
if (ReactCurrentOwner.current) {
|
|
var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();
|
|
if (mapsAsChildrenOwnerName) {
|
|
mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';
|
|
}
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;
|
|
didWarnAboutMaps = true;
|
|
}
|
|
// Iterator will provide entry [k,v] tuples rather than values.
|
|
while (!(step = iterator.next()).done) {
|
|
var entry = step.value;
|
|
if (entry) {
|
|
child = entry[1];
|
|
nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
}
|
|
}
|
|
} else if (type === 'object') {
|
|
var addendum = '';
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';
|
|
if (children._isReactElement) {
|
|
addendum = " It looks like you're using an element created by a different " + 'version of React. Make sure to use only one copy of React.';
|
|
}
|
|
if (ReactCurrentOwner.current) {
|
|
var name = ReactCurrentOwner.current.getName();
|
|
if (name) {
|
|
addendum += ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
}
|
|
var childrenString = String(children);
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;
|
|
}
|
|
}
|
|
|
|
return subtreeCount;
|
|
}
|
|
|
|
/**
|
|
* Traverses children that are typically specified as `props.children`, but
|
|
* might also be specified through attributes:
|
|
*
|
|
* - `traverseAllChildren(this.props.children, ...)`
|
|
* - `traverseAllChildren(this.props.leftPanelChildren, ...)`
|
|
*
|
|
* The `traverseContext` is an optional argument that is passed through the
|
|
* entire traversal. It can be used to store accumulations or anything else that
|
|
* the callback might find relevant.
|
|
*
|
|
* @param {?*} children Children tree object.
|
|
* @param {!function} callback To invoke upon traversing each child.
|
|
* @param {?*} traverseContext Context for traversal.
|
|
* @return {!number} The number of children in this subtree.
|
|
*/
|
|
function traverseAllChildren(children, callback, traverseContext) {
|
|
if (children == null) {
|
|
return 0;
|
|
}
|
|
|
|
return traverseAllChildrenImpl(children, '', callback, traverseContext);
|
|
}
|
|
|
|
module.exports = traverseAllChildren;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 95 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.default = connectAdvanced;
|
|
|
|
var _hoistNonReactStatics = __webpack_require__(69);
|
|
|
|
var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
|
|
|
|
var _invariant = __webpack_require__(26);
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _Subscription = __webpack_require__(223);
|
|
|
|
var _Subscription2 = _interopRequireDefault(_Subscription);
|
|
|
|
var _PropTypes = __webpack_require__(97);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
var hotReloadingVersion = 0;
|
|
var dummyState = {};
|
|
function noop() {}
|
|
function makeSelectorStateful(sourceSelector, store) {
|
|
// wrap the selector in an object that tracks its results between runs.
|
|
var selector = {
|
|
run: function runComponentSelector(props) {
|
|
try {
|
|
var nextProps = sourceSelector(store.getState(), props);
|
|
if (nextProps !== selector.props || selector.error) {
|
|
selector.shouldComponentUpdate = true;
|
|
selector.props = nextProps;
|
|
selector.error = null;
|
|
}
|
|
} catch (error) {
|
|
selector.shouldComponentUpdate = true;
|
|
selector.error = error;
|
|
}
|
|
}
|
|
};
|
|
|
|
return selector;
|
|
}
|
|
|
|
function connectAdvanced(
|
|
/*
|
|
selectorFactory is a func that is responsible for returning the selector function used to
|
|
compute new props from state, props, and dispatch. For example:
|
|
export default connectAdvanced((dispatch, options) => (state, props) => ({
|
|
thing: state.things[props.thingId],
|
|
saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),
|
|
}))(YourComponent)
|
|
Access to dispatch is provided to the factory so selectorFactories can bind actionCreators
|
|
outside of their selector as an optimization. Options passed to connectAdvanced are passed to
|
|
the selectorFactory, along with displayName and WrappedComponent, as the second argument.
|
|
Note that selectorFactory is responsible for all caching/memoization of inbound and outbound
|
|
props. Do not use connectAdvanced directly without memoizing results between calls to your
|
|
selector, otherwise the Connect component will re-render on every state or props change.
|
|
*/
|
|
selectorFactory) {
|
|
var _contextTypes, _childContextTypes;
|
|
|
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
_ref$getDisplayName = _ref.getDisplayName,
|
|
getDisplayName = _ref$getDisplayName === undefined ? function (name) {
|
|
return 'ConnectAdvanced(' + name + ')';
|
|
} : _ref$getDisplayName,
|
|
_ref$methodName = _ref.methodName,
|
|
methodName = _ref$methodName === undefined ? 'connectAdvanced' : _ref$methodName,
|
|
_ref$renderCountProp = _ref.renderCountProp,
|
|
renderCountProp = _ref$renderCountProp === undefined ? undefined : _ref$renderCountProp,
|
|
_ref$shouldHandleStat = _ref.shouldHandleStateChanges,
|
|
shouldHandleStateChanges = _ref$shouldHandleStat === undefined ? true : _ref$shouldHandleStat,
|
|
_ref$storeKey = _ref.storeKey,
|
|
storeKey = _ref$storeKey === undefined ? 'store' : _ref$storeKey,
|
|
_ref$withRef = _ref.withRef,
|
|
withRef = _ref$withRef === undefined ? false : _ref$withRef,
|
|
connectOptions = _objectWithoutProperties(_ref, ['getDisplayName', 'methodName', 'renderCountProp', 'shouldHandleStateChanges', 'storeKey', 'withRef']);
|
|
|
|
var subscriptionKey = storeKey + 'Subscription';
|
|
var version = hotReloadingVersion++;
|
|
|
|
var contextTypes = (_contextTypes = {}, _contextTypes[storeKey] = _PropTypes.storeShape, _contextTypes[subscriptionKey] = _PropTypes.subscriptionShape, _contextTypes);
|
|
var childContextTypes = (_childContextTypes = {}, _childContextTypes[subscriptionKey] = _PropTypes.subscriptionShape, _childContextTypes);
|
|
|
|
return function wrapWithConnect(WrappedComponent) {
|
|
(0, _invariant2.default)(typeof WrappedComponent == 'function', 'You must pass a component to the function returned by ' + ('connect. Instead received ' + JSON.stringify(WrappedComponent)));
|
|
|
|
var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';
|
|
|
|
var displayName = getDisplayName(wrappedComponentName);
|
|
|
|
var selectorFactoryOptions = _extends({}, connectOptions, {
|
|
getDisplayName: getDisplayName,
|
|
methodName: methodName,
|
|
renderCountProp: renderCountProp,
|
|
shouldHandleStateChanges: shouldHandleStateChanges,
|
|
storeKey: storeKey,
|
|
withRef: withRef,
|
|
displayName: displayName,
|
|
wrappedComponentName: wrappedComponentName,
|
|
WrappedComponent: WrappedComponent
|
|
});
|
|
|
|
var Connect = function (_Component) {
|
|
_inherits(Connect, _Component);
|
|
|
|
function Connect(props, context) {
|
|
_classCallCheck(this, Connect);
|
|
|
|
var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
|
|
|
|
_this.version = version;
|
|
_this.state = {};
|
|
_this.renderCount = 0;
|
|
_this.store = props[storeKey] || context[storeKey];
|
|
_this.propsMode = Boolean(props[storeKey]);
|
|
_this.setWrappedInstance = _this.setWrappedInstance.bind(_this);
|
|
|
|
(0, _invariant2.default)(_this.store, 'Could not find "' + storeKey + '" in either the context or props of ' + ('"' + displayName + '". Either wrap the root component in a <Provider>, ') + ('or explicitly pass "' + storeKey + '" as a prop to "' + displayName + '".'));
|
|
|
|
_this.initSelector();
|
|
_this.initSubscription();
|
|
return _this;
|
|
}
|
|
|
|
Connect.prototype.getChildContext = function getChildContext() {
|
|
var _ref2;
|
|
|
|
// If this component received store from props, its subscription should be transparent
|
|
// to any descendants receiving store+subscription from context; it passes along
|
|
// subscription passed to it. Otherwise, it shadows the parent subscription, which allows
|
|
// Connect to control ordering of notifications to flow top-down.
|
|
var subscription = this.propsMode ? null : this.subscription;
|
|
return _ref2 = {}, _ref2[subscriptionKey] = subscription || this.context[subscriptionKey], _ref2;
|
|
};
|
|
|
|
Connect.prototype.componentDidMount = function componentDidMount() {
|
|
if (!shouldHandleStateChanges) return;
|
|
|
|
// componentWillMount fires during server side rendering, but componentDidMount and
|
|
// componentWillUnmount do not. Because of this, trySubscribe happens during ...didMount.
|
|
// Otherwise, unsubscription would never take place during SSR, causing a memory leak.
|
|
// To handle the case where a child component may have triggered a state change by
|
|
// dispatching an action in its componentWillMount, we have to re-run the select and maybe
|
|
// re-render.
|
|
this.subscription.trySubscribe();
|
|
this.selector.run(this.props);
|
|
if (this.selector.shouldComponentUpdate) this.forceUpdate();
|
|
};
|
|
|
|
Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
|
this.selector.run(nextProps);
|
|
};
|
|
|
|
Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate() {
|
|
return this.selector.shouldComponentUpdate;
|
|
};
|
|
|
|
Connect.prototype.componentWillUnmount = function componentWillUnmount() {
|
|
if (this.subscription) this.subscription.tryUnsubscribe();
|
|
this.subscription = null;
|
|
this.notifyNestedSubs = noop;
|
|
this.store = null;
|
|
this.selector.run = noop;
|
|
this.selector.shouldComponentUpdate = false;
|
|
};
|
|
|
|
Connect.prototype.getWrappedInstance = function getWrappedInstance() {
|
|
(0, _invariant2.default)(withRef, 'To access the wrapped instance, you need to specify ' + ('{ withRef: true } in the options argument of the ' + methodName + '() call.'));
|
|
return this.wrappedInstance;
|
|
};
|
|
|
|
Connect.prototype.setWrappedInstance = function setWrappedInstance(ref) {
|
|
this.wrappedInstance = ref;
|
|
};
|
|
|
|
Connect.prototype.initSelector = function initSelector() {
|
|
var sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions);
|
|
this.selector = makeSelectorStateful(sourceSelector, this.store);
|
|
this.selector.run(this.props);
|
|
};
|
|
|
|
Connect.prototype.initSubscription = function initSubscription() {
|
|
if (!shouldHandleStateChanges) return;
|
|
|
|
// parentSub's source should match where store came from: props vs. context. A component
|
|
// connected to the store via props shouldn't use subscription from context, or vice versa.
|
|
var parentSub = (this.propsMode ? this.props : this.context)[subscriptionKey];
|
|
this.subscription = new _Subscription2.default(this.store, parentSub, this.onStateChange.bind(this));
|
|
|
|
// `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in
|
|
// the middle of the notification loop, where `this.subscription` will then be null. An
|
|
// extra null check every change can be avoided by copying the method onto `this` and then
|
|
// replacing it with a no-op on unmount. This can probably be avoided if Subscription's
|
|
// listeners logic is changed to not call listeners that have been unsubscribed in the
|
|
// middle of the notification loop.
|
|
this.notifyNestedSubs = this.subscription.notifyNestedSubs.bind(this.subscription);
|
|
};
|
|
|
|
Connect.prototype.onStateChange = function onStateChange() {
|
|
this.selector.run(this.props);
|
|
|
|
if (!this.selector.shouldComponentUpdate) {
|
|
this.notifyNestedSubs();
|
|
} else {
|
|
this.componentDidUpdate = this.notifyNestedSubsOnComponentDidUpdate;
|
|
this.setState(dummyState);
|
|
}
|
|
};
|
|
|
|
Connect.prototype.notifyNestedSubsOnComponentDidUpdate = function notifyNestedSubsOnComponentDidUpdate() {
|
|
// `componentDidUpdate` is conditionally implemented when `onStateChange` determines it
|
|
// needs to notify nested subs. Once called, it unimplements itself until further state
|
|
// changes occur. Doing it this way vs having a permanent `componentDidMount` that does
|
|
// a boolean check every time avoids an extra method call most of the time, resulting
|
|
// in some perf boost.
|
|
this.componentDidUpdate = undefined;
|
|
this.notifyNestedSubs();
|
|
};
|
|
|
|
Connect.prototype.isSubscribed = function isSubscribed() {
|
|
return Boolean(this.subscription) && this.subscription.isSubscribed();
|
|
};
|
|
|
|
Connect.prototype.addExtraProps = function addExtraProps(props) {
|
|
if (!withRef && !renderCountProp && !(this.propsMode && this.subscription)) return props;
|
|
// make a shallow copy so that fields added don't leak to the original selector.
|
|
// this is especially important for 'ref' since that's a reference back to the component
|
|
// instance. a singleton memoized selector would then be holding a reference to the
|
|
// instance, preventing the instance from being garbage collected, and that would be bad
|
|
var withExtras = _extends({}, props);
|
|
if (withRef) withExtras.ref = this.setWrappedInstance;
|
|
if (renderCountProp) withExtras[renderCountProp] = this.renderCount++;
|
|
if (this.propsMode && this.subscription) withExtras[subscriptionKey] = this.subscription;
|
|
return withExtras;
|
|
};
|
|
|
|
Connect.prototype.render = function render() {
|
|
var selector = this.selector;
|
|
selector.shouldComponentUpdate = false;
|
|
|
|
if (selector.error) {
|
|
throw selector.error;
|
|
} else {
|
|
return (0, _react.createElement)(WrappedComponent, this.addExtraProps(selector.props));
|
|
}
|
|
};
|
|
|
|
return Connect;
|
|
}(_react.Component);
|
|
|
|
Connect.WrappedComponent = WrappedComponent;
|
|
Connect.displayName = displayName;
|
|
Connect.childContextTypes = childContextTypes;
|
|
Connect.contextTypes = contextTypes;
|
|
Connect.propTypes = contextTypes;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Connect.prototype.componentWillUpdate = function componentWillUpdate() {
|
|
// We are hot reloading!
|
|
if (this.version !== version) {
|
|
this.version = version;
|
|
this.initSelector();
|
|
|
|
if (this.subscription) this.subscription.tryUnsubscribe();
|
|
this.initSubscription();
|
|
if (shouldHandleStateChanges) this.subscription.trySubscribe();
|
|
}
|
|
};
|
|
}
|
|
|
|
return (0, _hoistNonReactStatics2.default)(Connect, WrappedComponent);
|
|
};
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 96 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.wrapMapToPropsConstant = wrapMapToPropsConstant;
|
|
exports.getDependsOnOwnProps = getDependsOnOwnProps;
|
|
exports.wrapMapToPropsFunc = wrapMapToPropsFunc;
|
|
|
|
var _verifyPlainObject = __webpack_require__(98);
|
|
|
|
var _verifyPlainObject2 = _interopRequireDefault(_verifyPlainObject);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function wrapMapToPropsConstant(getConstant) {
|
|
return function initConstantSelector(dispatch, options) {
|
|
var constant = getConstant(dispatch, options);
|
|
|
|
function constantSelector() {
|
|
return constant;
|
|
}
|
|
constantSelector.dependsOnOwnProps = false;
|
|
return constantSelector;
|
|
};
|
|
}
|
|
|
|
// dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args
|
|
// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine
|
|
// whether mapToProps needs to be invoked when props have changed.
|
|
//
|
|
// A length of one signals that mapToProps does not depend on props from the parent component.
|
|
// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and
|
|
// therefore not reporting its length accurately..
|
|
function getDependsOnOwnProps(mapToProps) {
|
|
return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;
|
|
}
|
|
|
|
// Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,
|
|
// this function wraps mapToProps in a proxy function which does several things:
|
|
//
|
|
// * Detects whether the mapToProps function being called depends on props, which
|
|
// is used by selectorFactory to decide if it should reinvoke on props changes.
|
|
//
|
|
// * On first call, handles mapToProps if returns another function, and treats that
|
|
// new function as the true mapToProps for subsequent calls.
|
|
//
|
|
// * On first call, verifies the first result is a plain object, in order to warn
|
|
// the developer that their mapToProps function is not returning a valid result.
|
|
//
|
|
function wrapMapToPropsFunc(mapToProps, methodName) {
|
|
return function initProxySelector(dispatch, _ref) {
|
|
var displayName = _ref.displayName;
|
|
|
|
var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {
|
|
return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);
|
|
};
|
|
|
|
// allow detectFactoryAndVerify to get ownProps
|
|
proxy.dependsOnOwnProps = true;
|
|
|
|
proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {
|
|
proxy.mapToProps = mapToProps;
|
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);
|
|
var props = proxy(stateOrDispatch, ownProps);
|
|
|
|
if (typeof props === 'function') {
|
|
proxy.mapToProps = props;
|
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(props);
|
|
props = proxy(stateOrDispatch, ownProps);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') (0, _verifyPlainObject2.default)(props, displayName, methodName);
|
|
|
|
return props;
|
|
};
|
|
|
|
return proxy;
|
|
};
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 97 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.storeShape = exports.subscriptionShape = undefined;
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var subscriptionShape = exports.subscriptionShape = _propTypes2.default.shape({
|
|
trySubscribe: _propTypes2.default.func.isRequired,
|
|
tryUnsubscribe: _propTypes2.default.func.isRequired,
|
|
notifyNestedSubs: _propTypes2.default.func.isRequired,
|
|
isSubscribed: _propTypes2.default.func.isRequired
|
|
});
|
|
|
|
var storeShape = exports.storeShape = _propTypes2.default.shape({
|
|
subscribe: _propTypes2.default.func.isRequired,
|
|
dispatch: _propTypes2.default.func.isRequired,
|
|
getState: _propTypes2.default.func.isRequired
|
|
});
|
|
|
|
/***/ }),
|
|
/* 98 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = verifyPlainObject;
|
|
|
|
var _isPlainObject = __webpack_require__(43);
|
|
|
|
var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
|
|
|
|
var _warning = __webpack_require__(60);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function verifyPlainObject(value, displayName, methodName) {
|
|
if (!(0, _isPlainObject2.default)(value)) {
|
|
(0, _warning2.default)(methodName + '() in ' + displayName + ' must return a plain object. Instead received ' + value + '.');
|
|
}
|
|
}
|
|
|
|
/***/ }),
|
|
/* 99 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
var isModifiedEvent = function isModifiedEvent(event) {
|
|
return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
|
|
};
|
|
|
|
/**
|
|
* The public API for rendering a history-aware <a>.
|
|
*/
|
|
|
|
var Link = function (_React$Component) {
|
|
_inherits(Link, _React$Component);
|
|
|
|
function Link() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, Link);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.handleClick = function (event) {
|
|
if (_this.props.onClick) _this.props.onClick(event);
|
|
|
|
if (!event.defaultPrevented && // onClick prevented default
|
|
event.button === 0 && // ignore right clicks
|
|
!_this.props.target && // let browser handle "target=_blank" etc.
|
|
!isModifiedEvent(event // ignore clicks with modifier keys
|
|
)) {
|
|
event.preventDefault();
|
|
|
|
var history = _this.context.router.history;
|
|
var _this$props = _this.props,
|
|
replace = _this$props.replace,
|
|
to = _this$props.to;
|
|
|
|
if (replace) {
|
|
history.replace(to);
|
|
} else {
|
|
history.push(to);
|
|
}
|
|
}
|
|
}, _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
Link.prototype.render = function render() {
|
|
var _props = this.props,
|
|
replace = _props.replace,
|
|
to = _props.to,
|
|
props = _objectWithoutProperties(_props, ['replace', 'to']); // eslint-disable-line no-unused-vars
|
|
|
|
var href = this.context.router.history.createHref(typeof to === 'string' ? { pathname: to } : to);
|
|
|
|
return _react2.default.createElement('a', _extends({}, props, { onClick: this.handleClick, href: href }));
|
|
};
|
|
|
|
return Link;
|
|
}(_react2.default.Component);
|
|
|
|
Link.propTypes = {
|
|
onClick: _propTypes2.default.func,
|
|
target: _propTypes2.default.string,
|
|
replace: _propTypes2.default.bool,
|
|
to: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]).isRequired
|
|
};
|
|
Link.defaultProps = {
|
|
replace: false
|
|
};
|
|
Link.contextTypes = {
|
|
router: _propTypes2.default.shape({
|
|
history: _propTypes2.default.shape({
|
|
push: _propTypes2.default.func.isRequired,
|
|
replace: _propTypes2.default.func.isRequired,
|
|
createHref: _propTypes2.default.func.isRequired
|
|
}).isRequired
|
|
}).isRequired
|
|
};
|
|
|
|
exports.default = Link;
|
|
|
|
/***/ }),
|
|
/* 100 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _matchPath = __webpack_require__(62);
|
|
|
|
var _matchPath2 = _interopRequireDefault(_matchPath);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for matching a single path and rendering.
|
|
*/
|
|
|
|
var Route = function (_React$Component) {
|
|
_inherits(Route, _React$Component);
|
|
|
|
function Route() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, Route);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {
|
|
match: _this.computeMatch(_this.props, _this.context.router)
|
|
}, _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
Route.prototype.getChildContext = function getChildContext() {
|
|
return {
|
|
router: _extends({}, this.context.router, {
|
|
route: {
|
|
location: this.props.location || this.context.router.route.location,
|
|
match: this.state.match
|
|
}
|
|
})
|
|
};
|
|
};
|
|
|
|
Route.prototype.computeMatch = function computeMatch(_ref, _ref2) {
|
|
var computedMatch = _ref.computedMatch,
|
|
location = _ref.location,
|
|
path = _ref.path,
|
|
strict = _ref.strict,
|
|
exact = _ref.exact;
|
|
var route = _ref2.route;
|
|
|
|
if (computedMatch) return computedMatch; // <Switch> already computed the match for us
|
|
|
|
var pathname = (location || route.location).pathname;
|
|
|
|
return path ? (0, _matchPath2.default)(pathname, { path: path, strict: strict, exact: exact }) : route.match;
|
|
};
|
|
|
|
Route.prototype.componentWillMount = function componentWillMount() {
|
|
var _props = this.props,
|
|
component = _props.component,
|
|
render = _props.render,
|
|
children = _props.children;
|
|
|
|
(0, _warning2.default)(!(component && render), 'You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored');
|
|
|
|
(0, _warning2.default)(!(component && children), 'You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored');
|
|
|
|
(0, _warning2.default)(!(render && children), 'You should not use <Route render> and <Route children> in the same route; <Route children> will be ignored');
|
|
};
|
|
|
|
Route.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps, nextContext) {
|
|
(0, _warning2.default)(!(nextProps.location && !this.props.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');
|
|
|
|
(0, _warning2.default)(!(!nextProps.location && this.props.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.');
|
|
|
|
this.setState({
|
|
match: this.computeMatch(nextProps, nextContext.router)
|
|
});
|
|
};
|
|
|
|
Route.prototype.render = function render() {
|
|
var match = this.state.match;
|
|
var _props2 = this.props,
|
|
children = _props2.children,
|
|
component = _props2.component,
|
|
render = _props2.render;
|
|
var _context$router = this.context.router,
|
|
history = _context$router.history,
|
|
route = _context$router.route,
|
|
staticContext = _context$router.staticContext;
|
|
|
|
var location = this.props.location || route.location;
|
|
var props = { match: match, location: location, history: history, staticContext: staticContext };
|
|
|
|
return component ? // component prop gets first priority, only called if there's a match
|
|
match ? _react2.default.createElement(component, props) : null : render ? // render prop is next, only called if there's a match
|
|
match ? render(props) : null : children ? // children come last, always called
|
|
typeof children === 'function' ? children(props) : !Array.isArray(children) || children.length ? // Preact defaults to empty children array
|
|
_react2.default.Children.only(children) : null : null;
|
|
};
|
|
|
|
return Route;
|
|
}(_react2.default.Component);
|
|
|
|
Route.propTypes = {
|
|
computedMatch: _propTypes2.default.object, // private, from <Switch>
|
|
path: _propTypes2.default.string,
|
|
exact: _propTypes2.default.bool,
|
|
strict: _propTypes2.default.bool,
|
|
component: _propTypes2.default.func,
|
|
render: _propTypes2.default.func,
|
|
children: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.node]),
|
|
location: _propTypes2.default.object
|
|
};
|
|
Route.contextTypes = {
|
|
router: _propTypes2.default.shape({
|
|
history: _propTypes2.default.object.isRequired,
|
|
route: _propTypes2.default.object.isRequired,
|
|
staticContext: _propTypes2.default.object
|
|
})
|
|
};
|
|
Route.childContextTypes = {
|
|
router: _propTypes2.default.object.isRequired
|
|
};
|
|
|
|
exports.default = Route;
|
|
|
|
/***/ }),
|
|
/* 101 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(24),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var ReactNoopUpdateQueue = __webpack_require__(104);
|
|
|
|
var canDefineProperty = __webpack_require__(39);
|
|
var emptyObject = __webpack_require__(32);
|
|
var invariant = __webpack_require__(1);
|
|
var lowPriorityWarning = __webpack_require__(63);
|
|
|
|
/**
|
|
* Base class helpers for the updating state of a component.
|
|
*/
|
|
function ReactComponent(props, context, updater) {
|
|
this.props = props;
|
|
this.context = context;
|
|
this.refs = emptyObject;
|
|
// We initialize the default updater but the real one gets injected by the
|
|
// renderer.
|
|
this.updater = updater || ReactNoopUpdateQueue;
|
|
}
|
|
|
|
ReactComponent.prototype.isReactComponent = {};
|
|
|
|
/**
|
|
* Sets a subset of the state. Always use this to mutate
|
|
* state. You should treat `this.state` as immutable.
|
|
*
|
|
* There is no guarantee that `this.state` will be immediately updated, so
|
|
* accessing `this.state` after calling this method may return the old value.
|
|
*
|
|
* There is no guarantee that calls to `setState` will run synchronously,
|
|
* as they may eventually be batched together. You can provide an optional
|
|
* callback that will be executed when the call to setState is actually
|
|
* completed.
|
|
*
|
|
* When a function is provided to setState, it will be called at some point in
|
|
* the future (not synchronously). It will be called with the up to date
|
|
* component arguments (state, props, context). These values can be different
|
|
* from this.* because your function may be called after receiveProps but before
|
|
* shouldComponentUpdate, and this new state, props, and context will not yet be
|
|
* assigned to this.
|
|
*
|
|
* @param {object|function} partialState Next partial state or function to
|
|
* produce next partial state to be merged with current state.
|
|
* @param {?function} callback Called after state is updated.
|
|
* @final
|
|
* @protected
|
|
*/
|
|
ReactComponent.prototype.setState = function (partialState, callback) {
|
|
!((typeof partialState === 'undefined' ? 'undefined' : _typeof(partialState)) === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0;
|
|
this.updater.enqueueSetState(this, partialState);
|
|
if (callback) {
|
|
this.updater.enqueueCallback(this, callback, 'setState');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Forces an update. This should only be invoked when it is known with
|
|
* certainty that we are **not** in a DOM transaction.
|
|
*
|
|
* You may want to call this when you know that some deeper aspect of the
|
|
* component's state has changed but `setState` was not called.
|
|
*
|
|
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
* `componentWillUpdate` and `componentDidUpdate`.
|
|
*
|
|
* @param {?function} callback Called after update is complete.
|
|
* @final
|
|
* @protected
|
|
*/
|
|
ReactComponent.prototype.forceUpdate = function (callback) {
|
|
this.updater.enqueueForceUpdate(this);
|
|
if (callback) {
|
|
this.updater.enqueueCallback(this, callback, 'forceUpdate');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Deprecated APIs. These APIs used to exist on classic React classes but since
|
|
* we would like to deprecate them, we're not going to move them over to this
|
|
* modern base class. Instead, we define a getter that warns if it's accessed.
|
|
*/
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var deprecatedAPIs = {
|
|
isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
|
|
replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']
|
|
};
|
|
var defineDeprecationWarning = function defineDeprecationWarning(methodName, info) {
|
|
if (canDefineProperty) {
|
|
Object.defineProperty(ReactComponent.prototype, methodName, {
|
|
get: function get() {
|
|
lowPriorityWarning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);
|
|
return undefined;
|
|
}
|
|
});
|
|
}
|
|
};
|
|
for (var fnName in deprecatedAPIs) {
|
|
if (deprecatedAPIs.hasOwnProperty(fnName)) {
|
|
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Base class helpers for the updating state of a component.
|
|
*/
|
|
function ReactPureComponent(props, context, updater) {
|
|
// Duplicated from ReactComponent.
|
|
this.props = props;
|
|
this.context = context;
|
|
this.refs = emptyObject;
|
|
// We initialize the default updater but the real one gets injected by the
|
|
// renderer.
|
|
this.updater = updater || ReactNoopUpdateQueue;
|
|
}
|
|
|
|
function ComponentDummy() {}
|
|
ComponentDummy.prototype = ReactComponent.prototype;
|
|
ReactPureComponent.prototype = new ComponentDummy();
|
|
ReactPureComponent.prototype.constructor = ReactPureComponent;
|
|
// Avoid an extra prototype jump for these methods.
|
|
_assign(ReactPureComponent.prototype, ReactComponent.prototype);
|
|
ReactPureComponent.prototype.isPureReactComponent = true;
|
|
|
|
module.exports = {
|
|
Component: ReactComponent,
|
|
PureComponent: ReactPureComponent
|
|
};
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 102 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
// The Symbol used to tag the ReactElement type. If there is no native Symbol
|
|
// nor polyfill, then a plain number is used for performance.
|
|
|
|
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
|
|
|
|
module.exports = REACT_ELEMENT_TYPE;
|
|
|
|
/***/ }),
|
|
/* 103 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* ReactElementValidator provides a wrapper around a element factory
|
|
* which validates the props passed to the element. This is intended to be
|
|
* used only in DEV and could be replaced by a static type checker for languages
|
|
* that support it.
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactComponentTreeHook = __webpack_require__(9);
|
|
var ReactElement = __webpack_require__(19);
|
|
|
|
var checkReactTypeSpec = __webpack_require__(253);
|
|
|
|
var canDefineProperty = __webpack_require__(39);
|
|
var getIteratorFn = __webpack_require__(105);
|
|
var warning = __webpack_require__(2);
|
|
var lowPriorityWarning = __webpack_require__(63);
|
|
|
|
function getDeclarationErrorAddendum() {
|
|
if (ReactCurrentOwner.current) {
|
|
var name = ReactCurrentOwner.current.getName();
|
|
if (name) {
|
|
return ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function getSourceInfoErrorAddendum(elementProps) {
|
|
if (elementProps !== null && elementProps !== undefined && elementProps.__source !== undefined) {
|
|
var source = elementProps.__source;
|
|
var fileName = source.fileName.replace(/^.*[\\\/]/, '');
|
|
var lineNumber = source.lineNumber;
|
|
return ' Check your code at ' + fileName + ':' + lineNumber + '.';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Warn if there's no key explicitly set on dynamic arrays of children or
|
|
* object keys are not valid. This allows us to keep track of children between
|
|
* updates.
|
|
*/
|
|
var ownerHasKeyUseWarning = {};
|
|
|
|
function getCurrentComponentErrorInfo(parentType) {
|
|
var info = getDeclarationErrorAddendum();
|
|
|
|
if (!info) {
|
|
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
|
if (parentName) {
|
|
info = ' Check the top-level render call using <' + parentName + '>.';
|
|
}
|
|
}
|
|
return info;
|
|
}
|
|
|
|
/**
|
|
* Warn if the element doesn't have an explicit key assigned to it.
|
|
* This element is in an array. The array could grow and shrink or be
|
|
* reordered. All children that haven't already been validated are required to
|
|
* have a "key" property assigned to it. Error statuses are cached so a warning
|
|
* will only be shown once.
|
|
*
|
|
* @internal
|
|
* @param {ReactElement} element Element that requires a key.
|
|
* @param {*} parentType element's parent's type.
|
|
*/
|
|
function validateExplicitKey(element, parentType) {
|
|
if (!element._store || element._store.validated || element.key != null) {
|
|
return;
|
|
}
|
|
element._store.validated = true;
|
|
|
|
var memoizer = ownerHasKeyUseWarning.uniqueKey || (ownerHasKeyUseWarning.uniqueKey = {});
|
|
|
|
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
|
|
if (memoizer[currentComponentErrorInfo]) {
|
|
return;
|
|
}
|
|
memoizer[currentComponentErrorInfo] = true;
|
|
|
|
// Usually the current owner is the offender, but if it accepts children as a
|
|
// property, it may be the creator of the child that's responsible for
|
|
// assigning it a key.
|
|
var childOwner = '';
|
|
if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
|
|
// Give the component that originally created this child.
|
|
childOwner = ' It was passed a child from ' + element._owner.getName() + '.';
|
|
}
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, ReactComponentTreeHook.getCurrentStackAddendum(element)) : void 0;
|
|
}
|
|
|
|
/**
|
|
* Ensure that every element either is passed in a static location, in an
|
|
* array with an explicit keys property defined, or in an object literal
|
|
* with valid key property.
|
|
*
|
|
* @internal
|
|
* @param {ReactNode} node Statically passed child of any type.
|
|
* @param {*} parentType node's parent's type.
|
|
*/
|
|
function validateChildKeys(node, parentType) {
|
|
if ((typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') {
|
|
return;
|
|
}
|
|
if (Array.isArray(node)) {
|
|
for (var i = 0; i < node.length; i++) {
|
|
var child = node[i];
|
|
if (ReactElement.isValidElement(child)) {
|
|
validateExplicitKey(child, parentType);
|
|
}
|
|
}
|
|
} else if (ReactElement.isValidElement(node)) {
|
|
// This element was passed in a valid location.
|
|
if (node._store) {
|
|
node._store.validated = true;
|
|
}
|
|
} else if (node) {
|
|
var iteratorFn = getIteratorFn(node);
|
|
// Entry iterators provide implicit keys.
|
|
if (iteratorFn) {
|
|
if (iteratorFn !== node.entries) {
|
|
var iterator = iteratorFn.call(node);
|
|
var step;
|
|
while (!(step = iterator.next()).done) {
|
|
if (ReactElement.isValidElement(step.value)) {
|
|
validateExplicitKey(step.value, parentType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Given an element, validate that its props follow the propTypes definition,
|
|
* provided by the type.
|
|
*
|
|
* @param {ReactElement} element
|
|
*/
|
|
function validatePropTypes(element) {
|
|
var componentClass = element.type;
|
|
if (typeof componentClass !== 'function') {
|
|
return;
|
|
}
|
|
var name = componentClass.displayName || componentClass.name;
|
|
if (componentClass.propTypes) {
|
|
checkReactTypeSpec(componentClass.propTypes, element.props, 'prop', name, element, null);
|
|
}
|
|
if (typeof componentClass.getDefaultProps === 'function') {
|
|
process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0;
|
|
}
|
|
}
|
|
|
|
var ReactElementValidator = {
|
|
createElement: function createElement(type, props, children) {
|
|
var validType = typeof type === 'string' || typeof type === 'function';
|
|
// We warn in this case but don't throw. We expect the element creation to
|
|
// succeed and there will likely be errors in render.
|
|
if (!validType) {
|
|
if (typeof type !== 'function' && typeof type !== 'string') {
|
|
var info = '';
|
|
if (type === undefined || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && type !== null && Object.keys(type).length === 0) {
|
|
info += ' You likely forgot to export your component from the file ' + "it's defined in.";
|
|
}
|
|
|
|
var sourceInfo = getSourceInfoErrorAddendum(props);
|
|
if (sourceInfo) {
|
|
info += sourceInfo;
|
|
} else {
|
|
info += getDeclarationErrorAddendum();
|
|
}
|
|
|
|
info += ReactComponentTreeHook.getCurrentStackAddendum();
|
|
|
|
var currentSource = props !== null && props !== undefined && props.__source !== undefined ? props.__source : null;
|
|
ReactComponentTreeHook.pushNonStandardWarningStack(true, currentSource);
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', type == null ? type : typeof type === 'undefined' ? 'undefined' : _typeof(type), info) : void 0;
|
|
ReactComponentTreeHook.popNonStandardWarningStack();
|
|
}
|
|
}
|
|
|
|
var element = ReactElement.createElement.apply(this, arguments);
|
|
|
|
// The result can be nullish if a mock or a custom function is used.
|
|
// TODO: Drop this when these are no longer allowed as the type argument.
|
|
if (element == null) {
|
|
return element;
|
|
}
|
|
|
|
// Skip key warning if the type isn't valid since our key validation logic
|
|
// doesn't expect a non-string/function type and can throw confusing errors.
|
|
// We don't want exception behavior to differ between dev and prod.
|
|
// (Rendering will throw with a helpful message and as soon as the type is
|
|
// fixed, the key warnings will appear.)
|
|
if (validType) {
|
|
for (var i = 2; i < arguments.length; i++) {
|
|
validateChildKeys(arguments[i], type);
|
|
}
|
|
}
|
|
|
|
validatePropTypes(element);
|
|
|
|
return element;
|
|
},
|
|
|
|
createFactory: function createFactory(type) {
|
|
var validatedFactory = ReactElementValidator.createElement.bind(null, type);
|
|
// Legacy hook TODO: Warn if this is accessed
|
|
validatedFactory.type = type;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (canDefineProperty) {
|
|
Object.defineProperty(validatedFactory, 'type', {
|
|
enumerable: false,
|
|
get: function get() {
|
|
lowPriorityWarning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');
|
|
Object.defineProperty(this, 'type', {
|
|
value: type
|
|
});
|
|
return type;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
return validatedFactory;
|
|
},
|
|
|
|
cloneElement: function cloneElement(element, props, children) {
|
|
var newElement = ReactElement.cloneElement.apply(this, arguments);
|
|
for (var i = 2; i < arguments.length; i++) {
|
|
validateChildKeys(arguments[i], newElement.type);
|
|
}
|
|
validatePropTypes(newElement);
|
|
return newElement;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactElementValidator;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 104 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
function warnNoop(publicInstance, callerName) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var constructor = publicInstance.constructor;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This is the abstract API for an update queue.
|
|
*/
|
|
var ReactNoopUpdateQueue = {
|
|
/**
|
|
* Checks whether or not this composite component is mounted.
|
|
* @param {ReactClass} publicInstance The instance we want to test.
|
|
* @return {boolean} True if mounted, false otherwise.
|
|
* @protected
|
|
* @final
|
|
*/
|
|
isMounted: function isMounted(publicInstance) {
|
|
return false;
|
|
},
|
|
|
|
/**
|
|
* Enqueue a callback that will be executed after all the pending updates
|
|
* have processed.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance to use as `this` context.
|
|
* @param {?function} callback Called after state is updated.
|
|
* @internal
|
|
*/
|
|
enqueueCallback: function enqueueCallback(publicInstance, callback) {},
|
|
|
|
/**
|
|
* Forces an update. This should only be invoked when it is known with
|
|
* certainty that we are **not** in a DOM transaction.
|
|
*
|
|
* You may want to call this when you know that some deeper aspect of the
|
|
* component's state has changed but `setState` was not called.
|
|
*
|
|
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
* `componentWillUpdate` and `componentDidUpdate`.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @internal
|
|
*/
|
|
enqueueForceUpdate: function enqueueForceUpdate(publicInstance) {
|
|
warnNoop(publicInstance, 'forceUpdate');
|
|
},
|
|
|
|
/**
|
|
* Replaces all of the state. Always use this or `setState` to mutate state.
|
|
* You should treat `this.state` as immutable.
|
|
*
|
|
* There is no guarantee that `this.state` will be immediately updated, so
|
|
* accessing `this.state` after calling this method may return the old value.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object} completeState Next state.
|
|
* @internal
|
|
*/
|
|
enqueueReplaceState: function enqueueReplaceState(publicInstance, completeState) {
|
|
warnNoop(publicInstance, 'replaceState');
|
|
},
|
|
|
|
/**
|
|
* Sets a subset of the state. This only exists because _pendingState is
|
|
* internal. This provides a merging strategy that is not available to deep
|
|
* properties which is confusing. TODO: Expose pendingState or don't use it
|
|
* during the merge.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object} partialState Next partial state to be merged with state.
|
|
* @internal
|
|
*/
|
|
enqueueSetState: function enqueueSetState(publicInstance, partialState) {
|
|
warnNoop(publicInstance, 'setState');
|
|
}
|
|
};
|
|
|
|
module.exports = ReactNoopUpdateQueue;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 105 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/* global Symbol */
|
|
|
|
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
|
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
|
|
|
/**
|
|
* Returns the iterator method function contained on the iterable object.
|
|
*
|
|
* Be sure to invoke the function with the iterable as context:
|
|
*
|
|
* var iteratorFn = getIteratorFn(myIterable);
|
|
* if (iteratorFn) {
|
|
* var iterator = iteratorFn.call(myIterable);
|
|
* ...
|
|
* }
|
|
*
|
|
* @param {?object} maybeIterable
|
|
* @return {?function}
|
|
*/
|
|
function getIteratorFn(maybeIterable) {
|
|
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
|
if (typeof iteratorFn === 'function') {
|
|
return iteratorFn;
|
|
}
|
|
}
|
|
|
|
module.exports = getIteratorFn;
|
|
|
|
/***/ }),
|
|
/* 106 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = compose;
|
|
/**
|
|
* Composes single-argument functions from right to left. The rightmost
|
|
* function can take multiple arguments as it provides the signature for
|
|
* the resulting composite function.
|
|
*
|
|
* @param {...Function} funcs The functions to compose.
|
|
* @returns {Function} A function obtained by composing the argument functions
|
|
* from right to left. For example, compose(f, g, h) is identical to doing
|
|
* (...args) => f(g(h(...args))).
|
|
*/
|
|
|
|
function compose() {
|
|
for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
|
|
funcs[_key] = arguments[_key];
|
|
}
|
|
|
|
if (funcs.length === 0) {
|
|
return function (arg) {
|
|
return arg;
|
|
};
|
|
}
|
|
|
|
if (funcs.length === 1) {
|
|
return funcs[0];
|
|
}
|
|
|
|
var last = funcs[funcs.length - 1];
|
|
var rest = funcs.slice(0, -1);
|
|
return function () {
|
|
return rest.reduceRight(function (composed, f) {
|
|
return f(composed);
|
|
}, last.apply(undefined, arguments));
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
/* 107 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ActionTypes = undefined;
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.default = createStore;
|
|
|
|
var _isPlainObject = __webpack_require__(43);
|
|
|
|
var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
|
|
|
|
var _symbolObservable = __webpack_require__(262);
|
|
|
|
var _symbolObservable2 = _interopRequireDefault(_symbolObservable);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/**
|
|
* These are private action types reserved by Redux.
|
|
* For any unknown actions, you must return the current state.
|
|
* If the current state is undefined, you must return the initial state.
|
|
* Do not reference these action types directly in your code.
|
|
*/
|
|
var ActionTypes = exports.ActionTypes = {
|
|
INIT: '@@redux/INIT'
|
|
};
|
|
|
|
/**
|
|
* Creates a Redux store that holds the state tree.
|
|
* The only way to change the data in the store is to call `dispatch()` on it.
|
|
*
|
|
* There should only be a single store in your app. To specify how different
|
|
* parts of the state tree respond to actions, you may combine several reducers
|
|
* into a single reducer function by using `combineReducers`.
|
|
*
|
|
* @param {Function} reducer A function that returns the next state tree, given
|
|
* the current state tree and the action to handle.
|
|
*
|
|
* @param {any} [preloadedState] The initial state. You may optionally specify it
|
|
* to hydrate the state from the server in universal apps, or to restore a
|
|
* previously serialized user session.
|
|
* If you use `combineReducers` to produce the root reducer function, this must be
|
|
* an object with the same shape as `combineReducers` keys.
|
|
*
|
|
* @param {Function} enhancer The store enhancer. You may optionally specify it
|
|
* to enhance the store with third-party capabilities such as middleware,
|
|
* time travel, persistence, etc. The only store enhancer that ships with Redux
|
|
* is `applyMiddleware()`.
|
|
*
|
|
* @returns {Store} A Redux store that lets you read the state, dispatch actions
|
|
* and subscribe to changes.
|
|
*/
|
|
function createStore(reducer, preloadedState, enhancer) {
|
|
var _ref2;
|
|
|
|
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
|
|
enhancer = preloadedState;
|
|
preloadedState = undefined;
|
|
}
|
|
|
|
if (typeof enhancer !== 'undefined') {
|
|
if (typeof enhancer !== 'function') {
|
|
throw new Error('Expected the enhancer to be a function.');
|
|
}
|
|
|
|
return enhancer(createStore)(reducer, preloadedState);
|
|
}
|
|
|
|
if (typeof reducer !== 'function') {
|
|
throw new Error('Expected the reducer to be a function.');
|
|
}
|
|
|
|
var currentReducer = reducer;
|
|
var currentState = preloadedState;
|
|
var currentListeners = [];
|
|
var nextListeners = currentListeners;
|
|
var isDispatching = false;
|
|
|
|
function ensureCanMutateNextListeners() {
|
|
if (nextListeners === currentListeners) {
|
|
nextListeners = currentListeners.slice();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reads the state tree managed by the store.
|
|
*
|
|
* @returns {any} The current state tree of your application.
|
|
*/
|
|
function getState() {
|
|
return currentState;
|
|
}
|
|
|
|
/**
|
|
* Adds a change listener. It will be called any time an action is dispatched,
|
|
* and some part of the state tree may potentially have changed. You may then
|
|
* call `getState()` to read the current state tree inside the callback.
|
|
*
|
|
* You may call `dispatch()` from a change listener, with the following
|
|
* caveats:
|
|
*
|
|
* 1. The subscriptions are snapshotted just before every `dispatch()` call.
|
|
* If you subscribe or unsubscribe while the listeners are being invoked, this
|
|
* will not have any effect on the `dispatch()` that is currently in progress.
|
|
* However, the next `dispatch()` call, whether nested or not, will use a more
|
|
* recent snapshot of the subscription list.
|
|
*
|
|
* 2. The listener should not expect to see all state changes, as the state
|
|
* might have been updated multiple times during a nested `dispatch()` before
|
|
* the listener is called. It is, however, guaranteed that all subscribers
|
|
* registered before the `dispatch()` started will be called with the latest
|
|
* state by the time it exits.
|
|
*
|
|
* @param {Function} listener A callback to be invoked on every dispatch.
|
|
* @returns {Function} A function to remove this change listener.
|
|
*/
|
|
function subscribe(listener) {
|
|
if (typeof listener !== 'function') {
|
|
throw new Error('Expected listener to be a function.');
|
|
}
|
|
|
|
var isSubscribed = true;
|
|
|
|
ensureCanMutateNextListeners();
|
|
nextListeners.push(listener);
|
|
|
|
return function unsubscribe() {
|
|
if (!isSubscribed) {
|
|
return;
|
|
}
|
|
|
|
isSubscribed = false;
|
|
|
|
ensureCanMutateNextListeners();
|
|
var index = nextListeners.indexOf(listener);
|
|
nextListeners.splice(index, 1);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Dispatches an action. It is the only way to trigger a state change.
|
|
*
|
|
* The `reducer` function, used to create the store, will be called with the
|
|
* current state tree and the given `action`. Its return value will
|
|
* be considered the **next** state of the tree, and the change listeners
|
|
* will be notified.
|
|
*
|
|
* The base implementation only supports plain object actions. If you want to
|
|
* dispatch a Promise, an Observable, a thunk, or something else, you need to
|
|
* wrap your store creating function into the corresponding middleware. For
|
|
* example, see the documentation for the `redux-thunk` package. Even the
|
|
* middleware will eventually dispatch plain object actions using this method.
|
|
*
|
|
* @param {Object} action A plain object representing “what changed”. It is
|
|
* a good idea to keep actions serializable so you can record and replay user
|
|
* sessions, or use the time travelling `redux-devtools`. An action must have
|
|
* a `type` property which may not be `undefined`. It is a good idea to use
|
|
* string constants for action types.
|
|
*
|
|
* @returns {Object} For convenience, the same action object you dispatched.
|
|
*
|
|
* Note that, if you use a custom middleware, it may wrap `dispatch()` to
|
|
* return something else (for example, a Promise you can await).
|
|
*/
|
|
function dispatch(action) {
|
|
if (!(0, _isPlainObject2.default)(action)) {
|
|
throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
|
|
}
|
|
|
|
if (typeof action.type === 'undefined') {
|
|
throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
|
|
}
|
|
|
|
if (isDispatching) {
|
|
throw new Error('Reducers may not dispatch actions.');
|
|
}
|
|
|
|
try {
|
|
isDispatching = true;
|
|
currentState = currentReducer(currentState, action);
|
|
} finally {
|
|
isDispatching = false;
|
|
}
|
|
|
|
var listeners = currentListeners = nextListeners;
|
|
for (var i = 0; i < listeners.length; i++) {
|
|
listeners[i]();
|
|
}
|
|
|
|
return action;
|
|
}
|
|
|
|
/**
|
|
* Replaces the reducer currently used by the store to calculate the state.
|
|
*
|
|
* You might need this if your app implements code splitting and you want to
|
|
* load some of the reducers dynamically. You might also need this if you
|
|
* implement a hot reloading mechanism for Redux.
|
|
*
|
|
* @param {Function} nextReducer The reducer for the store to use instead.
|
|
* @returns {void}
|
|
*/
|
|
function replaceReducer(nextReducer) {
|
|
if (typeof nextReducer !== 'function') {
|
|
throw new Error('Expected the nextReducer to be a function.');
|
|
}
|
|
|
|
currentReducer = nextReducer;
|
|
dispatch({ type: ActionTypes.INIT });
|
|
}
|
|
|
|
/**
|
|
* Interoperability point for observable/reactive libraries.
|
|
* @returns {observable} A minimal observable of state changes.
|
|
* For more information, see the observable proposal:
|
|
* https://github.com/zenparsing/es-observable
|
|
*/
|
|
function observable() {
|
|
var _ref;
|
|
|
|
var outerSubscribe = subscribe;
|
|
return _ref = {
|
|
/**
|
|
* The minimal observable subscription method.
|
|
* @param {Object} observer Any object that can be used as an observer.
|
|
* The observer object should have a `next` method.
|
|
* @returns {subscription} An object with an `unsubscribe` method that can
|
|
* be used to unsubscribe the observable from the store, and prevent further
|
|
* emission of values from the observable.
|
|
*/
|
|
subscribe: function subscribe(observer) {
|
|
if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object') {
|
|
throw new TypeError('Expected the observer to be an object.');
|
|
}
|
|
|
|
function observeState() {
|
|
if (observer.next) {
|
|
observer.next(getState());
|
|
}
|
|
}
|
|
|
|
observeState();
|
|
var unsubscribe = outerSubscribe(observeState);
|
|
return { unsubscribe: unsubscribe };
|
|
}
|
|
}, _ref[_symbolObservable2.default] = function () {
|
|
return this;
|
|
}, _ref;
|
|
}
|
|
|
|
// When a store is created, an "INIT" action is dispatched so that every
|
|
// reducer returns their initial state. This effectively populates
|
|
// the initial state tree.
|
|
dispatch({ type: ActionTypes.INIT });
|
|
|
|
return _ref2 = {
|
|
dispatch: dispatch,
|
|
subscribe: subscribe,
|
|
getState: getState,
|
|
replaceReducer: replaceReducer
|
|
}, _ref2[_symbolObservable2.default] = observable, _ref2;
|
|
}
|
|
|
|
/***/ }),
|
|
/* 108 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = warning;
|
|
/**
|
|
* Prints a warning in the console if it exists.
|
|
*
|
|
* @param {String} message The warning message.
|
|
* @returns {void}
|
|
*/
|
|
function warning(message) {
|
|
/* eslint-disable no-console */
|
|
if (typeof console !== 'undefined' && typeof console.error === 'function') {
|
|
console.error(message);
|
|
}
|
|
/* eslint-enable no-console */
|
|
try {
|
|
// This error was thrown as a convenience so that if you enable
|
|
// "break on all exceptions" in your console,
|
|
// it would pause the execution at this line.
|
|
throw new Error(message);
|
|
/* eslint-disable no-empty */
|
|
} catch (e) {}
|
|
/* eslint-enable no-empty */
|
|
}
|
|
|
|
/***/ }),
|
|
/* 109 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var g;
|
|
|
|
// This works in non-strict mode
|
|
g = function () {
|
|
return this;
|
|
}();
|
|
|
|
try {
|
|
// This works if eval is allowed (see CSP)
|
|
g = g || Function("return this")() || (1, eval)("this");
|
|
} catch (e) {
|
|
// This works if the window reference is available
|
|
if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;
|
|
}
|
|
|
|
// g can still be undefined, but nothing to do about it...
|
|
// We return undefined, instead of nothing here, so it's
|
|
// easier to handle this case. if(!global) { ...}
|
|
|
|
module.exports = g;
|
|
|
|
/***/ }),
|
|
/* 110 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = BottomNav;
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var footerItems = ["Files", "Photos", "Shared", "Music", "Menu"];
|
|
var iconMap = {
|
|
files: 'fa-folder',
|
|
photos: 'fa-picture-o',
|
|
shared: 'fa-users',
|
|
music: 'fa-music',
|
|
menu: 'fa-bars'
|
|
};
|
|
|
|
function BottomNav(_ref) {
|
|
var location = _ref.location;
|
|
|
|
|
|
var footerElements = footerItems.map(function (item, index) {
|
|
return _react2.default.createElement(
|
|
"li",
|
|
{
|
|
className: "footer-item " + (location === item.toLowerCase() && "footer-li-active"),
|
|
key: index
|
|
},
|
|
_react2.default.createElement(
|
|
"a",
|
|
{ href: "/#/" + item.toLowerCase() },
|
|
_react2.default.createElement(
|
|
"div",
|
|
{ className: "test-div " + (index === 2 && "middle-button") },
|
|
_react2.default.createElement("i", { className: "fa " + iconMap[item.toLowerCase()] + " fa-2x footer-fa", "aria-hidden": "true" }),
|
|
_react2.default.createElement(
|
|
"span",
|
|
null,
|
|
index < 4 ? item : ""
|
|
)
|
|
)
|
|
)
|
|
);
|
|
});
|
|
|
|
return _react2.default.createElement(
|
|
"div",
|
|
{ className: "footer" },
|
|
_react2.default.createElement(
|
|
"ul",
|
|
{ className: "footermenu" },
|
|
footerElements
|
|
)
|
|
);
|
|
}
|
|
|
|
/***/ }),
|
|
/* 111 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = getPath;
|
|
function traverse(origin, proplist) {
|
|
if (proplist.length) {
|
|
var prop = proplist.shift();
|
|
return traverse(origin.contents.find(function (item) {
|
|
return item.title === prop;
|
|
}), proplist);
|
|
} else {
|
|
return origin;
|
|
}
|
|
}
|
|
|
|
function getPath(state) {
|
|
return (state.currentPath ? traverse(state.filesystem, state.currentPath.split('/').slice(1)) : state.filesystem).contents;
|
|
}
|
|
|
|
/***/ }),
|
|
/* 112 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = __webpack_require__(158);
|
|
|
|
/***/ }),
|
|
/* 113 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.withRouter = exports.matchPath = exports.Switch = exports.StaticRouter = exports.Router = exports.Route = exports.Redirect = exports.Prompt = exports.NavLink = exports.MemoryRouter = exports.Link = exports.HashRouter = exports.BrowserRouter = undefined;
|
|
|
|
var _BrowserRouter2 = __webpack_require__(225);
|
|
|
|
var _BrowserRouter3 = _interopRequireDefault(_BrowserRouter2);
|
|
|
|
var _HashRouter2 = __webpack_require__(226);
|
|
|
|
var _HashRouter3 = _interopRequireDefault(_HashRouter2);
|
|
|
|
var _Link2 = __webpack_require__(99);
|
|
|
|
var _Link3 = _interopRequireDefault(_Link2);
|
|
|
|
var _MemoryRouter2 = __webpack_require__(227);
|
|
|
|
var _MemoryRouter3 = _interopRequireDefault(_MemoryRouter2);
|
|
|
|
var _NavLink2 = __webpack_require__(228);
|
|
|
|
var _NavLink3 = _interopRequireDefault(_NavLink2);
|
|
|
|
var _Prompt2 = __webpack_require__(229);
|
|
|
|
var _Prompt3 = _interopRequireDefault(_Prompt2);
|
|
|
|
var _Redirect2 = __webpack_require__(230);
|
|
|
|
var _Redirect3 = _interopRequireDefault(_Redirect2);
|
|
|
|
var _Route2 = __webpack_require__(231);
|
|
|
|
var _Route3 = _interopRequireDefault(_Route2);
|
|
|
|
var _Router2 = __webpack_require__(232);
|
|
|
|
var _Router3 = _interopRequireDefault(_Router2);
|
|
|
|
var _StaticRouter2 = __webpack_require__(233);
|
|
|
|
var _StaticRouter3 = _interopRequireDefault(_StaticRouter2);
|
|
|
|
var _Switch2 = __webpack_require__(234);
|
|
|
|
var _Switch3 = _interopRequireDefault(_Switch2);
|
|
|
|
var _matchPath2 = __webpack_require__(235);
|
|
|
|
var _matchPath3 = _interopRequireDefault(_matchPath2);
|
|
|
|
var _withRouter2 = __webpack_require__(236);
|
|
|
|
var _withRouter3 = _interopRequireDefault(_withRouter2);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
exports.BrowserRouter = _BrowserRouter3.default;
|
|
exports.HashRouter = _HashRouter3.default;
|
|
exports.Link = _Link3.default;
|
|
exports.MemoryRouter = _MemoryRouter3.default;
|
|
exports.NavLink = _NavLink3.default;
|
|
exports.Prompt = _Prompt3.default;
|
|
exports.Redirect = _Redirect3.default;
|
|
exports.Route = _Route3.default;
|
|
exports.Router = _Router3.default;
|
|
exports.StaticRouter = _StaticRouter3.default;
|
|
exports.Switch = _Switch3.default;
|
|
exports.matchPath = _matchPath3.default;
|
|
exports.withRouter = _withRouter3.default;
|
|
|
|
/***/ }),
|
|
/* 114 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _topNav = __webpack_require__(275);
|
|
|
|
var _topNav2 = _interopRequireDefault(_topNav);
|
|
|
|
var _bottomNav = __webpack_require__(110);
|
|
|
|
var _bottomNav2 = _interopRequireDefault(_bottomNav);
|
|
|
|
var _breadcrumbs = __webpack_require__(273);
|
|
|
|
var _breadcrumbs2 = _interopRequireDefault(_breadcrumbs);
|
|
|
|
var _displayMenu = __webpack_require__(274);
|
|
|
|
var _displayMenu2 = _interopRequireDefault(_displayMenu);
|
|
|
|
var _folderList = __webpack_require__(268);
|
|
|
|
var _folderList2 = _interopRequireDefault(_folderList);
|
|
|
|
var _fileList = __webpack_require__(267);
|
|
|
|
var _fileList2 = _interopRequireDefault(_fileList);
|
|
|
|
var _photoList = __webpack_require__(271);
|
|
|
|
var _photoList2 = _interopRequireDefault(_photoList);
|
|
|
|
var _sharedList = __webpack_require__(272);
|
|
|
|
var _sharedList2 = _interopRequireDefault(_sharedList);
|
|
|
|
var _musicList = __webpack_require__(270);
|
|
|
|
var _musicList2 = _interopRequireDefault(_musicList);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var itemLists = {
|
|
files: _fileList2.default,
|
|
photos: _photoList2.default,
|
|
shared: _sharedList2.default,
|
|
music: _musicList2.default
|
|
};
|
|
|
|
var Main = function Main(_ref) {
|
|
var location = _ref.location;
|
|
|
|
var currentList = location.pathname.split('/')[1] || 'files';
|
|
return _react2.default.createElement(
|
|
'div',
|
|
null,
|
|
_react2.default.createElement(_topNav2.default, null),
|
|
_react2.default.createElement('div', { className: 'spacer' }),
|
|
_react2.default.createElement(_breadcrumbs2.default, null),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'results' },
|
|
_react2.default.createElement(_displayMenu2.default, null),
|
|
_react2.default.createElement(_folderList2.default, null),
|
|
_react2.default.createElement(itemLists[currentList]),
|
|
_react2.default.createElement(_bottomNav2.default, { location: currentList })
|
|
)
|
|
);
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(function () {
|
|
return {};
|
|
}, function () {
|
|
return {};
|
|
})(Main);
|
|
|
|
/***/ }),
|
|
/* 115 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = Menu;
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _bottomNav = __webpack_require__(110);
|
|
|
|
var _bottomNav2 = _interopRequireDefault(_bottomNav);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function Menu(_ref) {
|
|
var location = _ref.location;
|
|
|
|
var currentList = location.pathname.split('/')[1] || 'files';
|
|
return _react2.default.createElement(
|
|
'div',
|
|
null,
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-header' },
|
|
_react2.default.createElement('img', { className: 'menu-header-logo', src: './logos/daplie-logo-gray.svg' })
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-container' },
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/folder.svg' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Files'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/profile.png' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Profile'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/network.png' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Network'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/storage-usage.png' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Storage Usage'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/notifications.png' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Notifications'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'menu-item' },
|
|
_react2.default.createElement('img', { className: 'menu-img-placeholder', src: './icons/settings.png' }),
|
|
_react2.default.createElement(
|
|
'h3',
|
|
null,
|
|
'Settings'
|
|
)
|
|
)
|
|
),
|
|
_react2.default.createElement(_bottomNav2.default, { location: currentList })
|
|
);
|
|
}
|
|
|
|
/***/ }),
|
|
/* 116 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = reduce;
|
|
|
|
var _state = __webpack_require__(277);
|
|
|
|
var _state2 = _interopRequireDefault(_state);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function reduce(state, action) {
|
|
'use strict';
|
|
|
|
if (!state) {
|
|
return _state2.default;
|
|
}
|
|
|
|
return {
|
|
selectMode: toggleSelection(state.selectionMode, action),
|
|
currentPath: navigateTo(state.currentPath, action),
|
|
filesystem: state.filesystem
|
|
};
|
|
}
|
|
|
|
function toggleSelection(state, action) {
|
|
switch (action.type) {
|
|
case 'start-selection':
|
|
return true;
|
|
case 'cancel-selection':
|
|
return false;
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
function navigateTo(state, action) {
|
|
return action.type === 'navigate-to' ? action.payload.path : state;
|
|
}
|
|
|
|
/***/ }),
|
|
/* 117 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var emptyObject = __webpack_require__(32);
|
|
var _invariant = __webpack_require__(1);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var warning = __webpack_require__(2);
|
|
}
|
|
|
|
var MIXINS_KEY = 'mixins';
|
|
|
|
// Helper function to allow the creation of anonymous functions which do not
|
|
// have .name set to the name of the variable being assigned to.
|
|
function identity(fn) {
|
|
return fn;
|
|
}
|
|
|
|
var ReactPropTypeLocationNames;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactPropTypeLocationNames = {
|
|
prop: 'prop',
|
|
context: 'context',
|
|
childContext: 'child context'
|
|
};
|
|
} else {
|
|
ReactPropTypeLocationNames = {};
|
|
}
|
|
|
|
function factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {
|
|
/**
|
|
* Policies that describe methods in `ReactClassInterface`.
|
|
*/
|
|
|
|
var injectedMixins = [];
|
|
|
|
/**
|
|
* Composite components are higher-level components that compose other composite
|
|
* or host components.
|
|
*
|
|
* To create a new type of `ReactClass`, pass a specification of
|
|
* your new class to `React.createClass`. The only requirement of your class
|
|
* specification is that you implement a `render` method.
|
|
*
|
|
* var MyComponent = React.createClass({
|
|
* render: function() {
|
|
* return <div>Hello World</div>;
|
|
* }
|
|
* });
|
|
*
|
|
* The class specification supports a specific protocol of methods that have
|
|
* special meaning (e.g. `render`). See `ReactClassInterface` for
|
|
* more the comprehensive protocol. Any other properties and methods in the
|
|
* class specification will be available on the prototype.
|
|
*
|
|
* @interface ReactClassInterface
|
|
* @internal
|
|
*/
|
|
var ReactClassInterface = {
|
|
/**
|
|
* An array of Mixin objects to include when defining your component.
|
|
*
|
|
* @type {array}
|
|
* @optional
|
|
*/
|
|
mixins: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* An object containing properties and methods that should be defined on
|
|
* the component's constructor instead of its prototype (static methods).
|
|
*
|
|
* @type {object}
|
|
* @optional
|
|
*/
|
|
statics: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Definition of prop types for this component.
|
|
*
|
|
* @type {object}
|
|
* @optional
|
|
*/
|
|
propTypes: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Definition of context types for this component.
|
|
*
|
|
* @type {object}
|
|
* @optional
|
|
*/
|
|
contextTypes: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Definition of context types this component sets for its children.
|
|
*
|
|
* @type {object}
|
|
* @optional
|
|
*/
|
|
childContextTypes: 'DEFINE_MANY',
|
|
|
|
// ==== Definition methods ====
|
|
|
|
/**
|
|
* Invoked when the component is mounted. Values in the mapping will be set on
|
|
* `this.props` if that prop is not specified (i.e. using an `in` check).
|
|
*
|
|
* This method is invoked before `getInitialState` and therefore cannot rely
|
|
* on `this.state` or use `this.setState`.
|
|
*
|
|
* @return {object}
|
|
* @optional
|
|
*/
|
|
getDefaultProps: 'DEFINE_MANY_MERGED',
|
|
|
|
/**
|
|
* Invoked once before the component is mounted. The return value will be used
|
|
* as the initial value of `this.state`.
|
|
*
|
|
* getInitialState: function() {
|
|
* return {
|
|
* isOn: false,
|
|
* fooBaz: new BazFoo()
|
|
* }
|
|
* }
|
|
*
|
|
* @return {object}
|
|
* @optional
|
|
*/
|
|
getInitialState: 'DEFINE_MANY_MERGED',
|
|
|
|
/**
|
|
* @return {object}
|
|
* @optional
|
|
*/
|
|
getChildContext: 'DEFINE_MANY_MERGED',
|
|
|
|
/**
|
|
* Uses props from `this.props` and state from `this.state` to render the
|
|
* structure of the component.
|
|
*
|
|
* No guarantees are made about when or how often this method is invoked, so
|
|
* it must not have side effects.
|
|
*
|
|
* render: function() {
|
|
* var name = this.props.name;
|
|
* return <div>Hello, {name}!</div>;
|
|
* }
|
|
*
|
|
* @return {ReactComponent}
|
|
* @required
|
|
*/
|
|
render: 'DEFINE_ONCE',
|
|
|
|
// ==== Delegate methods ====
|
|
|
|
/**
|
|
* Invoked when the component is initially created and about to be mounted.
|
|
* This may have side effects, but any external subscriptions or data created
|
|
* by this method must be cleaned up in `componentWillUnmount`.
|
|
*
|
|
* @optional
|
|
*/
|
|
componentWillMount: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Invoked when the component has been mounted and has a DOM representation.
|
|
* However, there is no guarantee that the DOM node is in the document.
|
|
*
|
|
* Use this as an opportunity to operate on the DOM when the component has
|
|
* been mounted (initialized and rendered) for the first time.
|
|
*
|
|
* @param {DOMElement} rootNode DOM element representing the component.
|
|
* @optional
|
|
*/
|
|
componentDidMount: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Invoked before the component receives new props.
|
|
*
|
|
* Use this as an opportunity to react to a prop transition by updating the
|
|
* state using `this.setState`. Current props are accessed via `this.props`.
|
|
*
|
|
* componentWillReceiveProps: function(nextProps, nextContext) {
|
|
* this.setState({
|
|
* likesIncreasing: nextProps.likeCount > this.props.likeCount
|
|
* });
|
|
* }
|
|
*
|
|
* NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop
|
|
* transition may cause a state change, but the opposite is not true. If you
|
|
* need it, you are probably looking for `componentWillUpdate`.
|
|
*
|
|
* @param {object} nextProps
|
|
* @optional
|
|
*/
|
|
componentWillReceiveProps: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Invoked while deciding if the component should be updated as a result of
|
|
* receiving new props, state and/or context.
|
|
*
|
|
* Use this as an opportunity to `return false` when you're certain that the
|
|
* transition to the new props/state/context will not require a component
|
|
* update.
|
|
*
|
|
* shouldComponentUpdate: function(nextProps, nextState, nextContext) {
|
|
* return !equal(nextProps, this.props) ||
|
|
* !equal(nextState, this.state) ||
|
|
* !equal(nextContext, this.context);
|
|
* }
|
|
*
|
|
* @param {object} nextProps
|
|
* @param {?object} nextState
|
|
* @param {?object} nextContext
|
|
* @return {boolean} True if the component should update.
|
|
* @optional
|
|
*/
|
|
shouldComponentUpdate: 'DEFINE_ONCE',
|
|
|
|
/**
|
|
* Invoked when the component is about to update due to a transition from
|
|
* `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`
|
|
* and `nextContext`.
|
|
*
|
|
* Use this as an opportunity to perform preparation before an update occurs.
|
|
*
|
|
* NOTE: You **cannot** use `this.setState()` in this method.
|
|
*
|
|
* @param {object} nextProps
|
|
* @param {?object} nextState
|
|
* @param {?object} nextContext
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @optional
|
|
*/
|
|
componentWillUpdate: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Invoked when the component's DOM representation has been updated.
|
|
*
|
|
* Use this as an opportunity to operate on the DOM when the component has
|
|
* been updated.
|
|
*
|
|
* @param {object} prevProps
|
|
* @param {?object} prevState
|
|
* @param {?object} prevContext
|
|
* @param {DOMElement} rootNode DOM element representing the component.
|
|
* @optional
|
|
*/
|
|
componentDidUpdate: 'DEFINE_MANY',
|
|
|
|
/**
|
|
* Invoked when the component is about to be removed from its parent and have
|
|
* its DOM representation destroyed.
|
|
*
|
|
* Use this as an opportunity to deallocate any external resources.
|
|
*
|
|
* NOTE: There is no `componentDidUnmount` since your component will have been
|
|
* destroyed by that point.
|
|
*
|
|
* @optional
|
|
*/
|
|
componentWillUnmount: 'DEFINE_MANY',
|
|
|
|
// ==== Advanced methods ====
|
|
|
|
/**
|
|
* Updates the component's currently mounted DOM representation.
|
|
*
|
|
* By default, this implements React's rendering and reconciliation algorithm.
|
|
* Sophisticated clients may wish to override this.
|
|
*
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
* @overridable
|
|
*/
|
|
updateComponent: 'OVERRIDE_BASE'
|
|
};
|
|
|
|
/**
|
|
* Mapping from class specification keys to special processing functions.
|
|
*
|
|
* Although these are declared like instance properties in the specification
|
|
* when defining classes using `React.createClass`, they are actually static
|
|
* and are accessible on the constructor instead of the prototype. Despite
|
|
* being static, they must be defined outside of the "statics" key under
|
|
* which all other static methods are defined.
|
|
*/
|
|
var RESERVED_SPEC_KEYS = {
|
|
displayName: function displayName(Constructor, _displayName) {
|
|
Constructor.displayName = _displayName;
|
|
},
|
|
mixins: function mixins(Constructor, _mixins) {
|
|
if (_mixins) {
|
|
for (var i = 0; i < _mixins.length; i++) {
|
|
mixSpecIntoComponent(Constructor, _mixins[i]);
|
|
}
|
|
}
|
|
},
|
|
childContextTypes: function childContextTypes(Constructor, _childContextTypes) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateTypeDef(Constructor, _childContextTypes, 'childContext');
|
|
}
|
|
Constructor.childContextTypes = _assign({}, Constructor.childContextTypes, _childContextTypes);
|
|
},
|
|
contextTypes: function contextTypes(Constructor, _contextTypes) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateTypeDef(Constructor, _contextTypes, 'context');
|
|
}
|
|
Constructor.contextTypes = _assign({}, Constructor.contextTypes, _contextTypes);
|
|
},
|
|
/**
|
|
* Special case getDefaultProps which should move into statics but requires
|
|
* automatic merging.
|
|
*/
|
|
getDefaultProps: function getDefaultProps(Constructor, _getDefaultProps) {
|
|
if (Constructor.getDefaultProps) {
|
|
Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, _getDefaultProps);
|
|
} else {
|
|
Constructor.getDefaultProps = _getDefaultProps;
|
|
}
|
|
},
|
|
propTypes: function propTypes(Constructor, _propTypes) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
validateTypeDef(Constructor, _propTypes, 'prop');
|
|
}
|
|
Constructor.propTypes = _assign({}, Constructor.propTypes, _propTypes);
|
|
},
|
|
statics: function statics(Constructor, _statics) {
|
|
mixStaticSpecIntoComponent(Constructor, _statics);
|
|
},
|
|
autobind: function autobind() {}
|
|
};
|
|
|
|
function validateTypeDef(Constructor, typeDef, location) {
|
|
for (var propName in typeDef) {
|
|
if (typeDef.hasOwnProperty(propName)) {
|
|
// use a warning instead of an _invariant so components
|
|
// don't show up in prod but only in __DEV__
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function validateMethodOverride(isAlreadyDefined, name) {
|
|
var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null;
|
|
|
|
// Disallow overriding of base class methods unless explicitly allowed.
|
|
if (ReactClassMixin.hasOwnProperty(name)) {
|
|
_invariant(specPolicy === 'OVERRIDE_BASE', 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name);
|
|
}
|
|
|
|
// Disallow defining methods more than once unless explicitly allowed.
|
|
if (isAlreadyDefined) {
|
|
_invariant(specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED', 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Mixin helper which handles policy validation and reserved
|
|
* specification keys when building React classes.
|
|
*/
|
|
function mixSpecIntoComponent(Constructor, spec) {
|
|
if (!spec) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var typeofSpec = typeof spec === 'undefined' ? 'undefined' : _typeof(spec);
|
|
var isMixinValid = typeofSpec === 'object' && spec !== null;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(isMixinValid, "%s: You're attempting to include a mixin that is either null " + 'or not an object. Check the mixins included by the component, ' + 'as well as any mixins they include themselves. ' + 'Expected object but got %s.', Constructor.displayName || 'ReactClass', spec === null ? null : typeofSpec);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
_invariant(typeof spec !== 'function', "ReactClass: You're attempting to " + 'use a component class or function as a mixin. Instead, just use a ' + 'regular object.');
|
|
_invariant(!isValidElement(spec), "ReactClass: You're attempting to " + 'use a component as a mixin. Instead, just use a regular object.');
|
|
|
|
var proto = Constructor.prototype;
|
|
var autoBindPairs = proto.__reactAutoBindPairs;
|
|
|
|
// By handling mixins before any other properties, we ensure the same
|
|
// chaining order is applied to methods with DEFINE_MANY policy, whether
|
|
// mixins are listed before or after these methods in the spec.
|
|
if (spec.hasOwnProperty(MIXINS_KEY)) {
|
|
RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
|
|
}
|
|
|
|
for (var name in spec) {
|
|
if (!spec.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
|
|
if (name === MIXINS_KEY) {
|
|
// We have already handled mixins in a special case above.
|
|
continue;
|
|
}
|
|
|
|
var property = spec[name];
|
|
var isAlreadyDefined = proto.hasOwnProperty(name);
|
|
validateMethodOverride(isAlreadyDefined, name);
|
|
|
|
if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {
|
|
RESERVED_SPEC_KEYS[name](Constructor, property);
|
|
} else {
|
|
// Setup methods on prototype:
|
|
// The following member methods should not be automatically bound:
|
|
// 1. Expected ReactClass methods (in the "interface").
|
|
// 2. Overridden methods (that were mixed in).
|
|
var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);
|
|
var isFunction = typeof property === 'function';
|
|
var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;
|
|
|
|
if (shouldAutoBind) {
|
|
autoBindPairs.push(name, property);
|
|
proto[name] = property;
|
|
} else {
|
|
if (isAlreadyDefined) {
|
|
var specPolicy = ReactClassInterface[name];
|
|
|
|
// These cases should already be caught by validateMethodOverride.
|
|
_invariant(isReactClassMethod && (specPolicy === 'DEFINE_MANY_MERGED' || specPolicy === 'DEFINE_MANY'), 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name);
|
|
|
|
// For methods which are defined more than once, call the existing
|
|
// methods before calling the new property, merging if appropriate.
|
|
if (specPolicy === 'DEFINE_MANY_MERGED') {
|
|
proto[name] = createMergedResultFunction(proto[name], property);
|
|
} else if (specPolicy === 'DEFINE_MANY') {
|
|
proto[name] = createChainedFunction(proto[name], property);
|
|
}
|
|
} else {
|
|
proto[name] = property;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// Add verbose displayName to the function, which helps when looking
|
|
// at profiling tools.
|
|
if (typeof property === 'function' && spec.displayName) {
|
|
proto[name].displayName = spec.displayName + '_' + name;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function mixStaticSpecIntoComponent(Constructor, statics) {
|
|
if (!statics) {
|
|
return;
|
|
}
|
|
for (var name in statics) {
|
|
var property = statics[name];
|
|
if (!statics.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
|
|
var isReserved = name in RESERVED_SPEC_KEYS;
|
|
_invariant(!isReserved, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name);
|
|
|
|
var isInherited = name in Constructor;
|
|
_invariant(!isInherited, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name);
|
|
Constructor[name] = property;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Merge two objects, but throw if both contain the same key.
|
|
*
|
|
* @param {object} one The first object, which is mutated.
|
|
* @param {object} two The second object
|
|
* @return {object} one after it has been mutated to contain everything in two.
|
|
*/
|
|
function mergeIntoWithNoDuplicateKeys(one, two) {
|
|
_invariant(one && two && (typeof one === 'undefined' ? 'undefined' : _typeof(one)) === 'object' && (typeof two === 'undefined' ? 'undefined' : _typeof(two)) === 'object', 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.');
|
|
|
|
for (var key in two) {
|
|
if (two.hasOwnProperty(key)) {
|
|
_invariant(one[key] === undefined, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key);
|
|
one[key] = two[key];
|
|
}
|
|
}
|
|
return one;
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes two functions and merges their return values.
|
|
*
|
|
* @param {function} one Function to invoke first.
|
|
* @param {function} two Function to invoke second.
|
|
* @return {function} Function that invokes the two argument functions.
|
|
* @private
|
|
*/
|
|
function createMergedResultFunction(one, two) {
|
|
return function mergedResult() {
|
|
var a = one.apply(this, arguments);
|
|
var b = two.apply(this, arguments);
|
|
if (a == null) {
|
|
return b;
|
|
} else if (b == null) {
|
|
return a;
|
|
}
|
|
var c = {};
|
|
mergeIntoWithNoDuplicateKeys(c, a);
|
|
mergeIntoWithNoDuplicateKeys(c, b);
|
|
return c;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes two functions and ignores their return vales.
|
|
*
|
|
* @param {function} one Function to invoke first.
|
|
* @param {function} two Function to invoke second.
|
|
* @return {function} Function that invokes the two argument functions.
|
|
* @private
|
|
*/
|
|
function createChainedFunction(one, two) {
|
|
return function chainedFunction() {
|
|
one.apply(this, arguments);
|
|
two.apply(this, arguments);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Binds a method to the component.
|
|
*
|
|
* @param {object} component Component whose method is going to be bound.
|
|
* @param {function} method Method to be bound.
|
|
* @return {function} The bound method.
|
|
*/
|
|
function bindAutoBindMethod(component, method) {
|
|
var boundMethod = method.bind(component);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
boundMethod.__reactBoundContext = component;
|
|
boundMethod.__reactBoundMethod = method;
|
|
boundMethod.__reactBoundArguments = null;
|
|
var componentName = component.constructor.displayName;
|
|
var _bind = boundMethod.bind;
|
|
boundMethod.bind = function (newThis) {
|
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
// User is trying to bind() an autobound method; we effectively will
|
|
// ignore the value of "this" that the user is trying to use, so
|
|
// let's warn.
|
|
if (newThis !== component && newThis !== null) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName);
|
|
}
|
|
} else if (!args.length) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName);
|
|
}
|
|
return boundMethod;
|
|
}
|
|
var reboundMethod = _bind.apply(boundMethod, arguments);
|
|
reboundMethod.__reactBoundContext = component;
|
|
reboundMethod.__reactBoundMethod = method;
|
|
reboundMethod.__reactBoundArguments = args;
|
|
return reboundMethod;
|
|
};
|
|
}
|
|
return boundMethod;
|
|
}
|
|
|
|
/**
|
|
* Binds all auto-bound methods in a component.
|
|
*
|
|
* @param {object} component Component whose method is going to be bound.
|
|
*/
|
|
function bindAutoBindMethods(component) {
|
|
var pairs = component.__reactAutoBindPairs;
|
|
for (var i = 0; i < pairs.length; i += 2) {
|
|
var autoBindKey = pairs[i];
|
|
var method = pairs[i + 1];
|
|
component[autoBindKey] = bindAutoBindMethod(component, method);
|
|
}
|
|
}
|
|
|
|
var IsMountedPreMixin = {
|
|
componentDidMount: function componentDidMount() {
|
|
this.__isMounted = true;
|
|
}
|
|
};
|
|
|
|
var IsMountedPostMixin = {
|
|
componentWillUnmount: function componentWillUnmount() {
|
|
this.__isMounted = false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Add more to the ReactClass base class. These are all legacy features and
|
|
* therefore not already part of the modern ReactComponent.
|
|
*/
|
|
var ReactClassMixin = {
|
|
/**
|
|
* TODO: This will be deprecated because state should always keep a consistent
|
|
* type signature and the only use case for this, is to avoid that.
|
|
*/
|
|
replaceState: function replaceState(newState, callback) {
|
|
this.updater.enqueueReplaceState(this, newState, callback);
|
|
},
|
|
|
|
/**
|
|
* Checks whether or not this composite component is mounted.
|
|
* @return {boolean} True if mounted, false otherwise.
|
|
* @protected
|
|
* @final
|
|
*/
|
|
isMounted: function isMounted() {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(this.__didWarnIsMounted, '%s: isMounted is deprecated. Instead, make sure to clean up ' + 'subscriptions and pending requests in componentWillUnmount to ' + 'prevent memory leaks.', this.constructor && this.constructor.displayName || this.name || 'Component');
|
|
this.__didWarnIsMounted = true;
|
|
}
|
|
return !!this.__isMounted;
|
|
}
|
|
};
|
|
|
|
var ReactClassComponent = function ReactClassComponent() {};
|
|
_assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin);
|
|
|
|
/**
|
|
* Creates a composite component class given a class specification.
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.createclass
|
|
*
|
|
* @param {object} spec Class specification (which must define `render`).
|
|
* @return {function} Component constructor function.
|
|
* @public
|
|
*/
|
|
function createClass(spec) {
|
|
// To keep our warnings more understandable, we'll use a little hack here to
|
|
// ensure that Constructor.name !== 'Constructor'. This makes sure we don't
|
|
// unnecessarily identify a class without displayName as 'Constructor'.
|
|
var Constructor = identity(function (props, context, updater) {
|
|
// This constructor gets overridden by mocks. The argument is used
|
|
// by mocks to assert on what gets mounted.
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory');
|
|
}
|
|
|
|
// Wire up auto-binding
|
|
if (this.__reactAutoBindPairs.length) {
|
|
bindAutoBindMethods(this);
|
|
}
|
|
|
|
this.props = props;
|
|
this.context = context;
|
|
this.refs = emptyObject;
|
|
this.updater = updater || ReactNoopUpdateQueue;
|
|
|
|
this.state = null;
|
|
|
|
// ReactClasses doesn't have constructors. Instead, they use the
|
|
// getInitialState and componentWillMount methods for initialization.
|
|
|
|
var initialState = this.getInitialState ? this.getInitialState() : null;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// We allow auto-mocks to proceed as if they're returning null.
|
|
if (initialState === undefined && this.getInitialState._isMockFunction) {
|
|
// This is probably bad practice. Consider warning here and
|
|
// deprecating this convenience.
|
|
initialState = null;
|
|
}
|
|
}
|
|
_invariant((typeof initialState === 'undefined' ? 'undefined' : _typeof(initialState)) === 'object' && !Array.isArray(initialState), '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent');
|
|
|
|
this.state = initialState;
|
|
});
|
|
Constructor.prototype = new ReactClassComponent();
|
|
Constructor.prototype.constructor = Constructor;
|
|
Constructor.prototype.__reactAutoBindPairs = [];
|
|
|
|
injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));
|
|
|
|
mixSpecIntoComponent(Constructor, IsMountedPreMixin);
|
|
mixSpecIntoComponent(Constructor, spec);
|
|
mixSpecIntoComponent(Constructor, IsMountedPostMixin);
|
|
|
|
// Initialize the defaultProps property after all mixins have been merged.
|
|
if (Constructor.getDefaultProps) {
|
|
Constructor.defaultProps = Constructor.getDefaultProps();
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// This is a tag to indicate that the use of these method names is ok,
|
|
// since it's used with createClass. If it's not, then it's likely a
|
|
// mistake so we'll warn you to use the static property, property
|
|
// initializer or constructor respectively.
|
|
if (Constructor.getDefaultProps) {
|
|
Constructor.getDefaultProps.isReactClassApproved = {};
|
|
}
|
|
if (Constructor.prototype.getInitialState) {
|
|
Constructor.prototype.getInitialState.isReactClassApproved = {};
|
|
}
|
|
}
|
|
|
|
_invariant(Constructor.prototype.render, 'createClass(...): Class specification must implement a `render` method.');
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component');
|
|
warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component');
|
|
}
|
|
|
|
// Reduce time spent doing lookups by setting these on the prototype.
|
|
for (var methodName in ReactClassInterface) {
|
|
if (!Constructor.prototype[methodName]) {
|
|
Constructor.prototype[methodName] = null;
|
|
}
|
|
}
|
|
|
|
return Constructor;
|
|
}
|
|
|
|
return createClass;
|
|
}
|
|
|
|
module.exports = factory;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 118 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var _hyphenPattern = /-(.)/g;
|
|
|
|
/**
|
|
* Camelcases a hyphenated string, for example:
|
|
*
|
|
* > camelize('background-color')
|
|
* < "backgroundColor"
|
|
*
|
|
* @param {string} string
|
|
* @return {string}
|
|
*/
|
|
function camelize(string) {
|
|
return string.replace(_hyphenPattern, function (_, character) {
|
|
return character.toUpperCase();
|
|
});
|
|
}
|
|
|
|
module.exports = camelize;
|
|
|
|
/***/ }),
|
|
/* 119 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
|
|
|
|
var camelize = __webpack_require__(118);
|
|
|
|
var msPattern = /^-ms-/;
|
|
|
|
/**
|
|
* Camelcases a hyphenated CSS property name, for example:
|
|
*
|
|
* > camelizeStyleName('background-color')
|
|
* < "backgroundColor"
|
|
* > camelizeStyleName('-moz-transition')
|
|
* < "MozTransition"
|
|
* > camelizeStyleName('-ms-transition')
|
|
* < "msTransition"
|
|
*
|
|
* As Andi Smith suggests
|
|
* (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
|
|
* is converted to lowercase `ms`.
|
|
*
|
|
* @param {string} string
|
|
* @return {string}
|
|
*/
|
|
function camelizeStyleName(string) {
|
|
return camelize(string.replace(msPattern, 'ms-'));
|
|
}
|
|
|
|
module.exports = camelizeStyleName;
|
|
|
|
/***/ }),
|
|
/* 120 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
var isTextNode = __webpack_require__(128);
|
|
|
|
/*eslint-disable no-bitwise */
|
|
|
|
/**
|
|
* Checks if a given DOM node contains or is another DOM node.
|
|
*/
|
|
function containsNode(outerNode, innerNode) {
|
|
if (!outerNode || !innerNode) {
|
|
return false;
|
|
} else if (outerNode === innerNode) {
|
|
return true;
|
|
} else if (isTextNode(outerNode)) {
|
|
return false;
|
|
} else if (isTextNode(innerNode)) {
|
|
return containsNode(outerNode, innerNode.parentNode);
|
|
} else if ('contains' in outerNode) {
|
|
return outerNode.contains(innerNode);
|
|
} else if (outerNode.compareDocumentPosition) {
|
|
return !!(outerNode.compareDocumentPosition(innerNode) & 16);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
module.exports = containsNode;
|
|
|
|
/***/ }),
|
|
/* 121 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Convert array-like objects to arrays.
|
|
*
|
|
* This API assumes the caller knows the contents of the data type. For less
|
|
* well defined inputs use createArrayFromMixed.
|
|
*
|
|
* @param {object|function|filelist} obj
|
|
* @return {array}
|
|
*/
|
|
function toArray(obj) {
|
|
var length = obj.length;
|
|
|
|
// Some browsers builtin objects can report typeof 'function' (e.g. NodeList
|
|
// in old versions of Safari).
|
|
!(!Array.isArray(obj) && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : void 0;
|
|
|
|
!(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : void 0;
|
|
|
|
!(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : void 0;
|
|
|
|
!(typeof obj.callee !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object can\'t be `arguments`. Use rest params ' + '(function(...args) {}) or Array.from() instead.') : invariant(false) : void 0;
|
|
|
|
// Old IE doesn't give collections access to hasOwnProperty. Assume inputs
|
|
// without method will throw during the slice call and skip straight to the
|
|
// fallback.
|
|
if (obj.hasOwnProperty) {
|
|
try {
|
|
return Array.prototype.slice.call(obj);
|
|
} catch (e) {
|
|
// IE < 9 does not support Array#slice on collections objects
|
|
}
|
|
}
|
|
|
|
// Fall back to copying key by key. This assumes all keys have a value,
|
|
// so will not preserve sparsely populated inputs.
|
|
var ret = Array(length);
|
|
for (var ii = 0; ii < length; ii++) {
|
|
ret[ii] = obj[ii];
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Perform a heuristic test to determine if an object is "array-like".
|
|
*
|
|
* A monk asked Joshu, a Zen master, "Has a dog Buddha nature?"
|
|
* Joshu replied: "Mu."
|
|
*
|
|
* This function determines if its argument has "array nature": it returns
|
|
* true if the argument is an actual array, an `arguments' object, or an
|
|
* HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).
|
|
*
|
|
* It will return false for other array-like objects like Filelist.
|
|
*
|
|
* @param {*} obj
|
|
* @return {boolean}
|
|
*/
|
|
function hasArrayNature(obj) {
|
|
return (
|
|
// not null/false
|
|
!!obj && (
|
|
// arrays are objects, NodeLists are functions in Safari
|
|
(typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function') &&
|
|
// quacks like an array
|
|
'length' in obj &&
|
|
// not window
|
|
!('setInterval' in obj) &&
|
|
// no DOM node should be considered an array-like
|
|
// a 'select' element has 'length' and 'item' properties on IE8
|
|
typeof obj.nodeType != 'number' && (
|
|
// a real array
|
|
Array.isArray(obj) ||
|
|
// arguments
|
|
'callee' in obj ||
|
|
// HTMLCollection/NodeList
|
|
'item' in obj)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Ensure that the argument is an array by wrapping it in an array if it is not.
|
|
* Creates a copy of the argument if it is already an array.
|
|
*
|
|
* This is mostly useful idiomatically:
|
|
*
|
|
* var createArrayFromMixed = require('createArrayFromMixed');
|
|
*
|
|
* function takesOneOrMoreThings(things) {
|
|
* things = createArrayFromMixed(things);
|
|
* ...
|
|
* }
|
|
*
|
|
* This allows you to treat `things' as an array, but accept scalars in the API.
|
|
*
|
|
* If you need to convert an array-like object, like `arguments`, into an array
|
|
* use toArray instead.
|
|
*
|
|
* @param {*} obj
|
|
* @return {array}
|
|
*/
|
|
function createArrayFromMixed(obj) {
|
|
if (!hasArrayNature(obj)) {
|
|
return [obj];
|
|
} else if (Array.isArray(obj)) {
|
|
return obj.slice();
|
|
} else {
|
|
return toArray(obj);
|
|
}
|
|
}
|
|
|
|
module.exports = createArrayFromMixed;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 122 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
/*eslint-disable fb-www/unsafe-html*/
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var createArrayFromMixed = __webpack_require__(121);
|
|
var getMarkupWrap = __webpack_require__(123);
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Dummy container used to render all markup.
|
|
*/
|
|
var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;
|
|
|
|
/**
|
|
* Pattern used by `getNodeName`.
|
|
*/
|
|
var nodeNamePattern = /^\s*<(\w+)/;
|
|
|
|
/**
|
|
* Extracts the `nodeName` of the first element in a string of markup.
|
|
*
|
|
* @param {string} markup String of markup.
|
|
* @return {?string} Node name of the supplied markup.
|
|
*/
|
|
function getNodeName(markup) {
|
|
var nodeNameMatch = markup.match(nodeNamePattern);
|
|
return nodeNameMatch && nodeNameMatch[1].toLowerCase();
|
|
}
|
|
|
|
/**
|
|
* Creates an array containing the nodes rendered from the supplied markup. The
|
|
* optionally supplied `handleScript` function will be invoked once for each
|
|
* <script> element that is rendered. If no `handleScript` function is supplied,
|
|
* an exception is thrown if any <script> elements are rendered.
|
|
*
|
|
* @param {string} markup A string of valid HTML markup.
|
|
* @param {?function} handleScript Invoked once for each rendered <script>.
|
|
* @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.
|
|
*/
|
|
function createNodesFromMarkup(markup, handleScript) {
|
|
var node = dummyNode;
|
|
!!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : void 0;
|
|
var nodeName = getNodeName(markup);
|
|
|
|
var wrap = nodeName && getMarkupWrap(nodeName);
|
|
if (wrap) {
|
|
node.innerHTML = wrap[1] + markup + wrap[2];
|
|
|
|
var wrapDepth = wrap[0];
|
|
while (wrapDepth--) {
|
|
node = node.lastChild;
|
|
}
|
|
} else {
|
|
node.innerHTML = markup;
|
|
}
|
|
|
|
var scripts = node.getElementsByTagName('script');
|
|
if (scripts.length) {
|
|
!handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : void 0;
|
|
createArrayFromMixed(scripts).forEach(handleScript);
|
|
}
|
|
|
|
var nodes = Array.from(node.childNodes);
|
|
while (node.lastChild) {
|
|
node.removeChild(node.lastChild);
|
|
}
|
|
return nodes;
|
|
}
|
|
|
|
module.exports = createNodesFromMarkup;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 123 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/*eslint-disable fb-www/unsafe-html */
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Dummy container used to detect which wraps are necessary.
|
|
*/
|
|
var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;
|
|
|
|
/**
|
|
* Some browsers cannot use `innerHTML` to render certain elements standalone,
|
|
* so we wrap them, render the wrapped nodes, then extract the desired node.
|
|
*
|
|
* In IE8, certain elements cannot render alone, so wrap all elements ('*').
|
|
*/
|
|
|
|
var shouldWrap = {};
|
|
|
|
var selectWrap = [1, '<select multiple="true">', '</select>'];
|
|
var tableWrap = [1, '<table>', '</table>'];
|
|
var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
|
|
|
|
var svgWrap = [1, '<svg xmlns="http://www.w3.org/2000/svg">', '</svg>'];
|
|
|
|
var markupWrap = {
|
|
'*': [1, '?<div>', '</div>'],
|
|
|
|
'area': [1, '<map>', '</map>'],
|
|
'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
|
|
'legend': [1, '<fieldset>', '</fieldset>'],
|
|
'param': [1, '<object>', '</object>'],
|
|
'tr': [2, '<table><tbody>', '</tbody></table>'],
|
|
|
|
'optgroup': selectWrap,
|
|
'option': selectWrap,
|
|
|
|
'caption': tableWrap,
|
|
'colgroup': tableWrap,
|
|
'tbody': tableWrap,
|
|
'tfoot': tableWrap,
|
|
'thead': tableWrap,
|
|
|
|
'td': trWrap,
|
|
'th': trWrap
|
|
};
|
|
|
|
// Initialize the SVG elements since we know they'll always need to be wrapped
|
|
// consistently. If they are created inside a <div> they will be initialized in
|
|
// the wrong namespace (and will not display).
|
|
var svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan'];
|
|
svgElements.forEach(function (nodeName) {
|
|
markupWrap[nodeName] = svgWrap;
|
|
shouldWrap[nodeName] = true;
|
|
});
|
|
|
|
/**
|
|
* Gets the markup wrap configuration for the supplied `nodeName`.
|
|
*
|
|
* NOTE: This lazily detects which wraps are necessary for the current browser.
|
|
*
|
|
* @param {string} nodeName Lowercase `nodeName`.
|
|
* @return {?array} Markup wrap configuration, if applicable.
|
|
*/
|
|
function getMarkupWrap(nodeName) {
|
|
!!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : void 0;
|
|
if (!markupWrap.hasOwnProperty(nodeName)) {
|
|
nodeName = '*';
|
|
}
|
|
if (!shouldWrap.hasOwnProperty(nodeName)) {
|
|
if (nodeName === '*') {
|
|
dummyNode.innerHTML = '<link />';
|
|
} else {
|
|
dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';
|
|
}
|
|
shouldWrap[nodeName] = !dummyNode.firstChild;
|
|
}
|
|
return shouldWrap[nodeName] ? markupWrap[nodeName] : null;
|
|
}
|
|
|
|
module.exports = getMarkupWrap;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 124 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Gets the scroll position of the supplied element or window.
|
|
*
|
|
* The return values are unbounded, unlike `getScrollPosition`. This means they
|
|
* may be negative or exceed the element boundaries (which is possible using
|
|
* inertial scrolling).
|
|
*
|
|
* @param {DOMWindow|DOMElement} scrollable
|
|
* @return {object} Map with `x` and `y` keys.
|
|
*/
|
|
|
|
function getUnboundedScrollPosition(scrollable) {
|
|
if (scrollable.Window && scrollable instanceof scrollable.Window) {
|
|
return {
|
|
x: scrollable.pageXOffset || scrollable.document.documentElement.scrollLeft,
|
|
y: scrollable.pageYOffset || scrollable.document.documentElement.scrollTop
|
|
};
|
|
}
|
|
return {
|
|
x: scrollable.scrollLeft,
|
|
y: scrollable.scrollTop
|
|
};
|
|
}
|
|
|
|
module.exports = getUnboundedScrollPosition;
|
|
|
|
/***/ }),
|
|
/* 125 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var _uppercasePattern = /([A-Z])/g;
|
|
|
|
/**
|
|
* Hyphenates a camelcased string, for example:
|
|
*
|
|
* > hyphenate('backgroundColor')
|
|
* < "background-color"
|
|
*
|
|
* For CSS style names, use `hyphenateStyleName` instead which works properly
|
|
* with all vendor prefixes, including `ms`.
|
|
*
|
|
* @param {string} string
|
|
* @return {string}
|
|
*/
|
|
function hyphenate(string) {
|
|
return string.replace(_uppercasePattern, '-$1').toLowerCase();
|
|
}
|
|
|
|
module.exports = hyphenate;
|
|
|
|
/***/ }),
|
|
/* 126 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
|
|
|
|
var hyphenate = __webpack_require__(125);
|
|
|
|
var msPattern = /^ms-/;
|
|
|
|
/**
|
|
* Hyphenates a camelcased CSS property name, for example:
|
|
*
|
|
* > hyphenateStyleName('backgroundColor')
|
|
* < "background-color"
|
|
* > hyphenateStyleName('MozTransition')
|
|
* < "-moz-transition"
|
|
* > hyphenateStyleName('msTransition')
|
|
* < "-ms-transition"
|
|
*
|
|
* As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
|
|
* is converted to `-ms-`.
|
|
*
|
|
* @param {string} string
|
|
* @return {string}
|
|
*/
|
|
function hyphenateStyleName(string) {
|
|
return hyphenate(string).replace(msPattern, '-ms-');
|
|
}
|
|
|
|
module.exports = hyphenateStyleName;
|
|
|
|
/***/ }),
|
|
/* 127 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
/**
|
|
* @param {*} object The object to check.
|
|
* @return {boolean} Whether or not the object is a DOM node.
|
|
*/
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
function isNode(object) {
|
|
var doc = object ? object.ownerDocument || object : document;
|
|
var defaultView = doc.defaultView || window;
|
|
return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));
|
|
}
|
|
|
|
module.exports = isNode;
|
|
|
|
/***/ }),
|
|
/* 128 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var isNode = __webpack_require__(127);
|
|
|
|
/**
|
|
* @param {*} object The object to check.
|
|
* @return {boolean} Whether or not the object is a DOM text node.
|
|
*/
|
|
function isTextNode(object) {
|
|
return isNode(object) && object.nodeType == 3;
|
|
}
|
|
|
|
module.exports = isTextNode;
|
|
|
|
/***/ }),
|
|
/* 129 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
* @typechecks static-only
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Memoizes the return value of a function that accepts one string argument.
|
|
*/
|
|
|
|
function memoizeStringOnly(callback) {
|
|
var cache = {};
|
|
return function (string) {
|
|
if (!cache.hasOwnProperty(string)) {
|
|
cache[string] = callback.call(this, string);
|
|
}
|
|
return cache[string];
|
|
};
|
|
}
|
|
|
|
module.exports = memoizeStringOnly;
|
|
|
|
/***/ }),
|
|
/* 130 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var performance;
|
|
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
performance = window.performance || window.msPerformance || window.webkitPerformance;
|
|
}
|
|
|
|
module.exports = performance || {};
|
|
|
|
/***/ }),
|
|
/* 131 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @typechecks
|
|
*/
|
|
|
|
var performance = __webpack_require__(130);
|
|
|
|
var performanceNow;
|
|
|
|
/**
|
|
* Detect if we can use `window.performance.now()` and gracefully fallback to
|
|
* `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now
|
|
* because of Facebook's testing infrastructure.
|
|
*/
|
|
if (performance.now) {
|
|
performanceNow = function performanceNow() {
|
|
return performance.now();
|
|
};
|
|
} else {
|
|
performanceNow = function performanceNow() {
|
|
return Date.now();
|
|
};
|
|
}
|
|
|
|
module.exports = performanceNow;
|
|
|
|
/***/ }),
|
|
/* 132 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
|
|
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
} : function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
};
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _invariant = __webpack_require__(26);
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
var _LocationUtils = __webpack_require__(41);
|
|
|
|
var _PathUtils = __webpack_require__(25);
|
|
|
|
var _createTransitionManager = __webpack_require__(42);
|
|
|
|
var _createTransitionManager2 = _interopRequireDefault(_createTransitionManager);
|
|
|
|
var _DOMUtils = __webpack_require__(68);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
}
|
|
|
|
var PopStateEvent = 'popstate';
|
|
var HashChangeEvent = 'hashchange';
|
|
|
|
var getHistoryState = function getHistoryState() {
|
|
try {
|
|
return window.history.state || {};
|
|
} catch (e) {
|
|
// IE 11 sometimes throws when accessing window.history.state
|
|
// See https://github.com/ReactTraining/history/pull/289
|
|
return {};
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Creates a history object that uses the HTML5 history API including
|
|
* pushState, replaceState, and the popstate event.
|
|
*/
|
|
var createBrowserHistory = function createBrowserHistory() {
|
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
(0, _invariant2.default)(_DOMUtils.canUseDOM, 'Browser history needs a DOM');
|
|
|
|
var globalHistory = window.history;
|
|
var canUseHistory = (0, _DOMUtils.supportsHistory)();
|
|
var needsHashChangeListener = !(0, _DOMUtils.supportsPopStateOnHashChange)();
|
|
|
|
var _props$forceRefresh = props.forceRefresh,
|
|
forceRefresh = _props$forceRefresh === undefined ? false : _props$forceRefresh,
|
|
_props$getUserConfirm = props.getUserConfirmation,
|
|
getUserConfirmation = _props$getUserConfirm === undefined ? _DOMUtils.getConfirmation : _props$getUserConfirm,
|
|
_props$keyLength = props.keyLength,
|
|
keyLength = _props$keyLength === undefined ? 6 : _props$keyLength;
|
|
|
|
var basename = props.basename ? (0, _PathUtils.stripTrailingSlash)((0, _PathUtils.addLeadingSlash)(props.basename)) : '';
|
|
|
|
var getDOMLocation = function getDOMLocation(historyState) {
|
|
var _ref = historyState || {},
|
|
key = _ref.key,
|
|
state = _ref.state;
|
|
|
|
var _window$location = window.location,
|
|
pathname = _window$location.pathname,
|
|
search = _window$location.search,
|
|
hash = _window$location.hash;
|
|
|
|
var path = pathname + search + hash;
|
|
|
|
(0, _warning2.default)(!basename || (0, _PathUtils.hasBasename)(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".');
|
|
|
|
if (basename) path = (0, _PathUtils.stripBasename)(path, basename);
|
|
|
|
return (0, _LocationUtils.createLocation)(path, state, key);
|
|
};
|
|
|
|
var createKey = function createKey() {
|
|
return Math.random().toString(36).substr(2, keyLength);
|
|
};
|
|
|
|
var transitionManager = (0, _createTransitionManager2.default)();
|
|
|
|
var setState = function setState(nextState) {
|
|
_extends(history, nextState);
|
|
|
|
history.length = globalHistory.length;
|
|
|
|
transitionManager.notifyListeners(history.location, history.action);
|
|
};
|
|
|
|
var handlePopState = function handlePopState(event) {
|
|
// Ignore extraneous popstate events in WebKit.
|
|
if ((0, _DOMUtils.isExtraneousPopstateEvent)(event)) return;
|
|
|
|
handlePop(getDOMLocation(event.state));
|
|
};
|
|
|
|
var handleHashChange = function handleHashChange() {
|
|
handlePop(getDOMLocation(getHistoryState()));
|
|
};
|
|
|
|
var forceNextPop = false;
|
|
|
|
var handlePop = function handlePop(location) {
|
|
if (forceNextPop) {
|
|
forceNextPop = false;
|
|
setState();
|
|
} else {
|
|
var action = 'POP';
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (ok) {
|
|
setState({ action: action, location: location });
|
|
} else {
|
|
revertPop(location);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
var revertPop = function revertPop(fromLocation) {
|
|
var toLocation = history.location;
|
|
|
|
// TODO: We could probably make this more reliable by
|
|
// keeping a list of keys we've seen in sessionStorage.
|
|
// Instead, we just default to 0 for keys we don't know.
|
|
|
|
var toIndex = allKeys.indexOf(toLocation.key);
|
|
|
|
if (toIndex === -1) toIndex = 0;
|
|
|
|
var fromIndex = allKeys.indexOf(fromLocation.key);
|
|
|
|
if (fromIndex === -1) fromIndex = 0;
|
|
|
|
var delta = toIndex - fromIndex;
|
|
|
|
if (delta) {
|
|
forceNextPop = true;
|
|
go(delta);
|
|
}
|
|
};
|
|
|
|
var initialLocation = getDOMLocation(getHistoryState());
|
|
var allKeys = [initialLocation.key];
|
|
|
|
// Public interface
|
|
|
|
var createHref = function createHref(location) {
|
|
return basename + (0, _PathUtils.createPath)(location);
|
|
};
|
|
|
|
var push = function push(path, state) {
|
|
(0, _warning2.default)(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored');
|
|
|
|
var action = 'PUSH';
|
|
var location = (0, _LocationUtils.createLocation)(path, state, createKey(), history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
var href = createHref(location);
|
|
var key = location.key,
|
|
state = location.state;
|
|
|
|
if (canUseHistory) {
|
|
globalHistory.pushState({ key: key, state: state }, null, href);
|
|
|
|
if (forceRefresh) {
|
|
window.location.href = href;
|
|
} else {
|
|
var prevIndex = allKeys.indexOf(history.location.key);
|
|
var nextKeys = allKeys.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);
|
|
|
|
nextKeys.push(location.key);
|
|
allKeys = nextKeys;
|
|
|
|
setState({ action: action, location: location });
|
|
}
|
|
} else {
|
|
(0, _warning2.default)(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history');
|
|
|
|
window.location.href = href;
|
|
}
|
|
});
|
|
};
|
|
|
|
var replace = function replace(path, state) {
|
|
(0, _warning2.default)(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored');
|
|
|
|
var action = 'REPLACE';
|
|
var location = (0, _LocationUtils.createLocation)(path, state, createKey(), history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
var href = createHref(location);
|
|
var key = location.key,
|
|
state = location.state;
|
|
|
|
if (canUseHistory) {
|
|
globalHistory.replaceState({ key: key, state: state }, null, href);
|
|
|
|
if (forceRefresh) {
|
|
window.location.replace(href);
|
|
} else {
|
|
var prevIndex = allKeys.indexOf(history.location.key);
|
|
|
|
if (prevIndex !== -1) allKeys[prevIndex] = location.key;
|
|
|
|
setState({ action: action, location: location });
|
|
}
|
|
} else {
|
|
(0, _warning2.default)(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history');
|
|
|
|
window.location.replace(href);
|
|
}
|
|
});
|
|
};
|
|
|
|
var go = function go(n) {
|
|
globalHistory.go(n);
|
|
};
|
|
|
|
var goBack = function goBack() {
|
|
return go(-1);
|
|
};
|
|
|
|
var goForward = function goForward() {
|
|
return go(1);
|
|
};
|
|
|
|
var listenerCount = 0;
|
|
|
|
var checkDOMListeners = function checkDOMListeners(delta) {
|
|
listenerCount += delta;
|
|
|
|
if (listenerCount === 1) {
|
|
(0, _DOMUtils.addEventListener)(window, PopStateEvent, handlePopState);
|
|
|
|
if (needsHashChangeListener) (0, _DOMUtils.addEventListener)(window, HashChangeEvent, handleHashChange);
|
|
} else if (listenerCount === 0) {
|
|
(0, _DOMUtils.removeEventListener)(window, PopStateEvent, handlePopState);
|
|
|
|
if (needsHashChangeListener) (0, _DOMUtils.removeEventListener)(window, HashChangeEvent, handleHashChange);
|
|
}
|
|
};
|
|
|
|
var isBlocked = false;
|
|
|
|
var block = function block() {
|
|
var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
|
|
var unblock = transitionManager.setPrompt(prompt);
|
|
|
|
if (!isBlocked) {
|
|
checkDOMListeners(1);
|
|
isBlocked = true;
|
|
}
|
|
|
|
return function () {
|
|
if (isBlocked) {
|
|
isBlocked = false;
|
|
checkDOMListeners(-1);
|
|
}
|
|
|
|
return unblock();
|
|
};
|
|
};
|
|
|
|
var listen = function listen(listener) {
|
|
var unlisten = transitionManager.appendListener(listener);
|
|
checkDOMListeners(1);
|
|
|
|
return function () {
|
|
checkDOMListeners(-1);
|
|
unlisten();
|
|
};
|
|
};
|
|
|
|
var history = {
|
|
length: globalHistory.length,
|
|
action: 'POP',
|
|
location: initialLocation,
|
|
createHref: createHref,
|
|
push: push,
|
|
replace: replace,
|
|
go: go,
|
|
goBack: goBack,
|
|
goForward: goForward,
|
|
block: block,
|
|
listen: listen
|
|
};
|
|
|
|
return history;
|
|
};
|
|
|
|
exports.default = createBrowserHistory;
|
|
|
|
/***/ }),
|
|
/* 133 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _invariant = __webpack_require__(26);
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
var _LocationUtils = __webpack_require__(41);
|
|
|
|
var _PathUtils = __webpack_require__(25);
|
|
|
|
var _createTransitionManager = __webpack_require__(42);
|
|
|
|
var _createTransitionManager2 = _interopRequireDefault(_createTransitionManager);
|
|
|
|
var _DOMUtils = __webpack_require__(68);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
}
|
|
|
|
var HashChangeEvent = 'hashchange';
|
|
|
|
var HashPathCoders = {
|
|
hashbang: {
|
|
encodePath: function encodePath(path) {
|
|
return path.charAt(0) === '!' ? path : '!/' + (0, _PathUtils.stripLeadingSlash)(path);
|
|
},
|
|
decodePath: function decodePath(path) {
|
|
return path.charAt(0) === '!' ? path.substr(1) : path;
|
|
}
|
|
},
|
|
noslash: {
|
|
encodePath: _PathUtils.stripLeadingSlash,
|
|
decodePath: _PathUtils.addLeadingSlash
|
|
},
|
|
slash: {
|
|
encodePath: _PathUtils.addLeadingSlash,
|
|
decodePath: _PathUtils.addLeadingSlash
|
|
}
|
|
};
|
|
|
|
var getHashPath = function getHashPath() {
|
|
// We can't use window.location.hash here because it's not
|
|
// consistent across browsers - Firefox will pre-decode it!
|
|
var href = window.location.href;
|
|
var hashIndex = href.indexOf('#');
|
|
return hashIndex === -1 ? '' : href.substring(hashIndex + 1);
|
|
};
|
|
|
|
var pushHashPath = function pushHashPath(path) {
|
|
return window.location.hash = path;
|
|
};
|
|
|
|
var replaceHashPath = function replaceHashPath(path) {
|
|
var hashIndex = window.location.href.indexOf('#');
|
|
|
|
window.location.replace(window.location.href.slice(0, hashIndex >= 0 ? hashIndex : 0) + '#' + path);
|
|
};
|
|
|
|
var createHashHistory = function createHashHistory() {
|
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
(0, _invariant2.default)(_DOMUtils.canUseDOM, 'Hash history needs a DOM');
|
|
|
|
var globalHistory = window.history;
|
|
var canGoWithoutReload = (0, _DOMUtils.supportsGoWithoutReloadUsingHash)();
|
|
|
|
var _props$getUserConfirm = props.getUserConfirmation,
|
|
getUserConfirmation = _props$getUserConfirm === undefined ? _DOMUtils.getConfirmation : _props$getUserConfirm,
|
|
_props$hashType = props.hashType,
|
|
hashType = _props$hashType === undefined ? 'slash' : _props$hashType;
|
|
|
|
var basename = props.basename ? (0, _PathUtils.stripTrailingSlash)((0, _PathUtils.addLeadingSlash)(props.basename)) : '';
|
|
|
|
var _HashPathCoders$hashT = HashPathCoders[hashType],
|
|
encodePath = _HashPathCoders$hashT.encodePath,
|
|
decodePath = _HashPathCoders$hashT.decodePath;
|
|
|
|
var getDOMLocation = function getDOMLocation() {
|
|
var path = decodePath(getHashPath());
|
|
|
|
(0, _warning2.default)(!basename || (0, _PathUtils.hasBasename)(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".');
|
|
|
|
if (basename) path = (0, _PathUtils.stripBasename)(path, basename);
|
|
|
|
return (0, _LocationUtils.createLocation)(path);
|
|
};
|
|
|
|
var transitionManager = (0, _createTransitionManager2.default)();
|
|
|
|
var setState = function setState(nextState) {
|
|
_extends(history, nextState);
|
|
|
|
history.length = globalHistory.length;
|
|
|
|
transitionManager.notifyListeners(history.location, history.action);
|
|
};
|
|
|
|
var forceNextPop = false;
|
|
var ignorePath = null;
|
|
|
|
var handleHashChange = function handleHashChange() {
|
|
var path = getHashPath();
|
|
var encodedPath = encodePath(path);
|
|
|
|
if (path !== encodedPath) {
|
|
// Ensure we always have a properly-encoded hash.
|
|
replaceHashPath(encodedPath);
|
|
} else {
|
|
var location = getDOMLocation();
|
|
var prevLocation = history.location;
|
|
|
|
if (!forceNextPop && (0, _LocationUtils.locationsAreEqual)(prevLocation, location)) return; // A hashchange doesn't always == location change.
|
|
|
|
if (ignorePath === (0, _PathUtils.createPath)(location)) return; // Ignore this change; we already setState in push/replace.
|
|
|
|
ignorePath = null;
|
|
|
|
handlePop(location);
|
|
}
|
|
};
|
|
|
|
var handlePop = function handlePop(location) {
|
|
if (forceNextPop) {
|
|
forceNextPop = false;
|
|
setState();
|
|
} else {
|
|
var action = 'POP';
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (ok) {
|
|
setState({ action: action, location: location });
|
|
} else {
|
|
revertPop(location);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
var revertPop = function revertPop(fromLocation) {
|
|
var toLocation = history.location;
|
|
|
|
// TODO: We could probably make this more reliable by
|
|
// keeping a list of paths we've seen in sessionStorage.
|
|
// Instead, we just default to 0 for paths we don't know.
|
|
|
|
var toIndex = allPaths.lastIndexOf((0, _PathUtils.createPath)(toLocation));
|
|
|
|
if (toIndex === -1) toIndex = 0;
|
|
|
|
var fromIndex = allPaths.lastIndexOf((0, _PathUtils.createPath)(fromLocation));
|
|
|
|
if (fromIndex === -1) fromIndex = 0;
|
|
|
|
var delta = toIndex - fromIndex;
|
|
|
|
if (delta) {
|
|
forceNextPop = true;
|
|
go(delta);
|
|
}
|
|
};
|
|
|
|
// Ensure the hash is encoded properly before doing anything else.
|
|
var path = getHashPath();
|
|
var encodedPath = encodePath(path);
|
|
|
|
if (path !== encodedPath) replaceHashPath(encodedPath);
|
|
|
|
var initialLocation = getDOMLocation();
|
|
var allPaths = [(0, _PathUtils.createPath)(initialLocation)];
|
|
|
|
// Public interface
|
|
|
|
var createHref = function createHref(location) {
|
|
return '#' + encodePath(basename + (0, _PathUtils.createPath)(location));
|
|
};
|
|
|
|
var push = function push(path, state) {
|
|
(0, _warning2.default)(state === undefined, 'Hash history cannot push state; it is ignored');
|
|
|
|
var action = 'PUSH';
|
|
var location = (0, _LocationUtils.createLocation)(path, undefined, undefined, history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
var path = (0, _PathUtils.createPath)(location);
|
|
var encodedPath = encodePath(basename + path);
|
|
var hashChanged = getHashPath() !== encodedPath;
|
|
|
|
if (hashChanged) {
|
|
// We cannot tell if a hashchange was caused by a PUSH, so we'd
|
|
// rather setState here and ignore the hashchange. The caveat here
|
|
// is that other hash histories in the page will consider it a POP.
|
|
ignorePath = path;
|
|
pushHashPath(encodedPath);
|
|
|
|
var prevIndex = allPaths.lastIndexOf((0, _PathUtils.createPath)(history.location));
|
|
var nextPaths = allPaths.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);
|
|
|
|
nextPaths.push(path);
|
|
allPaths = nextPaths;
|
|
|
|
setState({ action: action, location: location });
|
|
} else {
|
|
(0, _warning2.default)(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack');
|
|
|
|
setState();
|
|
}
|
|
});
|
|
};
|
|
|
|
var replace = function replace(path, state) {
|
|
(0, _warning2.default)(state === undefined, 'Hash history cannot replace state; it is ignored');
|
|
|
|
var action = 'REPLACE';
|
|
var location = (0, _LocationUtils.createLocation)(path, undefined, undefined, history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
var path = (0, _PathUtils.createPath)(location);
|
|
var encodedPath = encodePath(basename + path);
|
|
var hashChanged = getHashPath() !== encodedPath;
|
|
|
|
if (hashChanged) {
|
|
// We cannot tell if a hashchange was caused by a REPLACE, so we'd
|
|
// rather setState here and ignore the hashchange. The caveat here
|
|
// is that other hash histories in the page will consider it a POP.
|
|
ignorePath = path;
|
|
replaceHashPath(encodedPath);
|
|
}
|
|
|
|
var prevIndex = allPaths.indexOf((0, _PathUtils.createPath)(history.location));
|
|
|
|
if (prevIndex !== -1) allPaths[prevIndex] = path;
|
|
|
|
setState({ action: action, location: location });
|
|
});
|
|
};
|
|
|
|
var go = function go(n) {
|
|
(0, _warning2.default)(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser');
|
|
|
|
globalHistory.go(n);
|
|
};
|
|
|
|
var goBack = function goBack() {
|
|
return go(-1);
|
|
};
|
|
|
|
var goForward = function goForward() {
|
|
return go(1);
|
|
};
|
|
|
|
var listenerCount = 0;
|
|
|
|
var checkDOMListeners = function checkDOMListeners(delta) {
|
|
listenerCount += delta;
|
|
|
|
if (listenerCount === 1) {
|
|
(0, _DOMUtils.addEventListener)(window, HashChangeEvent, handleHashChange);
|
|
} else if (listenerCount === 0) {
|
|
(0, _DOMUtils.removeEventListener)(window, HashChangeEvent, handleHashChange);
|
|
}
|
|
};
|
|
|
|
var isBlocked = false;
|
|
|
|
var block = function block() {
|
|
var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
|
|
var unblock = transitionManager.setPrompt(prompt);
|
|
|
|
if (!isBlocked) {
|
|
checkDOMListeners(1);
|
|
isBlocked = true;
|
|
}
|
|
|
|
return function () {
|
|
if (isBlocked) {
|
|
isBlocked = false;
|
|
checkDOMListeners(-1);
|
|
}
|
|
|
|
return unblock();
|
|
};
|
|
};
|
|
|
|
var listen = function listen(listener) {
|
|
var unlisten = transitionManager.appendListener(listener);
|
|
checkDOMListeners(1);
|
|
|
|
return function () {
|
|
checkDOMListeners(-1);
|
|
unlisten();
|
|
};
|
|
};
|
|
|
|
var history = {
|
|
length: globalHistory.length,
|
|
action: 'POP',
|
|
location: initialLocation,
|
|
createHref: createHref,
|
|
push: push,
|
|
replace: replace,
|
|
go: go,
|
|
goBack: goBack,
|
|
goForward: goForward,
|
|
block: block,
|
|
listen: listen
|
|
};
|
|
|
|
return history;
|
|
};
|
|
|
|
exports.default = createHashHistory;
|
|
|
|
/***/ }),
|
|
/* 134 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
|
|
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
} : function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
};
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _PathUtils = __webpack_require__(25);
|
|
|
|
var _LocationUtils = __webpack_require__(41);
|
|
|
|
var _createTransitionManager = __webpack_require__(42);
|
|
|
|
var _createTransitionManager2 = _interopRequireDefault(_createTransitionManager);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
}
|
|
|
|
var clamp = function clamp(n, lowerBound, upperBound) {
|
|
return Math.min(Math.max(n, lowerBound), upperBound);
|
|
};
|
|
|
|
/**
|
|
* Creates a history object that stores locations in memory.
|
|
*/
|
|
var createMemoryHistory = function createMemoryHistory() {
|
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var getUserConfirmation = props.getUserConfirmation,
|
|
_props$initialEntries = props.initialEntries,
|
|
initialEntries = _props$initialEntries === undefined ? ['/'] : _props$initialEntries,
|
|
_props$initialIndex = props.initialIndex,
|
|
initialIndex = _props$initialIndex === undefined ? 0 : _props$initialIndex,
|
|
_props$keyLength = props.keyLength,
|
|
keyLength = _props$keyLength === undefined ? 6 : _props$keyLength;
|
|
|
|
var transitionManager = (0, _createTransitionManager2.default)();
|
|
|
|
var setState = function setState(nextState) {
|
|
_extends(history, nextState);
|
|
|
|
history.length = history.entries.length;
|
|
|
|
transitionManager.notifyListeners(history.location, history.action);
|
|
};
|
|
|
|
var createKey = function createKey() {
|
|
return Math.random().toString(36).substr(2, keyLength);
|
|
};
|
|
|
|
var index = clamp(initialIndex, 0, initialEntries.length - 1);
|
|
var entries = initialEntries.map(function (entry) {
|
|
return typeof entry === 'string' ? (0, _LocationUtils.createLocation)(entry, undefined, createKey()) : (0, _LocationUtils.createLocation)(entry, undefined, entry.key || createKey());
|
|
});
|
|
|
|
// Public interface
|
|
|
|
var createHref = _PathUtils.createPath;
|
|
|
|
var push = function push(path, state) {
|
|
(0, _warning2.default)(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored');
|
|
|
|
var action = 'PUSH';
|
|
var location = (0, _LocationUtils.createLocation)(path, state, createKey(), history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
var prevIndex = history.index;
|
|
var nextIndex = prevIndex + 1;
|
|
|
|
var nextEntries = history.entries.slice(0);
|
|
if (nextEntries.length > nextIndex) {
|
|
nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);
|
|
} else {
|
|
nextEntries.push(location);
|
|
}
|
|
|
|
setState({
|
|
action: action,
|
|
location: location,
|
|
index: nextIndex,
|
|
entries: nextEntries
|
|
});
|
|
});
|
|
};
|
|
|
|
var replace = function replace(path, state) {
|
|
(0, _warning2.default)(!((typeof path === 'undefined' ? 'undefined' : _typeof(path)) === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored');
|
|
|
|
var action = 'REPLACE';
|
|
var location = (0, _LocationUtils.createLocation)(path, state, createKey(), history.location);
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (!ok) return;
|
|
|
|
history.entries[history.index] = location;
|
|
|
|
setState({ action: action, location: location });
|
|
});
|
|
};
|
|
|
|
var go = function go(n) {
|
|
var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);
|
|
|
|
var action = 'POP';
|
|
var location = history.entries[nextIndex];
|
|
|
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
|
if (ok) {
|
|
setState({
|
|
action: action,
|
|
location: location,
|
|
index: nextIndex
|
|
});
|
|
} else {
|
|
// Mimic the behavior of DOM histories by
|
|
// causing a render after a cancelled POP.
|
|
setState();
|
|
}
|
|
});
|
|
};
|
|
|
|
var goBack = function goBack() {
|
|
return go(-1);
|
|
};
|
|
|
|
var goForward = function goForward() {
|
|
return go(1);
|
|
};
|
|
|
|
var canGo = function canGo(n) {
|
|
var nextIndex = history.index + n;
|
|
return nextIndex >= 0 && nextIndex < history.entries.length;
|
|
};
|
|
|
|
var block = function block() {
|
|
var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
return transitionManager.setPrompt(prompt);
|
|
};
|
|
|
|
var listen = function listen(listener) {
|
|
return transitionManager.appendListener(listener);
|
|
};
|
|
|
|
var history = {
|
|
length: entries.length,
|
|
action: 'POP',
|
|
location: entries[index],
|
|
index: index,
|
|
entries: entries,
|
|
createHref: createHref,
|
|
push: push,
|
|
replace: replace,
|
|
go: go,
|
|
goBack: goBack,
|
|
goForward: goForward,
|
|
canGo: canGo,
|
|
block: block,
|
|
listen: listen
|
|
};
|
|
|
|
return history;
|
|
};
|
|
|
|
exports.default = createMemoryHistory;
|
|
|
|
/***/ }),
|
|
/* 135 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _Symbol2 = __webpack_require__(70);
|
|
|
|
var _Symbol3 = _interopRequireDefault(_Symbol2);
|
|
|
|
var _getRawTag = __webpack_require__(138);
|
|
|
|
var _getRawTag2 = _interopRequireDefault(_getRawTag);
|
|
|
|
var _objectToString = __webpack_require__(139);
|
|
|
|
var _objectToString2 = _interopRequireDefault(_objectToString);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** `Object#toString` result references. */
|
|
var nullTag = '[object Null]',
|
|
undefinedTag = '[object Undefined]';
|
|
|
|
/** Built-in value references. */
|
|
var symToStringTag = _Symbol3.default ? _Symbol3.default.toStringTag : undefined;
|
|
|
|
/**
|
|
* The base implementation of `getTag` without fallbacks for buggy environments.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to query.
|
|
* @returns {string} Returns the `toStringTag`.
|
|
*/
|
|
function baseGetTag(value) {
|
|
if (value == null) {
|
|
return value === undefined ? undefinedTag : nullTag;
|
|
}
|
|
return symToStringTag && symToStringTag in Object(value) ? (0, _getRawTag2.default)(value) : (0, _objectToString2.default)(value);
|
|
}
|
|
|
|
exports.default = baseGetTag;
|
|
|
|
/***/ }),
|
|
/* 136 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(global) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
/** Detect free variable `global` from Node.js. */
|
|
var freeGlobal = (typeof global === 'undefined' ? 'undefined' : _typeof(global)) == 'object' && global && global.Object === Object && global;
|
|
|
|
exports.default = freeGlobal;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(109)))
|
|
|
|
/***/ }),
|
|
/* 137 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _overArg = __webpack_require__(140);
|
|
|
|
var _overArg2 = _interopRequireDefault(_overArg);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** Built-in value references. */
|
|
var getPrototype = (0, _overArg2.default)(Object.getPrototypeOf, Object);
|
|
|
|
exports.default = getPrototype;
|
|
|
|
/***/ }),
|
|
/* 138 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _Symbol2 = __webpack_require__(70);
|
|
|
|
var _Symbol3 = _interopRequireDefault(_Symbol2);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** Used for built-in method references. */
|
|
var objectProto = Object.prototype;
|
|
|
|
/** Used to check objects for own properties. */
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
/**
|
|
* Used to resolve the
|
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|
* of values.
|
|
*/
|
|
var nativeObjectToString = objectProto.toString;
|
|
|
|
/** Built-in value references. */
|
|
var symToStringTag = _Symbol3.default ? _Symbol3.default.toStringTag : undefined;
|
|
|
|
/**
|
|
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to query.
|
|
* @returns {string} Returns the raw `toStringTag`.
|
|
*/
|
|
function getRawTag(value) {
|
|
var isOwn = hasOwnProperty.call(value, symToStringTag),
|
|
tag = value[symToStringTag];
|
|
|
|
try {
|
|
value[symToStringTag] = undefined;
|
|
var unmasked = true;
|
|
} catch (e) {}
|
|
|
|
var result = nativeObjectToString.call(value);
|
|
if (unmasked) {
|
|
if (isOwn) {
|
|
value[symToStringTag] = tag;
|
|
} else {
|
|
delete value[symToStringTag];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
exports.default = getRawTag;
|
|
|
|
/***/ }),
|
|
/* 139 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
/** Used for built-in method references. */
|
|
var objectProto = Object.prototype;
|
|
|
|
/**
|
|
* Used to resolve the
|
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|
* of values.
|
|
*/
|
|
var nativeObjectToString = objectProto.toString;
|
|
|
|
/**
|
|
* Converts `value` to a string using `Object.prototype.toString`.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to convert.
|
|
* @returns {string} Returns the converted string.
|
|
*/
|
|
function objectToString(value) {
|
|
return nativeObjectToString.call(value);
|
|
}
|
|
|
|
exports.default = objectToString;
|
|
|
|
/***/ }),
|
|
/* 140 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
/**
|
|
* Creates a unary function that invokes `func` with its argument transformed.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {Function} transform The argument transform.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
function overArg(func, transform) {
|
|
return function (arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
|
|
exports.default = overArg;
|
|
|
|
/***/ }),
|
|
/* 141 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _freeGlobal = __webpack_require__(136);
|
|
|
|
var _freeGlobal2 = _interopRequireDefault(_freeGlobal);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/** Detect free variable `self`. */
|
|
var freeSelf = (typeof self === 'undefined' ? 'undefined' : _typeof(self)) == 'object' && self && self.Object === Object && self;
|
|
|
|
/** Used as a reference to the global object. */
|
|
var root = _freeGlobal2.default || freeSelf || Function('return this')();
|
|
|
|
exports.default = root;
|
|
|
|
/***/ }),
|
|
/* 142 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
/**
|
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|
* and has a `typeof` result of "object".
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|
* @example
|
|
*
|
|
* _.isObjectLike({});
|
|
* // => true
|
|
*
|
|
* _.isObjectLike([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isObjectLike(_.noop);
|
|
* // => false
|
|
*
|
|
* _.isObjectLike(null);
|
|
* // => false
|
|
*/
|
|
function isObjectLike(value) {
|
|
return value != null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object';
|
|
}
|
|
|
|
exports.default = isObjectLike;
|
|
|
|
/***/ }),
|
|
/* 143 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
var ReactPropTypesSecret = __webpack_require__(44);
|
|
var loggedTypeFailures = {};
|
|
}
|
|
|
|
/**
|
|
* Assert that the values match with the type specs.
|
|
* Error messages are memorized and will only be shown once.
|
|
*
|
|
* @param {object} typeSpecs Map of name to a ReactPropType
|
|
* @param {object} values Runtime values that need to be type-checked
|
|
* @param {string} location e.g. "prop", "context", "child context"
|
|
* @param {string} componentName Name of the component for error messages.
|
|
* @param {?Function} getStack Returns the component stack.
|
|
* @private
|
|
*/
|
|
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
for (var typeSpecName in typeSpecs) {
|
|
if (typeSpecs.hasOwnProperty(typeSpecName)) {
|
|
var error;
|
|
// Prop type validation may throw. In case they do, we don't want to
|
|
// fail the render phase where it didn't fail before. So we log it.
|
|
// After these have been cleaned up, we'll let them throw.
|
|
try {
|
|
// This is intentionally an invariant that gets caught. It's the same
|
|
// behavior as without this statement except with a better message.
|
|
invariant(typeof typeSpecs[typeSpecName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', location, typeSpecName);
|
|
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
|
|
} catch (ex) {
|
|
error = ex;
|
|
}
|
|
warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error === 'undefined' ? 'undefined' : _typeof(error));
|
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
|
// Only monitor this failure once because there tends to be a lot of the
|
|
// same error.
|
|
loggedTypeFailures[error.message] = true;
|
|
|
|
var stack = getStack ? getStack() : '';
|
|
|
|
warning(false, 'Failed %s type: %s%s', location, error.message, stack != null ? stack : '');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = checkPropTypes;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 144 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var invariant = __webpack_require__(1);
|
|
var ReactPropTypesSecret = __webpack_require__(44);
|
|
|
|
module.exports = function () {
|
|
function shim(props, propName, componentName, location, propFullName, secret) {
|
|
if (secret === ReactPropTypesSecret) {
|
|
// It is still safe when called from React.
|
|
return;
|
|
}
|
|
invariant(false, 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 'Use PropTypes.checkPropTypes() to call them. ' + 'Read more at http://fb.me/use-check-prop-types');
|
|
};
|
|
shim.isRequired = shim;
|
|
function getShim() {
|
|
return shim;
|
|
};
|
|
// Important!
|
|
// Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
|
|
var ReactPropTypes = {
|
|
array: shim,
|
|
bool: shim,
|
|
func: shim,
|
|
number: shim,
|
|
object: shim,
|
|
string: shim,
|
|
symbol: shim,
|
|
|
|
any: shim,
|
|
arrayOf: getShim,
|
|
element: shim,
|
|
instanceOf: getShim,
|
|
node: shim,
|
|
objectOf: getShim,
|
|
oneOf: getShim,
|
|
oneOfType: getShim,
|
|
shape: getShim
|
|
};
|
|
|
|
ReactPropTypes.checkPropTypes = emptyFunction;
|
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
|
|
return ReactPropTypes;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 145 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ARIADOMPropertyConfig = {
|
|
Properties: {
|
|
// Global States and Properties
|
|
'aria-current': 0, // state
|
|
'aria-details': 0,
|
|
'aria-disabled': 0, // state
|
|
'aria-hidden': 0, // state
|
|
'aria-invalid': 0, // state
|
|
'aria-keyshortcuts': 0,
|
|
'aria-label': 0,
|
|
'aria-roledescription': 0,
|
|
// Widget Attributes
|
|
'aria-autocomplete': 0,
|
|
'aria-checked': 0,
|
|
'aria-expanded': 0,
|
|
'aria-haspopup': 0,
|
|
'aria-level': 0,
|
|
'aria-modal': 0,
|
|
'aria-multiline': 0,
|
|
'aria-multiselectable': 0,
|
|
'aria-orientation': 0,
|
|
'aria-placeholder': 0,
|
|
'aria-pressed': 0,
|
|
'aria-readonly': 0,
|
|
'aria-required': 0,
|
|
'aria-selected': 0,
|
|
'aria-sort': 0,
|
|
'aria-valuemax': 0,
|
|
'aria-valuemin': 0,
|
|
'aria-valuenow': 0,
|
|
'aria-valuetext': 0,
|
|
// Live Region Attributes
|
|
'aria-atomic': 0,
|
|
'aria-busy': 0,
|
|
'aria-live': 0,
|
|
'aria-relevant': 0,
|
|
// Drag-and-Drop Attributes
|
|
'aria-dropeffect': 0,
|
|
'aria-grabbed': 0,
|
|
// Relationship Attributes
|
|
'aria-activedescendant': 0,
|
|
'aria-colcount': 0,
|
|
'aria-colindex': 0,
|
|
'aria-colspan': 0,
|
|
'aria-controls': 0,
|
|
'aria-describedby': 0,
|
|
'aria-errormessage': 0,
|
|
'aria-flowto': 0,
|
|
'aria-labelledby': 0,
|
|
'aria-owns': 0,
|
|
'aria-posinset': 0,
|
|
'aria-rowcount': 0,
|
|
'aria-rowindex': 0,
|
|
'aria-rowspan': 0,
|
|
'aria-setsize': 0
|
|
},
|
|
DOMAttributeNames: {},
|
|
DOMPropertyNames: {}
|
|
};
|
|
|
|
module.exports = ARIADOMPropertyConfig;
|
|
|
|
/***/ }),
|
|
/* 146 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
|
|
var focusNode = __webpack_require__(66);
|
|
|
|
var AutoFocusUtils = {
|
|
focusDOMComponent: function focusDOMComponent() {
|
|
focusNode(ReactDOMComponentTree.getNodeFromInstance(this));
|
|
}
|
|
};
|
|
|
|
module.exports = AutoFocusUtils;
|
|
|
|
/***/ }),
|
|
/* 147 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var EventPropagators = __webpack_require__(28);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var FallbackCompositionState = __webpack_require__(153);
|
|
var SyntheticCompositionEvent = __webpack_require__(196);
|
|
var SyntheticInputEvent = __webpack_require__(199);
|
|
|
|
var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
|
|
var START_KEYCODE = 229;
|
|
|
|
var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;
|
|
|
|
var documentMode = null;
|
|
if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {
|
|
documentMode = document.documentMode;
|
|
}
|
|
|
|
// Webkit offers a very useful `textInput` event that can be used to
|
|
// directly represent `beforeInput`. The IE `textinput` event is not as
|
|
// useful, so we don't use it.
|
|
var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();
|
|
|
|
// In IE9+, we have access to composition events, but the data supplied
|
|
// by the native compositionend event may be incorrect. Japanese ideographic
|
|
// spaces, for instance (\u3000) are not recorded correctly.
|
|
var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
|
|
|
|
/**
|
|
* Opera <= 12 includes TextEvent in window, but does not fire
|
|
* text input events. Rely on keypress instead.
|
|
*/
|
|
function isPresto() {
|
|
var opera = window.opera;
|
|
return (typeof opera === 'undefined' ? 'undefined' : _typeof(opera)) === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;
|
|
}
|
|
|
|
var SPACEBAR_CODE = 32;
|
|
var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
|
|
|
|
// Events and their corresponding property names.
|
|
var eventTypes = {
|
|
beforeInput: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onBeforeInput',
|
|
captured: 'onBeforeInputCapture'
|
|
},
|
|
dependencies: ['topCompositionEnd', 'topKeyPress', 'topTextInput', 'topPaste']
|
|
},
|
|
compositionEnd: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onCompositionEnd',
|
|
captured: 'onCompositionEndCapture'
|
|
},
|
|
dependencies: ['topBlur', 'topCompositionEnd', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
|
},
|
|
compositionStart: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onCompositionStart',
|
|
captured: 'onCompositionStartCapture'
|
|
},
|
|
dependencies: ['topBlur', 'topCompositionStart', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
|
},
|
|
compositionUpdate: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onCompositionUpdate',
|
|
captured: 'onCompositionUpdateCapture'
|
|
},
|
|
dependencies: ['topBlur', 'topCompositionUpdate', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
|
}
|
|
};
|
|
|
|
// Track whether we've ever handled a keypress on the space key.
|
|
var hasSpaceKeypress = false;
|
|
|
|
/**
|
|
* Return whether a native keypress event is assumed to be a command.
|
|
* This is required because Firefox fires `keypress` events for key commands
|
|
* (cut, copy, select-all, etc.) even though no character is inserted.
|
|
*/
|
|
function isKeypressCommand(nativeEvent) {
|
|
return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
|
|
// ctrlKey && altKey is equivalent to AltGr, and is not a command.
|
|
!(nativeEvent.ctrlKey && nativeEvent.altKey);
|
|
}
|
|
|
|
/**
|
|
* Translate native top level events into event types.
|
|
*
|
|
* @param {string} topLevelType
|
|
* @return {object}
|
|
*/
|
|
function getCompositionEventType(topLevelType) {
|
|
switch (topLevelType) {
|
|
case 'topCompositionStart':
|
|
return eventTypes.compositionStart;
|
|
case 'topCompositionEnd':
|
|
return eventTypes.compositionEnd;
|
|
case 'topCompositionUpdate':
|
|
return eventTypes.compositionUpdate;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Does our fallback best-guess model think this event signifies that
|
|
* composition has begun?
|
|
*
|
|
* @param {string} topLevelType
|
|
* @param {object} nativeEvent
|
|
* @return {boolean}
|
|
*/
|
|
function isFallbackCompositionStart(topLevelType, nativeEvent) {
|
|
return topLevelType === 'topKeyDown' && nativeEvent.keyCode === START_KEYCODE;
|
|
}
|
|
|
|
/**
|
|
* Does our fallback mode think that this event is the end of composition?
|
|
*
|
|
* @param {string} topLevelType
|
|
* @param {object} nativeEvent
|
|
* @return {boolean}
|
|
*/
|
|
function isFallbackCompositionEnd(topLevelType, nativeEvent) {
|
|
switch (topLevelType) {
|
|
case 'topKeyUp':
|
|
// Command keys insert or clear IME input.
|
|
return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
|
|
case 'topKeyDown':
|
|
// Expect IME keyCode on each keydown. If we get any other
|
|
// code we must have exited earlier.
|
|
return nativeEvent.keyCode !== START_KEYCODE;
|
|
case 'topKeyPress':
|
|
case 'topMouseDown':
|
|
case 'topBlur':
|
|
// Events are not possible without cancelling IME.
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Google Input Tools provides composition data via a CustomEvent,
|
|
* with the `data` property populated in the `detail` object. If this
|
|
* is available on the event object, use it. If not, this is a plain
|
|
* composition event and we have nothing special to extract.
|
|
*
|
|
* @param {object} nativeEvent
|
|
* @return {?string}
|
|
*/
|
|
function getDataFromCustomEvent(nativeEvent) {
|
|
var detail = nativeEvent.detail;
|
|
if ((typeof detail === 'undefined' ? 'undefined' : _typeof(detail)) === 'object' && 'data' in detail) {
|
|
return detail.data;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Track the current IME composition fallback object, if any.
|
|
var currentComposition = null;
|
|
|
|
/**
|
|
* @return {?object} A SyntheticCompositionEvent.
|
|
*/
|
|
function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var eventType;
|
|
var fallbackData;
|
|
|
|
if (canUseCompositionEvent) {
|
|
eventType = getCompositionEventType(topLevelType);
|
|
} else if (!currentComposition) {
|
|
if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
|
|
eventType = eventTypes.compositionStart;
|
|
}
|
|
} else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
|
eventType = eventTypes.compositionEnd;
|
|
}
|
|
|
|
if (!eventType) {
|
|
return null;
|
|
}
|
|
|
|
if (useFallbackCompositionData) {
|
|
// The current composition is stored statically and must not be
|
|
// overwritten while composition continues.
|
|
if (!currentComposition && eventType === eventTypes.compositionStart) {
|
|
currentComposition = FallbackCompositionState.getPooled(nativeEventTarget);
|
|
} else if (eventType === eventTypes.compositionEnd) {
|
|
if (currentComposition) {
|
|
fallbackData = currentComposition.getData();
|
|
}
|
|
}
|
|
}
|
|
|
|
var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
|
|
|
|
if (fallbackData) {
|
|
// Inject data generated from fallback path into the synthetic event.
|
|
// This matches the property of native CompositionEventInterface.
|
|
event.data = fallbackData;
|
|
} else {
|
|
var customData = getDataFromCustomEvent(nativeEvent);
|
|
if (customData !== null) {
|
|
event.data = customData;
|
|
}
|
|
}
|
|
|
|
EventPropagators.accumulateTwoPhaseDispatches(event);
|
|
return event;
|
|
}
|
|
|
|
/**
|
|
* @param {string} topLevelType Record from `EventConstants`.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @return {?string} The string corresponding to this `beforeInput` event.
|
|
*/
|
|
function getNativeBeforeInputChars(topLevelType, nativeEvent) {
|
|
switch (topLevelType) {
|
|
case 'topCompositionEnd':
|
|
return getDataFromCustomEvent(nativeEvent);
|
|
case 'topKeyPress':
|
|
/**
|
|
* If native `textInput` events are available, our goal is to make
|
|
* use of them. However, there is a special case: the spacebar key.
|
|
* In Webkit, preventing default on a spacebar `textInput` event
|
|
* cancels character insertion, but it *also* causes the browser
|
|
* to fall back to its default spacebar behavior of scrolling the
|
|
* page.
|
|
*
|
|
* Tracking at:
|
|
* https://code.google.com/p/chromium/issues/detail?id=355103
|
|
*
|
|
* To avoid this issue, use the keypress event as if no `textInput`
|
|
* event is available.
|
|
*/
|
|
var which = nativeEvent.which;
|
|
if (which !== SPACEBAR_CODE) {
|
|
return null;
|
|
}
|
|
|
|
hasSpaceKeypress = true;
|
|
return SPACEBAR_CHAR;
|
|
|
|
case 'topTextInput':
|
|
// Record the characters to be added to the DOM.
|
|
var chars = nativeEvent.data;
|
|
|
|
// If it's a spacebar character, assume that we have already handled
|
|
// it at the keypress level and bail immediately. Android Chrome
|
|
// doesn't give us keycodes, so we need to blacklist it.
|
|
if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
|
|
return null;
|
|
}
|
|
|
|
return chars;
|
|
|
|
default:
|
|
// For other native event types, do nothing.
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* For browsers that do not provide the `textInput` event, extract the
|
|
* appropriate string to use for SyntheticInputEvent.
|
|
*
|
|
* @param {string} topLevelType Record from `EventConstants`.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @return {?string} The fallback string for this `beforeInput` event.
|
|
*/
|
|
function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
|
|
// If we are currently composing (IME) and using a fallback to do so,
|
|
// try to extract the composed characters from the fallback object.
|
|
// If composition event is available, we extract a string only at
|
|
// compositionevent, otherwise extract it at fallback events.
|
|
if (currentComposition) {
|
|
if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
|
var chars = currentComposition.getData();
|
|
FallbackCompositionState.release(currentComposition);
|
|
currentComposition = null;
|
|
return chars;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
switch (topLevelType) {
|
|
case 'topPaste':
|
|
// If a paste event occurs after a keypress, throw out the input
|
|
// chars. Paste events should not lead to BeforeInput events.
|
|
return null;
|
|
case 'topKeyPress':
|
|
/**
|
|
* As of v27, Firefox may fire keypress events even when no character
|
|
* will be inserted. A few possibilities:
|
|
*
|
|
* - `which` is `0`. Arrow keys, Esc key, etc.
|
|
*
|
|
* - `which` is the pressed key code, but no char is available.
|
|
* Ex: 'AltGr + d` in Polish. There is no modified character for
|
|
* this key combination and no character is inserted into the
|
|
* document, but FF fires the keypress for char code `100` anyway.
|
|
* No `input` event will occur.
|
|
*
|
|
* - `which` is the pressed key code, but a command combination is
|
|
* being used. Ex: `Cmd+C`. No character is inserted, and no
|
|
* `input` event will occur.
|
|
*/
|
|
if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
|
|
return String.fromCharCode(nativeEvent.which);
|
|
}
|
|
return null;
|
|
case 'topCompositionEnd':
|
|
return useFallbackCompositionData ? null : nativeEvent.data;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Extract a SyntheticInputEvent for `beforeInput`, based on either native
|
|
* `textInput` or fallback behavior.
|
|
*
|
|
* @return {?object} A SyntheticInputEvent.
|
|
*/
|
|
function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var chars;
|
|
|
|
if (canUseTextInputEvent) {
|
|
chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
|
|
} else {
|
|
chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
|
|
}
|
|
|
|
// If no characters are being inserted, no BeforeInput event should
|
|
// be fired.
|
|
if (!chars) {
|
|
return null;
|
|
}
|
|
|
|
var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
|
|
|
|
event.data = chars;
|
|
EventPropagators.accumulateTwoPhaseDispatches(event);
|
|
return event;
|
|
}
|
|
|
|
/**
|
|
* Create an `onBeforeInput` event to match
|
|
* http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
|
|
*
|
|
* This event plugin is based on the native `textInput` event
|
|
* available in Chrome, Safari, Opera, and IE. This event fires after
|
|
* `onKeyPress` and `onCompositionEnd`, but before `onInput`.
|
|
*
|
|
* `beforeInput` is spec'd but not implemented in any browsers, and
|
|
* the `input` event does not provide any useful information about what has
|
|
* actually been added, contrary to the spec. Thus, `textInput` is the best
|
|
* available event to identify the characters that have actually been inserted
|
|
* into the target node.
|
|
*
|
|
* This plugin is also responsible for emitting `composition` events, thus
|
|
* allowing us to share composition fallback code for both `beforeInput` and
|
|
* `composition` event types.
|
|
*/
|
|
var BeforeInputEventPlugin = {
|
|
eventTypes: eventTypes,
|
|
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)];
|
|
}
|
|
};
|
|
|
|
module.exports = BeforeInputEventPlugin;
|
|
|
|
/***/ }),
|
|
/* 148 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var CSSProperty = __webpack_require__(73);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
|
|
var camelizeStyleName = __webpack_require__(119);
|
|
var dangerousStyleValue = __webpack_require__(206);
|
|
var hyphenateStyleName = __webpack_require__(126);
|
|
var memoizeStringOnly = __webpack_require__(129);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var processStyleName = memoizeStringOnly(function (styleName) {
|
|
return hyphenateStyleName(styleName);
|
|
});
|
|
|
|
var hasShorthandPropertyBug = false;
|
|
var styleFloatAccessor = 'cssFloat';
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
var tempStyle = document.createElement('div').style;
|
|
try {
|
|
// IE8 throws "Invalid argument." if resetting shorthand style properties.
|
|
tempStyle.font = '';
|
|
} catch (e) {
|
|
hasShorthandPropertyBug = true;
|
|
}
|
|
// IE8 only supports accessing cssFloat (standard) as styleFloat
|
|
if (document.documentElement.style.cssFloat === undefined) {
|
|
styleFloatAccessor = 'styleFloat';
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// 'msTransform' is correct, but the other prefixes should be capitalized
|
|
var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
|
|
|
|
// style values shouldn't contain a semicolon
|
|
var badStyleValueWithSemicolonPattern = /;\s*$/;
|
|
|
|
var warnedStyleNames = {};
|
|
var warnedStyleValues = {};
|
|
var warnedForNaNValue = false;
|
|
|
|
var warnHyphenatedStyleName = function warnHyphenatedStyleName(name, owner) {
|
|
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleNames[name] = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), checkRenderMessage(owner)) : void 0;
|
|
};
|
|
|
|
var warnBadVendoredStyleName = function warnBadVendoredStyleName(name, owner) {
|
|
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleNames[name] = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner)) : void 0;
|
|
};
|
|
|
|
var warnStyleValueWithSemicolon = function warnStyleValueWithSemicolon(name, value, owner) {
|
|
if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleValues[value] = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, "Style property values shouldn't contain a semicolon.%s " + 'Try "%s: %s" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, '')) : void 0;
|
|
};
|
|
|
|
var warnStyleValueIsNaN = function warnStyleValueIsNaN(name, value, owner) {
|
|
if (warnedForNaNValue) {
|
|
return;
|
|
}
|
|
|
|
warnedForNaNValue = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner)) : void 0;
|
|
};
|
|
|
|
var checkRenderMessage = function checkRenderMessage(owner) {
|
|
if (owner) {
|
|
var name = owner.getName();
|
|
if (name) {
|
|
return ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
};
|
|
|
|
/**
|
|
* @param {string} name
|
|
* @param {*} value
|
|
* @param {ReactDOMComponent} component
|
|
*/
|
|
var warnValidStyle = function warnValidStyle(name, value, component) {
|
|
var owner;
|
|
if (component) {
|
|
owner = component._currentElement._owner;
|
|
}
|
|
if (name.indexOf('-') > -1) {
|
|
warnHyphenatedStyleName(name, owner);
|
|
} else if (badVendoredStyleNamePattern.test(name)) {
|
|
warnBadVendoredStyleName(name, owner);
|
|
} else if (badStyleValueWithSemicolonPattern.test(value)) {
|
|
warnStyleValueWithSemicolon(name, value, owner);
|
|
}
|
|
|
|
if (typeof value === 'number' && isNaN(value)) {
|
|
warnStyleValueIsNaN(name, value, owner);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Operations for dealing with CSS properties.
|
|
*/
|
|
var CSSPropertyOperations = {
|
|
/**
|
|
* Serializes a mapping of style properties for use as inline styles:
|
|
*
|
|
* > createMarkupForStyles({width: '200px', height: 0})
|
|
* "width:200px;height:0;"
|
|
*
|
|
* Undefined values are ignored so that declarative programming is easier.
|
|
* The result should be HTML-escaped before insertion into the DOM.
|
|
*
|
|
* @param {object} styles
|
|
* @param {ReactDOMComponent} component
|
|
* @return {?string}
|
|
*/
|
|
createMarkupForStyles: function createMarkupForStyles(styles, component) {
|
|
var serialized = '';
|
|
for (var styleName in styles) {
|
|
if (!styles.hasOwnProperty(styleName)) {
|
|
continue;
|
|
}
|
|
var isCustomProperty = styleName.indexOf('--') === 0;
|
|
var styleValue = styles[styleName];
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!isCustomProperty) {
|
|
warnValidStyle(styleName, styleValue, component);
|
|
}
|
|
}
|
|
if (styleValue != null) {
|
|
serialized += processStyleName(styleName) + ':';
|
|
serialized += dangerousStyleValue(styleName, styleValue, component, isCustomProperty) + ';';
|
|
}
|
|
}
|
|
return serialized || null;
|
|
},
|
|
|
|
/**
|
|
* Sets the value for multiple styles on a node. If a value is specified as
|
|
* '' (empty string), the corresponding style property will be unset.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @param {object} styles
|
|
* @param {ReactDOMComponent} component
|
|
*/
|
|
setValueForStyles: function setValueForStyles(node, styles, component) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onHostOperation({
|
|
instanceID: component._debugID,
|
|
type: 'update styles',
|
|
payload: styles
|
|
});
|
|
}
|
|
|
|
var style = node.style;
|
|
for (var styleName in styles) {
|
|
if (!styles.hasOwnProperty(styleName)) {
|
|
continue;
|
|
}
|
|
var isCustomProperty = styleName.indexOf('--') === 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!isCustomProperty) {
|
|
warnValidStyle(styleName, styles[styleName], component);
|
|
}
|
|
}
|
|
var styleValue = dangerousStyleValue(styleName, styles[styleName], component, isCustomProperty);
|
|
if (styleName === 'float' || styleName === 'cssFloat') {
|
|
styleName = styleFloatAccessor;
|
|
}
|
|
if (isCustomProperty) {
|
|
style.setProperty(styleName, styleValue);
|
|
} else if (styleValue) {
|
|
style[styleName] = styleValue;
|
|
} else {
|
|
var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];
|
|
if (expansion) {
|
|
// Shorthand property that IE8 won't like unsetting, so unset each
|
|
// component to placate it
|
|
for (var individualStyleName in expansion) {
|
|
style[individualStyleName] = '';
|
|
}
|
|
} else {
|
|
style[styleName] = '';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = CSSPropertyOperations;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 149 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var EventPluginHub = __webpack_require__(27);
|
|
var EventPropagators = __webpack_require__(28);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
var inputValueTracking = __webpack_require__(90);
|
|
var getEventTarget = __webpack_require__(56);
|
|
var isEventSupported = __webpack_require__(57);
|
|
var isTextInputElement = __webpack_require__(92);
|
|
|
|
var eventTypes = {
|
|
change: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onChange',
|
|
captured: 'onChangeCapture'
|
|
},
|
|
dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange']
|
|
}
|
|
};
|
|
|
|
function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
|
|
var event = SyntheticEvent.getPooled(eventTypes.change, inst, nativeEvent, target);
|
|
event.type = 'change';
|
|
EventPropagators.accumulateTwoPhaseDispatches(event);
|
|
return event;
|
|
}
|
|
/**
|
|
* For IE shims
|
|
*/
|
|
var activeElement = null;
|
|
var activeElementInst = null;
|
|
|
|
/**
|
|
* SECTION: handle `change` event
|
|
*/
|
|
function shouldUseChangeEvent(elem) {
|
|
var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
|
|
return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
|
|
}
|
|
|
|
var doesChangeEventBubble = false;
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
// See `handleChange` comment below
|
|
doesChangeEventBubble = isEventSupported('change') && (!document.documentMode || document.documentMode > 8);
|
|
}
|
|
|
|
function manualDispatchChangeEvent(nativeEvent) {
|
|
var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent));
|
|
|
|
// If change and propertychange bubbled, we'd just bind to it like all the
|
|
// other events and have it go through ReactBrowserEventEmitter. Since it
|
|
// doesn't, we manually listen for the events and so we have to enqueue and
|
|
// process the abstract event manually.
|
|
//
|
|
// Batching is necessary here in order to ensure that all event handlers run
|
|
// before the next rerender (including event handlers attached to ancestor
|
|
// elements instead of directly on the input). Without this, controlled
|
|
// components don't work properly in conjunction with event bubbling because
|
|
// the component is rerendered and the value reverted before all the event
|
|
// handlers can run. See https://github.com/facebook/react/issues/708.
|
|
ReactUpdates.batchedUpdates(runEventInBatch, event);
|
|
}
|
|
|
|
function runEventInBatch(event) {
|
|
EventPluginHub.enqueueEvents(event);
|
|
EventPluginHub.processEventQueue(false);
|
|
}
|
|
|
|
function startWatchingForChangeEventIE8(target, targetInst) {
|
|
activeElement = target;
|
|
activeElementInst = targetInst;
|
|
activeElement.attachEvent('onchange', manualDispatchChangeEvent);
|
|
}
|
|
|
|
function stopWatchingForChangeEventIE8() {
|
|
if (!activeElement) {
|
|
return;
|
|
}
|
|
activeElement.detachEvent('onchange', manualDispatchChangeEvent);
|
|
activeElement = null;
|
|
activeElementInst = null;
|
|
}
|
|
|
|
function getInstIfValueChanged(targetInst, nativeEvent) {
|
|
var updated = inputValueTracking.updateValueIfChanged(targetInst);
|
|
var simulated = nativeEvent.simulated === true && ChangeEventPlugin._allowSimulatedPassThrough;
|
|
|
|
if (updated || simulated) {
|
|
return targetInst;
|
|
}
|
|
}
|
|
|
|
function getTargetInstForChangeEvent(topLevelType, targetInst) {
|
|
if (topLevelType === 'topChange') {
|
|
return targetInst;
|
|
}
|
|
}
|
|
|
|
function handleEventsForChangeEventIE8(topLevelType, target, targetInst) {
|
|
if (topLevelType === 'topFocus') {
|
|
// stopWatching() should be a noop here but we call it just in case we
|
|
// missed a blur event somehow.
|
|
stopWatchingForChangeEventIE8();
|
|
startWatchingForChangeEventIE8(target, targetInst);
|
|
} else if (topLevelType === 'topBlur') {
|
|
stopWatchingForChangeEventIE8();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* SECTION: handle `input` event
|
|
*/
|
|
var isInputEventSupported = false;
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
// IE9 claims to support the input event but fails to trigger it when
|
|
// deleting text, so we ignore its input events.
|
|
|
|
isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);
|
|
}
|
|
|
|
/**
|
|
* (For IE <=9) Starts tracking propertychange events on the passed-in element
|
|
* and override the value property so that we can distinguish user events from
|
|
* value changes in JS.
|
|
*/
|
|
function startWatchingForValueChange(target, targetInst) {
|
|
activeElement = target;
|
|
activeElementInst = targetInst;
|
|
activeElement.attachEvent('onpropertychange', handlePropertyChange);
|
|
}
|
|
|
|
/**
|
|
* (For IE <=9) Removes the event listeners from the currently-tracked element,
|
|
* if any exists.
|
|
*/
|
|
function stopWatchingForValueChange() {
|
|
if (!activeElement) {
|
|
return;
|
|
}
|
|
activeElement.detachEvent('onpropertychange', handlePropertyChange);
|
|
|
|
activeElement = null;
|
|
activeElementInst = null;
|
|
}
|
|
|
|
/**
|
|
* (For IE <=9) Handles a propertychange event, sending a `change` event if
|
|
* the value of the active element has changed.
|
|
*/
|
|
function handlePropertyChange(nativeEvent) {
|
|
if (nativeEvent.propertyName !== 'value') {
|
|
return;
|
|
}
|
|
if (getInstIfValueChanged(activeElementInst, nativeEvent)) {
|
|
manualDispatchChangeEvent(nativeEvent);
|
|
}
|
|
}
|
|
|
|
function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
|
|
if (topLevelType === 'topFocus') {
|
|
// In IE8, we can capture almost all .value changes by adding a
|
|
// propertychange handler and looking for events with propertyName
|
|
// equal to 'value'
|
|
// In IE9, propertychange fires for most input events but is buggy and
|
|
// doesn't fire when text is deleted, but conveniently, selectionchange
|
|
// appears to fire in all of the remaining cases so we catch those and
|
|
// forward the event if the value has changed
|
|
// In either case, we don't want to call the event handler if the value
|
|
// is changed from JS so we redefine a setter for `.value` that updates
|
|
// our activeElementValue variable, allowing us to ignore those changes
|
|
//
|
|
// stopWatching() should be a noop here but we call it just in case we
|
|
// missed a blur event somehow.
|
|
stopWatchingForValueChange();
|
|
startWatchingForValueChange(target, targetInst);
|
|
} else if (topLevelType === 'topBlur') {
|
|
stopWatchingForValueChange();
|
|
}
|
|
}
|
|
|
|
// For IE8 and IE9.
|
|
function getTargetInstForInputEventPolyfill(topLevelType, targetInst, nativeEvent) {
|
|
if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === 'topKeyDown') {
|
|
// On the selectionchange event, the target is just document which isn't
|
|
// helpful for us so just check activeElement instead.
|
|
//
|
|
// 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
|
|
// propertychange on the first input event after setting `value` from a
|
|
// script and fires only keydown, keypress, keyup. Catching keyup usually
|
|
// gets it and catching keydown lets us fire an event for the first
|
|
// keystroke if user does a key repeat (it'll be a little delayed: right
|
|
// before the second keystroke). Other input methods (e.g., paste) seem to
|
|
// fire selectionchange normally.
|
|
return getInstIfValueChanged(activeElementInst, nativeEvent);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* SECTION: handle `click` event
|
|
*/
|
|
function shouldUseClickEvent(elem) {
|
|
// Use the `click` event to detect changes to checkbox and radio inputs.
|
|
// This approach works across all browsers, whereas `change` does not fire
|
|
// until `blur` in IE8.
|
|
var nodeName = elem.nodeName;
|
|
return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
|
|
}
|
|
|
|
function getTargetInstForClickEvent(topLevelType, targetInst, nativeEvent) {
|
|
if (topLevelType === 'topClick') {
|
|
return getInstIfValueChanged(targetInst, nativeEvent);
|
|
}
|
|
}
|
|
|
|
function getTargetInstForInputOrChangeEvent(topLevelType, targetInst, nativeEvent) {
|
|
if (topLevelType === 'topInput' || topLevelType === 'topChange') {
|
|
return getInstIfValueChanged(targetInst, nativeEvent);
|
|
}
|
|
}
|
|
|
|
function handleControlledInputBlur(inst, node) {
|
|
// TODO: In IE, inst is occasionally null. Why?
|
|
if (inst == null) {
|
|
return;
|
|
}
|
|
|
|
// Fiber and ReactDOM keep wrapper state in separate places
|
|
var state = inst._wrapperState || node._wrapperState;
|
|
|
|
if (!state || !state.controlled || node.type !== 'number') {
|
|
return;
|
|
}
|
|
|
|
// If controlled, assign the value attribute to the current value on blur
|
|
var value = '' + node.value;
|
|
if (node.getAttribute('value') !== value) {
|
|
node.setAttribute('value', value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This plugin creates an `onChange` event that normalizes change events
|
|
* across form elements. This event fires at a time when it's possible to
|
|
* change the element's value without seeing a flicker.
|
|
*
|
|
* Supported elements are:
|
|
* - input (see `isTextInputElement`)
|
|
* - textarea
|
|
* - select
|
|
*/
|
|
var ChangeEventPlugin = {
|
|
eventTypes: eventTypes,
|
|
|
|
_allowSimulatedPassThrough: true,
|
|
_isInputEventSupported: isInputEventSupported,
|
|
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window;
|
|
|
|
var getTargetInstFunc, handleEventFunc;
|
|
if (shouldUseChangeEvent(targetNode)) {
|
|
if (doesChangeEventBubble) {
|
|
getTargetInstFunc = getTargetInstForChangeEvent;
|
|
} else {
|
|
handleEventFunc = handleEventsForChangeEventIE8;
|
|
}
|
|
} else if (isTextInputElement(targetNode)) {
|
|
if (isInputEventSupported) {
|
|
getTargetInstFunc = getTargetInstForInputOrChangeEvent;
|
|
} else {
|
|
getTargetInstFunc = getTargetInstForInputEventPolyfill;
|
|
handleEventFunc = handleEventsForInputEventPolyfill;
|
|
}
|
|
} else if (shouldUseClickEvent(targetNode)) {
|
|
getTargetInstFunc = getTargetInstForClickEvent;
|
|
}
|
|
|
|
if (getTargetInstFunc) {
|
|
var inst = getTargetInstFunc(topLevelType, targetInst, nativeEvent);
|
|
if (inst) {
|
|
var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
|
|
return event;
|
|
}
|
|
}
|
|
|
|
if (handleEventFunc) {
|
|
handleEventFunc(topLevelType, targetNode, targetInst);
|
|
}
|
|
|
|
// When blurring, set the value attribute for number inputs
|
|
if (topLevelType === 'topBlur') {
|
|
handleControlledInputBlur(targetInst, targetNode);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ChangeEventPlugin;
|
|
|
|
/***/ }),
|
|
/* 150 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var createNodesFromMarkup = __webpack_require__(122);
|
|
var emptyFunction = __webpack_require__(10);
|
|
var invariant = __webpack_require__(1);
|
|
|
|
var Danger = {
|
|
/**
|
|
* Replaces a node with a string of markup at its current position within its
|
|
* parent. The markup must render into a single root node.
|
|
*
|
|
* @param {DOMElement} oldChild Child node to replace.
|
|
* @param {string} markup Markup to render in place of the child node.
|
|
* @internal
|
|
*/
|
|
dangerouslyReplaceNodeWithMarkup: function dangerouslyReplaceNodeWithMarkup(oldChild, markup) {
|
|
!ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering.') : _prodInvariant('56') : void 0;
|
|
!markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : _prodInvariant('57') : void 0;
|
|
!(oldChild.nodeName !== 'HTML') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString().') : _prodInvariant('58') : void 0;
|
|
|
|
if (typeof markup === 'string') {
|
|
var newChild = createNodesFromMarkup(markup, emptyFunction)[0];
|
|
oldChild.parentNode.replaceChild(newChild, oldChild);
|
|
} else {
|
|
DOMLazyTree.replaceChildWithTree(oldChild, markup);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = Danger;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 151 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Module that is injectable into `EventPluginHub`, that specifies a
|
|
* deterministic ordering of `EventPlugin`s. A convenient way to reason about
|
|
* plugins, without having to package every one of them. This is better than
|
|
* having plugins be ordered in the same order that they are injected because
|
|
* that ordering would be influenced by the packaging order.
|
|
* `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
|
|
* preventing default on events is convenient in `SimpleEventPlugin` handlers.
|
|
*/
|
|
|
|
var DefaultEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];
|
|
|
|
module.exports = DefaultEventPluginOrder;
|
|
|
|
/***/ }),
|
|
/* 152 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var EventPropagators = __webpack_require__(28);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var SyntheticMouseEvent = __webpack_require__(35);
|
|
|
|
var eventTypes = {
|
|
mouseEnter: {
|
|
registrationName: 'onMouseEnter',
|
|
dependencies: ['topMouseOut', 'topMouseOver']
|
|
},
|
|
mouseLeave: {
|
|
registrationName: 'onMouseLeave',
|
|
dependencies: ['topMouseOut', 'topMouseOver']
|
|
}
|
|
};
|
|
|
|
var EnterLeaveEventPlugin = {
|
|
eventTypes: eventTypes,
|
|
|
|
/**
|
|
* For almost every interaction we care about, there will be both a top-level
|
|
* `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
|
|
* we do not extract duplicate events. However, moving the mouse into the
|
|
* browser from outside will not fire a `mouseout` event. In this case, we use
|
|
* the `mouseover` top-level event.
|
|
*/
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
|
|
return null;
|
|
}
|
|
if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {
|
|
// Must not be a mouse in or mouse out - ignoring.
|
|
return null;
|
|
}
|
|
|
|
var win;
|
|
if (nativeEventTarget.window === nativeEventTarget) {
|
|
// `nativeEventTarget` is probably a window object.
|
|
win = nativeEventTarget;
|
|
} else {
|
|
// TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
|
|
var doc = nativeEventTarget.ownerDocument;
|
|
if (doc) {
|
|
win = doc.defaultView || doc.parentWindow;
|
|
} else {
|
|
win = window;
|
|
}
|
|
}
|
|
|
|
var from;
|
|
var to;
|
|
if (topLevelType === 'topMouseOut') {
|
|
from = targetInst;
|
|
var related = nativeEvent.relatedTarget || nativeEvent.toElement;
|
|
to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null;
|
|
} else {
|
|
// Moving to a node from outside the window.
|
|
from = null;
|
|
to = targetInst;
|
|
}
|
|
|
|
if (from === to) {
|
|
// Nothing pertains to our managed components.
|
|
return null;
|
|
}
|
|
|
|
var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from);
|
|
var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to);
|
|
|
|
var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget);
|
|
leave.type = 'mouseleave';
|
|
leave.target = fromNode;
|
|
leave.relatedTarget = toNode;
|
|
|
|
var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget);
|
|
enter.type = 'mouseenter';
|
|
enter.target = toNode;
|
|
enter.relatedTarget = fromNode;
|
|
|
|
EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to);
|
|
|
|
return [leave, enter];
|
|
}
|
|
};
|
|
|
|
module.exports = EnterLeaveEventPlugin;
|
|
|
|
/***/ }),
|
|
/* 153 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var PooledClass = __webpack_require__(18);
|
|
|
|
var getTextContentAccessor = __webpack_require__(89);
|
|
|
|
/**
|
|
* This helper class stores information about text content of a target node,
|
|
* allowing comparison of content before and after a given event.
|
|
*
|
|
* Identify the node where selection currently begins, then observe
|
|
* both its text content and its current position in the DOM. Since the
|
|
* browser may natively replace the target node during composition, we can
|
|
* use its position to find its replacement.
|
|
*
|
|
* @param {DOMEventTarget} root
|
|
*/
|
|
function FallbackCompositionState(root) {
|
|
this._root = root;
|
|
this._startText = this.getText();
|
|
this._fallbackText = null;
|
|
}
|
|
|
|
_assign(FallbackCompositionState.prototype, {
|
|
destructor: function destructor() {
|
|
this._root = null;
|
|
this._startText = null;
|
|
this._fallbackText = null;
|
|
},
|
|
|
|
/**
|
|
* Get current text of input.
|
|
*
|
|
* @return {string}
|
|
*/
|
|
getText: function getText() {
|
|
if ('value' in this._root) {
|
|
return this._root.value;
|
|
}
|
|
return this._root[getTextContentAccessor()];
|
|
},
|
|
|
|
/**
|
|
* Determine the differing substring between the initially stored
|
|
* text content and the current content.
|
|
*
|
|
* @return {string}
|
|
*/
|
|
getData: function getData() {
|
|
if (this._fallbackText) {
|
|
return this._fallbackText;
|
|
}
|
|
|
|
var start;
|
|
var startValue = this._startText;
|
|
var startLength = startValue.length;
|
|
var end;
|
|
var endValue = this.getText();
|
|
var endLength = endValue.length;
|
|
|
|
for (start = 0; start < startLength; start++) {
|
|
if (startValue[start] !== endValue[start]) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
var minEnd = startLength - start;
|
|
for (end = 1; end <= minEnd; end++) {
|
|
if (startValue[startLength - end] !== endValue[endLength - end]) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
var sliceTail = end > 1 ? 1 - end : undefined;
|
|
this._fallbackText = endValue.slice(start, sliceTail);
|
|
return this._fallbackText;
|
|
}
|
|
});
|
|
|
|
PooledClass.addPoolingTo(FallbackCompositionState);
|
|
|
|
module.exports = FallbackCompositionState;
|
|
|
|
/***/ }),
|
|
/* 154 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
|
|
var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;
|
|
var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;
|
|
var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;
|
|
var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;
|
|
var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;
|
|
|
|
var HTMLDOMPropertyConfig = {
|
|
isCustomAttribute: RegExp.prototype.test.bind(new RegExp('^(data|aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$')),
|
|
Properties: {
|
|
/**
|
|
* Standard Properties
|
|
*/
|
|
accept: 0,
|
|
acceptCharset: 0,
|
|
accessKey: 0,
|
|
action: 0,
|
|
allowFullScreen: HAS_BOOLEAN_VALUE,
|
|
allowTransparency: 0,
|
|
alt: 0,
|
|
// specifies target context for links with `preload` type
|
|
as: 0,
|
|
async: HAS_BOOLEAN_VALUE,
|
|
autoComplete: 0,
|
|
// autoFocus is polyfilled/normalized by AutoFocusUtils
|
|
// autoFocus: HAS_BOOLEAN_VALUE,
|
|
autoPlay: HAS_BOOLEAN_VALUE,
|
|
capture: HAS_BOOLEAN_VALUE,
|
|
cellPadding: 0,
|
|
cellSpacing: 0,
|
|
charSet: 0,
|
|
challenge: 0,
|
|
checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
cite: 0,
|
|
classID: 0,
|
|
className: 0,
|
|
cols: HAS_POSITIVE_NUMERIC_VALUE,
|
|
colSpan: 0,
|
|
content: 0,
|
|
contentEditable: 0,
|
|
contextMenu: 0,
|
|
controls: HAS_BOOLEAN_VALUE,
|
|
coords: 0,
|
|
crossOrigin: 0,
|
|
data: 0, // For `<object />` acts as `src`.
|
|
dateTime: 0,
|
|
'default': HAS_BOOLEAN_VALUE,
|
|
defer: HAS_BOOLEAN_VALUE,
|
|
dir: 0,
|
|
disabled: HAS_BOOLEAN_VALUE,
|
|
download: HAS_OVERLOADED_BOOLEAN_VALUE,
|
|
draggable: 0,
|
|
encType: 0,
|
|
form: 0,
|
|
formAction: 0,
|
|
formEncType: 0,
|
|
formMethod: 0,
|
|
formNoValidate: HAS_BOOLEAN_VALUE,
|
|
formTarget: 0,
|
|
frameBorder: 0,
|
|
headers: 0,
|
|
height: 0,
|
|
hidden: HAS_BOOLEAN_VALUE,
|
|
high: 0,
|
|
href: 0,
|
|
hrefLang: 0,
|
|
htmlFor: 0,
|
|
httpEquiv: 0,
|
|
icon: 0,
|
|
id: 0,
|
|
inputMode: 0,
|
|
integrity: 0,
|
|
is: 0,
|
|
keyParams: 0,
|
|
keyType: 0,
|
|
kind: 0,
|
|
label: 0,
|
|
lang: 0,
|
|
list: 0,
|
|
loop: HAS_BOOLEAN_VALUE,
|
|
low: 0,
|
|
manifest: 0,
|
|
marginHeight: 0,
|
|
marginWidth: 0,
|
|
max: 0,
|
|
maxLength: 0,
|
|
media: 0,
|
|
mediaGroup: 0,
|
|
method: 0,
|
|
min: 0,
|
|
minLength: 0,
|
|
// Caution; `option.selected` is not updated if `select.multiple` is
|
|
// disabled with `removeAttribute`.
|
|
multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
name: 0,
|
|
nonce: 0,
|
|
noValidate: HAS_BOOLEAN_VALUE,
|
|
open: HAS_BOOLEAN_VALUE,
|
|
optimum: 0,
|
|
pattern: 0,
|
|
placeholder: 0,
|
|
playsInline: HAS_BOOLEAN_VALUE,
|
|
poster: 0,
|
|
preload: 0,
|
|
profile: 0,
|
|
radioGroup: 0,
|
|
readOnly: HAS_BOOLEAN_VALUE,
|
|
referrerPolicy: 0,
|
|
rel: 0,
|
|
required: HAS_BOOLEAN_VALUE,
|
|
reversed: HAS_BOOLEAN_VALUE,
|
|
role: 0,
|
|
rows: HAS_POSITIVE_NUMERIC_VALUE,
|
|
rowSpan: HAS_NUMERIC_VALUE,
|
|
sandbox: 0,
|
|
scope: 0,
|
|
scoped: HAS_BOOLEAN_VALUE,
|
|
scrolling: 0,
|
|
seamless: HAS_BOOLEAN_VALUE,
|
|
selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
shape: 0,
|
|
size: HAS_POSITIVE_NUMERIC_VALUE,
|
|
sizes: 0,
|
|
span: HAS_POSITIVE_NUMERIC_VALUE,
|
|
spellCheck: 0,
|
|
src: 0,
|
|
srcDoc: 0,
|
|
srcLang: 0,
|
|
srcSet: 0,
|
|
start: HAS_NUMERIC_VALUE,
|
|
step: 0,
|
|
style: 0,
|
|
summary: 0,
|
|
tabIndex: 0,
|
|
target: 0,
|
|
title: 0,
|
|
// Setting .type throws on non-<input> tags
|
|
type: 0,
|
|
useMap: 0,
|
|
value: 0,
|
|
width: 0,
|
|
wmode: 0,
|
|
wrap: 0,
|
|
|
|
/**
|
|
* RDFa Properties
|
|
*/
|
|
about: 0,
|
|
datatype: 0,
|
|
inlist: 0,
|
|
prefix: 0,
|
|
// property is also supported for OpenGraph in meta tags.
|
|
property: 0,
|
|
resource: 0,
|
|
'typeof': 0,
|
|
vocab: 0,
|
|
|
|
/**
|
|
* Non-standard Properties
|
|
*/
|
|
// autoCapitalize and autoCorrect are supported in Mobile Safari for
|
|
// keyboard hints.
|
|
autoCapitalize: 0,
|
|
autoCorrect: 0,
|
|
// autoSave allows WebKit/Blink to persist values of input fields on page reloads
|
|
autoSave: 0,
|
|
// color is for Safari mask-icon link
|
|
color: 0,
|
|
// itemProp, itemScope, itemType are for
|
|
// Microdata support. See http://schema.org/docs/gs.html
|
|
itemProp: 0,
|
|
itemScope: HAS_BOOLEAN_VALUE,
|
|
itemType: 0,
|
|
// itemID and itemRef are for Microdata support as well but
|
|
// only specified in the WHATWG spec document. See
|
|
// https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api
|
|
itemID: 0,
|
|
itemRef: 0,
|
|
// results show looking glass icon and recent searches on input
|
|
// search fields in WebKit/Blink
|
|
results: 0,
|
|
// IE-only attribute that specifies security restrictions on an iframe
|
|
// as an alternative to the sandbox attribute on IE<10
|
|
security: 0,
|
|
// IE-only attribute that controls focus behavior
|
|
unselectable: 0
|
|
},
|
|
DOMAttributeNames: {
|
|
acceptCharset: 'accept-charset',
|
|
className: 'class',
|
|
htmlFor: 'for',
|
|
httpEquiv: 'http-equiv'
|
|
},
|
|
DOMPropertyNames: {},
|
|
DOMMutationMethods: {
|
|
value: function value(node, _value) {
|
|
if (_value == null) {
|
|
return node.removeAttribute('value');
|
|
}
|
|
|
|
// Number inputs get special treatment due to some edge cases in
|
|
// Chrome. Let everything else assign the value attribute as normal.
|
|
// https://github.com/facebook/react/issues/7253#issuecomment-236074326
|
|
if (node.type !== 'number' || node.hasAttribute('value') === false) {
|
|
node.setAttribute('value', '' + _value);
|
|
} else if (node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node) {
|
|
// Don't assign an attribute if validation reports bad
|
|
// input. Chrome will clear the value. Additionally, don't
|
|
// operate on inputs that have focus, otherwise Chrome might
|
|
// strip off trailing decimal places and cause the user's
|
|
// cursor position to jump to the beginning of the input.
|
|
//
|
|
// In ReactDOMInput, we have an onBlur event that will trigger
|
|
// this function again when focus is lost.
|
|
node.setAttribute('value', '' + _value);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = HTMLDOMPropertyConfig;
|
|
|
|
/***/ }),
|
|
/* 155 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactReconciler = __webpack_require__(22);
|
|
|
|
var instantiateReactComponent = __webpack_require__(91);
|
|
var KeyEscapeUtils = __webpack_require__(48);
|
|
var shouldUpdateReactComponent = __webpack_require__(58);
|
|
var traverseAllChildren = __webpack_require__(94);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ReactComponentTreeHook;
|
|
|
|
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') {
|
|
// Temporary hack.
|
|
// Inline requires don't work well with Jest:
|
|
// https://github.com/facebook/react/issues/7240
|
|
// Remove the inline requires when we don't need them anymore:
|
|
// https://github.com/facebook/react/pull/7178
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
|
|
function instantiateChild(childInstances, child, name, selfDebugID) {
|
|
// We found a component instance.
|
|
var keyUnique = childInstances[name] === undefined;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!ReactComponentTreeHook) {
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
if (!keyUnique) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0;
|
|
}
|
|
}
|
|
if (child != null && keyUnique) {
|
|
childInstances[name] = instantiateReactComponent(child, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ReactChildReconciler provides helpers for initializing or updating a set of
|
|
* children. Its output is suitable for passing it onto ReactMultiChild which
|
|
* does diffed reordering and insertion.
|
|
*/
|
|
var ReactChildReconciler = {
|
|
/**
|
|
* Generates a "mount image" for each of the supplied children. In the case
|
|
* of `ReactDOMComponent`, a mount image is a string of markup.
|
|
*
|
|
* @param {?object} nestedChildNodes Nested child maps.
|
|
* @return {?object} A set of child instances.
|
|
* @internal
|
|
*/
|
|
instantiateChildren: function instantiateChildren(nestedChildNodes, transaction, context, selfDebugID) // 0 in production and for roots
|
|
{
|
|
if (nestedChildNodes == null) {
|
|
return null;
|
|
}
|
|
var childInstances = {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
traverseAllChildren(nestedChildNodes, function (childInsts, child, name) {
|
|
return instantiateChild(childInsts, child, name, selfDebugID);
|
|
}, childInstances);
|
|
} else {
|
|
traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);
|
|
}
|
|
return childInstances;
|
|
},
|
|
|
|
/**
|
|
* Updates the rendered children and returns a new set of children.
|
|
*
|
|
* @param {?object} prevChildren Previously initialized set of children.
|
|
* @param {?object} nextChildren Flat child element maps.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {object} context
|
|
* @return {?object} A new set of child instances.
|
|
* @internal
|
|
*/
|
|
updateChildren: function updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, hostParent, hostContainerInfo, context, selfDebugID) // 0 in production and for roots
|
|
{
|
|
// We currently don't have a way to track moves here but if we use iterators
|
|
// instead of for..in we can zip the iterators and check if an item has
|
|
// moved.
|
|
// TODO: If nothing has changed, return the prevChildren object so that we
|
|
// can quickly bailout if nothing has changed.
|
|
if (!nextChildren && !prevChildren) {
|
|
return;
|
|
}
|
|
var name;
|
|
var prevChild;
|
|
for (name in nextChildren) {
|
|
if (!nextChildren.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
prevChild = prevChildren && prevChildren[name];
|
|
var prevElement = prevChild && prevChild._currentElement;
|
|
var nextElement = nextChildren[name];
|
|
if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {
|
|
ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);
|
|
nextChildren[name] = prevChild;
|
|
} else {
|
|
if (prevChild) {
|
|
removedNodes[name] = ReactReconciler.getHostNode(prevChild);
|
|
ReactReconciler.unmountComponent(prevChild, false);
|
|
}
|
|
// The child must be instantiated before it's mounted.
|
|
var nextChildInstance = instantiateReactComponent(nextElement, true);
|
|
nextChildren[name] = nextChildInstance;
|
|
// Creating mount image now ensures refs are resolved in right order
|
|
// (see https://github.com/facebook/react/pull/7101 for explanation).
|
|
var nextChildMountImage = ReactReconciler.mountComponent(nextChildInstance, transaction, hostParent, hostContainerInfo, context, selfDebugID);
|
|
mountImages.push(nextChildMountImage);
|
|
}
|
|
}
|
|
// Unmount children that are no longer present.
|
|
for (name in prevChildren) {
|
|
if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {
|
|
prevChild = prevChildren[name];
|
|
removedNodes[name] = ReactReconciler.getHostNode(prevChild);
|
|
ReactReconciler.unmountComponent(prevChild, false);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Unmounts all rendered children. This should be used to clean up children
|
|
* when this component is unmounted.
|
|
*
|
|
* @param {?object} renderedChildren Previously initialized set of children.
|
|
* @internal
|
|
*/
|
|
unmountChildren: function unmountChildren(renderedChildren, safely) {
|
|
for (var name in renderedChildren) {
|
|
if (renderedChildren.hasOwnProperty(name)) {
|
|
var renderedChild = renderedChildren[name];
|
|
ReactReconciler.unmountComponent(renderedChild, safely);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactChildReconciler;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 156 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMChildrenOperations = __webpack_require__(45);
|
|
var ReactDOMIDOperations = __webpack_require__(163);
|
|
|
|
/**
|
|
* Abstracts away all functionality of the reconciler that requires knowledge of
|
|
* the browser context. TODO: These callers should be refactored to avoid the
|
|
* need for this injection.
|
|
*/
|
|
var ReactComponentBrowserEnvironment = {
|
|
processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,
|
|
|
|
replaceNodeWithMarkup: DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup
|
|
};
|
|
|
|
module.exports = ReactComponentBrowserEnvironment;
|
|
|
|
/***/ }),
|
|
/* 157 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var React = __webpack_require__(23);
|
|
var ReactComponentEnvironment = __webpack_require__(50);
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactErrorUtils = __webpack_require__(51);
|
|
var ReactInstanceMap = __webpack_require__(29);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactNodeTypes = __webpack_require__(83);
|
|
var ReactReconciler = __webpack_require__(22);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var checkReactTypeSpec = __webpack_require__(205);
|
|
}
|
|
|
|
var emptyObject = __webpack_require__(32);
|
|
var invariant = __webpack_require__(1);
|
|
var shallowEqual = __webpack_require__(40);
|
|
var shouldUpdateReactComponent = __webpack_require__(58);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var CompositeTypes = {
|
|
ImpureClass: 0,
|
|
PureClass: 1,
|
|
StatelessFunctional: 2
|
|
};
|
|
|
|
function StatelessComponent(Component) {}
|
|
StatelessComponent.prototype.render = function () {
|
|
var Component = ReactInstanceMap.get(this)._currentElement.type;
|
|
var element = Component(this.props, this.context, this.updater);
|
|
warnIfInvalidElement(Component, element);
|
|
return element;
|
|
};
|
|
|
|
function warnIfInvalidElement(Component, element) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(element === null || element === false || React.isValidElement(element), '%s(...): A valid React element (or null) must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(!Component.childContextTypes, '%s(...): childContextTypes cannot be defined on a functional component.', Component.displayName || Component.name || 'Component') : void 0;
|
|
}
|
|
}
|
|
|
|
function shouldConstruct(Component) {
|
|
return !!(Component.prototype && Component.prototype.isReactComponent);
|
|
}
|
|
|
|
function isPureComponent(Component) {
|
|
return !!(Component.prototype && Component.prototype.isPureReactComponent);
|
|
}
|
|
|
|
// Separated into a function to contain deoptimizations caused by try/finally.
|
|
function measureLifeCyclePerf(fn, debugID, timerType) {
|
|
if (debugID === 0) {
|
|
// Top-level wrappers (see ReactMount) and empty components (see
|
|
// ReactDOMEmptyComponent) are invisible to hooks and devtools.
|
|
// Both are implementation details that should go away in the future.
|
|
return fn();
|
|
}
|
|
|
|
ReactInstrumentation.debugTool.onBeginLifeCycleTimer(debugID, timerType);
|
|
try {
|
|
return fn();
|
|
} finally {
|
|
ReactInstrumentation.debugTool.onEndLifeCycleTimer(debugID, timerType);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ------------------ The Life-Cycle of a Composite Component ------------------
|
|
*
|
|
* - constructor: Initialization of state. The instance is now retained.
|
|
* - componentWillMount
|
|
* - render
|
|
* - [children's constructors]
|
|
* - [children's componentWillMount and render]
|
|
* - [children's componentDidMount]
|
|
* - componentDidMount
|
|
*
|
|
* Update Phases:
|
|
* - componentWillReceiveProps (only called if parent updated)
|
|
* - shouldComponentUpdate
|
|
* - componentWillUpdate
|
|
* - render
|
|
* - [children's constructors or receive props phases]
|
|
* - componentDidUpdate
|
|
*
|
|
* - componentWillUnmount
|
|
* - [children's componentWillUnmount]
|
|
* - [children destroyed]
|
|
* - (destroyed): The instance is now blank, released by React and ready for GC.
|
|
*
|
|
* -----------------------------------------------------------------------------
|
|
*/
|
|
|
|
/**
|
|
* An incrementing ID assigned to each component when it is mounted. This is
|
|
* used to enforce the order in which `ReactUpdates` updates dirty components.
|
|
*
|
|
* @private
|
|
*/
|
|
var nextMountID = 1;
|
|
|
|
/**
|
|
* @lends {ReactCompositeComponent.prototype}
|
|
*/
|
|
var ReactCompositeComponent = {
|
|
/**
|
|
* Base constructor for all composite component.
|
|
*
|
|
* @param {ReactElement} element
|
|
* @final
|
|
* @internal
|
|
*/
|
|
construct: function construct(element) {
|
|
this._currentElement = element;
|
|
this._rootNodeID = 0;
|
|
this._compositeType = null;
|
|
this._instance = null;
|
|
this._hostParent = null;
|
|
this._hostContainerInfo = null;
|
|
|
|
// See ReactUpdateQueue
|
|
this._updateBatchNumber = null;
|
|
this._pendingElement = null;
|
|
this._pendingStateQueue = null;
|
|
this._pendingReplaceState = false;
|
|
this._pendingForceUpdate = false;
|
|
|
|
this._renderedNodeType = null;
|
|
this._renderedComponent = null;
|
|
this._context = null;
|
|
this._mountOrder = 0;
|
|
this._topLevelWrapper = null;
|
|
|
|
// See ReactUpdates and ReactUpdateQueue.
|
|
this._pendingCallbacks = null;
|
|
|
|
// ComponentWillUnmount shall only be called once
|
|
this._calledComponentWillUnmount = false;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
this._warnedAboutRefsInRender = false;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Initializes the component, renders markup, and registers event listeners.
|
|
*
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {?object} hostParent
|
|
* @param {?object} hostContainerInfo
|
|
* @param {?object} context
|
|
* @return {?string} Rendered markup to be inserted into the DOM.
|
|
* @final
|
|
* @internal
|
|
*/
|
|
mountComponent: function mountComponent(transaction, hostParent, hostContainerInfo, context) {
|
|
var _this = this;
|
|
|
|
this._context = context;
|
|
this._mountOrder = nextMountID++;
|
|
this._hostParent = hostParent;
|
|
this._hostContainerInfo = hostContainerInfo;
|
|
|
|
var publicProps = this._currentElement.props;
|
|
var publicContext = this._processContext(context);
|
|
|
|
var Component = this._currentElement.type;
|
|
|
|
var updateQueue = transaction.getUpdateQueue();
|
|
|
|
// Initialize the public class
|
|
var doConstruct = shouldConstruct(Component);
|
|
var inst = this._constructComponent(doConstruct, publicProps, publicContext, updateQueue);
|
|
var renderedElement;
|
|
|
|
// Support functional components
|
|
if (!doConstruct && (inst == null || inst.render == null)) {
|
|
renderedElement = inst;
|
|
warnIfInvalidElement(Component, renderedElement);
|
|
!(inst === null || inst === false || React.isValidElement(inst)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : _prodInvariant('105', Component.displayName || Component.name || 'Component') : void 0;
|
|
inst = new StatelessComponent(Component);
|
|
this._compositeType = CompositeTypes.StatelessFunctional;
|
|
} else {
|
|
if (isPureComponent(Component)) {
|
|
this._compositeType = CompositeTypes.PureClass;
|
|
} else {
|
|
this._compositeType = CompositeTypes.ImpureClass;
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// This will throw later in _renderValidatedComponent, but add an early
|
|
// warning now to help debugging
|
|
if (inst.render == null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', Component.displayName || Component.name || 'Component') : void 0;
|
|
}
|
|
|
|
var propsMutated = inst.props !== publicProps;
|
|
var componentName = Component.displayName || Component.name || 'Component';
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(inst.props === undefined || !propsMutated, '%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", componentName, componentName) : void 0;
|
|
}
|
|
|
|
// These should be set up in the constructor, but as a convenience for
|
|
// simpler class abstractions, we set them up after the fact.
|
|
inst.props = publicProps;
|
|
inst.context = publicContext;
|
|
inst.refs = emptyObject;
|
|
inst.updater = updateQueue;
|
|
|
|
this._instance = inst;
|
|
|
|
// Store a reference from the instance back to the internal representation
|
|
ReactInstanceMap.set(inst, this);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// Since plain JS classes are defined without any special initialization
|
|
// logic, we can not catch common errors early. Therefore, we have to
|
|
// catch them here, at initialization time, instead.
|
|
process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved || inst.state, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : void 0;
|
|
}
|
|
|
|
var initialState = inst.state;
|
|
if (initialState === undefined) {
|
|
inst.state = initialState = null;
|
|
}
|
|
!((typeof initialState === 'undefined' ? 'undefined' : _typeof(initialState)) === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : _prodInvariant('106', this.getName() || 'ReactCompositeComponent') : void 0;
|
|
|
|
this._pendingStateQueue = null;
|
|
this._pendingReplaceState = false;
|
|
this._pendingForceUpdate = false;
|
|
|
|
var markup;
|
|
if (inst.unstable_handleError) {
|
|
markup = this.performInitialMountWithErrorHandling(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
|
} else {
|
|
markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
|
}
|
|
|
|
if (inst.componentDidMount) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
transaction.getReactMountReady().enqueue(function () {
|
|
measureLifeCyclePerf(function () {
|
|
return inst.componentDidMount();
|
|
}, _this._debugID, 'componentDidMount');
|
|
});
|
|
} else {
|
|
transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);
|
|
}
|
|
}
|
|
|
|
return markup;
|
|
},
|
|
|
|
_constructComponent: function _constructComponent(doConstruct, publicProps, publicContext, updateQueue) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactCurrentOwner.current = this;
|
|
try {
|
|
return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue);
|
|
} finally {
|
|
ReactCurrentOwner.current = null;
|
|
}
|
|
} else {
|
|
return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue);
|
|
}
|
|
},
|
|
|
|
_constructComponentWithoutOwner: function _constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue) {
|
|
var Component = this._currentElement.type;
|
|
|
|
if (doConstruct) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
return measureLifeCyclePerf(function () {
|
|
return new Component(publicProps, publicContext, updateQueue);
|
|
}, this._debugID, 'ctor');
|
|
} else {
|
|
return new Component(publicProps, publicContext, updateQueue);
|
|
}
|
|
}
|
|
|
|
// This can still be an instance in case of factory components
|
|
// but we'll count this as time spent rendering as the more common case.
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
return measureLifeCyclePerf(function () {
|
|
return Component(publicProps, publicContext, updateQueue);
|
|
}, this._debugID, 'render');
|
|
} else {
|
|
return Component(publicProps, publicContext, updateQueue);
|
|
}
|
|
},
|
|
|
|
performInitialMountWithErrorHandling: function performInitialMountWithErrorHandling(renderedElement, hostParent, hostContainerInfo, transaction, context) {
|
|
var markup;
|
|
var checkpoint = transaction.checkpoint();
|
|
try {
|
|
markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
|
} catch (e) {
|
|
// Roll back to checkpoint, handle error (which may add items to the transaction), and take a new checkpoint
|
|
transaction.rollback(checkpoint);
|
|
this._instance.unstable_handleError(e);
|
|
if (this._pendingStateQueue) {
|
|
this._instance.state = this._processPendingState(this._instance.props, this._instance.context);
|
|
}
|
|
checkpoint = transaction.checkpoint();
|
|
|
|
this._renderedComponent.unmountComponent(true);
|
|
transaction.rollback(checkpoint);
|
|
|
|
// Try again - we've informed the component about the error, so they can render an error message this time.
|
|
// If this throws again, the error will bubble up (and can be caught by a higher error boundary).
|
|
markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
|
}
|
|
return markup;
|
|
},
|
|
|
|
performInitialMount: function performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context) {
|
|
var inst = this._instance;
|
|
|
|
var debugID = 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
debugID = this._debugID;
|
|
}
|
|
|
|
if (inst.componentWillMount) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
measureLifeCyclePerf(function () {
|
|
return inst.componentWillMount();
|
|
}, debugID, 'componentWillMount');
|
|
} else {
|
|
inst.componentWillMount();
|
|
}
|
|
// When mounting, calls to `setState` by `componentWillMount` will set
|
|
// `this._pendingStateQueue` without triggering a re-render.
|
|
if (this._pendingStateQueue) {
|
|
inst.state = this._processPendingState(inst.props, inst.context);
|
|
}
|
|
}
|
|
|
|
// If not a stateless component, we now render
|
|
if (renderedElement === undefined) {
|
|
renderedElement = this._renderValidatedComponent();
|
|
}
|
|
|
|
var nodeType = ReactNodeTypes.getType(renderedElement);
|
|
this._renderedNodeType = nodeType;
|
|
var child = this._instantiateReactComponent(renderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */
|
|
);
|
|
this._renderedComponent = child;
|
|
|
|
var markup = ReactReconciler.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context), debugID);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (debugID !== 0) {
|
|
var childDebugIDs = child._debugID !== 0 ? [child._debugID] : [];
|
|
ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs);
|
|
}
|
|
}
|
|
|
|
return markup;
|
|
},
|
|
|
|
getHostNode: function getHostNode() {
|
|
return ReactReconciler.getHostNode(this._renderedComponent);
|
|
},
|
|
|
|
/**
|
|
* Releases any resources allocated by `mountComponent`.
|
|
*
|
|
* @final
|
|
* @internal
|
|
*/
|
|
unmountComponent: function unmountComponent(safely) {
|
|
if (!this._renderedComponent) {
|
|
return;
|
|
}
|
|
|
|
var inst = this._instance;
|
|
|
|
if (inst.componentWillUnmount && !inst._calledComponentWillUnmount) {
|
|
inst._calledComponentWillUnmount = true;
|
|
|
|
if (safely) {
|
|
var name = this.getName() + '.componentWillUnmount()';
|
|
ReactErrorUtils.invokeGuardedCallback(name, inst.componentWillUnmount.bind(inst));
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
measureLifeCyclePerf(function () {
|
|
return inst.componentWillUnmount();
|
|
}, this._debugID, 'componentWillUnmount');
|
|
} else {
|
|
inst.componentWillUnmount();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this._renderedComponent) {
|
|
ReactReconciler.unmountComponent(this._renderedComponent, safely);
|
|
this._renderedNodeType = null;
|
|
this._renderedComponent = null;
|
|
this._instance = null;
|
|
}
|
|
|
|
// Reset pending fields
|
|
// Even if this component is scheduled for another update in ReactUpdates,
|
|
// it would still be ignored because these fields are reset.
|
|
this._pendingStateQueue = null;
|
|
this._pendingReplaceState = false;
|
|
this._pendingForceUpdate = false;
|
|
this._pendingCallbacks = null;
|
|
this._pendingElement = null;
|
|
|
|
// These fields do not really need to be reset since this object is no
|
|
// longer accessible.
|
|
this._context = null;
|
|
this._rootNodeID = 0;
|
|
this._topLevelWrapper = null;
|
|
|
|
// Delete the reference from the instance to this internal representation
|
|
// which allow the internals to be properly cleaned up even if the user
|
|
// leaks a reference to the public instance.
|
|
ReactInstanceMap.remove(inst);
|
|
|
|
// Some existing components rely on inst.props even after they've been
|
|
// destroyed (in event handlers).
|
|
// TODO: inst.props = null;
|
|
// TODO: inst.state = null;
|
|
// TODO: inst.context = null;
|
|
},
|
|
|
|
/**
|
|
* Filters the context object to only contain keys specified in
|
|
* `contextTypes`
|
|
*
|
|
* @param {object} context
|
|
* @return {?object}
|
|
* @private
|
|
*/
|
|
_maskContext: function _maskContext(context) {
|
|
var Component = this._currentElement.type;
|
|
var contextTypes = Component.contextTypes;
|
|
if (!contextTypes) {
|
|
return emptyObject;
|
|
}
|
|
var maskedContext = {};
|
|
for (var contextName in contextTypes) {
|
|
maskedContext[contextName] = context[contextName];
|
|
}
|
|
return maskedContext;
|
|
},
|
|
|
|
/**
|
|
* Filters the context object to only contain keys specified in
|
|
* `contextTypes`, and asserts that they are valid.
|
|
*
|
|
* @param {object} context
|
|
* @return {?object}
|
|
* @private
|
|
*/
|
|
_processContext: function _processContext(context) {
|
|
var maskedContext = this._maskContext(context);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var Component = this._currentElement.type;
|
|
if (Component.contextTypes) {
|
|
this._checkContextTypes(Component.contextTypes, maskedContext, 'context');
|
|
}
|
|
}
|
|
return maskedContext;
|
|
},
|
|
|
|
/**
|
|
* @param {object} currentContext
|
|
* @return {object}
|
|
* @private
|
|
*/
|
|
_processChildContext: function _processChildContext(currentContext) {
|
|
var Component = this._currentElement.type;
|
|
var inst = this._instance;
|
|
var childContext;
|
|
|
|
if (inst.getChildContext) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onBeginProcessingChildContext();
|
|
try {
|
|
childContext = inst.getChildContext();
|
|
} finally {
|
|
ReactInstrumentation.debugTool.onEndProcessingChildContext();
|
|
}
|
|
} else {
|
|
childContext = inst.getChildContext();
|
|
}
|
|
}
|
|
|
|
if (childContext) {
|
|
!(_typeof(Component.childContextTypes) === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().', this.getName() || 'ReactCompositeComponent') : _prodInvariant('107', this.getName() || 'ReactCompositeComponent') : void 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
this._checkContextTypes(Component.childContextTypes, childContext, 'child context');
|
|
}
|
|
for (var name in childContext) {
|
|
!(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : _prodInvariant('108', this.getName() || 'ReactCompositeComponent', name) : void 0;
|
|
}
|
|
return _assign({}, currentContext, childContext);
|
|
}
|
|
return currentContext;
|
|
},
|
|
|
|
/**
|
|
* Assert that the context types are valid
|
|
*
|
|
* @param {object} typeSpecs Map of context field to a ReactPropType
|
|
* @param {object} values Runtime values that need to be type-checked
|
|
* @param {string} location e.g. "prop", "context", "child context"
|
|
* @private
|
|
*/
|
|
_checkContextTypes: function _checkContextTypes(typeSpecs, values, location) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
checkReactTypeSpec(typeSpecs, values, location, this.getName(), null, this._debugID);
|
|
}
|
|
},
|
|
|
|
receiveComponent: function receiveComponent(nextElement, transaction, nextContext) {
|
|
var prevElement = this._currentElement;
|
|
var prevContext = this._context;
|
|
|
|
this._pendingElement = null;
|
|
|
|
this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);
|
|
},
|
|
|
|
/**
|
|
* If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`
|
|
* is set, update the component.
|
|
*
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
*/
|
|
performUpdateIfNecessary: function performUpdateIfNecessary(transaction) {
|
|
if (this._pendingElement != null) {
|
|
ReactReconciler.receiveComponent(this, this._pendingElement, transaction, this._context);
|
|
} else if (this._pendingStateQueue !== null || this._pendingForceUpdate) {
|
|
this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);
|
|
} else {
|
|
this._updateBatchNumber = null;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Perform an update to a mounted component. The componentWillReceiveProps and
|
|
* shouldComponentUpdate methods are called, then (assuming the update isn't
|
|
* skipped) the remaining update lifecycle methods are called and the DOM
|
|
* representation is updated.
|
|
*
|
|
* By default, this implements React's rendering and reconciliation algorithm.
|
|
* Sophisticated clients may wish to override this.
|
|
*
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {ReactElement} prevParentElement
|
|
* @param {ReactElement} nextParentElement
|
|
* @internal
|
|
* @overridable
|
|
*/
|
|
updateComponent: function updateComponent(transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {
|
|
var inst = this._instance;
|
|
!(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Attempted to update component `%s` that has already been unmounted (or failed to mount).', this.getName() || 'ReactCompositeComponent') : _prodInvariant('136', this.getName() || 'ReactCompositeComponent') : void 0;
|
|
|
|
var willReceive = false;
|
|
var nextContext;
|
|
|
|
// Determine if the context has changed or not
|
|
if (this._context === nextUnmaskedContext) {
|
|
nextContext = inst.context;
|
|
} else {
|
|
nextContext = this._processContext(nextUnmaskedContext);
|
|
willReceive = true;
|
|
}
|
|
|
|
var prevProps = prevParentElement.props;
|
|
var nextProps = nextParentElement.props;
|
|
|
|
// Not a simple state update but a props update
|
|
if (prevParentElement !== nextParentElement) {
|
|
willReceive = true;
|
|
}
|
|
|
|
// An update here will schedule an update but immediately set
|
|
// _pendingStateQueue which will ensure that any state updates gets
|
|
// immediately reconciled instead of waiting for the next batch.
|
|
if (willReceive && inst.componentWillReceiveProps) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
measureLifeCyclePerf(function () {
|
|
return inst.componentWillReceiveProps(nextProps, nextContext);
|
|
}, this._debugID, 'componentWillReceiveProps');
|
|
} else {
|
|
inst.componentWillReceiveProps(nextProps, nextContext);
|
|
}
|
|
}
|
|
|
|
var nextState = this._processPendingState(nextProps, nextContext);
|
|
var shouldUpdate = true;
|
|
|
|
if (!this._pendingForceUpdate) {
|
|
if (inst.shouldComponentUpdate) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
shouldUpdate = measureLifeCyclePerf(function () {
|
|
return inst.shouldComponentUpdate(nextProps, nextState, nextContext);
|
|
}, this._debugID, 'shouldComponentUpdate');
|
|
} else {
|
|
shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext);
|
|
}
|
|
} else {
|
|
if (this._compositeType === CompositeTypes.PureClass) {
|
|
shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(shouldUpdate !== undefined, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : void 0;
|
|
}
|
|
|
|
this._updateBatchNumber = null;
|
|
if (shouldUpdate) {
|
|
this._pendingForceUpdate = false;
|
|
// Will set `this.props`, `this.state` and `this.context`.
|
|
this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);
|
|
} else {
|
|
// If it's determined that a component should not update, we still want
|
|
// to set props and state but we shortcut the rest of the update.
|
|
this._currentElement = nextParentElement;
|
|
this._context = nextUnmaskedContext;
|
|
inst.props = nextProps;
|
|
inst.state = nextState;
|
|
inst.context = nextContext;
|
|
}
|
|
},
|
|
|
|
_processPendingState: function _processPendingState(props, context) {
|
|
var inst = this._instance;
|
|
var queue = this._pendingStateQueue;
|
|
var replace = this._pendingReplaceState;
|
|
this._pendingReplaceState = false;
|
|
this._pendingStateQueue = null;
|
|
|
|
if (!queue) {
|
|
return inst.state;
|
|
}
|
|
|
|
if (replace && queue.length === 1) {
|
|
return queue[0];
|
|
}
|
|
|
|
var nextState = _assign({}, replace ? queue[0] : inst.state);
|
|
for (var i = replace ? 1 : 0; i < queue.length; i++) {
|
|
var partial = queue[i];
|
|
_assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);
|
|
}
|
|
|
|
return nextState;
|
|
},
|
|
|
|
/**
|
|
* Merges new props and state, notifies delegate methods of update and
|
|
* performs update.
|
|
*
|
|
* @param {ReactElement} nextElement Next element
|
|
* @param {object} nextProps Next public object to set as properties.
|
|
* @param {?object} nextState Next object to set as state.
|
|
* @param {?object} nextContext Next public object to set as context.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {?object} unmaskedContext
|
|
* @private
|
|
*/
|
|
_performComponentUpdate: function _performComponentUpdate(nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {
|
|
var _this2 = this;
|
|
|
|
var inst = this._instance;
|
|
|
|
var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);
|
|
var prevProps;
|
|
var prevState;
|
|
var prevContext;
|
|
if (hasComponentDidUpdate) {
|
|
prevProps = inst.props;
|
|
prevState = inst.state;
|
|
prevContext = inst.context;
|
|
}
|
|
|
|
if (inst.componentWillUpdate) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
measureLifeCyclePerf(function () {
|
|
return inst.componentWillUpdate(nextProps, nextState, nextContext);
|
|
}, this._debugID, 'componentWillUpdate');
|
|
} else {
|
|
inst.componentWillUpdate(nextProps, nextState, nextContext);
|
|
}
|
|
}
|
|
|
|
this._currentElement = nextElement;
|
|
this._context = unmaskedContext;
|
|
inst.props = nextProps;
|
|
inst.state = nextState;
|
|
inst.context = nextContext;
|
|
|
|
this._updateRenderedComponent(transaction, unmaskedContext);
|
|
|
|
if (hasComponentDidUpdate) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
transaction.getReactMountReady().enqueue(function () {
|
|
measureLifeCyclePerf(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), _this2._debugID, 'componentDidUpdate');
|
|
});
|
|
} else {
|
|
transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Call the component's `render` method and update the DOM accordingly.
|
|
*
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
*/
|
|
_updateRenderedComponent: function _updateRenderedComponent(transaction, context) {
|
|
var prevComponentInstance = this._renderedComponent;
|
|
var prevRenderedElement = prevComponentInstance._currentElement;
|
|
var nextRenderedElement = this._renderValidatedComponent();
|
|
|
|
var debugID = 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
debugID = this._debugID;
|
|
}
|
|
|
|
if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {
|
|
ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));
|
|
} else {
|
|
var oldHostNode = ReactReconciler.getHostNode(prevComponentInstance);
|
|
ReactReconciler.unmountComponent(prevComponentInstance, false);
|
|
|
|
var nodeType = ReactNodeTypes.getType(nextRenderedElement);
|
|
this._renderedNodeType = nodeType;
|
|
var child = this._instantiateReactComponent(nextRenderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */
|
|
);
|
|
this._renderedComponent = child;
|
|
|
|
var nextMarkup = ReactReconciler.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context), debugID);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (debugID !== 0) {
|
|
var childDebugIDs = child._debugID !== 0 ? [child._debugID] : [];
|
|
ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs);
|
|
}
|
|
}
|
|
|
|
this._replaceNodeWithMarkup(oldHostNode, nextMarkup, prevComponentInstance);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Overridden in shallow rendering.
|
|
*
|
|
* @protected
|
|
*/
|
|
_replaceNodeWithMarkup: function _replaceNodeWithMarkup(oldHostNode, nextMarkup, prevInstance) {
|
|
ReactComponentEnvironment.replaceNodeWithMarkup(oldHostNode, nextMarkup, prevInstance);
|
|
},
|
|
|
|
/**
|
|
* @protected
|
|
*/
|
|
_renderValidatedComponentWithoutOwnerOrContext: function _renderValidatedComponentWithoutOwnerOrContext() {
|
|
var inst = this._instance;
|
|
var renderedElement;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
renderedElement = measureLifeCyclePerf(function () {
|
|
return inst.render();
|
|
}, this._debugID, 'render');
|
|
} else {
|
|
renderedElement = inst.render();
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// We allow auto-mocks to proceed as if they're returning null.
|
|
if (renderedElement === undefined && inst.render._isMockFunction) {
|
|
// This is probably bad practice. Consider warning here and
|
|
// deprecating this convenience.
|
|
renderedElement = null;
|
|
}
|
|
}
|
|
|
|
return renderedElement;
|
|
},
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
_renderValidatedComponent: function _renderValidatedComponent() {
|
|
var renderedElement;
|
|
if (process.env.NODE_ENV !== 'production' || this._compositeType !== CompositeTypes.StatelessFunctional) {
|
|
ReactCurrentOwner.current = this;
|
|
try {
|
|
renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();
|
|
} finally {
|
|
ReactCurrentOwner.current = null;
|
|
}
|
|
} else {
|
|
renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();
|
|
}
|
|
!(
|
|
// TODO: An `isValidNode` function would probably be more appropriate
|
|
renderedElement === null || renderedElement === false || React.isValidElement(renderedElement)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : _prodInvariant('109', this.getName() || 'ReactCompositeComponent') : void 0;
|
|
|
|
return renderedElement;
|
|
},
|
|
|
|
/**
|
|
* Lazily allocates the refs object and stores `component` as `ref`.
|
|
*
|
|
* @param {string} ref Reference name.
|
|
* @param {component} component Component to store as `ref`.
|
|
* @final
|
|
* @private
|
|
*/
|
|
attachRef: function attachRef(ref, component) {
|
|
var inst = this.getPublicInstance();
|
|
!(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : _prodInvariant('110') : void 0;
|
|
var publicComponentInstance = component.getPublicInstance();
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var componentName = component && component.getName ? component.getName() : 'a component';
|
|
process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null || component._compositeType !== CompositeTypes.StatelessFunctional, 'Stateless function components cannot be given refs ' + '(See ref "%s" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : void 0;
|
|
}
|
|
var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;
|
|
refs[ref] = publicComponentInstance;
|
|
},
|
|
|
|
/**
|
|
* Detaches a reference name.
|
|
*
|
|
* @param {string} ref Name to dereference.
|
|
* @final
|
|
* @private
|
|
*/
|
|
detachRef: function detachRef(ref) {
|
|
var refs = this.getPublicInstance().refs;
|
|
delete refs[ref];
|
|
},
|
|
|
|
/**
|
|
* Get a text description of the component that can be used to identify it
|
|
* in error messages.
|
|
* @return {string} The name or null.
|
|
* @internal
|
|
*/
|
|
getName: function getName() {
|
|
var type = this._currentElement.type;
|
|
var constructor = this._instance && this._instance.constructor;
|
|
return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;
|
|
},
|
|
|
|
/**
|
|
* Get the publicly accessible representation of this component - i.e. what
|
|
* is exposed by refs and returned by render. Can be null for stateless
|
|
* components.
|
|
*
|
|
* @return {ReactComponent} the public component instance.
|
|
* @internal
|
|
*/
|
|
getPublicInstance: function getPublicInstance() {
|
|
var inst = this._instance;
|
|
if (this._compositeType === CompositeTypes.StatelessFunctional) {
|
|
return null;
|
|
}
|
|
return inst;
|
|
},
|
|
|
|
// Stub
|
|
_instantiateReactComponent: null
|
|
};
|
|
|
|
module.exports = ReactCompositeComponent;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 158 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/
|
|
|
|
|
|
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactDefaultInjection = __webpack_require__(175);
|
|
var ReactMount = __webpack_require__(82);
|
|
var ReactReconciler = __webpack_require__(22);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
var ReactVersion = __webpack_require__(190);
|
|
|
|
var findDOMNode = __webpack_require__(207);
|
|
var getHostComponentFromComposite = __webpack_require__(88);
|
|
var renderSubtreeIntoContainer = __webpack_require__(214);
|
|
var warning = __webpack_require__(2);
|
|
|
|
ReactDefaultInjection.inject();
|
|
|
|
var ReactDOM = {
|
|
findDOMNode: findDOMNode,
|
|
render: ReactMount.render,
|
|
unmountComponentAtNode: ReactMount.unmountComponentAtNode,
|
|
version: ReactVersion,
|
|
|
|
/* eslint-disable camelcase */
|
|
unstable_batchedUpdates: ReactUpdates.batchedUpdates,
|
|
unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer
|
|
/* eslint-enable camelcase */
|
|
};
|
|
|
|
// Inject the runtime into a devtools global hook regardless of browser.
|
|
// Allows for debugging when the hook is injected on the page.
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
|
|
__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({
|
|
ComponentTree: {
|
|
getClosestInstanceFromNode: ReactDOMComponentTree.getClosestInstanceFromNode,
|
|
getNodeFromInstance: function getNodeFromInstance(inst) {
|
|
// inst is an internal instance (but could be a composite)
|
|
if (inst._renderedComponent) {
|
|
inst = getHostComponentFromComposite(inst);
|
|
}
|
|
if (inst) {
|
|
return ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
},
|
|
Mount: ReactMount,
|
|
Reconciler: ReactReconciler
|
|
});
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
if (ExecutionEnvironment.canUseDOM && window.top === window.self) {
|
|
// First check if devtools is not installed
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
|
|
// If we're in Chrome or Firefox, provide a download link if not installed.
|
|
if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
|
|
// Firefox does not have the issue with devtools loaded over file://
|
|
var showFileUrlMessage = window.location.protocol.indexOf('http') === -1 && navigator.userAgent.indexOf('Firefox') === -1;
|
|
console.debug('Download the React DevTools ' + (showFileUrlMessage ? 'and use an HTTP server (instead of a file: URL) ' : '') + 'for a better development experience: ' + 'https://fb.me/react-devtools');
|
|
}
|
|
}
|
|
|
|
var testFunc = function testFn() {};
|
|
process.env.NODE_ENV !== 'production' ? warning((testFunc.name || testFunc.toString()).indexOf('testFn') !== -1, "It looks like you're using a minified copy of the development build " + 'of React. When deploying React apps to production, make sure to use ' + 'the production build which skips development warnings and is faster. ' + 'See https://fb.me/react-minification for more details.') : void 0;
|
|
|
|
// If we're in IE8, check to see if we are in compatibility mode and provide
|
|
// information on preventing compatibility mode
|
|
var ieCompatibilityMode = document.documentMode && document.documentMode < 8;
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv="X-UA-Compatible" content="IE=edge" />') : void 0;
|
|
|
|
var expectedFeatures = [
|
|
// shims
|
|
Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.trim];
|
|
|
|
for (var i = 0; i < expectedFeatures.length; i++) {
|
|
if (!expectedFeatures[i]) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'One or more ES5 shims expected by React are not available: ' + 'https://fb.me/react-warning-polyfills') : void 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactDOMUnknownPropertyHook = __webpack_require__(172);
|
|
var ReactDOMNullInputValuePropHook = __webpack_require__(166);
|
|
var ReactDOMInvalidARIAHook = __webpack_require__(165);
|
|
|
|
ReactInstrumentation.debugTool.addHook(ReactDOMUnknownPropertyHook);
|
|
ReactInstrumentation.debugTool.addHook(ReactDOMNullInputValuePropHook);
|
|
ReactInstrumentation.debugTool.addHook(ReactDOMInvalidARIAHook);
|
|
}
|
|
|
|
module.exports = ReactDOM;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 159 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/* global hasOwnProperty:true */
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var AutoFocusUtils = __webpack_require__(146);
|
|
var CSSPropertyOperations = __webpack_require__(148);
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var DOMNamespaces = __webpack_require__(46);
|
|
var DOMProperty = __webpack_require__(17);
|
|
var DOMPropertyOperations = __webpack_require__(75);
|
|
var EventPluginHub = __webpack_require__(27);
|
|
var EventPluginRegistry = __webpack_require__(33);
|
|
var ReactBrowserEventEmitter = __webpack_require__(34);
|
|
var ReactDOMComponentFlags = __webpack_require__(76);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactDOMInput = __webpack_require__(164);
|
|
var ReactDOMOption = __webpack_require__(167);
|
|
var ReactDOMSelect = __webpack_require__(77);
|
|
var ReactDOMTextarea = __webpack_require__(170);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactMultiChild = __webpack_require__(183);
|
|
var ReactServerRenderingTransaction = __webpack_require__(188);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var escapeTextContentForBrowser = __webpack_require__(37);
|
|
var invariant = __webpack_require__(1);
|
|
var isEventSupported = __webpack_require__(57);
|
|
var shallowEqual = __webpack_require__(40);
|
|
var inputValueTracking = __webpack_require__(90);
|
|
var validateDOMNesting = __webpack_require__(59);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var Flags = ReactDOMComponentFlags;
|
|
var deleteListener = EventPluginHub.deleteListener;
|
|
var getNode = ReactDOMComponentTree.getNodeFromInstance;
|
|
var listenTo = ReactBrowserEventEmitter.listenTo;
|
|
var registrationNameModules = EventPluginRegistry.registrationNameModules;
|
|
|
|
// For quickly matching children type, to test if can be treated as content.
|
|
var CONTENT_TYPES = { string: true, number: true };
|
|
|
|
var STYLE = 'style';
|
|
var HTML = '__html';
|
|
var RESERVED_PROPS = {
|
|
children: null,
|
|
dangerouslySetInnerHTML: null,
|
|
suppressContentEditableWarning: null
|
|
};
|
|
|
|
// Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE).
|
|
var DOC_FRAGMENT_TYPE = 11;
|
|
|
|
function getDeclarationErrorAddendum(internalInstance) {
|
|
if (internalInstance) {
|
|
var owner = internalInstance._currentElement._owner || null;
|
|
if (owner) {
|
|
var name = owner.getName();
|
|
if (name) {
|
|
return ' This DOM node was rendered by `' + name + '`.';
|
|
}
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function friendlyStringify(obj) {
|
|
if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {
|
|
if (Array.isArray(obj)) {
|
|
return '[' + obj.map(friendlyStringify).join(', ') + ']';
|
|
} else {
|
|
var pairs = [];
|
|
for (var key in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key);
|
|
pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));
|
|
}
|
|
}
|
|
return '{' + pairs.join(', ') + '}';
|
|
}
|
|
} else if (typeof obj === 'string') {
|
|
return JSON.stringify(obj);
|
|
} else if (typeof obj === 'function') {
|
|
return '[function object]';
|
|
}
|
|
// Differs from JSON.stringify in that undefined because undefined and that
|
|
// inf and nan don't become null
|
|
return String(obj);
|
|
}
|
|
|
|
var styleMutationWarning = {};
|
|
|
|
function checkAndWarnForMutatedStyle(style1, style2, component) {
|
|
if (style1 == null || style2 == null) {
|
|
return;
|
|
}
|
|
if (shallowEqual(style1, style2)) {
|
|
return;
|
|
}
|
|
|
|
var componentName = component._tag;
|
|
var owner = component._currentElement._owner;
|
|
var ownerName;
|
|
if (owner) {
|
|
ownerName = owner.getName();
|
|
}
|
|
|
|
var hash = ownerName + '|' + componentName;
|
|
|
|
if (styleMutationWarning.hasOwnProperty(hash)) {
|
|
return;
|
|
}
|
|
|
|
styleMutationWarning[hash] = true;
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : void 0;
|
|
}
|
|
|
|
/**
|
|
* @param {object} component
|
|
* @param {?object} props
|
|
*/
|
|
function assertValidProps(component, props) {
|
|
if (!props) {
|
|
return;
|
|
}
|
|
// Note the use of `==` which checks for null or undefined.
|
|
if (voidElementTags[component._tag]) {
|
|
!(props.children == null && props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : _prodInvariant('137', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : void 0;
|
|
}
|
|
if (props.dangerouslySetInnerHTML != null) {
|
|
!(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : _prodInvariant('60') : void 0;
|
|
!(_typeof(props.dangerouslySetInnerHTML) === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : _prodInvariant('61') : void 0;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0;
|
|
process.env.NODE_ENV !== 'production' ? warning(props.onFocusIn == null && props.onFocusOut == null, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.') : void 0;
|
|
}
|
|
!(props.style == null || _typeof(props.style) === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \'em\'}} when using JSX.%s', getDeclarationErrorAddendum(component)) : _prodInvariant('62', getDeclarationErrorAddendum(component)) : void 0;
|
|
}
|
|
|
|
function enqueuePutListener(inst, registrationName, listener, transaction) {
|
|
if (transaction instanceof ReactServerRenderingTransaction) {
|
|
return;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// IE8 has no API for event capturing and the `onScroll` event doesn't
|
|
// bubble.
|
|
process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), "This browser doesn't support the `onScroll` event") : void 0;
|
|
}
|
|
var containerInfo = inst._hostContainerInfo;
|
|
var isDocumentFragment = containerInfo._node && containerInfo._node.nodeType === DOC_FRAGMENT_TYPE;
|
|
var doc = isDocumentFragment ? containerInfo._node : containerInfo._ownerDocument;
|
|
listenTo(registrationName, doc);
|
|
transaction.getReactMountReady().enqueue(putListener, {
|
|
inst: inst,
|
|
registrationName: registrationName,
|
|
listener: listener
|
|
});
|
|
}
|
|
|
|
function putListener() {
|
|
var listenerToPut = this;
|
|
EventPluginHub.putListener(listenerToPut.inst, listenerToPut.registrationName, listenerToPut.listener);
|
|
}
|
|
|
|
function inputPostMount() {
|
|
var inst = this;
|
|
ReactDOMInput.postMountWrapper(inst);
|
|
}
|
|
|
|
function textareaPostMount() {
|
|
var inst = this;
|
|
ReactDOMTextarea.postMountWrapper(inst);
|
|
}
|
|
|
|
function optionPostMount() {
|
|
var inst = this;
|
|
ReactDOMOption.postMountWrapper(inst);
|
|
}
|
|
|
|
var setAndValidateContentChildDev = emptyFunction;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev = function setAndValidateContentChildDev(content) {
|
|
var hasExistingContent = this._contentDebugID != null;
|
|
var debugID = this._debugID;
|
|
// This ID represents the inlined child that has no backing instance:
|
|
var contentDebugID = -debugID;
|
|
|
|
if (content == null) {
|
|
if (hasExistingContent) {
|
|
ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID);
|
|
}
|
|
this._contentDebugID = null;
|
|
return;
|
|
}
|
|
|
|
validateDOMNesting(null, String(content), this, this._ancestorInfo);
|
|
this._contentDebugID = contentDebugID;
|
|
if (hasExistingContent) {
|
|
ReactInstrumentation.debugTool.onBeforeUpdateComponent(contentDebugID, content);
|
|
ReactInstrumentation.debugTool.onUpdateComponent(contentDebugID);
|
|
} else {
|
|
ReactInstrumentation.debugTool.onBeforeMountComponent(contentDebugID, content, debugID);
|
|
ReactInstrumentation.debugTool.onMountComponent(contentDebugID);
|
|
ReactInstrumentation.debugTool.onSetChildren(debugID, [contentDebugID]);
|
|
}
|
|
};
|
|
}
|
|
|
|
// There are so many media events, it makes sense to just
|
|
// maintain a list rather than create a `trapBubbledEvent` for each
|
|
var mediaEvents = {
|
|
topAbort: 'abort',
|
|
topCanPlay: 'canplay',
|
|
topCanPlayThrough: 'canplaythrough',
|
|
topDurationChange: 'durationchange',
|
|
topEmptied: 'emptied',
|
|
topEncrypted: 'encrypted',
|
|
topEnded: 'ended',
|
|
topError: 'error',
|
|
topLoadedData: 'loadeddata',
|
|
topLoadedMetadata: 'loadedmetadata',
|
|
topLoadStart: 'loadstart',
|
|
topPause: 'pause',
|
|
topPlay: 'play',
|
|
topPlaying: 'playing',
|
|
topProgress: 'progress',
|
|
topRateChange: 'ratechange',
|
|
topSeeked: 'seeked',
|
|
topSeeking: 'seeking',
|
|
topStalled: 'stalled',
|
|
topSuspend: 'suspend',
|
|
topTimeUpdate: 'timeupdate',
|
|
topVolumeChange: 'volumechange',
|
|
topWaiting: 'waiting'
|
|
};
|
|
|
|
function trackInputValue() {
|
|
inputValueTracking.track(this);
|
|
}
|
|
|
|
function trapBubbledEventsLocal() {
|
|
var inst = this;
|
|
// If a component renders to null or if another component fatals and causes
|
|
// the state of the tree to be corrupted, `node` here can be null.
|
|
!inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : _prodInvariant('63') : void 0;
|
|
var node = getNode(inst);
|
|
!node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : _prodInvariant('64') : void 0;
|
|
|
|
switch (inst._tag) {
|
|
case 'iframe':
|
|
case 'object':
|
|
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)];
|
|
break;
|
|
case 'video':
|
|
case 'audio':
|
|
inst._wrapperState.listeners = [];
|
|
// Create listener for each media event
|
|
for (var event in mediaEvents) {
|
|
if (mediaEvents.hasOwnProperty(event)) {
|
|
inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(event, mediaEvents[event], node));
|
|
}
|
|
}
|
|
break;
|
|
case 'source':
|
|
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node)];
|
|
break;
|
|
case 'img':
|
|
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node), ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)];
|
|
break;
|
|
case 'form':
|
|
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topReset', 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent('topSubmit', 'submit', node)];
|
|
break;
|
|
case 'input':
|
|
case 'select':
|
|
case 'textarea':
|
|
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topInvalid', 'invalid', node)];
|
|
break;
|
|
}
|
|
}
|
|
|
|
function postUpdateSelectWrapper() {
|
|
ReactDOMSelect.postUpdateWrapper(this);
|
|
}
|
|
|
|
// For HTML, certain tags should omit their close tag. We keep a whitelist for
|
|
// those special-case tags.
|
|
|
|
var omittedCloseTags = {
|
|
area: true,
|
|
base: true,
|
|
br: true,
|
|
col: true,
|
|
embed: true,
|
|
hr: true,
|
|
img: true,
|
|
input: true,
|
|
keygen: true,
|
|
link: true,
|
|
meta: true,
|
|
param: true,
|
|
source: true,
|
|
track: true,
|
|
wbr: true
|
|
// NOTE: menuitem's close tag should be omitted, but that causes problems.
|
|
};
|
|
|
|
var newlineEatingTags = {
|
|
listing: true,
|
|
pre: true,
|
|
textarea: true
|
|
};
|
|
|
|
// For HTML, certain tags cannot have children. This has the same purpose as
|
|
// `omittedCloseTags` except that `menuitem` should still have its closing tag.
|
|
|
|
var voidElementTags = _assign({
|
|
menuitem: true
|
|
}, omittedCloseTags);
|
|
|
|
// We accept any tag to be rendered but since this gets injected into arbitrary
|
|
// HTML, we want to make sure that it's a safe tag.
|
|
// http://www.w3.org/TR/REC-xml/#NT-Name
|
|
|
|
var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
|
|
var validatedTagCache = {};
|
|
var hasOwnProperty = {}.hasOwnProperty;
|
|
|
|
function validateDangerousTag(tag) {
|
|
if (!hasOwnProperty.call(validatedTagCache, tag)) {
|
|
!VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : _prodInvariant('65', tag) : void 0;
|
|
validatedTagCache[tag] = true;
|
|
}
|
|
}
|
|
|
|
function isCustomComponent(tagName, props) {
|
|
return tagName.indexOf('-') >= 0 || props.is != null;
|
|
}
|
|
|
|
var globalIdCounter = 1;
|
|
|
|
/**
|
|
* Creates a new React class that is idempotent and capable of containing other
|
|
* React components. It accepts event listeners and DOM properties that are
|
|
* valid according to `DOMProperty`.
|
|
*
|
|
* - Event listeners: `onClick`, `onMouseDown`, etc.
|
|
* - DOM properties: `className`, `name`, `title`, etc.
|
|
*
|
|
* The `style` property functions differently from the DOM API. It accepts an
|
|
* object mapping of style properties to values.
|
|
*
|
|
* @constructor ReactDOMComponent
|
|
* @extends ReactMultiChild
|
|
*/
|
|
function ReactDOMComponent(element) {
|
|
var tag = element.type;
|
|
validateDangerousTag(tag);
|
|
this._currentElement = element;
|
|
this._tag = tag.toLowerCase();
|
|
this._namespaceURI = null;
|
|
this._renderedChildren = null;
|
|
this._previousStyle = null;
|
|
this._previousStyleCopy = null;
|
|
this._hostNode = null;
|
|
this._hostParent = null;
|
|
this._rootNodeID = 0;
|
|
this._domID = 0;
|
|
this._hostContainerInfo = null;
|
|
this._wrapperState = null;
|
|
this._topLevelWrapper = null;
|
|
this._flags = 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
this._ancestorInfo = null;
|
|
setAndValidateContentChildDev.call(this, null);
|
|
}
|
|
}
|
|
|
|
ReactDOMComponent.displayName = 'ReactDOMComponent';
|
|
|
|
ReactDOMComponent.Mixin = {
|
|
/**
|
|
* Generates root tag markup then recurses. This method has side effects and
|
|
* is not idempotent.
|
|
*
|
|
* @internal
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {?ReactDOMComponent} the parent component instance
|
|
* @param {?object} info about the host container
|
|
* @param {object} context
|
|
* @return {string} The computed markup.
|
|
*/
|
|
mountComponent: function mountComponent(transaction, hostParent, hostContainerInfo, context) {
|
|
this._rootNodeID = globalIdCounter++;
|
|
this._domID = hostContainerInfo._idCounter++;
|
|
this._hostParent = hostParent;
|
|
this._hostContainerInfo = hostContainerInfo;
|
|
|
|
var props = this._currentElement.props;
|
|
|
|
switch (this._tag) {
|
|
case 'audio':
|
|
case 'form':
|
|
case 'iframe':
|
|
case 'img':
|
|
case 'link':
|
|
case 'object':
|
|
case 'source':
|
|
case 'video':
|
|
this._wrapperState = {
|
|
listeners: null
|
|
};
|
|
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
|
break;
|
|
case 'input':
|
|
ReactDOMInput.mountWrapper(this, props, hostParent);
|
|
props = ReactDOMInput.getHostProps(this, props);
|
|
transaction.getReactMountReady().enqueue(trackInputValue, this);
|
|
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
|
break;
|
|
case 'option':
|
|
ReactDOMOption.mountWrapper(this, props, hostParent);
|
|
props = ReactDOMOption.getHostProps(this, props);
|
|
break;
|
|
case 'select':
|
|
ReactDOMSelect.mountWrapper(this, props, hostParent);
|
|
props = ReactDOMSelect.getHostProps(this, props);
|
|
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
|
break;
|
|
case 'textarea':
|
|
ReactDOMTextarea.mountWrapper(this, props, hostParent);
|
|
props = ReactDOMTextarea.getHostProps(this, props);
|
|
transaction.getReactMountReady().enqueue(trackInputValue, this);
|
|
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
|
break;
|
|
}
|
|
|
|
assertValidProps(this, props);
|
|
|
|
// We create tags in the namespace of their parent container, except HTML
|
|
// tags get no namespace.
|
|
var namespaceURI;
|
|
var parentTag;
|
|
if (hostParent != null) {
|
|
namespaceURI = hostParent._namespaceURI;
|
|
parentTag = hostParent._tag;
|
|
} else if (hostContainerInfo._tag) {
|
|
namespaceURI = hostContainerInfo._namespaceURI;
|
|
parentTag = hostContainerInfo._tag;
|
|
}
|
|
if (namespaceURI == null || namespaceURI === DOMNamespaces.svg && parentTag === 'foreignobject') {
|
|
namespaceURI = DOMNamespaces.html;
|
|
}
|
|
if (namespaceURI === DOMNamespaces.html) {
|
|
if (this._tag === 'svg') {
|
|
namespaceURI = DOMNamespaces.svg;
|
|
} else if (this._tag === 'math') {
|
|
namespaceURI = DOMNamespaces.mathml;
|
|
}
|
|
}
|
|
this._namespaceURI = namespaceURI;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var parentInfo;
|
|
if (hostParent != null) {
|
|
parentInfo = hostParent._ancestorInfo;
|
|
} else if (hostContainerInfo._tag) {
|
|
parentInfo = hostContainerInfo._ancestorInfo;
|
|
}
|
|
if (parentInfo) {
|
|
// parentInfo should always be present except for the top-level
|
|
// component when server rendering
|
|
validateDOMNesting(this._tag, null, this, parentInfo);
|
|
}
|
|
this._ancestorInfo = validateDOMNesting.updatedAncestorInfo(parentInfo, this._tag, this);
|
|
}
|
|
|
|
var mountImage;
|
|
if (transaction.useCreateElement) {
|
|
var ownerDocument = hostContainerInfo._ownerDocument;
|
|
var el;
|
|
if (namespaceURI === DOMNamespaces.html) {
|
|
if (this._tag === 'script') {
|
|
// Create the script via .innerHTML so its "parser-inserted" flag is
|
|
// set to true and it does not execute
|
|
var div = ownerDocument.createElement('div');
|
|
var type = this._currentElement.type;
|
|
div.innerHTML = '<' + type + '></' + type + '>';
|
|
el = div.removeChild(div.firstChild);
|
|
} else if (props.is) {
|
|
el = ownerDocument.createElement(this._currentElement.type, props.is);
|
|
} else {
|
|
// Separate else branch instead of using `props.is || undefined` above becuase of a Firefox bug.
|
|
// See discussion in https://github.com/facebook/react/pull/6896
|
|
// and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
|
|
el = ownerDocument.createElement(this._currentElement.type);
|
|
}
|
|
} else {
|
|
el = ownerDocument.createElementNS(namespaceURI, this._currentElement.type);
|
|
}
|
|
ReactDOMComponentTree.precacheNode(this, el);
|
|
this._flags |= Flags.hasCachedChildNodes;
|
|
if (!this._hostParent) {
|
|
DOMPropertyOperations.setAttributeForRoot(el);
|
|
}
|
|
this._updateDOMProperties(null, props, transaction);
|
|
var lazyTree = DOMLazyTree(el);
|
|
this._createInitialChildren(transaction, props, context, lazyTree);
|
|
mountImage = lazyTree;
|
|
} else {
|
|
var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);
|
|
var tagContent = this._createContentMarkup(transaction, props, context);
|
|
if (!tagContent && omittedCloseTags[this._tag]) {
|
|
mountImage = tagOpen + '/>';
|
|
} else {
|
|
mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';
|
|
}
|
|
}
|
|
|
|
switch (this._tag) {
|
|
case 'input':
|
|
transaction.getReactMountReady().enqueue(inputPostMount, this);
|
|
if (props.autoFocus) {
|
|
transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);
|
|
}
|
|
break;
|
|
case 'textarea':
|
|
transaction.getReactMountReady().enqueue(textareaPostMount, this);
|
|
if (props.autoFocus) {
|
|
transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);
|
|
}
|
|
break;
|
|
case 'select':
|
|
if (props.autoFocus) {
|
|
transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);
|
|
}
|
|
break;
|
|
case 'button':
|
|
if (props.autoFocus) {
|
|
transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);
|
|
}
|
|
break;
|
|
case 'option':
|
|
transaction.getReactMountReady().enqueue(optionPostMount, this);
|
|
break;
|
|
}
|
|
|
|
return mountImage;
|
|
},
|
|
|
|
/**
|
|
* Creates markup for the open tag and all attributes.
|
|
*
|
|
* This method has side effects because events get registered.
|
|
*
|
|
* Iterating over object properties is faster than iterating over arrays.
|
|
* @see http://jsperf.com/obj-vs-arr-iteration
|
|
*
|
|
* @private
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {object} props
|
|
* @return {string} Markup of opening tag.
|
|
*/
|
|
_createOpenTagMarkupAndPutListeners: function _createOpenTagMarkupAndPutListeners(transaction, props) {
|
|
var ret = '<' + this._currentElement.type;
|
|
|
|
for (var propKey in props) {
|
|
if (!props.hasOwnProperty(propKey)) {
|
|
continue;
|
|
}
|
|
var propValue = props[propKey];
|
|
if (propValue == null) {
|
|
continue;
|
|
}
|
|
if (registrationNameModules.hasOwnProperty(propKey)) {
|
|
if (propValue) {
|
|
enqueuePutListener(this, propKey, propValue, transaction);
|
|
}
|
|
} else {
|
|
if (propKey === STYLE) {
|
|
if (propValue) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// See `_updateDOMProperties`. style block
|
|
this._previousStyle = propValue;
|
|
}
|
|
propValue = this._previousStyleCopy = _assign({}, props.style);
|
|
}
|
|
propValue = CSSPropertyOperations.createMarkupForStyles(propValue, this);
|
|
}
|
|
var markup = null;
|
|
if (this._tag != null && isCustomComponent(this._tag, props)) {
|
|
if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
|
markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);
|
|
}
|
|
} else {
|
|
markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);
|
|
}
|
|
if (markup) {
|
|
ret += ' ' + markup;
|
|
}
|
|
}
|
|
}
|
|
|
|
// For static pages, no need to put React ID and checksum. Saves lots of
|
|
// bytes.
|
|
if (transaction.renderToStaticMarkup) {
|
|
return ret;
|
|
}
|
|
|
|
if (!this._hostParent) {
|
|
ret += ' ' + DOMPropertyOperations.createMarkupForRoot();
|
|
}
|
|
ret += ' ' + DOMPropertyOperations.createMarkupForID(this._domID);
|
|
return ret;
|
|
},
|
|
|
|
/**
|
|
* Creates markup for the content between the tags.
|
|
*
|
|
* @private
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {object} props
|
|
* @param {object} context
|
|
* @return {string} Content markup.
|
|
*/
|
|
_createContentMarkup: function _createContentMarkup(transaction, props, context) {
|
|
var ret = '';
|
|
|
|
// Intentional use of != to avoid catching zero/false.
|
|
var innerHTML = props.dangerouslySetInnerHTML;
|
|
if (innerHTML != null) {
|
|
if (innerHTML.__html != null) {
|
|
ret = innerHTML.__html;
|
|
}
|
|
} else {
|
|
var contentToUse = CONTENT_TYPES[_typeof(props.children)] ? props.children : null;
|
|
var childrenToUse = contentToUse != null ? null : props.children;
|
|
if (contentToUse != null) {
|
|
// TODO: Validate that text is allowed as a child of this node
|
|
ret = escapeTextContentForBrowser(contentToUse);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev.call(this, contentToUse);
|
|
}
|
|
} else if (childrenToUse != null) {
|
|
var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
|
ret = mountImages.join('');
|
|
}
|
|
}
|
|
if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') {
|
|
// text/html ignores the first character in these tags if it's a newline
|
|
// Prefer to break application/xml over text/html (for now) by adding
|
|
// a newline specifically to get eaten by the parser. (Alternately for
|
|
// textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
|
|
// \r is normalized out by HTMLTextAreaElement#value.)
|
|
// See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
|
|
// See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
|
|
// See: <http://www.w3.org/TR/html5/syntax.html#newlines>
|
|
// See: Parsing of "textarea" "listing" and "pre" elements
|
|
// from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
|
|
return '\n' + ret;
|
|
} else {
|
|
return ret;
|
|
}
|
|
},
|
|
|
|
_createInitialChildren: function _createInitialChildren(transaction, props, context, lazyTree) {
|
|
// Intentional use of != to avoid catching zero/false.
|
|
var innerHTML = props.dangerouslySetInnerHTML;
|
|
if (innerHTML != null) {
|
|
if (innerHTML.__html != null) {
|
|
DOMLazyTree.queueHTML(lazyTree, innerHTML.__html);
|
|
}
|
|
} else {
|
|
var contentToUse = CONTENT_TYPES[_typeof(props.children)] ? props.children : null;
|
|
var childrenToUse = contentToUse != null ? null : props.children;
|
|
// TODO: Validate that text is allowed as a child of this node
|
|
if (contentToUse != null) {
|
|
// Avoid setting textContent when the text is empty. In IE11 setting
|
|
// textContent on a text area will cause the placeholder to not
|
|
// show within the textarea until it has been focused and blurred again.
|
|
// https://github.com/facebook/react/issues/6731#issuecomment-254874553
|
|
if (contentToUse !== '') {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev.call(this, contentToUse);
|
|
}
|
|
DOMLazyTree.queueText(lazyTree, contentToUse);
|
|
}
|
|
} else if (childrenToUse != null) {
|
|
var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
|
for (var i = 0; i < mountImages.length; i++) {
|
|
DOMLazyTree.queueChild(lazyTree, mountImages[i]);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Receives a next element and updates the component.
|
|
*
|
|
* @internal
|
|
* @param {ReactElement} nextElement
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @param {object} context
|
|
*/
|
|
receiveComponent: function receiveComponent(nextElement, transaction, context) {
|
|
var prevElement = this._currentElement;
|
|
this._currentElement = nextElement;
|
|
this.updateComponent(transaction, prevElement, nextElement, context);
|
|
},
|
|
|
|
/**
|
|
* Updates a DOM component after it has already been allocated and
|
|
* attached to the DOM. Reconciles the root DOM node, then recurses.
|
|
*
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {ReactElement} prevElement
|
|
* @param {ReactElement} nextElement
|
|
* @internal
|
|
* @overridable
|
|
*/
|
|
updateComponent: function updateComponent(transaction, prevElement, nextElement, context) {
|
|
var lastProps = prevElement.props;
|
|
var nextProps = this._currentElement.props;
|
|
|
|
switch (this._tag) {
|
|
case 'input':
|
|
lastProps = ReactDOMInput.getHostProps(this, lastProps);
|
|
nextProps = ReactDOMInput.getHostProps(this, nextProps);
|
|
break;
|
|
case 'option':
|
|
lastProps = ReactDOMOption.getHostProps(this, lastProps);
|
|
nextProps = ReactDOMOption.getHostProps(this, nextProps);
|
|
break;
|
|
case 'select':
|
|
lastProps = ReactDOMSelect.getHostProps(this, lastProps);
|
|
nextProps = ReactDOMSelect.getHostProps(this, nextProps);
|
|
break;
|
|
case 'textarea':
|
|
lastProps = ReactDOMTextarea.getHostProps(this, lastProps);
|
|
nextProps = ReactDOMTextarea.getHostProps(this, nextProps);
|
|
break;
|
|
}
|
|
|
|
assertValidProps(this, nextProps);
|
|
this._updateDOMProperties(lastProps, nextProps, transaction);
|
|
this._updateDOMChildren(lastProps, nextProps, transaction, context);
|
|
|
|
switch (this._tag) {
|
|
case 'input':
|
|
// Update the wrapper around inputs *after* updating props. This has to
|
|
// happen after `_updateDOMProperties`. Otherwise HTML5 input validations
|
|
// raise warnings and prevent the new value from being assigned.
|
|
ReactDOMInput.updateWrapper(this);
|
|
break;
|
|
case 'textarea':
|
|
ReactDOMTextarea.updateWrapper(this);
|
|
break;
|
|
case 'select':
|
|
// <select> value update needs to occur after <option> children
|
|
// reconciliation
|
|
transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reconciles the properties by detecting differences in property values and
|
|
* updating the DOM as necessary. This function is probably the single most
|
|
* critical path for performance optimization.
|
|
*
|
|
* TODO: Benchmark whether checking for changed values in memory actually
|
|
* improves performance (especially statically positioned elements).
|
|
* TODO: Benchmark the effects of putting this at the top since 99% of props
|
|
* do not change for a given reconciliation.
|
|
* TODO: Benchmark areas that can be improved with caching.
|
|
*
|
|
* @private
|
|
* @param {object} lastProps
|
|
* @param {object} nextProps
|
|
* @param {?DOMElement} node
|
|
*/
|
|
_updateDOMProperties: function _updateDOMProperties(lastProps, nextProps, transaction) {
|
|
var propKey;
|
|
var styleName;
|
|
var styleUpdates;
|
|
for (propKey in lastProps) {
|
|
if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
|
|
continue;
|
|
}
|
|
if (propKey === STYLE) {
|
|
var lastStyle = this._previousStyleCopy;
|
|
for (styleName in lastStyle) {
|
|
if (lastStyle.hasOwnProperty(styleName)) {
|
|
styleUpdates = styleUpdates || {};
|
|
styleUpdates[styleName] = '';
|
|
}
|
|
}
|
|
this._previousStyleCopy = null;
|
|
} else if (registrationNameModules.hasOwnProperty(propKey)) {
|
|
if (lastProps[propKey]) {
|
|
// Only call deleteListener if there was a listener previously or
|
|
// else willDeleteListener gets called when there wasn't actually a
|
|
// listener (e.g., onClick={null})
|
|
deleteListener(this, propKey);
|
|
}
|
|
} else if (isCustomComponent(this._tag, lastProps)) {
|
|
if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
|
DOMPropertyOperations.deleteValueForAttribute(getNode(this), propKey);
|
|
}
|
|
} else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {
|
|
DOMPropertyOperations.deleteValueForProperty(getNode(this), propKey);
|
|
}
|
|
}
|
|
for (propKey in nextProps) {
|
|
var nextProp = nextProps[propKey];
|
|
var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps != null ? lastProps[propKey] : undefined;
|
|
if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
|
|
continue;
|
|
}
|
|
if (propKey === STYLE) {
|
|
if (nextProp) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this);
|
|
this._previousStyle = nextProp;
|
|
}
|
|
nextProp = this._previousStyleCopy = _assign({}, nextProp);
|
|
} else {
|
|
this._previousStyleCopy = null;
|
|
}
|
|
if (lastProp) {
|
|
// Unset styles on `lastProp` but not on `nextProp`.
|
|
for (styleName in lastProp) {
|
|
if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
|
|
styleUpdates = styleUpdates || {};
|
|
styleUpdates[styleName] = '';
|
|
}
|
|
}
|
|
// Update styles that changed since `lastProp`.
|
|
for (styleName in nextProp) {
|
|
if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
|
|
styleUpdates = styleUpdates || {};
|
|
styleUpdates[styleName] = nextProp[styleName];
|
|
}
|
|
}
|
|
} else {
|
|
// Relies on `updateStylesByID` not mutating `styleUpdates`.
|
|
styleUpdates = nextProp;
|
|
}
|
|
} else if (registrationNameModules.hasOwnProperty(propKey)) {
|
|
if (nextProp) {
|
|
enqueuePutListener(this, propKey, nextProp, transaction);
|
|
} else if (lastProp) {
|
|
deleteListener(this, propKey);
|
|
}
|
|
} else if (isCustomComponent(this._tag, nextProps)) {
|
|
if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
|
DOMPropertyOperations.setValueForAttribute(getNode(this), propKey, nextProp);
|
|
}
|
|
} else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {
|
|
var node = getNode(this);
|
|
// If we're updating to null or undefined, we should remove the property
|
|
// from the DOM node instead of inadvertently setting to a string. This
|
|
// brings us in line with the same behavior we have on initial render.
|
|
if (nextProp != null) {
|
|
DOMPropertyOperations.setValueForProperty(node, propKey, nextProp);
|
|
} else {
|
|
DOMPropertyOperations.deleteValueForProperty(node, propKey);
|
|
}
|
|
}
|
|
}
|
|
if (styleUpdates) {
|
|
CSSPropertyOperations.setValueForStyles(getNode(this), styleUpdates, this);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reconciles the children with the various properties that affect the
|
|
* children content.
|
|
*
|
|
* @param {object} lastProps
|
|
* @param {object} nextProps
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @param {object} context
|
|
*/
|
|
_updateDOMChildren: function _updateDOMChildren(lastProps, nextProps, transaction, context) {
|
|
var lastContent = CONTENT_TYPES[_typeof(lastProps.children)] ? lastProps.children : null;
|
|
var nextContent = CONTENT_TYPES[_typeof(nextProps.children)] ? nextProps.children : null;
|
|
|
|
var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;
|
|
var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;
|
|
|
|
// Note the use of `!=` which checks for null or undefined.
|
|
var lastChildren = lastContent != null ? null : lastProps.children;
|
|
var nextChildren = nextContent != null ? null : nextProps.children;
|
|
|
|
// If we're switching from children to content/html or vice versa, remove
|
|
// the old content
|
|
var lastHasContentOrHtml = lastContent != null || lastHtml != null;
|
|
var nextHasContentOrHtml = nextContent != null || nextHtml != null;
|
|
if (lastChildren != null && nextChildren == null) {
|
|
this.updateChildren(null, transaction, context);
|
|
} else if (lastHasContentOrHtml && !nextHasContentOrHtml) {
|
|
this.updateTextContent('');
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onSetChildren(this._debugID, []);
|
|
}
|
|
}
|
|
|
|
if (nextContent != null) {
|
|
if (lastContent !== nextContent) {
|
|
this.updateTextContent('' + nextContent);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev.call(this, nextContent);
|
|
}
|
|
}
|
|
} else if (nextHtml != null) {
|
|
if (lastHtml !== nextHtml) {
|
|
this.updateMarkup('' + nextHtml);
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactInstrumentation.debugTool.onSetChildren(this._debugID, []);
|
|
}
|
|
} else if (nextChildren != null) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev.call(this, null);
|
|
}
|
|
|
|
this.updateChildren(nextChildren, transaction, context);
|
|
}
|
|
},
|
|
|
|
getHostNode: function getHostNode() {
|
|
return getNode(this);
|
|
},
|
|
|
|
/**
|
|
* Destroys all event registrations for this instance. Does not remove from
|
|
* the DOM. That must be done by the parent.
|
|
*
|
|
* @internal
|
|
*/
|
|
unmountComponent: function unmountComponent(safely) {
|
|
switch (this._tag) {
|
|
case 'audio':
|
|
case 'form':
|
|
case 'iframe':
|
|
case 'img':
|
|
case 'link':
|
|
case 'object':
|
|
case 'source':
|
|
case 'video':
|
|
var listeners = this._wrapperState.listeners;
|
|
if (listeners) {
|
|
for (var i = 0; i < listeners.length; i++) {
|
|
listeners[i].remove();
|
|
}
|
|
}
|
|
break;
|
|
case 'input':
|
|
case 'textarea':
|
|
inputValueTracking.stopTracking(this);
|
|
break;
|
|
case 'html':
|
|
case 'head':
|
|
case 'body':
|
|
/**
|
|
* Components like <html> <head> and <body> can't be removed or added
|
|
* easily in a cross-browser way, however it's valuable to be able to
|
|
* take advantage of React's reconciliation for styling and <title>
|
|
* management. So we just document it and throw in dangerous cases.
|
|
*/
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.', this._tag) : _prodInvariant('66', this._tag) : void 0;
|
|
break;
|
|
}
|
|
|
|
this.unmountChildren(safely);
|
|
ReactDOMComponentTree.uncacheNode(this);
|
|
EventPluginHub.deleteAllListeners(this);
|
|
this._rootNodeID = 0;
|
|
this._domID = 0;
|
|
this._wrapperState = null;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setAndValidateContentChildDev.call(this, null);
|
|
}
|
|
},
|
|
|
|
getPublicInstance: function getPublicInstance() {
|
|
return getNode(this);
|
|
}
|
|
};
|
|
|
|
_assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin);
|
|
|
|
module.exports = ReactDOMComponent;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 160 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var validateDOMNesting = __webpack_require__(59);
|
|
|
|
var DOC_NODE_TYPE = 9;
|
|
|
|
function ReactDOMContainerInfo(topLevelWrapper, node) {
|
|
var info = {
|
|
_topLevelWrapper: topLevelWrapper,
|
|
_idCounter: 1,
|
|
_ownerDocument: node ? node.nodeType === DOC_NODE_TYPE ? node : node.ownerDocument : null,
|
|
_node: node,
|
|
_tag: node ? node.nodeName.toLowerCase() : null,
|
|
_namespaceURI: node ? node.namespaceURI : null
|
|
};
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
info._ancestorInfo = node ? validateDOMNesting.updatedAncestorInfo(null, info._tag, null) : null;
|
|
}
|
|
return info;
|
|
}
|
|
|
|
module.exports = ReactDOMContainerInfo;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 161 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
|
|
var ReactDOMEmptyComponent = function ReactDOMEmptyComponent(instantiate) {
|
|
// ReactCompositeComponent uses this:
|
|
this._currentElement = null;
|
|
// ReactDOMComponentTree uses these:
|
|
this._hostNode = null;
|
|
this._hostParent = null;
|
|
this._hostContainerInfo = null;
|
|
this._domID = 0;
|
|
};
|
|
_assign(ReactDOMEmptyComponent.prototype, {
|
|
mountComponent: function mountComponent(transaction, hostParent, hostContainerInfo, context) {
|
|
var domID = hostContainerInfo._idCounter++;
|
|
this._domID = domID;
|
|
this._hostParent = hostParent;
|
|
this._hostContainerInfo = hostContainerInfo;
|
|
|
|
var nodeValue = ' react-empty: ' + this._domID + ' ';
|
|
if (transaction.useCreateElement) {
|
|
var ownerDocument = hostContainerInfo._ownerDocument;
|
|
var node = ownerDocument.createComment(nodeValue);
|
|
ReactDOMComponentTree.precacheNode(this, node);
|
|
return DOMLazyTree(node);
|
|
} else {
|
|
if (transaction.renderToStaticMarkup) {
|
|
// Normally we'd insert a comment node, but since this is a situation
|
|
// where React won't take over (static pages), we can simply return
|
|
// nothing.
|
|
return '';
|
|
}
|
|
return '<!--' + nodeValue + '-->';
|
|
}
|
|
},
|
|
receiveComponent: function receiveComponent() {},
|
|
getHostNode: function getHostNode() {
|
|
return ReactDOMComponentTree.getNodeFromInstance(this);
|
|
},
|
|
unmountComponent: function unmountComponent() {
|
|
ReactDOMComponentTree.uncacheNode(this);
|
|
}
|
|
});
|
|
|
|
module.exports = ReactDOMEmptyComponent;
|
|
|
|
/***/ }),
|
|
/* 162 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactDOMFeatureFlags = {
|
|
useCreateElement: true,
|
|
useFiber: false
|
|
};
|
|
|
|
module.exports = ReactDOMFeatureFlags;
|
|
|
|
/***/ }),
|
|
/* 163 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMChildrenOperations = __webpack_require__(45);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
|
|
/**
|
|
* Operations used to process updates to DOM nodes.
|
|
*/
|
|
var ReactDOMIDOperations = {
|
|
/**
|
|
* Updates a component's children by processing a series of updates.
|
|
*
|
|
* @param {array<object>} updates List of update configurations.
|
|
* @internal
|
|
*/
|
|
dangerouslyProcessChildrenUpdates: function dangerouslyProcessChildrenUpdates(parentInst, updates) {
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(parentInst);
|
|
DOMChildrenOperations.processUpdates(node, updates);
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDOMIDOperations;
|
|
|
|
/***/ }),
|
|
/* 164 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var DOMPropertyOperations = __webpack_require__(75);
|
|
var LinkedValueUtils = __webpack_require__(49);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var didWarnValueLink = false;
|
|
var didWarnCheckedLink = false;
|
|
var didWarnValueDefaultValue = false;
|
|
var didWarnCheckedDefaultChecked = false;
|
|
var didWarnControlledToUncontrolled = false;
|
|
var didWarnUncontrolledToControlled = false;
|
|
|
|
function forceUpdateIfMounted() {
|
|
if (this._rootNodeID) {
|
|
// DOM component is still mounted; update
|
|
ReactDOMInput.updateWrapper(this);
|
|
}
|
|
}
|
|
|
|
function isControlled(props) {
|
|
var usesChecked = props.type === 'checkbox' || props.type === 'radio';
|
|
return usesChecked ? props.checked != null : props.value != null;
|
|
}
|
|
|
|
/**
|
|
* Implements an <input> host component that allows setting these optional
|
|
* props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
|
|
*
|
|
* If `checked` or `value` are not supplied (or null/undefined), user actions
|
|
* that affect the checked state or value will trigger updates to the element.
|
|
*
|
|
* If they are supplied (and not null/undefined), the rendered element will not
|
|
* trigger updates to the element. Instead, the props must change in order for
|
|
* the rendered element to be updated.
|
|
*
|
|
* The rendered element will be initialized as unchecked (or `defaultChecked`)
|
|
* with an empty value (or `defaultValue`).
|
|
*
|
|
* @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
|
|
*/
|
|
var ReactDOMInput = {
|
|
getHostProps: function getHostProps(inst, props) {
|
|
var value = LinkedValueUtils.getValue(props);
|
|
var checked = LinkedValueUtils.getChecked(props);
|
|
|
|
var hostProps = _assign({
|
|
// Make sure we set .type before any other properties (setting .value
|
|
// before .type means .value is lost in IE11 and below)
|
|
type: undefined,
|
|
// Make sure we set .step before .value (setting .value before .step
|
|
// means .value is rounded on mount, based upon step precision)
|
|
step: undefined,
|
|
// Make sure we set .min & .max before .value (to ensure proper order
|
|
// in corner cases such as min or max deriving from value, e.g. Issue #7170)
|
|
min: undefined,
|
|
max: undefined
|
|
}, props, {
|
|
defaultChecked: undefined,
|
|
defaultValue: undefined,
|
|
value: value != null ? value : inst._wrapperState.initialValue,
|
|
checked: checked != null ? checked : inst._wrapperState.initialChecked,
|
|
onChange: inst._wrapperState.onChange
|
|
});
|
|
|
|
return hostProps;
|
|
},
|
|
|
|
mountWrapper: function mountWrapper(inst, props) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);
|
|
|
|
var owner = inst._currentElement._owner;
|
|
|
|
if (props.valueLink !== undefined && !didWarnValueLink) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0;
|
|
didWarnValueLink = true;
|
|
}
|
|
if (props.checkedLink !== undefined && !didWarnCheckedLink) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`checkedLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0;
|
|
didWarnCheckedLink = true;
|
|
}
|
|
if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;
|
|
didWarnCheckedDefaultChecked = true;
|
|
}
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;
|
|
didWarnValueDefaultValue = true;
|
|
}
|
|
}
|
|
|
|
var defaultValue = props.defaultValue;
|
|
inst._wrapperState = {
|
|
initialChecked: props.checked != null ? props.checked : props.defaultChecked,
|
|
initialValue: props.value != null ? props.value : defaultValue,
|
|
listeners: null,
|
|
onChange: _handleChange.bind(inst),
|
|
controlled: isControlled(props)
|
|
};
|
|
},
|
|
|
|
updateWrapper: function updateWrapper(inst) {
|
|
var props = inst._currentElement.props;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var controlled = isControlled(props);
|
|
var owner = inst._currentElement._owner;
|
|
|
|
if (!inst._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;
|
|
didWarnUncontrolledToControlled = true;
|
|
}
|
|
if (inst._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;
|
|
didWarnControlledToUncontrolled = true;
|
|
}
|
|
}
|
|
|
|
// TODO: Shouldn't this be getChecked(props)?
|
|
var checked = props.checked;
|
|
if (checked != null) {
|
|
DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(inst), 'checked', checked || false);
|
|
}
|
|
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
var value = LinkedValueUtils.getValue(props);
|
|
if (value != null) {
|
|
if (value === 0 && node.value === '') {
|
|
node.value = '0';
|
|
// Note: IE9 reports a number inputs as 'text', so check props instead.
|
|
} else if (props.type === 'number') {
|
|
// Simulate `input.valueAsNumber`. IE9 does not support it
|
|
var valueAsNumber = parseFloat(node.value, 10) || 0;
|
|
|
|
if (
|
|
// eslint-disable-next-line
|
|
value != valueAsNumber ||
|
|
// eslint-disable-next-line
|
|
value == valueAsNumber && node.value != value) {
|
|
// Cast `value` to a string to ensure the value is set correctly. While
|
|
// browsers typically do this as necessary, jsdom doesn't.
|
|
node.value = '' + value;
|
|
}
|
|
} else if (node.value !== '' + value) {
|
|
// Cast `value` to a string to ensure the value is set correctly. While
|
|
// browsers typically do this as necessary, jsdom doesn't.
|
|
node.value = '' + value;
|
|
}
|
|
} else {
|
|
if (props.value == null && props.defaultValue != null) {
|
|
// In Chrome, assigning defaultValue to certain input types triggers input validation.
|
|
// For number inputs, the display value loses trailing decimal points. For email inputs,
|
|
// Chrome raises "The specified value <x> is not a valid email address".
|
|
//
|
|
// Here we check to see if the defaultValue has actually changed, avoiding these problems
|
|
// when the user is inputting text
|
|
//
|
|
// https://github.com/facebook/react/issues/7253
|
|
if (node.defaultValue !== '' + props.defaultValue) {
|
|
node.defaultValue = '' + props.defaultValue;
|
|
}
|
|
}
|
|
if (props.checked == null && props.defaultChecked != null) {
|
|
node.defaultChecked = !!props.defaultChecked;
|
|
}
|
|
}
|
|
},
|
|
|
|
postMountWrapper: function postMountWrapper(inst) {
|
|
var props = inst._currentElement.props;
|
|
|
|
// This is in postMount because we need access to the DOM node, which is not
|
|
// available until after the component has mounted.
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
|
|
// Detach value from defaultValue. We won't do anything if we're working on
|
|
// submit or reset inputs as those values & defaultValues are linked. They
|
|
// are not resetable nodes so this operation doesn't matter and actually
|
|
// removes browser-default values (eg "Submit Query") when no value is
|
|
// provided.
|
|
|
|
switch (props.type) {
|
|
case 'submit':
|
|
case 'reset':
|
|
break;
|
|
case 'color':
|
|
case 'date':
|
|
case 'datetime':
|
|
case 'datetime-local':
|
|
case 'month':
|
|
case 'time':
|
|
case 'week':
|
|
// This fixes the no-show issue on iOS Safari and Android Chrome:
|
|
// https://github.com/facebook/react/issues/7233
|
|
node.value = '';
|
|
node.value = node.defaultValue;
|
|
break;
|
|
default:
|
|
node.value = node.value;
|
|
break;
|
|
}
|
|
|
|
// Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
|
|
// this is needed to work around a chrome bug where setting defaultChecked
|
|
// will sometimes influence the value of checked (even after detachment).
|
|
// Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
|
|
// We need to temporarily unset name to avoid disrupting radio button groups.
|
|
var name = node.name;
|
|
if (name !== '') {
|
|
node.name = '';
|
|
}
|
|
node.defaultChecked = !node.defaultChecked;
|
|
node.defaultChecked = !node.defaultChecked;
|
|
if (name !== '') {
|
|
node.name = name;
|
|
}
|
|
}
|
|
};
|
|
|
|
function _handleChange(event) {
|
|
var props = this._currentElement.props;
|
|
|
|
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
|
|
|
// Here we use asap to wait until all updates have propagated, which
|
|
// is important when using controlled components within layers:
|
|
// https://github.com/facebook/react/issues/1698
|
|
ReactUpdates.asap(forceUpdateIfMounted, this);
|
|
|
|
var name = props.name;
|
|
if (props.type === 'radio' && name != null) {
|
|
var rootNode = ReactDOMComponentTree.getNodeFromInstance(this);
|
|
var queryRoot = rootNode;
|
|
|
|
while (queryRoot.parentNode) {
|
|
queryRoot = queryRoot.parentNode;
|
|
}
|
|
|
|
// If `rootNode.form` was non-null, then we could try `form.elements`,
|
|
// but that sometimes behaves strangely in IE8. We could also try using
|
|
// `form.getElementsByName`, but that will only return direct children
|
|
// and won't include inputs that use the HTML5 `form=` attribute. Since
|
|
// the input might not even be in a form, let's just use the global
|
|
// `querySelectorAll` to ensure we don't miss anything.
|
|
var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
|
|
|
|
for (var i = 0; i < group.length; i++) {
|
|
var otherNode = group[i];
|
|
if (otherNode === rootNode || otherNode.form !== rootNode.form) {
|
|
continue;
|
|
}
|
|
// This will throw if radio buttons rendered by different copies of React
|
|
// and the same name are rendered into the same form (same as #1939).
|
|
// That's probably okay; we don't support it just as we don't support
|
|
// mixing React radio buttons with non-React ones.
|
|
var otherInstance = ReactDOMComponentTree.getInstanceFromNode(otherNode);
|
|
!otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : _prodInvariant('90') : void 0;
|
|
// If this is a controlled radio button group, forcing the input that
|
|
// was previously checked to update will cause it to be come re-checked
|
|
// as appropriate.
|
|
ReactUpdates.asap(forceUpdateIfMounted, otherInstance);
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
module.exports = ReactDOMInput;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 165 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
var ReactComponentTreeHook = __webpack_require__(9);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
var warnedProperties = {};
|
|
var rARIA = new RegExp('^(aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
|
|
function validateProperty(tagName, name, debugID) {
|
|
if (warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {
|
|
return true;
|
|
}
|
|
|
|
if (rARIA.test(name)) {
|
|
var lowerCasedName = name.toLowerCase();
|
|
var standardName = DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;
|
|
|
|
// If this is an aria-* attribute, but is not listed in the known DOM
|
|
// DOM properties, then it is an invalid aria-* attribute.
|
|
if (standardName == null) {
|
|
warnedProperties[name] = true;
|
|
return false;
|
|
}
|
|
// aria-* attributes should be lowercase; suggest the lowercase version.
|
|
if (name !== standardName) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown ARIA attribute %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
warnedProperties[name] = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function warnInvalidARIAProps(debugID, element) {
|
|
var invalidProps = [];
|
|
|
|
for (var key in element.props) {
|
|
var isValid = validateProperty(element.type, key, debugID);
|
|
if (!isValid) {
|
|
invalidProps.push(key);
|
|
}
|
|
}
|
|
|
|
var unknownPropString = invalidProps.map(function (prop) {
|
|
return '`' + prop + '`';
|
|
}).join(', ');
|
|
|
|
if (invalidProps.length === 1) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
} else if (invalidProps.length > 1) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
}
|
|
}
|
|
|
|
function handleElement(debugID, element) {
|
|
if (element == null || typeof element.type !== 'string') {
|
|
return;
|
|
}
|
|
if (element.type.indexOf('-') >= 0 || element.props.is) {
|
|
return;
|
|
}
|
|
|
|
warnInvalidARIAProps(debugID, element);
|
|
}
|
|
|
|
var ReactDOMInvalidARIAHook = {
|
|
onBeforeMountComponent: function onBeforeMountComponent(debugID, element) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
handleElement(debugID, element);
|
|
}
|
|
},
|
|
onBeforeUpdateComponent: function onBeforeUpdateComponent(debugID, element) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
handleElement(debugID, element);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDOMInvalidARIAHook;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 166 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactComponentTreeHook = __webpack_require__(9);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
var didWarnValueNull = false;
|
|
|
|
function handleElement(debugID, element) {
|
|
if (element == null) {
|
|
return;
|
|
}
|
|
if (element.type !== 'input' && element.type !== 'textarea' && element.type !== 'select') {
|
|
return;
|
|
}
|
|
if (element.props != null && element.props.value === null && !didWarnValueNull) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`value` prop on `%s` should not be null. ' + 'Consider using the empty string to clear the component or `undefined` ' + 'for uncontrolled components.%s', element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
|
|
didWarnValueNull = true;
|
|
}
|
|
}
|
|
|
|
var ReactDOMNullInputValuePropHook = {
|
|
onBeforeMountComponent: function onBeforeMountComponent(debugID, element) {
|
|
handleElement(debugID, element);
|
|
},
|
|
onBeforeUpdateComponent: function onBeforeUpdateComponent(debugID, element) {
|
|
handleElement(debugID, element);
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDOMNullInputValuePropHook;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 167 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var React = __webpack_require__(23);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactDOMSelect = __webpack_require__(77);
|
|
|
|
var warning = __webpack_require__(2);
|
|
var didWarnInvalidOptionChildren = false;
|
|
|
|
function flattenChildren(children) {
|
|
var content = '';
|
|
|
|
// Flatten children and warn if they aren't strings or numbers;
|
|
// invalid types are ignored.
|
|
React.Children.forEach(children, function (child) {
|
|
if (child == null) {
|
|
return;
|
|
}
|
|
if (typeof child === 'string' || typeof child === 'number') {
|
|
content += child;
|
|
} else if (!didWarnInvalidOptionChildren) {
|
|
didWarnInvalidOptionChildren = true;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : void 0;
|
|
}
|
|
});
|
|
|
|
return content;
|
|
}
|
|
|
|
/**
|
|
* Implements an <option> host component that warns when `selected` is set.
|
|
*/
|
|
var ReactDOMOption = {
|
|
mountWrapper: function mountWrapper(inst, props, hostParent) {
|
|
// TODO (yungsters): Remove support for `selected` in <option>.
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : void 0;
|
|
}
|
|
|
|
// Look up whether this option is 'selected'
|
|
var selectValue = null;
|
|
if (hostParent != null) {
|
|
var selectParent = hostParent;
|
|
|
|
if (selectParent._tag === 'optgroup') {
|
|
selectParent = selectParent._hostParent;
|
|
}
|
|
|
|
if (selectParent != null && selectParent._tag === 'select') {
|
|
selectValue = ReactDOMSelect.getSelectValueContext(selectParent);
|
|
}
|
|
}
|
|
|
|
// If the value is null (e.g., no specified value or after initial mount)
|
|
// or missing (e.g., for <datalist>), we don't change props.selected
|
|
var selected = null;
|
|
if (selectValue != null) {
|
|
var value;
|
|
if (props.value != null) {
|
|
value = props.value + '';
|
|
} else {
|
|
value = flattenChildren(props.children);
|
|
}
|
|
selected = false;
|
|
if (Array.isArray(selectValue)) {
|
|
// multiple
|
|
for (var i = 0; i < selectValue.length; i++) {
|
|
if ('' + selectValue[i] === value) {
|
|
selected = true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
selected = '' + selectValue === value;
|
|
}
|
|
}
|
|
|
|
inst._wrapperState = { selected: selected };
|
|
},
|
|
|
|
postMountWrapper: function postMountWrapper(inst) {
|
|
// value="" should make a value attribute (#6219)
|
|
var props = inst._currentElement.props;
|
|
if (props.value != null) {
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
node.setAttribute('value', props.value);
|
|
}
|
|
},
|
|
|
|
getHostProps: function getHostProps(inst, props) {
|
|
var hostProps = _assign({ selected: undefined, children: undefined }, props);
|
|
|
|
// Read state only from initial mount because <select> updates value
|
|
// manually; we need the initial state only for server rendering
|
|
if (inst._wrapperState.selected != null) {
|
|
hostProps.selected = inst._wrapperState.selected;
|
|
}
|
|
|
|
var content = flattenChildren(props.children);
|
|
|
|
if (content) {
|
|
hostProps.children = content;
|
|
}
|
|
|
|
return hostProps;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDOMOption;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 168 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var getNodeForCharacterOffset = __webpack_require__(211);
|
|
var getTextContentAccessor = __webpack_require__(89);
|
|
|
|
/**
|
|
* While `isCollapsed` is available on the Selection object and `collapsed`
|
|
* is available on the Range object, IE11 sometimes gets them wrong.
|
|
* If the anchor/focus nodes and offsets are the same, the range is collapsed.
|
|
*/
|
|
function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {
|
|
return anchorNode === focusNode && anchorOffset === focusOffset;
|
|
}
|
|
|
|
/**
|
|
* Get the appropriate anchor and focus node/offset pairs for IE.
|
|
*
|
|
* The catch here is that IE's selection API doesn't provide information
|
|
* about whether the selection is forward or backward, so we have to
|
|
* behave as though it's always forward.
|
|
*
|
|
* IE text differs from modern selection in that it behaves as though
|
|
* block elements end with a new line. This means character offsets will
|
|
* differ between the two APIs.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @return {object}
|
|
*/
|
|
function getIEOffsets(node) {
|
|
var selection = document.selection;
|
|
var selectedRange = selection.createRange();
|
|
var selectedLength = selectedRange.text.length;
|
|
|
|
// Duplicate selection so we can move range without breaking user selection.
|
|
var fromStart = selectedRange.duplicate();
|
|
fromStart.moveToElementText(node);
|
|
fromStart.setEndPoint('EndToStart', selectedRange);
|
|
|
|
var startOffset = fromStart.text.length;
|
|
var endOffset = startOffset + selectedLength;
|
|
|
|
return {
|
|
start: startOffset,
|
|
end: endOffset
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @param {DOMElement} node
|
|
* @return {?object}
|
|
*/
|
|
function getModernOffsets(node) {
|
|
var selection = window.getSelection && window.getSelection();
|
|
|
|
if (!selection || selection.rangeCount === 0) {
|
|
return null;
|
|
}
|
|
|
|
var anchorNode = selection.anchorNode;
|
|
var anchorOffset = selection.anchorOffset;
|
|
var focusNode = selection.focusNode;
|
|
var focusOffset = selection.focusOffset;
|
|
|
|
var currentRange = selection.getRangeAt(0);
|
|
|
|
// In Firefox, range.startContainer and range.endContainer can be "anonymous
|
|
// divs", e.g. the up/down buttons on an <input type="number">. Anonymous
|
|
// divs do not seem to expose properties, triggering a "Permission denied
|
|
// error" if any of its properties are accessed. The only seemingly possible
|
|
// way to avoid erroring is to access a property that typically works for
|
|
// non-anonymous divs and catch any error that may otherwise arise. See
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=208427
|
|
try {
|
|
/* eslint-disable no-unused-expressions */
|
|
currentRange.startContainer.nodeType;
|
|
currentRange.endContainer.nodeType;
|
|
/* eslint-enable no-unused-expressions */
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
|
|
// If the node and offset values are the same, the selection is collapsed.
|
|
// `Selection.isCollapsed` is available natively, but IE sometimes gets
|
|
// this value wrong.
|
|
var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);
|
|
|
|
var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;
|
|
|
|
var tempRange = currentRange.cloneRange();
|
|
tempRange.selectNodeContents(node);
|
|
tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
|
|
|
|
var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);
|
|
|
|
var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;
|
|
var end = start + rangeLength;
|
|
|
|
// Detect whether the selection is backward.
|
|
var detectionRange = document.createRange();
|
|
detectionRange.setStart(anchorNode, anchorOffset);
|
|
detectionRange.setEnd(focusNode, focusOffset);
|
|
var isBackward = detectionRange.collapsed;
|
|
|
|
return {
|
|
start: isBackward ? end : start,
|
|
end: isBackward ? start : end
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @param {DOMElement|DOMTextNode} node
|
|
* @param {object} offsets
|
|
*/
|
|
function setIEOffsets(node, offsets) {
|
|
var range = document.selection.createRange().duplicate();
|
|
var start, end;
|
|
|
|
if (offsets.end === undefined) {
|
|
start = offsets.start;
|
|
end = start;
|
|
} else if (offsets.start > offsets.end) {
|
|
start = offsets.end;
|
|
end = offsets.start;
|
|
} else {
|
|
start = offsets.start;
|
|
end = offsets.end;
|
|
}
|
|
|
|
range.moveToElementText(node);
|
|
range.moveStart('character', start);
|
|
range.setEndPoint('EndToStart', range);
|
|
range.moveEnd('character', end - start);
|
|
range.select();
|
|
}
|
|
|
|
/**
|
|
* In modern non-IE browsers, we can support both forward and backward
|
|
* selections.
|
|
*
|
|
* Note: IE10+ supports the Selection object, but it does not support
|
|
* the `extend` method, which means that even in modern IE, it's not possible
|
|
* to programmatically create a backward selection. Thus, for all IE
|
|
* versions, we use the old IE API to create our selections.
|
|
*
|
|
* @param {DOMElement|DOMTextNode} node
|
|
* @param {object} offsets
|
|
*/
|
|
function setModernOffsets(node, offsets) {
|
|
if (!window.getSelection) {
|
|
return;
|
|
}
|
|
|
|
var selection = window.getSelection();
|
|
var length = node[getTextContentAccessor()].length;
|
|
var start = Math.min(offsets.start, length);
|
|
var end = offsets.end === undefined ? start : Math.min(offsets.end, length);
|
|
|
|
// IE 11 uses modern selection, but doesn't support the extend method.
|
|
// Flip backward selections, so we can set with a single range.
|
|
if (!selection.extend && start > end) {
|
|
var temp = end;
|
|
end = start;
|
|
start = temp;
|
|
}
|
|
|
|
var startMarker = getNodeForCharacterOffset(node, start);
|
|
var endMarker = getNodeForCharacterOffset(node, end);
|
|
|
|
if (startMarker && endMarker) {
|
|
var range = document.createRange();
|
|
range.setStart(startMarker.node, startMarker.offset);
|
|
selection.removeAllRanges();
|
|
|
|
if (start > end) {
|
|
selection.addRange(range);
|
|
selection.extend(endMarker.node, endMarker.offset);
|
|
} else {
|
|
range.setEnd(endMarker.node, endMarker.offset);
|
|
selection.addRange(range);
|
|
}
|
|
}
|
|
}
|
|
|
|
var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);
|
|
|
|
var ReactDOMSelection = {
|
|
/**
|
|
* @param {DOMElement} node
|
|
*/
|
|
getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,
|
|
|
|
/**
|
|
* @param {DOMElement|DOMTextNode} node
|
|
* @param {object} offsets
|
|
*/
|
|
setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets
|
|
};
|
|
|
|
module.exports = ReactDOMSelection;
|
|
|
|
/***/ }),
|
|
/* 169 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var DOMChildrenOperations = __webpack_require__(45);
|
|
var DOMLazyTree = __webpack_require__(21);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
|
|
var escapeTextContentForBrowser = __webpack_require__(37);
|
|
var invariant = __webpack_require__(1);
|
|
var validateDOMNesting = __webpack_require__(59);
|
|
|
|
/**
|
|
* Text nodes violate a couple assumptions that React makes about components:
|
|
*
|
|
* - When mounting text into the DOM, adjacent text nodes are merged.
|
|
* - Text nodes cannot be assigned a React root ID.
|
|
*
|
|
* This component is used to wrap strings between comment nodes so that they
|
|
* can undergo the same reconciliation that is applied to elements.
|
|
*
|
|
* TODO: Investigate representing React components in the DOM with text nodes.
|
|
*
|
|
* @class ReactDOMTextComponent
|
|
* @extends ReactComponent
|
|
* @internal
|
|
*/
|
|
var ReactDOMTextComponent = function ReactDOMTextComponent(text) {
|
|
// TODO: This is really a ReactText (ReactNode), not a ReactElement
|
|
this._currentElement = text;
|
|
this._stringText = '' + text;
|
|
// ReactDOMComponentTree uses these:
|
|
this._hostNode = null;
|
|
this._hostParent = null;
|
|
|
|
// Properties
|
|
this._domID = 0;
|
|
this._mountIndex = 0;
|
|
this._closingComment = null;
|
|
this._commentNodes = null;
|
|
};
|
|
|
|
_assign(ReactDOMTextComponent.prototype, {
|
|
/**
|
|
* Creates the markup for this text node. This node is not intended to have
|
|
* any features besides containing text content.
|
|
*
|
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
|
* @return {string} Markup for this text node.
|
|
* @internal
|
|
*/
|
|
mountComponent: function mountComponent(transaction, hostParent, hostContainerInfo, context) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var parentInfo;
|
|
if (hostParent != null) {
|
|
parentInfo = hostParent._ancestorInfo;
|
|
} else if (hostContainerInfo != null) {
|
|
parentInfo = hostContainerInfo._ancestorInfo;
|
|
}
|
|
if (parentInfo) {
|
|
// parentInfo should always be present except for the top-level
|
|
// component when server rendering
|
|
validateDOMNesting(null, this._stringText, this, parentInfo);
|
|
}
|
|
}
|
|
|
|
var domID = hostContainerInfo._idCounter++;
|
|
var openingValue = ' react-text: ' + domID + ' ';
|
|
var closingValue = ' /react-text ';
|
|
this._domID = domID;
|
|
this._hostParent = hostParent;
|
|
if (transaction.useCreateElement) {
|
|
var ownerDocument = hostContainerInfo._ownerDocument;
|
|
var openingComment = ownerDocument.createComment(openingValue);
|
|
var closingComment = ownerDocument.createComment(closingValue);
|
|
var lazyTree = DOMLazyTree(ownerDocument.createDocumentFragment());
|
|
DOMLazyTree.queueChild(lazyTree, DOMLazyTree(openingComment));
|
|
if (this._stringText) {
|
|
DOMLazyTree.queueChild(lazyTree, DOMLazyTree(ownerDocument.createTextNode(this._stringText)));
|
|
}
|
|
DOMLazyTree.queueChild(lazyTree, DOMLazyTree(closingComment));
|
|
ReactDOMComponentTree.precacheNode(this, openingComment);
|
|
this._closingComment = closingComment;
|
|
return lazyTree;
|
|
} else {
|
|
var escapedText = escapeTextContentForBrowser(this._stringText);
|
|
|
|
if (transaction.renderToStaticMarkup) {
|
|
// Normally we'd wrap this between comment nodes for the reasons stated
|
|
// above, but since this is a situation where React won't take over
|
|
// (static pages), we can simply return the text as it is.
|
|
return escapedText;
|
|
}
|
|
|
|
return '<!--' + openingValue + '-->' + escapedText + '<!--' + closingValue + '-->';
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Updates this component by updating the text content.
|
|
*
|
|
* @param {ReactText} nextText The next text content
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
*/
|
|
receiveComponent: function receiveComponent(nextText, transaction) {
|
|
if (nextText !== this._currentElement) {
|
|
this._currentElement = nextText;
|
|
var nextStringText = '' + nextText;
|
|
if (nextStringText !== this._stringText) {
|
|
// TODO: Save this as pending props and use performUpdateIfNecessary
|
|
// and/or updateComponent to do the actual update for consistency with
|
|
// other component types?
|
|
this._stringText = nextStringText;
|
|
var commentNodes = this.getHostNode();
|
|
DOMChildrenOperations.replaceDelimitedText(commentNodes[0], commentNodes[1], nextStringText);
|
|
}
|
|
}
|
|
},
|
|
|
|
getHostNode: function getHostNode() {
|
|
var hostNode = this._commentNodes;
|
|
if (hostNode) {
|
|
return hostNode;
|
|
}
|
|
if (!this._closingComment) {
|
|
var openingComment = ReactDOMComponentTree.getNodeFromInstance(this);
|
|
var node = openingComment.nextSibling;
|
|
while (true) {
|
|
!(node != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Missing closing comment for text component %s', this._domID) : _prodInvariant('67', this._domID) : void 0;
|
|
if (node.nodeType === 8 && node.nodeValue === ' /react-text ') {
|
|
this._closingComment = node;
|
|
break;
|
|
}
|
|
node = node.nextSibling;
|
|
}
|
|
}
|
|
hostNode = [this._hostNode, this._closingComment];
|
|
this._commentNodes = hostNode;
|
|
return hostNode;
|
|
},
|
|
|
|
unmountComponent: function unmountComponent() {
|
|
this._closingComment = null;
|
|
this._commentNodes = null;
|
|
ReactDOMComponentTree.uncacheNode(this);
|
|
}
|
|
});
|
|
|
|
module.exports = ReactDOMTextComponent;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 170 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3),
|
|
_assign = __webpack_require__(5);
|
|
|
|
var LinkedValueUtils = __webpack_require__(49);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var didWarnValueLink = false;
|
|
var didWarnValDefaultVal = false;
|
|
|
|
function forceUpdateIfMounted() {
|
|
if (this._rootNodeID) {
|
|
// DOM component is still mounted; update
|
|
ReactDOMTextarea.updateWrapper(this);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements a <textarea> host component that allows setting `value`, and
|
|
* `defaultValue`. This differs from the traditional DOM API because value is
|
|
* usually set as PCDATA children.
|
|
*
|
|
* If `value` is not supplied (or null/undefined), user actions that affect the
|
|
* value will trigger updates to the element.
|
|
*
|
|
* If `value` is supplied (and not null/undefined), the rendered element will
|
|
* not trigger updates to the element. Instead, the `value` prop must change in
|
|
* order for the rendered element to be updated.
|
|
*
|
|
* The rendered element will be initialized with an empty value, the prop
|
|
* `defaultValue` if specified, or the children content (deprecated).
|
|
*/
|
|
var ReactDOMTextarea = {
|
|
getHostProps: function getHostProps(inst, props) {
|
|
!(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : _prodInvariant('91') : void 0;
|
|
|
|
// Always set children to the same thing. In IE9, the selection range will
|
|
// get reset if `textContent` is mutated. We could add a check in setTextContent
|
|
// to only set the value if/when the value differs from the node value (which would
|
|
// completely solve this IE9 bug), but Sebastian+Ben seemed to like this solution.
|
|
// The value can be a boolean or object so that's why it's forced to be a string.
|
|
var hostProps = _assign({}, props, {
|
|
value: undefined,
|
|
defaultValue: undefined,
|
|
children: '' + inst._wrapperState.initialValue,
|
|
onChange: inst._wrapperState.onChange
|
|
});
|
|
|
|
return hostProps;
|
|
},
|
|
|
|
mountWrapper: function mountWrapper(inst, props) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);
|
|
if (props.valueLink !== undefined && !didWarnValueLink) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `textarea` is deprecated; set `value` and `onChange` instead.') : void 0;
|
|
didWarnValueLink = true;
|
|
}
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components') : void 0;
|
|
didWarnValDefaultVal = true;
|
|
}
|
|
}
|
|
|
|
var value = LinkedValueUtils.getValue(props);
|
|
var initialValue = value;
|
|
|
|
// Only bother fetching default value if we're going to use it
|
|
if (value == null) {
|
|
var defaultValue = props.defaultValue;
|
|
// TODO (yungsters): Remove support for children content in <textarea>.
|
|
var children = props.children;
|
|
if (children != null) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : void 0;
|
|
}
|
|
!(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : _prodInvariant('92') : void 0;
|
|
if (Array.isArray(children)) {
|
|
!(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : _prodInvariant('93') : void 0;
|
|
children = children[0];
|
|
}
|
|
|
|
defaultValue = '' + children;
|
|
}
|
|
if (defaultValue == null) {
|
|
defaultValue = '';
|
|
}
|
|
initialValue = defaultValue;
|
|
}
|
|
|
|
inst._wrapperState = {
|
|
initialValue: '' + initialValue,
|
|
listeners: null,
|
|
onChange: _handleChange.bind(inst)
|
|
};
|
|
},
|
|
|
|
updateWrapper: function updateWrapper(inst) {
|
|
var props = inst._currentElement.props;
|
|
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
var value = LinkedValueUtils.getValue(props);
|
|
if (value != null) {
|
|
// Cast `value` to a string to ensure the value is set correctly. While
|
|
// browsers typically do this as necessary, jsdom doesn't.
|
|
var newValue = '' + value;
|
|
|
|
// To avoid side effects (such as losing text selection), only set value if changed
|
|
if (newValue !== node.value) {
|
|
node.value = newValue;
|
|
}
|
|
if (props.defaultValue == null) {
|
|
node.defaultValue = newValue;
|
|
}
|
|
}
|
|
if (props.defaultValue != null) {
|
|
node.defaultValue = props.defaultValue;
|
|
}
|
|
},
|
|
|
|
postMountWrapper: function postMountWrapper(inst) {
|
|
// This is in postMount because we need access to the DOM node, which is not
|
|
// available until after the component has mounted.
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
var textContent = node.textContent;
|
|
|
|
// Only set node.value if textContent is equal to the expected
|
|
// initial value. In IE10/IE11 there is a bug where the placeholder attribute
|
|
// will populate textContent as well.
|
|
// https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
|
|
if (textContent === inst._wrapperState.initialValue) {
|
|
node.value = textContent;
|
|
}
|
|
}
|
|
};
|
|
|
|
function _handleChange(event) {
|
|
var props = this._currentElement.props;
|
|
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
|
ReactUpdates.asap(forceUpdateIfMounted, this);
|
|
return returnValue;
|
|
}
|
|
|
|
module.exports = ReactDOMTextarea;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 171 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Return the lowest common ancestor of A and B, or null if they are in
|
|
* different trees.
|
|
*/
|
|
function getLowestCommonAncestor(instA, instB) {
|
|
!('_hostNode' in instA) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;
|
|
!('_hostNode' in instB) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;
|
|
|
|
var depthA = 0;
|
|
for (var tempA = instA; tempA; tempA = tempA._hostParent) {
|
|
depthA++;
|
|
}
|
|
var depthB = 0;
|
|
for (var tempB = instB; tempB; tempB = tempB._hostParent) {
|
|
depthB++;
|
|
}
|
|
|
|
// If A is deeper, crawl up.
|
|
while (depthA - depthB > 0) {
|
|
instA = instA._hostParent;
|
|
depthA--;
|
|
}
|
|
|
|
// If B is deeper, crawl up.
|
|
while (depthB - depthA > 0) {
|
|
instB = instB._hostParent;
|
|
depthB--;
|
|
}
|
|
|
|
// Walk in lockstep until we find a match.
|
|
var depth = depthA;
|
|
while (depth--) {
|
|
if (instA === instB) {
|
|
return instA;
|
|
}
|
|
instA = instA._hostParent;
|
|
instB = instB._hostParent;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Return if A is an ancestor of B.
|
|
*/
|
|
function isAncestor(instA, instB) {
|
|
!('_hostNode' in instA) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0;
|
|
!('_hostNode' in instB) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0;
|
|
|
|
while (instB) {
|
|
if (instB === instA) {
|
|
return true;
|
|
}
|
|
instB = instB._hostParent;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Return the parent instance of the passed-in instance.
|
|
*/
|
|
function getParentInstance(inst) {
|
|
!('_hostNode' in inst) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getParentInstance: Invalid argument.') : _prodInvariant('36') : void 0;
|
|
|
|
return inst._hostParent;
|
|
}
|
|
|
|
/**
|
|
* Simulates the traversal of a two-phase, capture/bubble event dispatch.
|
|
*/
|
|
function traverseTwoPhase(inst, fn, arg) {
|
|
var path = [];
|
|
while (inst) {
|
|
path.push(inst);
|
|
inst = inst._hostParent;
|
|
}
|
|
var i;
|
|
for (i = path.length; i-- > 0;) {
|
|
fn(path[i], 'captured', arg);
|
|
}
|
|
for (i = 0; i < path.length; i++) {
|
|
fn(path[i], 'bubbled', arg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
|
|
* should would receive a `mouseEnter` or `mouseLeave` event.
|
|
*
|
|
* Does not invoke the callback on the nearest common ancestor because nothing
|
|
* "entered" or "left" that element.
|
|
*/
|
|
function traverseEnterLeave(from, to, fn, argFrom, argTo) {
|
|
var common = from && to ? getLowestCommonAncestor(from, to) : null;
|
|
var pathFrom = [];
|
|
while (from && from !== common) {
|
|
pathFrom.push(from);
|
|
from = from._hostParent;
|
|
}
|
|
var pathTo = [];
|
|
while (to && to !== common) {
|
|
pathTo.push(to);
|
|
to = to._hostParent;
|
|
}
|
|
var i;
|
|
for (i = 0; i < pathFrom.length; i++) {
|
|
fn(pathFrom[i], 'bubbled', argFrom);
|
|
}
|
|
for (i = pathTo.length; i-- > 0;) {
|
|
fn(pathTo[i], 'captured', argTo);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
isAncestor: isAncestor,
|
|
getLowestCommonAncestor: getLowestCommonAncestor,
|
|
getParentInstance: getParentInstance,
|
|
traverseTwoPhase: traverseTwoPhase,
|
|
traverseEnterLeave: traverseEnterLeave
|
|
};
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 172 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
var EventPluginRegistry = __webpack_require__(33);
|
|
var ReactComponentTreeHook = __webpack_require__(9);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var reactProps = {
|
|
children: true,
|
|
dangerouslySetInnerHTML: true,
|
|
key: true,
|
|
ref: true,
|
|
|
|
autoFocus: true,
|
|
defaultValue: true,
|
|
valueLink: true,
|
|
defaultChecked: true,
|
|
checkedLink: true,
|
|
innerHTML: true,
|
|
suppressContentEditableWarning: true,
|
|
onFocusIn: true,
|
|
onFocusOut: true
|
|
};
|
|
var warnedProperties = {};
|
|
|
|
var validateProperty = function validateProperty(tagName, name, debugID) {
|
|
if (DOMProperty.properties.hasOwnProperty(name) || DOMProperty.isCustomAttribute(name)) {
|
|
return true;
|
|
}
|
|
if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {
|
|
return true;
|
|
}
|
|
if (EventPluginRegistry.registrationNameModules.hasOwnProperty(name)) {
|
|
return true;
|
|
}
|
|
warnedProperties[name] = true;
|
|
var lowerCasedName = name.toLowerCase();
|
|
|
|
// data-* attributes should be lowercase; suggest the lowercase version
|
|
var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;
|
|
|
|
var registrationName = EventPluginRegistry.possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? EventPluginRegistry.possibleRegistrationNames[lowerCasedName] : null;
|
|
|
|
if (standardName != null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown DOM property %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
return true;
|
|
} else if (registrationName != null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown event handler property %s. Did you mean `%s`?%s', name, registrationName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
return true;
|
|
} else {
|
|
// We were unable to guess which prop the user intended.
|
|
// It is likely that the user was just blindly spreading/forwarding props
|
|
// Components should be careful to only render valid props/attributes.
|
|
// Warning will be invoked in warnUnknownProperties to allow grouping.
|
|
return false;
|
|
}
|
|
};
|
|
}
|
|
|
|
var warnUnknownProperties = function warnUnknownProperties(debugID, element) {
|
|
var unknownProps = [];
|
|
for (var key in element.props) {
|
|
var isValid = validateProperty(element.type, key, debugID);
|
|
if (!isValid) {
|
|
unknownProps.push(key);
|
|
}
|
|
}
|
|
|
|
var unknownPropString = unknownProps.map(function (prop) {
|
|
return '`' + prop + '`';
|
|
}).join(', ');
|
|
|
|
if (unknownProps.length === 1) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown prop %s on <%s> tag. Remove this prop from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
} else if (unknownProps.length > 1) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown props %s on <%s> tag. Remove these props from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
|
|
}
|
|
};
|
|
|
|
function handleElement(debugID, element) {
|
|
if (element == null || typeof element.type !== 'string') {
|
|
return;
|
|
}
|
|
if (element.type.indexOf('-') >= 0 || element.props.is) {
|
|
return;
|
|
}
|
|
warnUnknownProperties(debugID, element);
|
|
}
|
|
|
|
var ReactDOMUnknownPropertyHook = {
|
|
onBeforeMountComponent: function onBeforeMountComponent(debugID, element) {
|
|
handleElement(debugID, element);
|
|
},
|
|
onBeforeUpdateComponent: function onBeforeUpdateComponent(debugID, element) {
|
|
handleElement(debugID, element);
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDOMUnknownPropertyHook;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 173 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var ReactInvalidSetStateWarningHook = __webpack_require__(181);
|
|
var ReactHostOperationHistoryHook = __webpack_require__(179);
|
|
var ReactComponentTreeHook = __webpack_require__(9);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
var performanceNow = __webpack_require__(131);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var hooks = [];
|
|
var didHookThrowForEvent = {};
|
|
|
|
function callHook(event, fn, context, arg1, arg2, arg3, arg4, arg5) {
|
|
try {
|
|
fn.call(context, arg1, arg2, arg3, arg4, arg5);
|
|
} catch (e) {
|
|
process.env.NODE_ENV !== 'production' ? warning(didHookThrowForEvent[event], 'Exception thrown by hook while handling %s: %s', event, e + '\n' + e.stack) : void 0;
|
|
didHookThrowForEvent[event] = true;
|
|
}
|
|
}
|
|
|
|
function emitEvent(event, arg1, arg2, arg3, arg4, arg5) {
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
var hook = hooks[i];
|
|
var fn = hook[event];
|
|
if (fn) {
|
|
callHook(event, fn, hook, arg1, arg2, arg3, arg4, arg5);
|
|
}
|
|
}
|
|
}
|
|
|
|
var _isProfiling = false;
|
|
var flushHistory = [];
|
|
var lifeCycleTimerStack = [];
|
|
var currentFlushNesting = 0;
|
|
var currentFlushMeasurements = [];
|
|
var currentFlushStartTime = 0;
|
|
var currentTimerDebugID = null;
|
|
var currentTimerStartTime = 0;
|
|
var currentTimerNestedFlushDuration = 0;
|
|
var currentTimerType = null;
|
|
|
|
var lifeCycleTimerHasWarned = false;
|
|
|
|
function clearHistory() {
|
|
ReactComponentTreeHook.purgeUnmountedComponents();
|
|
ReactHostOperationHistoryHook.clearHistory();
|
|
}
|
|
|
|
function getTreeSnapshot(registeredIDs) {
|
|
return registeredIDs.reduce(function (tree, id) {
|
|
var ownerID = ReactComponentTreeHook.getOwnerID(id);
|
|
var parentID = ReactComponentTreeHook.getParentID(id);
|
|
tree[id] = {
|
|
displayName: ReactComponentTreeHook.getDisplayName(id),
|
|
text: ReactComponentTreeHook.getText(id),
|
|
updateCount: ReactComponentTreeHook.getUpdateCount(id),
|
|
childIDs: ReactComponentTreeHook.getChildIDs(id),
|
|
// Text nodes don't have owners but this is close enough.
|
|
ownerID: ownerID || parentID && ReactComponentTreeHook.getOwnerID(parentID) || 0,
|
|
parentID: parentID
|
|
};
|
|
return tree;
|
|
}, {});
|
|
}
|
|
|
|
function resetMeasurements() {
|
|
var previousStartTime = currentFlushStartTime;
|
|
var previousMeasurements = currentFlushMeasurements;
|
|
var previousOperations = ReactHostOperationHistoryHook.getHistory();
|
|
|
|
if (currentFlushNesting === 0) {
|
|
currentFlushStartTime = 0;
|
|
currentFlushMeasurements = [];
|
|
clearHistory();
|
|
return;
|
|
}
|
|
|
|
if (previousMeasurements.length || previousOperations.length) {
|
|
var registeredIDs = ReactComponentTreeHook.getRegisteredIDs();
|
|
flushHistory.push({
|
|
duration: performanceNow() - previousStartTime,
|
|
measurements: previousMeasurements || [],
|
|
operations: previousOperations || [],
|
|
treeSnapshot: getTreeSnapshot(registeredIDs)
|
|
});
|
|
}
|
|
|
|
clearHistory();
|
|
currentFlushStartTime = performanceNow();
|
|
currentFlushMeasurements = [];
|
|
}
|
|
|
|
function checkDebugID(debugID) {
|
|
var allowRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
|
|
if (allowRoot && debugID === 0) {
|
|
return;
|
|
}
|
|
if (!debugID) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDebugTool: debugID may not be empty.') : void 0;
|
|
}
|
|
}
|
|
|
|
function beginLifeCycleTimer(debugID, timerType) {
|
|
if (currentFlushNesting === 0) {
|
|
return;
|
|
}
|
|
if (currentTimerType && !lifeCycleTimerHasWarned) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'There is an internal error in the React performance measurement code. ' + 'Did not expect %s timer to start while %s timer is still in ' + 'progress for %s instance.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0;
|
|
lifeCycleTimerHasWarned = true;
|
|
}
|
|
currentTimerStartTime = performanceNow();
|
|
currentTimerNestedFlushDuration = 0;
|
|
currentTimerDebugID = debugID;
|
|
currentTimerType = timerType;
|
|
}
|
|
|
|
function endLifeCycleTimer(debugID, timerType) {
|
|
if (currentFlushNesting === 0) {
|
|
return;
|
|
}
|
|
if (currentTimerType !== timerType && !lifeCycleTimerHasWarned) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'There is an internal error in the React performance measurement code. ' + 'We did not expect %s timer to stop while %s timer is still in ' + 'progress for %s instance. Please report this as a bug in React.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0;
|
|
lifeCycleTimerHasWarned = true;
|
|
}
|
|
if (_isProfiling) {
|
|
currentFlushMeasurements.push({
|
|
timerType: timerType,
|
|
instanceID: debugID,
|
|
duration: performanceNow() - currentTimerStartTime - currentTimerNestedFlushDuration
|
|
});
|
|
}
|
|
currentTimerStartTime = 0;
|
|
currentTimerNestedFlushDuration = 0;
|
|
currentTimerDebugID = null;
|
|
currentTimerType = null;
|
|
}
|
|
|
|
function pauseCurrentLifeCycleTimer() {
|
|
var currentTimer = {
|
|
startTime: currentTimerStartTime,
|
|
nestedFlushStartTime: performanceNow(),
|
|
debugID: currentTimerDebugID,
|
|
timerType: currentTimerType
|
|
};
|
|
lifeCycleTimerStack.push(currentTimer);
|
|
currentTimerStartTime = 0;
|
|
currentTimerNestedFlushDuration = 0;
|
|
currentTimerDebugID = null;
|
|
currentTimerType = null;
|
|
}
|
|
|
|
function resumeCurrentLifeCycleTimer() {
|
|
var _lifeCycleTimerStack$ = lifeCycleTimerStack.pop(),
|
|
startTime = _lifeCycleTimerStack$.startTime,
|
|
nestedFlushStartTime = _lifeCycleTimerStack$.nestedFlushStartTime,
|
|
debugID = _lifeCycleTimerStack$.debugID,
|
|
timerType = _lifeCycleTimerStack$.timerType;
|
|
|
|
var nestedFlushDuration = performanceNow() - nestedFlushStartTime;
|
|
currentTimerStartTime = startTime;
|
|
currentTimerNestedFlushDuration += nestedFlushDuration;
|
|
currentTimerDebugID = debugID;
|
|
currentTimerType = timerType;
|
|
}
|
|
|
|
var lastMarkTimeStamp = 0;
|
|
var canUsePerformanceMeasure = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';
|
|
|
|
function shouldMark(debugID) {
|
|
if (!_isProfiling || !canUsePerformanceMeasure) {
|
|
return false;
|
|
}
|
|
var element = ReactComponentTreeHook.getElement(debugID);
|
|
if (element == null || (typeof element === 'undefined' ? 'undefined' : _typeof(element)) !== 'object') {
|
|
return false;
|
|
}
|
|
var isHostElement = typeof element.type === 'string';
|
|
if (isHostElement) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function markBegin(debugID, markType) {
|
|
if (!shouldMark(debugID)) {
|
|
return;
|
|
}
|
|
|
|
var markName = debugID + '::' + markType;
|
|
lastMarkTimeStamp = performanceNow();
|
|
performance.mark(markName);
|
|
}
|
|
|
|
function markEnd(debugID, markType) {
|
|
if (!shouldMark(debugID)) {
|
|
return;
|
|
}
|
|
|
|
var markName = debugID + '::' + markType;
|
|
var displayName = ReactComponentTreeHook.getDisplayName(debugID) || 'Unknown';
|
|
|
|
// Chrome has an issue of dropping markers recorded too fast:
|
|
// https://bugs.chromium.org/p/chromium/issues/detail?id=640652
|
|
// To work around this, we will not report very small measurements.
|
|
// I determined the magic number by tweaking it back and forth.
|
|
// 0.05ms was enough to prevent the issue, but I set it to 0.1ms to be safe.
|
|
// When the bug is fixed, we can `measure()` unconditionally if we want to.
|
|
var timeStamp = performanceNow();
|
|
if (timeStamp - lastMarkTimeStamp > 0.1) {
|
|
var measurementName = displayName + ' [' + markType + ']';
|
|
performance.measure(measurementName, markName);
|
|
}
|
|
|
|
performance.clearMarks(markName);
|
|
if (measurementName) {
|
|
performance.clearMeasures(measurementName);
|
|
}
|
|
}
|
|
|
|
var ReactDebugTool = {
|
|
addHook: function addHook(hook) {
|
|
hooks.push(hook);
|
|
},
|
|
removeHook: function removeHook(hook) {
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
if (hooks[i] === hook) {
|
|
hooks.splice(i, 1);
|
|
i--;
|
|
}
|
|
}
|
|
},
|
|
isProfiling: function isProfiling() {
|
|
return _isProfiling;
|
|
},
|
|
beginProfiling: function beginProfiling() {
|
|
if (_isProfiling) {
|
|
return;
|
|
}
|
|
|
|
_isProfiling = true;
|
|
flushHistory.length = 0;
|
|
resetMeasurements();
|
|
ReactDebugTool.addHook(ReactHostOperationHistoryHook);
|
|
},
|
|
endProfiling: function endProfiling() {
|
|
if (!_isProfiling) {
|
|
return;
|
|
}
|
|
|
|
_isProfiling = false;
|
|
resetMeasurements();
|
|
ReactDebugTool.removeHook(ReactHostOperationHistoryHook);
|
|
},
|
|
getFlushHistory: function getFlushHistory() {
|
|
return flushHistory;
|
|
},
|
|
onBeginFlush: function onBeginFlush() {
|
|
currentFlushNesting++;
|
|
resetMeasurements();
|
|
pauseCurrentLifeCycleTimer();
|
|
emitEvent('onBeginFlush');
|
|
},
|
|
onEndFlush: function onEndFlush() {
|
|
resetMeasurements();
|
|
currentFlushNesting--;
|
|
resumeCurrentLifeCycleTimer();
|
|
emitEvent('onEndFlush');
|
|
},
|
|
onBeginLifeCycleTimer: function onBeginLifeCycleTimer(debugID, timerType) {
|
|
checkDebugID(debugID);
|
|
emitEvent('onBeginLifeCycleTimer', debugID, timerType);
|
|
markBegin(debugID, timerType);
|
|
beginLifeCycleTimer(debugID, timerType);
|
|
},
|
|
onEndLifeCycleTimer: function onEndLifeCycleTimer(debugID, timerType) {
|
|
checkDebugID(debugID);
|
|
endLifeCycleTimer(debugID, timerType);
|
|
markEnd(debugID, timerType);
|
|
emitEvent('onEndLifeCycleTimer', debugID, timerType);
|
|
},
|
|
onBeginProcessingChildContext: function onBeginProcessingChildContext() {
|
|
emitEvent('onBeginProcessingChildContext');
|
|
},
|
|
onEndProcessingChildContext: function onEndProcessingChildContext() {
|
|
emitEvent('onEndProcessingChildContext');
|
|
},
|
|
onHostOperation: function onHostOperation(operation) {
|
|
checkDebugID(operation.instanceID);
|
|
emitEvent('onHostOperation', operation);
|
|
},
|
|
onSetState: function onSetState() {
|
|
emitEvent('onSetState');
|
|
},
|
|
onSetChildren: function onSetChildren(debugID, childDebugIDs) {
|
|
checkDebugID(debugID);
|
|
childDebugIDs.forEach(checkDebugID);
|
|
emitEvent('onSetChildren', debugID, childDebugIDs);
|
|
},
|
|
onBeforeMountComponent: function onBeforeMountComponent(debugID, element, parentDebugID) {
|
|
checkDebugID(debugID);
|
|
checkDebugID(parentDebugID, true);
|
|
emitEvent('onBeforeMountComponent', debugID, element, parentDebugID);
|
|
markBegin(debugID, 'mount');
|
|
},
|
|
onMountComponent: function onMountComponent(debugID) {
|
|
checkDebugID(debugID);
|
|
markEnd(debugID, 'mount');
|
|
emitEvent('onMountComponent', debugID);
|
|
},
|
|
onBeforeUpdateComponent: function onBeforeUpdateComponent(debugID, element) {
|
|
checkDebugID(debugID);
|
|
emitEvent('onBeforeUpdateComponent', debugID, element);
|
|
markBegin(debugID, 'update');
|
|
},
|
|
onUpdateComponent: function onUpdateComponent(debugID) {
|
|
checkDebugID(debugID);
|
|
markEnd(debugID, 'update');
|
|
emitEvent('onUpdateComponent', debugID);
|
|
},
|
|
onBeforeUnmountComponent: function onBeforeUnmountComponent(debugID) {
|
|
checkDebugID(debugID);
|
|
emitEvent('onBeforeUnmountComponent', debugID);
|
|
markBegin(debugID, 'unmount');
|
|
},
|
|
onUnmountComponent: function onUnmountComponent(debugID) {
|
|
checkDebugID(debugID);
|
|
markEnd(debugID, 'unmount');
|
|
emitEvent('onUnmountComponent', debugID);
|
|
},
|
|
onTestEvent: function onTestEvent() {
|
|
emitEvent('onTestEvent');
|
|
}
|
|
};
|
|
|
|
// TODO remove these when RN/www gets updated
|
|
ReactDebugTool.addDevtool = ReactDebugTool.addHook;
|
|
ReactDebugTool.removeDevtool = ReactDebugTool.removeHook;
|
|
|
|
ReactDebugTool.addHook(ReactInvalidSetStateWarningHook);
|
|
ReactDebugTool.addHook(ReactComponentTreeHook);
|
|
var url = ExecutionEnvironment.canUseDOM && window.location.href || '';
|
|
if (/[?&]react_perf\b/.test(url)) {
|
|
ReactDebugTool.beginProfiling();
|
|
}
|
|
|
|
module.exports = ReactDebugTool;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 174 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var ReactUpdates = __webpack_require__(14);
|
|
var Transaction = __webpack_require__(36);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
|
|
var RESET_BATCHED_UPDATES = {
|
|
initialize: emptyFunction,
|
|
close: function close() {
|
|
ReactDefaultBatchingStrategy.isBatchingUpdates = false;
|
|
}
|
|
};
|
|
|
|
var FLUSH_BATCHED_UPDATES = {
|
|
initialize: emptyFunction,
|
|
close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)
|
|
};
|
|
|
|
var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
|
|
|
|
function ReactDefaultBatchingStrategyTransaction() {
|
|
this.reinitializeTransaction();
|
|
}
|
|
|
|
_assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction, {
|
|
getTransactionWrappers: function getTransactionWrappers() {
|
|
return TRANSACTION_WRAPPERS;
|
|
}
|
|
});
|
|
|
|
var transaction = new ReactDefaultBatchingStrategyTransaction();
|
|
|
|
var ReactDefaultBatchingStrategy = {
|
|
isBatchingUpdates: false,
|
|
|
|
/**
|
|
* Call the provided function in a context within which calls to `setState`
|
|
* and friends are batched such that components aren't updated unnecessarily.
|
|
*/
|
|
batchedUpdates: function batchedUpdates(callback, a, b, c, d, e) {
|
|
var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
|
|
|
|
ReactDefaultBatchingStrategy.isBatchingUpdates = true;
|
|
|
|
// The code is written this way to avoid extra allocations
|
|
if (alreadyBatchingUpdates) {
|
|
return callback(a, b, c, d, e);
|
|
} else {
|
|
return transaction.perform(callback, null, a, b, c, d, e);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactDefaultBatchingStrategy;
|
|
|
|
/***/ }),
|
|
/* 175 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ARIADOMPropertyConfig = __webpack_require__(145);
|
|
var BeforeInputEventPlugin = __webpack_require__(147);
|
|
var ChangeEventPlugin = __webpack_require__(149);
|
|
var DefaultEventPluginOrder = __webpack_require__(151);
|
|
var EnterLeaveEventPlugin = __webpack_require__(152);
|
|
var HTMLDOMPropertyConfig = __webpack_require__(154);
|
|
var ReactComponentBrowserEnvironment = __webpack_require__(156);
|
|
var ReactDOMComponent = __webpack_require__(159);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactDOMEmptyComponent = __webpack_require__(161);
|
|
var ReactDOMTreeTraversal = __webpack_require__(171);
|
|
var ReactDOMTextComponent = __webpack_require__(169);
|
|
var ReactDefaultBatchingStrategy = __webpack_require__(174);
|
|
var ReactEventListener = __webpack_require__(178);
|
|
var ReactInjection = __webpack_require__(180);
|
|
var ReactReconcileTransaction = __webpack_require__(186);
|
|
var SVGDOMPropertyConfig = __webpack_require__(191);
|
|
var SelectEventPlugin = __webpack_require__(192);
|
|
var SimpleEventPlugin = __webpack_require__(193);
|
|
|
|
var alreadyInjected = false;
|
|
|
|
function inject() {
|
|
if (alreadyInjected) {
|
|
// TODO: This is currently true because these injections are shared between
|
|
// the client and the server package. They should be built independently
|
|
// and not share any injection state. Then this problem will be solved.
|
|
return;
|
|
}
|
|
alreadyInjected = true;
|
|
|
|
ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);
|
|
|
|
/**
|
|
* Inject modules for resolving DOM hierarchy and plugin ordering.
|
|
*/
|
|
ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);
|
|
ReactInjection.EventPluginUtils.injectComponentTree(ReactDOMComponentTree);
|
|
ReactInjection.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal);
|
|
|
|
/**
|
|
* Some important event plugins included by default (without having to require
|
|
* them).
|
|
*/
|
|
ReactInjection.EventPluginHub.injectEventPluginsByName({
|
|
SimpleEventPlugin: SimpleEventPlugin,
|
|
EnterLeaveEventPlugin: EnterLeaveEventPlugin,
|
|
ChangeEventPlugin: ChangeEventPlugin,
|
|
SelectEventPlugin: SelectEventPlugin,
|
|
BeforeInputEventPlugin: BeforeInputEventPlugin
|
|
});
|
|
|
|
ReactInjection.HostComponent.injectGenericComponentClass(ReactDOMComponent);
|
|
|
|
ReactInjection.HostComponent.injectTextComponentClass(ReactDOMTextComponent);
|
|
|
|
ReactInjection.DOMProperty.injectDOMPropertyConfig(ARIADOMPropertyConfig);
|
|
ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);
|
|
ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);
|
|
|
|
ReactInjection.EmptyComponent.injectEmptyComponentFactory(function (instantiate) {
|
|
return new ReactDOMEmptyComponent(instantiate);
|
|
});
|
|
|
|
ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);
|
|
ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);
|
|
|
|
ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);
|
|
}
|
|
|
|
module.exports = {
|
|
inject: inject
|
|
};
|
|
|
|
/***/ }),
|
|
/* 176 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
// The Symbol used to tag the ReactElement type. If there is no native Symbol
|
|
// nor polyfill, then a plain number is used for performance.
|
|
|
|
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
|
|
|
|
module.exports = REACT_ELEMENT_TYPE;
|
|
|
|
/***/ }),
|
|
/* 177 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var EventPluginHub = __webpack_require__(27);
|
|
|
|
function runEventQueueInBatch(events) {
|
|
EventPluginHub.enqueueEvents(events);
|
|
EventPluginHub.processEventQueue(false);
|
|
}
|
|
|
|
var ReactEventEmitterMixin = {
|
|
/**
|
|
* Streams a fired top-level event to `EventPluginHub` where plugins have the
|
|
* opportunity to create `ReactEvent`s to be dispatched.
|
|
*/
|
|
handleTopLevel: function handleTopLevel(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var events = EventPluginHub.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
|
|
runEventQueueInBatch(events);
|
|
}
|
|
};
|
|
|
|
module.exports = ReactEventEmitterMixin;
|
|
|
|
/***/ }),
|
|
/* 178 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var EventListener = __webpack_require__(65);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var PooledClass = __webpack_require__(18);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var getEventTarget = __webpack_require__(56);
|
|
var getUnboundedScrollPosition = __webpack_require__(124);
|
|
|
|
/**
|
|
* Find the deepest React component completely containing the root of the
|
|
* passed-in instance (for use when entire React trees are nested within each
|
|
* other). If React trees are not nested, returns null.
|
|
*/
|
|
function findParent(inst) {
|
|
// TODO: It may be a good idea to cache this to prevent unnecessary DOM
|
|
// traversal, but caching is difficult to do correctly without using a
|
|
// mutation observer to listen for all DOM changes.
|
|
while (inst._hostParent) {
|
|
inst = inst._hostParent;
|
|
}
|
|
var rootNode = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
var container = rootNode.parentNode;
|
|
return ReactDOMComponentTree.getClosestInstanceFromNode(container);
|
|
}
|
|
|
|
// Used to store ancestor hierarchy in top level callback
|
|
function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {
|
|
this.topLevelType = topLevelType;
|
|
this.nativeEvent = nativeEvent;
|
|
this.ancestors = [];
|
|
}
|
|
_assign(TopLevelCallbackBookKeeping.prototype, {
|
|
destructor: function destructor() {
|
|
this.topLevelType = null;
|
|
this.nativeEvent = null;
|
|
this.ancestors.length = 0;
|
|
}
|
|
});
|
|
PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);
|
|
|
|
function handleTopLevelImpl(bookKeeping) {
|
|
var nativeEventTarget = getEventTarget(bookKeeping.nativeEvent);
|
|
var targetInst = ReactDOMComponentTree.getClosestInstanceFromNode(nativeEventTarget);
|
|
|
|
// Loop through the hierarchy, in case there's any nested components.
|
|
// It's important that we build the array of ancestors before calling any
|
|
// event handlers, because event handlers can modify the DOM, leading to
|
|
// inconsistencies with ReactMount's node cache. See #1105.
|
|
var ancestor = targetInst;
|
|
do {
|
|
bookKeeping.ancestors.push(ancestor);
|
|
ancestor = ancestor && findParent(ancestor);
|
|
} while (ancestor);
|
|
|
|
for (var i = 0; i < bookKeeping.ancestors.length; i++) {
|
|
targetInst = bookKeeping.ancestors[i];
|
|
ReactEventListener._handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
|
|
}
|
|
}
|
|
|
|
function scrollValueMonitor(cb) {
|
|
var scrollPosition = getUnboundedScrollPosition(window);
|
|
cb(scrollPosition);
|
|
}
|
|
|
|
var ReactEventListener = {
|
|
_enabled: true,
|
|
_handleTopLevel: null,
|
|
|
|
WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,
|
|
|
|
setHandleTopLevel: function setHandleTopLevel(handleTopLevel) {
|
|
ReactEventListener._handleTopLevel = handleTopLevel;
|
|
},
|
|
|
|
setEnabled: function setEnabled(enabled) {
|
|
ReactEventListener._enabled = !!enabled;
|
|
},
|
|
|
|
isEnabled: function isEnabled() {
|
|
return ReactEventListener._enabled;
|
|
},
|
|
|
|
/**
|
|
* Traps top-level events by using event bubbling.
|
|
*
|
|
* @param {string} topLevelType Record from `EventConstants`.
|
|
* @param {string} handlerBaseName Event name (e.g. "click").
|
|
* @param {object} element Element on which to attach listener.
|
|
* @return {?object} An object with a remove function which will forcefully
|
|
* remove the listener.
|
|
* @internal
|
|
*/
|
|
trapBubbledEvent: function trapBubbledEvent(topLevelType, handlerBaseName, element) {
|
|
if (!element) {
|
|
return null;
|
|
}
|
|
return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
|
},
|
|
|
|
/**
|
|
* Traps a top-level event by using event capturing.
|
|
*
|
|
* @param {string} topLevelType Record from `EventConstants`.
|
|
* @param {string} handlerBaseName Event name (e.g. "click").
|
|
* @param {object} element Element on which to attach listener.
|
|
* @return {?object} An object with a remove function which will forcefully
|
|
* remove the listener.
|
|
* @internal
|
|
*/
|
|
trapCapturedEvent: function trapCapturedEvent(topLevelType, handlerBaseName, element) {
|
|
if (!element) {
|
|
return null;
|
|
}
|
|
return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
|
},
|
|
|
|
monitorScrollValue: function monitorScrollValue(refresh) {
|
|
var callback = scrollValueMonitor.bind(null, refresh);
|
|
EventListener.listen(window, 'scroll', callback);
|
|
},
|
|
|
|
dispatchEvent: function dispatchEvent(topLevelType, nativeEvent) {
|
|
if (!ReactEventListener._enabled) {
|
|
return;
|
|
}
|
|
|
|
var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);
|
|
try {
|
|
// Event queue being processed in the same cycle allows
|
|
// `preventDefault`.
|
|
ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);
|
|
} finally {
|
|
TopLevelCallbackBookKeeping.release(bookKeeping);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactEventListener;
|
|
|
|
/***/ }),
|
|
/* 179 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var history = [];
|
|
|
|
var ReactHostOperationHistoryHook = {
|
|
onHostOperation: function onHostOperation(operation) {
|
|
history.push(operation);
|
|
},
|
|
clearHistory: function clearHistory() {
|
|
if (ReactHostOperationHistoryHook._preventClearing) {
|
|
// Should only be used for tests.
|
|
return;
|
|
}
|
|
|
|
history = [];
|
|
},
|
|
getHistory: function getHistory() {
|
|
return history;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactHostOperationHistoryHook;
|
|
|
|
/***/ }),
|
|
/* 180 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var DOMProperty = __webpack_require__(17);
|
|
var EventPluginHub = __webpack_require__(27);
|
|
var EventPluginUtils = __webpack_require__(47);
|
|
var ReactComponentEnvironment = __webpack_require__(50);
|
|
var ReactEmptyComponent = __webpack_require__(78);
|
|
var ReactBrowserEventEmitter = __webpack_require__(34);
|
|
var ReactHostComponent = __webpack_require__(80);
|
|
var ReactUpdates = __webpack_require__(14);
|
|
|
|
var ReactInjection = {
|
|
Component: ReactComponentEnvironment.injection,
|
|
DOMProperty: DOMProperty.injection,
|
|
EmptyComponent: ReactEmptyComponent.injection,
|
|
EventPluginHub: EventPluginHub.injection,
|
|
EventPluginUtils: EventPluginUtils.injection,
|
|
EventEmitter: ReactBrowserEventEmitter.injection,
|
|
HostComponent: ReactHostComponent.injection,
|
|
Updates: ReactUpdates.injection
|
|
};
|
|
|
|
module.exports = ReactInjection;
|
|
|
|
/***/ }),
|
|
/* 181 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var processingChildContext = false;
|
|
|
|
var warnInvalidSetState = function warnInvalidSetState() {
|
|
process.env.NODE_ENV !== 'production' ? warning(!processingChildContext, 'setState(...): Cannot call setState() inside getChildContext()') : void 0;
|
|
};
|
|
}
|
|
|
|
var ReactInvalidSetStateWarningHook = {
|
|
onBeginProcessingChildContext: function onBeginProcessingChildContext() {
|
|
processingChildContext = true;
|
|
},
|
|
onEndProcessingChildContext: function onEndProcessingChildContext() {
|
|
processingChildContext = false;
|
|
},
|
|
onSetState: function onSetState() {
|
|
warnInvalidSetState();
|
|
}
|
|
};
|
|
|
|
module.exports = ReactInvalidSetStateWarningHook;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 182 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var adler32 = __webpack_require__(204);
|
|
|
|
var TAG_END = /\/?>/;
|
|
var COMMENT_START = /^<\!\-\-/;
|
|
|
|
var ReactMarkupChecksum = {
|
|
CHECKSUM_ATTR_NAME: 'data-react-checksum',
|
|
|
|
/**
|
|
* @param {string} markup Markup string
|
|
* @return {string} Markup string with checksum attribute attached
|
|
*/
|
|
addChecksumToMarkup: function addChecksumToMarkup(markup) {
|
|
var checksum = adler32(markup);
|
|
|
|
// Add checksum (handle both parent tags, comments and self-closing tags)
|
|
if (COMMENT_START.test(markup)) {
|
|
return markup;
|
|
} else {
|
|
return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&');
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @param {string} markup to use
|
|
* @param {DOMElement} element root React element
|
|
* @returns {boolean} whether or not the markup is the same
|
|
*/
|
|
canReuseMarkup: function canReuseMarkup(markup, element) {
|
|
var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
|
existingChecksum = existingChecksum && parseInt(existingChecksum, 10);
|
|
var markupChecksum = adler32(markup);
|
|
return markupChecksum === existingChecksum;
|
|
}
|
|
};
|
|
|
|
module.exports = ReactMarkupChecksum;
|
|
|
|
/***/ }),
|
|
/* 183 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactComponentEnvironment = __webpack_require__(50);
|
|
var ReactInstanceMap = __webpack_require__(29);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactReconciler = __webpack_require__(22);
|
|
var ReactChildReconciler = __webpack_require__(155);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var flattenChildren = __webpack_require__(208);
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Make an update for markup to be rendered and inserted at a supplied index.
|
|
*
|
|
* @param {string} markup Markup that renders into an element.
|
|
* @param {number} toIndex Destination index.
|
|
* @private
|
|
*/
|
|
function makeInsertMarkup(markup, afterNode, toIndex) {
|
|
// NOTE: Null values reduce hidden classes.
|
|
return {
|
|
type: 'INSERT_MARKUP',
|
|
content: markup,
|
|
fromIndex: null,
|
|
fromNode: null,
|
|
toIndex: toIndex,
|
|
afterNode: afterNode
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Make an update for moving an existing element to another index.
|
|
*
|
|
* @param {number} fromIndex Source index of the existing element.
|
|
* @param {number} toIndex Destination index of the element.
|
|
* @private
|
|
*/
|
|
function makeMove(child, afterNode, toIndex) {
|
|
// NOTE: Null values reduce hidden classes.
|
|
return {
|
|
type: 'MOVE_EXISTING',
|
|
content: null,
|
|
fromIndex: child._mountIndex,
|
|
fromNode: ReactReconciler.getHostNode(child),
|
|
toIndex: toIndex,
|
|
afterNode: afterNode
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Make an update for removing an element at an index.
|
|
*
|
|
* @param {number} fromIndex Index of the element to remove.
|
|
* @private
|
|
*/
|
|
function makeRemove(child, node) {
|
|
// NOTE: Null values reduce hidden classes.
|
|
return {
|
|
type: 'REMOVE_NODE',
|
|
content: null,
|
|
fromIndex: child._mountIndex,
|
|
fromNode: node,
|
|
toIndex: null,
|
|
afterNode: null
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Make an update for setting the markup of a node.
|
|
*
|
|
* @param {string} markup Markup that renders into an element.
|
|
* @private
|
|
*/
|
|
function makeSetMarkup(markup) {
|
|
// NOTE: Null values reduce hidden classes.
|
|
return {
|
|
type: 'SET_MARKUP',
|
|
content: markup,
|
|
fromIndex: null,
|
|
fromNode: null,
|
|
toIndex: null,
|
|
afterNode: null
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Make an update for setting the text content.
|
|
*
|
|
* @param {string} textContent Text content to set.
|
|
* @private
|
|
*/
|
|
function makeTextContent(textContent) {
|
|
// NOTE: Null values reduce hidden classes.
|
|
return {
|
|
type: 'TEXT_CONTENT',
|
|
content: textContent,
|
|
fromIndex: null,
|
|
fromNode: null,
|
|
toIndex: null,
|
|
afterNode: null
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Push an update, if any, onto the queue. Creates a new queue if none is
|
|
* passed and always returns the queue. Mutative.
|
|
*/
|
|
function enqueue(queue, update) {
|
|
if (update) {
|
|
queue = queue || [];
|
|
queue.push(update);
|
|
}
|
|
return queue;
|
|
}
|
|
|
|
/**
|
|
* Processes any enqueued updates.
|
|
*
|
|
* @private
|
|
*/
|
|
function processQueue(inst, updateQueue) {
|
|
ReactComponentEnvironment.processChildrenUpdates(inst, updateQueue);
|
|
}
|
|
|
|
var setChildrenForInstrumentation = emptyFunction;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var getDebugID = function getDebugID(inst) {
|
|
if (!inst._debugID) {
|
|
// Check for ART-like instances. TODO: This is silly/gross.
|
|
var internal;
|
|
if (internal = ReactInstanceMap.get(inst)) {
|
|
inst = internal;
|
|
}
|
|
}
|
|
return inst._debugID;
|
|
};
|
|
setChildrenForInstrumentation = function setChildrenForInstrumentation(children) {
|
|
var debugID = getDebugID(this);
|
|
// TODO: React Native empty components are also multichild.
|
|
// This means they still get into this method but don't have _debugID.
|
|
if (debugID !== 0) {
|
|
ReactInstrumentation.debugTool.onSetChildren(debugID, children ? Object.keys(children).map(function (key) {
|
|
return children[key]._debugID;
|
|
}) : []);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* ReactMultiChild are capable of reconciling multiple children.
|
|
*
|
|
* @class ReactMultiChild
|
|
* @internal
|
|
*/
|
|
var ReactMultiChild = {
|
|
/**
|
|
* Provides common functionality for components that must reconcile multiple
|
|
* children. This is used by `ReactDOMComponent` to mount, update, and
|
|
* unmount child components.
|
|
*
|
|
* @lends {ReactMultiChild.prototype}
|
|
*/
|
|
Mixin: {
|
|
_reconcilerInstantiateChildren: function _reconcilerInstantiateChildren(nestedChildren, transaction, context) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var selfDebugID = getDebugID(this);
|
|
if (this._currentElement) {
|
|
try {
|
|
ReactCurrentOwner.current = this._currentElement._owner;
|
|
return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context, selfDebugID);
|
|
} finally {
|
|
ReactCurrentOwner.current = null;
|
|
}
|
|
}
|
|
}
|
|
return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);
|
|
},
|
|
|
|
_reconcilerUpdateChildren: function _reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context) {
|
|
var nextChildren;
|
|
var selfDebugID = 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
selfDebugID = getDebugID(this);
|
|
if (this._currentElement) {
|
|
try {
|
|
ReactCurrentOwner.current = this._currentElement._owner;
|
|
nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID);
|
|
} finally {
|
|
ReactCurrentOwner.current = null;
|
|
}
|
|
ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID);
|
|
return nextChildren;
|
|
}
|
|
}
|
|
nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID);
|
|
ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID);
|
|
return nextChildren;
|
|
},
|
|
|
|
/**
|
|
* Generates a "mount image" for each of the supplied children. In the case
|
|
* of `ReactDOMComponent`, a mount image is a string of markup.
|
|
*
|
|
* @param {?object} nestedChildren Nested child maps.
|
|
* @return {array} An array of mounted representations.
|
|
* @internal
|
|
*/
|
|
mountChildren: function mountChildren(nestedChildren, transaction, context) {
|
|
var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context);
|
|
this._renderedChildren = children;
|
|
|
|
var mountImages = [];
|
|
var index = 0;
|
|
for (var name in children) {
|
|
if (children.hasOwnProperty(name)) {
|
|
var child = children[name];
|
|
var selfDebugID = 0;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
selfDebugID = getDebugID(this);
|
|
}
|
|
var mountImage = ReactReconciler.mountComponent(child, transaction, this, this._hostContainerInfo, context, selfDebugID);
|
|
child._mountIndex = index++;
|
|
mountImages.push(mountImage);
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setChildrenForInstrumentation.call(this, children);
|
|
}
|
|
|
|
return mountImages;
|
|
},
|
|
|
|
/**
|
|
* Replaces any rendered children with a text content string.
|
|
*
|
|
* @param {string} nextContent String of content.
|
|
* @internal
|
|
*/
|
|
updateTextContent: function updateTextContent(nextContent) {
|
|
var prevChildren = this._renderedChildren;
|
|
// Remove any rendered children.
|
|
ReactChildReconciler.unmountChildren(prevChildren, false);
|
|
for (var name in prevChildren) {
|
|
if (prevChildren.hasOwnProperty(name)) {
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0;
|
|
}
|
|
}
|
|
// Set new text content.
|
|
var updates = [makeTextContent(nextContent)];
|
|
processQueue(this, updates);
|
|
},
|
|
|
|
/**
|
|
* Replaces any rendered children with a markup string.
|
|
*
|
|
* @param {string} nextMarkup String of markup.
|
|
* @internal
|
|
*/
|
|
updateMarkup: function updateMarkup(nextMarkup) {
|
|
var prevChildren = this._renderedChildren;
|
|
// Remove any rendered children.
|
|
ReactChildReconciler.unmountChildren(prevChildren, false);
|
|
for (var name in prevChildren) {
|
|
if (prevChildren.hasOwnProperty(name)) {
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0;
|
|
}
|
|
}
|
|
var updates = [makeSetMarkup(nextMarkup)];
|
|
processQueue(this, updates);
|
|
},
|
|
|
|
/**
|
|
* Updates the rendered children with new children.
|
|
*
|
|
* @param {?object} nextNestedChildrenElements Nested child element maps.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @internal
|
|
*/
|
|
updateChildren: function updateChildren(nextNestedChildrenElements, transaction, context) {
|
|
// Hook used by React ART
|
|
this._updateChildren(nextNestedChildrenElements, transaction, context);
|
|
},
|
|
|
|
/**
|
|
* @param {?object} nextNestedChildrenElements Nested child element maps.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @final
|
|
* @protected
|
|
*/
|
|
_updateChildren: function _updateChildren(nextNestedChildrenElements, transaction, context) {
|
|
var prevChildren = this._renderedChildren;
|
|
var removedNodes = {};
|
|
var mountImages = [];
|
|
var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context);
|
|
if (!nextChildren && !prevChildren) {
|
|
return;
|
|
}
|
|
var updates = null;
|
|
var name;
|
|
// `nextIndex` will increment for each child in `nextChildren`, but
|
|
// `lastIndex` will be the last index visited in `prevChildren`.
|
|
var nextIndex = 0;
|
|
var lastIndex = 0;
|
|
// `nextMountIndex` will increment for each newly mounted child.
|
|
var nextMountIndex = 0;
|
|
var lastPlacedNode = null;
|
|
for (name in nextChildren) {
|
|
if (!nextChildren.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
var prevChild = prevChildren && prevChildren[name];
|
|
var nextChild = nextChildren[name];
|
|
if (prevChild === nextChild) {
|
|
updates = enqueue(updates, this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex));
|
|
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
|
prevChild._mountIndex = nextIndex;
|
|
} else {
|
|
if (prevChild) {
|
|
// Update `lastIndex` before `_mountIndex` gets unset by unmounting.
|
|
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
|
// The `removedNodes` loop below will actually remove the child.
|
|
}
|
|
// The child must be instantiated before it's mounted.
|
|
updates = enqueue(updates, this._mountChildAtIndex(nextChild, mountImages[nextMountIndex], lastPlacedNode, nextIndex, transaction, context));
|
|
nextMountIndex++;
|
|
}
|
|
nextIndex++;
|
|
lastPlacedNode = ReactReconciler.getHostNode(nextChild);
|
|
}
|
|
// Remove children that are no longer present.
|
|
for (name in removedNodes) {
|
|
if (removedNodes.hasOwnProperty(name)) {
|
|
updates = enqueue(updates, this._unmountChild(prevChildren[name], removedNodes[name]));
|
|
}
|
|
}
|
|
if (updates) {
|
|
processQueue(this, updates);
|
|
}
|
|
this._renderedChildren = nextChildren;
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
setChildrenForInstrumentation.call(this, nextChildren);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Unmounts all rendered children. This should be used to clean up children
|
|
* when this component is unmounted. It does not actually perform any
|
|
* backend operations.
|
|
*
|
|
* @internal
|
|
*/
|
|
unmountChildren: function unmountChildren(safely) {
|
|
var renderedChildren = this._renderedChildren;
|
|
ReactChildReconciler.unmountChildren(renderedChildren, safely);
|
|
this._renderedChildren = null;
|
|
},
|
|
|
|
/**
|
|
* Moves a child component to the supplied index.
|
|
*
|
|
* @param {ReactComponent} child Component to move.
|
|
* @param {number} toIndex Destination index of the element.
|
|
* @param {number} lastIndex Last index visited of the siblings of `child`.
|
|
* @protected
|
|
*/
|
|
moveChild: function moveChild(child, afterNode, toIndex, lastIndex) {
|
|
// If the index of `child` is less than `lastIndex`, then it needs to
|
|
// be moved. Otherwise, we do not need to move it because a child will be
|
|
// inserted or moved before `child`.
|
|
if (child._mountIndex < lastIndex) {
|
|
return makeMove(child, afterNode, toIndex);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Creates a child component.
|
|
*
|
|
* @param {ReactComponent} child Component to create.
|
|
* @param {string} mountImage Markup to insert.
|
|
* @protected
|
|
*/
|
|
createChild: function createChild(child, afterNode, mountImage) {
|
|
return makeInsertMarkup(mountImage, afterNode, child._mountIndex);
|
|
},
|
|
|
|
/**
|
|
* Removes a child component.
|
|
*
|
|
* @param {ReactComponent} child Child to remove.
|
|
* @protected
|
|
*/
|
|
removeChild: function removeChild(child, node) {
|
|
return makeRemove(child, node);
|
|
},
|
|
|
|
/**
|
|
* Mounts a child with the supplied name.
|
|
*
|
|
* NOTE: This is part of `updateChildren` and is here for readability.
|
|
*
|
|
* @param {ReactComponent} child Component to mount.
|
|
* @param {string} name Name of the child.
|
|
* @param {number} index Index at which to insert the child.
|
|
* @param {ReactReconcileTransaction} transaction
|
|
* @private
|
|
*/
|
|
_mountChildAtIndex: function _mountChildAtIndex(child, mountImage, afterNode, index, transaction, context) {
|
|
child._mountIndex = index;
|
|
return this.createChild(child, afterNode, mountImage);
|
|
},
|
|
|
|
/**
|
|
* Unmounts a rendered child.
|
|
*
|
|
* NOTE: This is part of `updateChildren` and is here for readability.
|
|
*
|
|
* @param {ReactComponent} child Component to unmount.
|
|
* @private
|
|
*/
|
|
_unmountChild: function _unmountChild(child, node) {
|
|
var update = this.removeChild(child, node);
|
|
child._mountIndex = null;
|
|
return update;
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactMultiChild;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 184 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* @param {?object} object
|
|
* @return {boolean} True if `object` is a valid owner.
|
|
* @final
|
|
*/
|
|
function isValidOwner(object) {
|
|
return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function');
|
|
}
|
|
|
|
/**
|
|
* ReactOwners are capable of storing references to owned components.
|
|
*
|
|
* All components are capable of //being// referenced by owner components, but
|
|
* only ReactOwner components are capable of //referencing// owned components.
|
|
* The named reference is known as a "ref".
|
|
*
|
|
* Refs are available when mounted and updated during reconciliation.
|
|
*
|
|
* var MyComponent = React.createClass({
|
|
* render: function() {
|
|
* return (
|
|
* <div onClick={this.handleClick}>
|
|
* <CustomComponent ref="custom" />
|
|
* </div>
|
|
* );
|
|
* },
|
|
* handleClick: function() {
|
|
* this.refs.custom.handleClick();
|
|
* },
|
|
* componentDidMount: function() {
|
|
* this.refs.custom.initialize();
|
|
* }
|
|
* });
|
|
*
|
|
* Refs should rarely be used. When refs are used, they should only be done to
|
|
* control data that is not handled by React's data flow.
|
|
*
|
|
* @class ReactOwner
|
|
*/
|
|
var ReactOwner = {
|
|
/**
|
|
* Adds a component by ref to an owner component.
|
|
*
|
|
* @param {ReactComponent} component Component to reference.
|
|
* @param {string} ref Name by which to refer to the component.
|
|
* @param {ReactOwner} owner Component on which to record the ref.
|
|
* @final
|
|
* @internal
|
|
*/
|
|
addComponentAsRefTo: function addComponentAsRefTo(component, ref, owner) {
|
|
!isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component\'s `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).') : _prodInvariant('119') : void 0;
|
|
owner.attachRef(ref, component);
|
|
},
|
|
|
|
/**
|
|
* Removes a component by ref from an owner component.
|
|
*
|
|
* @param {ReactComponent} component Component to dereference.
|
|
* @param {string} ref Name of the ref to remove.
|
|
* @param {ReactOwner} owner Component on which the ref is recorded.
|
|
* @final
|
|
* @internal
|
|
*/
|
|
removeComponentAsRefFrom: function removeComponentAsRefFrom(component, ref, owner) {
|
|
!isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component\'s `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).') : _prodInvariant('120') : void 0;
|
|
var ownerPublicInstance = owner.getPublicInstance();
|
|
// Check that `component`'s owner is still alive and that `component` is still the current ref
|
|
// because we do not want to detach the ref if another component stole it.
|
|
if (ownerPublicInstance && ownerPublicInstance.refs[ref] === component.getPublicInstance()) {
|
|
owner.detachRef(ref);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = ReactOwner;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 185 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactPropTypeLocationNames = {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactPropTypeLocationNames = {
|
|
prop: 'prop',
|
|
context: 'context',
|
|
childContext: 'child context'
|
|
};
|
|
}
|
|
|
|
module.exports = ReactPropTypeLocationNames;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 186 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var CallbackQueue = __webpack_require__(74);
|
|
var PooledClass = __webpack_require__(18);
|
|
var ReactBrowserEventEmitter = __webpack_require__(34);
|
|
var ReactInputSelection = __webpack_require__(81);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var Transaction = __webpack_require__(36);
|
|
var ReactUpdateQueue = __webpack_require__(52);
|
|
|
|
/**
|
|
* Ensures that, when possible, the selection range (currently selected text
|
|
* input) is not disturbed by performing the transaction.
|
|
*/
|
|
var SELECTION_RESTORATION = {
|
|
/**
|
|
* @return {Selection} Selection information.
|
|
*/
|
|
initialize: ReactInputSelection.getSelectionInformation,
|
|
/**
|
|
* @param {Selection} sel Selection information returned from `initialize`.
|
|
*/
|
|
close: ReactInputSelection.restoreSelection
|
|
};
|
|
|
|
/**
|
|
* Suppresses events (blur/focus) that could be inadvertently dispatched due to
|
|
* high level DOM manipulations (like temporarily removing a text input from the
|
|
* DOM).
|
|
*/
|
|
var EVENT_SUPPRESSION = {
|
|
/**
|
|
* @return {boolean} The enabled status of `ReactBrowserEventEmitter` before
|
|
* the reconciliation.
|
|
*/
|
|
initialize: function initialize() {
|
|
var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();
|
|
ReactBrowserEventEmitter.setEnabled(false);
|
|
return currentlyEnabled;
|
|
},
|
|
|
|
/**
|
|
* @param {boolean} previouslyEnabled Enabled status of
|
|
* `ReactBrowserEventEmitter` before the reconciliation occurred. `close`
|
|
* restores the previous value.
|
|
*/
|
|
close: function close(previouslyEnabled) {
|
|
ReactBrowserEventEmitter.setEnabled(previouslyEnabled);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Provides a queue for collecting `componentDidMount` and
|
|
* `componentDidUpdate` callbacks during the transaction.
|
|
*/
|
|
var ON_DOM_READY_QUEUEING = {
|
|
/**
|
|
* Initializes the internal `onDOMReady` queue.
|
|
*/
|
|
initialize: function initialize() {
|
|
this.reactMountReady.reset();
|
|
},
|
|
|
|
/**
|
|
* After DOM is flushed, invoke all registered `onDOMReady` callbacks.
|
|
*/
|
|
close: function close() {
|
|
this.reactMountReady.notifyAll();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Executed within the scope of the `Transaction` instance. Consider these as
|
|
* being member methods, but with an implied ordering while being isolated from
|
|
* each other.
|
|
*/
|
|
var TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
TRANSACTION_WRAPPERS.push({
|
|
initialize: ReactInstrumentation.debugTool.onBeginFlush,
|
|
close: ReactInstrumentation.debugTool.onEndFlush
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Currently:
|
|
* - The order that these are listed in the transaction is critical:
|
|
* - Suppresses events.
|
|
* - Restores selection range.
|
|
*
|
|
* Future:
|
|
* - Restore document/overflow scroll positions that were unintentionally
|
|
* modified via DOM insertions above the top viewport boundary.
|
|
* - Implement/integrate with customized constraint based layout system and keep
|
|
* track of which dimensions must be remeasured.
|
|
*
|
|
* @class ReactReconcileTransaction
|
|
*/
|
|
function ReactReconcileTransaction(useCreateElement) {
|
|
this.reinitializeTransaction();
|
|
// Only server-side rendering really needs this option (see
|
|
// `ReactServerRendering`), but server-side uses
|
|
// `ReactServerRenderingTransaction` instead. This option is here so that it's
|
|
// accessible and defaults to false when `ReactDOMComponent` and
|
|
// `ReactDOMTextComponent` checks it in `mountComponent`.`
|
|
this.renderToStaticMarkup = false;
|
|
this.reactMountReady = CallbackQueue.getPooled(null);
|
|
this.useCreateElement = useCreateElement;
|
|
}
|
|
|
|
var Mixin = {
|
|
/**
|
|
* @see Transaction
|
|
* @abstract
|
|
* @final
|
|
* @return {array<object>} List of operation wrap procedures.
|
|
* TODO: convert to array<TransactionWrapper>
|
|
*/
|
|
getTransactionWrappers: function getTransactionWrappers() {
|
|
return TRANSACTION_WRAPPERS;
|
|
},
|
|
|
|
/**
|
|
* @return {object} The queue to collect `onDOMReady` callbacks with.
|
|
*/
|
|
getReactMountReady: function getReactMountReady() {
|
|
return this.reactMountReady;
|
|
},
|
|
|
|
/**
|
|
* @return {object} The queue to collect React async events.
|
|
*/
|
|
getUpdateQueue: function getUpdateQueue() {
|
|
return ReactUpdateQueue;
|
|
},
|
|
|
|
/**
|
|
* Save current transaction state -- if the return value from this method is
|
|
* passed to `rollback`, the transaction will be reset to that state.
|
|
*/
|
|
checkpoint: function checkpoint() {
|
|
// reactMountReady is the our only stateful wrapper
|
|
return this.reactMountReady.checkpoint();
|
|
},
|
|
|
|
rollback: function rollback(checkpoint) {
|
|
this.reactMountReady.rollback(checkpoint);
|
|
},
|
|
|
|
/**
|
|
* `PooledClass` looks for this, and will invoke this before allowing this
|
|
* instance to be reused.
|
|
*/
|
|
destructor: function destructor() {
|
|
CallbackQueue.release(this.reactMountReady);
|
|
this.reactMountReady = null;
|
|
}
|
|
};
|
|
|
|
_assign(ReactReconcileTransaction.prototype, Transaction, Mixin);
|
|
|
|
PooledClass.addPoolingTo(ReactReconcileTransaction);
|
|
|
|
module.exports = ReactReconcileTransaction;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 187 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var ReactOwner = __webpack_require__(184);
|
|
|
|
var ReactRef = {};
|
|
|
|
function attachRef(ref, component, owner) {
|
|
if (typeof ref === 'function') {
|
|
ref(component.getPublicInstance());
|
|
} else {
|
|
// Legacy ref
|
|
ReactOwner.addComponentAsRefTo(component, ref, owner);
|
|
}
|
|
}
|
|
|
|
function detachRef(ref, component, owner) {
|
|
if (typeof ref === 'function') {
|
|
ref(null);
|
|
} else {
|
|
// Legacy ref
|
|
ReactOwner.removeComponentAsRefFrom(component, ref, owner);
|
|
}
|
|
}
|
|
|
|
ReactRef.attachRefs = function (instance, element) {
|
|
if (element === null || (typeof element === 'undefined' ? 'undefined' : _typeof(element)) !== 'object') {
|
|
return;
|
|
}
|
|
var ref = element.ref;
|
|
if (ref != null) {
|
|
attachRef(ref, instance, element._owner);
|
|
}
|
|
};
|
|
|
|
ReactRef.shouldUpdateRefs = function (prevElement, nextElement) {
|
|
// If either the owner or a `ref` has changed, make sure the newest owner
|
|
// has stored a reference to `this`, and the previous owner (if different)
|
|
// has forgotten the reference to `this`. We use the element instead
|
|
// of the public this.props because the post processing cannot determine
|
|
// a ref. The ref conceptually lives on the element.
|
|
|
|
// TODO: Should this even be possible? The owner cannot change because
|
|
// it's forbidden by shouldUpdateReactComponent. The ref can change
|
|
// if you swap the keys of but not the refs. Reconsider where this check
|
|
// is made. It probably belongs where the key checking and
|
|
// instantiateReactComponent is done.
|
|
|
|
var prevRef = null;
|
|
var prevOwner = null;
|
|
if (prevElement !== null && (typeof prevElement === 'undefined' ? 'undefined' : _typeof(prevElement)) === 'object') {
|
|
prevRef = prevElement.ref;
|
|
prevOwner = prevElement._owner;
|
|
}
|
|
|
|
var nextRef = null;
|
|
var nextOwner = null;
|
|
if (nextElement !== null && (typeof nextElement === 'undefined' ? 'undefined' : _typeof(nextElement)) === 'object') {
|
|
nextRef = nextElement.ref;
|
|
nextOwner = nextElement._owner;
|
|
}
|
|
|
|
return prevRef !== nextRef ||
|
|
// If owner changes but we have an unchanged function ref, don't update refs
|
|
typeof nextRef === 'string' && nextOwner !== prevOwner;
|
|
};
|
|
|
|
ReactRef.detachRefs = function (instance, element) {
|
|
if (element === null || (typeof element === 'undefined' ? 'undefined' : _typeof(element)) !== 'object') {
|
|
return;
|
|
}
|
|
var ref = element.ref;
|
|
if (ref != null) {
|
|
detachRef(ref, instance, element._owner);
|
|
}
|
|
};
|
|
|
|
module.exports = ReactRef;
|
|
|
|
/***/ }),
|
|
/* 188 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _assign = __webpack_require__(5);
|
|
|
|
var PooledClass = __webpack_require__(18);
|
|
var Transaction = __webpack_require__(36);
|
|
var ReactInstrumentation = __webpack_require__(11);
|
|
var ReactServerUpdateQueue = __webpack_require__(189);
|
|
|
|
/**
|
|
* Executed within the scope of the `Transaction` instance. Consider these as
|
|
* being member methods, but with an implied ordering while being isolated from
|
|
* each other.
|
|
*/
|
|
var TRANSACTION_WRAPPERS = [];
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
TRANSACTION_WRAPPERS.push({
|
|
initialize: ReactInstrumentation.debugTool.onBeginFlush,
|
|
close: ReactInstrumentation.debugTool.onEndFlush
|
|
});
|
|
}
|
|
|
|
var noopCallbackQueue = {
|
|
enqueue: function enqueue() {}
|
|
};
|
|
|
|
/**
|
|
* @class ReactServerRenderingTransaction
|
|
* @param {boolean} renderToStaticMarkup
|
|
*/
|
|
function ReactServerRenderingTransaction(renderToStaticMarkup) {
|
|
this.reinitializeTransaction();
|
|
this.renderToStaticMarkup = renderToStaticMarkup;
|
|
this.useCreateElement = false;
|
|
this.updateQueue = new ReactServerUpdateQueue(this);
|
|
}
|
|
|
|
var Mixin = {
|
|
/**
|
|
* @see Transaction
|
|
* @abstract
|
|
* @final
|
|
* @return {array} Empty list of operation wrap procedures.
|
|
*/
|
|
getTransactionWrappers: function getTransactionWrappers() {
|
|
return TRANSACTION_WRAPPERS;
|
|
},
|
|
|
|
/**
|
|
* @return {object} The queue to collect `onDOMReady` callbacks with.
|
|
*/
|
|
getReactMountReady: function getReactMountReady() {
|
|
return noopCallbackQueue;
|
|
},
|
|
|
|
/**
|
|
* @return {object} The queue to collect React async events.
|
|
*/
|
|
getUpdateQueue: function getUpdateQueue() {
|
|
return this.updateQueue;
|
|
},
|
|
|
|
/**
|
|
* `PooledClass` looks for this, and will invoke this before allowing this
|
|
* instance to be reused.
|
|
*/
|
|
destructor: function destructor() {},
|
|
|
|
checkpoint: function checkpoint() {},
|
|
|
|
rollback: function rollback() {}
|
|
};
|
|
|
|
_assign(ReactServerRenderingTransaction.prototype, Transaction, Mixin);
|
|
|
|
PooledClass.addPoolingTo(ReactServerRenderingTransaction);
|
|
|
|
module.exports = ReactServerRenderingTransaction;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 189 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
var ReactUpdateQueue = __webpack_require__(52);
|
|
|
|
var warning = __webpack_require__(2);
|
|
|
|
function warnNoop(publicInstance, callerName) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var constructor = publicInstance.constructor;
|
|
process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This is the update queue used for server rendering.
|
|
* It delegates to ReactUpdateQueue while server rendering is in progress and
|
|
* switches to ReactNoopUpdateQueue after the transaction has completed.
|
|
* @class ReactServerUpdateQueue
|
|
* @param {Transaction} transaction
|
|
*/
|
|
|
|
var ReactServerUpdateQueue = function () {
|
|
function ReactServerUpdateQueue(transaction) {
|
|
_classCallCheck(this, ReactServerUpdateQueue);
|
|
|
|
this.transaction = transaction;
|
|
}
|
|
|
|
/**
|
|
* Checks whether or not this composite component is mounted.
|
|
* @param {ReactClass} publicInstance The instance we want to test.
|
|
* @return {boolean} True if mounted, false otherwise.
|
|
* @protected
|
|
* @final
|
|
*/
|
|
|
|
ReactServerUpdateQueue.prototype.isMounted = function isMounted(publicInstance) {
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Enqueue a callback that will be executed after all the pending updates
|
|
* have processed.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance to use as `this` context.
|
|
* @param {?function} callback Called after state is updated.
|
|
* @internal
|
|
*/
|
|
|
|
ReactServerUpdateQueue.prototype.enqueueCallback = function enqueueCallback(publicInstance, callback, callerName) {
|
|
if (this.transaction.isInTransaction()) {
|
|
ReactUpdateQueue.enqueueCallback(publicInstance, callback, callerName);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Forces an update. This should only be invoked when it is known with
|
|
* certainty that we are **not** in a DOM transaction.
|
|
*
|
|
* You may want to call this when you know that some deeper aspect of the
|
|
* component's state has changed but `setState` was not called.
|
|
*
|
|
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
* `componentWillUpdate` and `componentDidUpdate`.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @internal
|
|
*/
|
|
|
|
ReactServerUpdateQueue.prototype.enqueueForceUpdate = function enqueueForceUpdate(publicInstance) {
|
|
if (this.transaction.isInTransaction()) {
|
|
ReactUpdateQueue.enqueueForceUpdate(publicInstance);
|
|
} else {
|
|
warnNoop(publicInstance, 'forceUpdate');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Replaces all of the state. Always use this or `setState` to mutate state.
|
|
* You should treat `this.state` as immutable.
|
|
*
|
|
* There is no guarantee that `this.state` will be immediately updated, so
|
|
* accessing `this.state` after calling this method may return the old value.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object|function} completeState Next state.
|
|
* @internal
|
|
*/
|
|
|
|
ReactServerUpdateQueue.prototype.enqueueReplaceState = function enqueueReplaceState(publicInstance, completeState) {
|
|
if (this.transaction.isInTransaction()) {
|
|
ReactUpdateQueue.enqueueReplaceState(publicInstance, completeState);
|
|
} else {
|
|
warnNoop(publicInstance, 'replaceState');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Sets a subset of the state. This only exists because _pendingState is
|
|
* internal. This provides a merging strategy that is not available to deep
|
|
* properties which is confusing. TODO: Expose pendingState or don't use it
|
|
* during the merge.
|
|
*
|
|
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
* @param {object|function} partialState Next partial state to be merged with state.
|
|
* @internal
|
|
*/
|
|
|
|
ReactServerUpdateQueue.prototype.enqueueSetState = function enqueueSetState(publicInstance, partialState) {
|
|
if (this.transaction.isInTransaction()) {
|
|
ReactUpdateQueue.enqueueSetState(publicInstance, partialState);
|
|
} else {
|
|
warnNoop(publicInstance, 'setState');
|
|
}
|
|
};
|
|
|
|
return ReactServerUpdateQueue;
|
|
}();
|
|
|
|
module.exports = ReactServerUpdateQueue;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 190 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
module.exports = '15.6.1';
|
|
|
|
/***/ }),
|
|
/* 191 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var NS = {
|
|
xlink: 'http://www.w3.org/1999/xlink',
|
|
xml: 'http://www.w3.org/XML/1998/namespace'
|
|
};
|
|
|
|
// We use attributes for everything SVG so let's avoid some duplication and run
|
|
// code instead.
|
|
// The following are all specified in the HTML config already so we exclude here.
|
|
// - class (as className)
|
|
// - color
|
|
// - height
|
|
// - id
|
|
// - lang
|
|
// - max
|
|
// - media
|
|
// - method
|
|
// - min
|
|
// - name
|
|
// - style
|
|
// - target
|
|
// - type
|
|
// - width
|
|
var ATTRS = {
|
|
accentHeight: 'accent-height',
|
|
accumulate: 0,
|
|
additive: 0,
|
|
alignmentBaseline: 'alignment-baseline',
|
|
allowReorder: 'allowReorder',
|
|
alphabetic: 0,
|
|
amplitude: 0,
|
|
arabicForm: 'arabic-form',
|
|
ascent: 0,
|
|
attributeName: 'attributeName',
|
|
attributeType: 'attributeType',
|
|
autoReverse: 'autoReverse',
|
|
azimuth: 0,
|
|
baseFrequency: 'baseFrequency',
|
|
baseProfile: 'baseProfile',
|
|
baselineShift: 'baseline-shift',
|
|
bbox: 0,
|
|
begin: 0,
|
|
bias: 0,
|
|
by: 0,
|
|
calcMode: 'calcMode',
|
|
capHeight: 'cap-height',
|
|
clip: 0,
|
|
clipPath: 'clip-path',
|
|
clipRule: 'clip-rule',
|
|
clipPathUnits: 'clipPathUnits',
|
|
colorInterpolation: 'color-interpolation',
|
|
colorInterpolationFilters: 'color-interpolation-filters',
|
|
colorProfile: 'color-profile',
|
|
colorRendering: 'color-rendering',
|
|
contentScriptType: 'contentScriptType',
|
|
contentStyleType: 'contentStyleType',
|
|
cursor: 0,
|
|
cx: 0,
|
|
cy: 0,
|
|
d: 0,
|
|
decelerate: 0,
|
|
descent: 0,
|
|
diffuseConstant: 'diffuseConstant',
|
|
direction: 0,
|
|
display: 0,
|
|
divisor: 0,
|
|
dominantBaseline: 'dominant-baseline',
|
|
dur: 0,
|
|
dx: 0,
|
|
dy: 0,
|
|
edgeMode: 'edgeMode',
|
|
elevation: 0,
|
|
enableBackground: 'enable-background',
|
|
end: 0,
|
|
exponent: 0,
|
|
externalResourcesRequired: 'externalResourcesRequired',
|
|
fill: 0,
|
|
fillOpacity: 'fill-opacity',
|
|
fillRule: 'fill-rule',
|
|
filter: 0,
|
|
filterRes: 'filterRes',
|
|
filterUnits: 'filterUnits',
|
|
floodColor: 'flood-color',
|
|
floodOpacity: 'flood-opacity',
|
|
focusable: 0,
|
|
fontFamily: 'font-family',
|
|
fontSize: 'font-size',
|
|
fontSizeAdjust: 'font-size-adjust',
|
|
fontStretch: 'font-stretch',
|
|
fontStyle: 'font-style',
|
|
fontVariant: 'font-variant',
|
|
fontWeight: 'font-weight',
|
|
format: 0,
|
|
from: 0,
|
|
fx: 0,
|
|
fy: 0,
|
|
g1: 0,
|
|
g2: 0,
|
|
glyphName: 'glyph-name',
|
|
glyphOrientationHorizontal: 'glyph-orientation-horizontal',
|
|
glyphOrientationVertical: 'glyph-orientation-vertical',
|
|
glyphRef: 'glyphRef',
|
|
gradientTransform: 'gradientTransform',
|
|
gradientUnits: 'gradientUnits',
|
|
hanging: 0,
|
|
horizAdvX: 'horiz-adv-x',
|
|
horizOriginX: 'horiz-origin-x',
|
|
ideographic: 0,
|
|
imageRendering: 'image-rendering',
|
|
'in': 0,
|
|
in2: 0,
|
|
intercept: 0,
|
|
k: 0,
|
|
k1: 0,
|
|
k2: 0,
|
|
k3: 0,
|
|
k4: 0,
|
|
kernelMatrix: 'kernelMatrix',
|
|
kernelUnitLength: 'kernelUnitLength',
|
|
kerning: 0,
|
|
keyPoints: 'keyPoints',
|
|
keySplines: 'keySplines',
|
|
keyTimes: 'keyTimes',
|
|
lengthAdjust: 'lengthAdjust',
|
|
letterSpacing: 'letter-spacing',
|
|
lightingColor: 'lighting-color',
|
|
limitingConeAngle: 'limitingConeAngle',
|
|
local: 0,
|
|
markerEnd: 'marker-end',
|
|
markerMid: 'marker-mid',
|
|
markerStart: 'marker-start',
|
|
markerHeight: 'markerHeight',
|
|
markerUnits: 'markerUnits',
|
|
markerWidth: 'markerWidth',
|
|
mask: 0,
|
|
maskContentUnits: 'maskContentUnits',
|
|
maskUnits: 'maskUnits',
|
|
mathematical: 0,
|
|
mode: 0,
|
|
numOctaves: 'numOctaves',
|
|
offset: 0,
|
|
opacity: 0,
|
|
operator: 0,
|
|
order: 0,
|
|
orient: 0,
|
|
orientation: 0,
|
|
origin: 0,
|
|
overflow: 0,
|
|
overlinePosition: 'overline-position',
|
|
overlineThickness: 'overline-thickness',
|
|
paintOrder: 'paint-order',
|
|
panose1: 'panose-1',
|
|
pathLength: 'pathLength',
|
|
patternContentUnits: 'patternContentUnits',
|
|
patternTransform: 'patternTransform',
|
|
patternUnits: 'patternUnits',
|
|
pointerEvents: 'pointer-events',
|
|
points: 0,
|
|
pointsAtX: 'pointsAtX',
|
|
pointsAtY: 'pointsAtY',
|
|
pointsAtZ: 'pointsAtZ',
|
|
preserveAlpha: 'preserveAlpha',
|
|
preserveAspectRatio: 'preserveAspectRatio',
|
|
primitiveUnits: 'primitiveUnits',
|
|
r: 0,
|
|
radius: 0,
|
|
refX: 'refX',
|
|
refY: 'refY',
|
|
renderingIntent: 'rendering-intent',
|
|
repeatCount: 'repeatCount',
|
|
repeatDur: 'repeatDur',
|
|
requiredExtensions: 'requiredExtensions',
|
|
requiredFeatures: 'requiredFeatures',
|
|
restart: 0,
|
|
result: 0,
|
|
rotate: 0,
|
|
rx: 0,
|
|
ry: 0,
|
|
scale: 0,
|
|
seed: 0,
|
|
shapeRendering: 'shape-rendering',
|
|
slope: 0,
|
|
spacing: 0,
|
|
specularConstant: 'specularConstant',
|
|
specularExponent: 'specularExponent',
|
|
speed: 0,
|
|
spreadMethod: 'spreadMethod',
|
|
startOffset: 'startOffset',
|
|
stdDeviation: 'stdDeviation',
|
|
stemh: 0,
|
|
stemv: 0,
|
|
stitchTiles: 'stitchTiles',
|
|
stopColor: 'stop-color',
|
|
stopOpacity: 'stop-opacity',
|
|
strikethroughPosition: 'strikethrough-position',
|
|
strikethroughThickness: 'strikethrough-thickness',
|
|
string: 0,
|
|
stroke: 0,
|
|
strokeDasharray: 'stroke-dasharray',
|
|
strokeDashoffset: 'stroke-dashoffset',
|
|
strokeLinecap: 'stroke-linecap',
|
|
strokeLinejoin: 'stroke-linejoin',
|
|
strokeMiterlimit: 'stroke-miterlimit',
|
|
strokeOpacity: 'stroke-opacity',
|
|
strokeWidth: 'stroke-width',
|
|
surfaceScale: 'surfaceScale',
|
|
systemLanguage: 'systemLanguage',
|
|
tableValues: 'tableValues',
|
|
targetX: 'targetX',
|
|
targetY: 'targetY',
|
|
textAnchor: 'text-anchor',
|
|
textDecoration: 'text-decoration',
|
|
textRendering: 'text-rendering',
|
|
textLength: 'textLength',
|
|
to: 0,
|
|
transform: 0,
|
|
u1: 0,
|
|
u2: 0,
|
|
underlinePosition: 'underline-position',
|
|
underlineThickness: 'underline-thickness',
|
|
unicode: 0,
|
|
unicodeBidi: 'unicode-bidi',
|
|
unicodeRange: 'unicode-range',
|
|
unitsPerEm: 'units-per-em',
|
|
vAlphabetic: 'v-alphabetic',
|
|
vHanging: 'v-hanging',
|
|
vIdeographic: 'v-ideographic',
|
|
vMathematical: 'v-mathematical',
|
|
values: 0,
|
|
vectorEffect: 'vector-effect',
|
|
version: 0,
|
|
vertAdvY: 'vert-adv-y',
|
|
vertOriginX: 'vert-origin-x',
|
|
vertOriginY: 'vert-origin-y',
|
|
viewBox: 'viewBox',
|
|
viewTarget: 'viewTarget',
|
|
visibility: 0,
|
|
widths: 0,
|
|
wordSpacing: 'word-spacing',
|
|
writingMode: 'writing-mode',
|
|
x: 0,
|
|
xHeight: 'x-height',
|
|
x1: 0,
|
|
x2: 0,
|
|
xChannelSelector: 'xChannelSelector',
|
|
xlinkActuate: 'xlink:actuate',
|
|
xlinkArcrole: 'xlink:arcrole',
|
|
xlinkHref: 'xlink:href',
|
|
xlinkRole: 'xlink:role',
|
|
xlinkShow: 'xlink:show',
|
|
xlinkTitle: 'xlink:title',
|
|
xlinkType: 'xlink:type',
|
|
xmlBase: 'xml:base',
|
|
xmlns: 0,
|
|
xmlnsXlink: 'xmlns:xlink',
|
|
xmlLang: 'xml:lang',
|
|
xmlSpace: 'xml:space',
|
|
y: 0,
|
|
y1: 0,
|
|
y2: 0,
|
|
yChannelSelector: 'yChannelSelector',
|
|
z: 0,
|
|
zoomAndPan: 'zoomAndPan'
|
|
};
|
|
|
|
var SVGDOMPropertyConfig = {
|
|
Properties: {},
|
|
DOMAttributeNamespaces: {
|
|
xlinkActuate: NS.xlink,
|
|
xlinkArcrole: NS.xlink,
|
|
xlinkHref: NS.xlink,
|
|
xlinkRole: NS.xlink,
|
|
xlinkShow: NS.xlink,
|
|
xlinkTitle: NS.xlink,
|
|
xlinkType: NS.xlink,
|
|
xmlBase: NS.xml,
|
|
xmlLang: NS.xml,
|
|
xmlSpace: NS.xml
|
|
},
|
|
DOMAttributeNames: {}
|
|
};
|
|
|
|
Object.keys(ATTRS).forEach(function (key) {
|
|
SVGDOMPropertyConfig.Properties[key] = 0;
|
|
if (ATTRS[key]) {
|
|
SVGDOMPropertyConfig.DOMAttributeNames[key] = ATTRS[key];
|
|
}
|
|
});
|
|
|
|
module.exports = SVGDOMPropertyConfig;
|
|
|
|
/***/ }),
|
|
/* 192 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var EventPropagators = __webpack_require__(28);
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactInputSelection = __webpack_require__(81);
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
var getActiveElement = __webpack_require__(67);
|
|
var isTextInputElement = __webpack_require__(92);
|
|
var shallowEqual = __webpack_require__(40);
|
|
|
|
var skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11;
|
|
|
|
var eventTypes = {
|
|
select: {
|
|
phasedRegistrationNames: {
|
|
bubbled: 'onSelect',
|
|
captured: 'onSelectCapture'
|
|
},
|
|
dependencies: ['topBlur', 'topContextMenu', 'topFocus', 'topKeyDown', 'topKeyUp', 'topMouseDown', 'topMouseUp', 'topSelectionChange']
|
|
}
|
|
};
|
|
|
|
var activeElement = null;
|
|
var activeElementInst = null;
|
|
var lastSelection = null;
|
|
var mouseDown = false;
|
|
|
|
// Track whether a listener exists for this plugin. If none exist, we do
|
|
// not extract events. See #3639.
|
|
var hasListener = false;
|
|
|
|
/**
|
|
* Get an object which is a unique representation of the current selection.
|
|
*
|
|
* The return value will not be consistent across nodes or browsers, but
|
|
* two identical selections on the same node will return identical objects.
|
|
*
|
|
* @param {DOMElement} node
|
|
* @return {object}
|
|
*/
|
|
function getSelection(node) {
|
|
if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) {
|
|
return {
|
|
start: node.selectionStart,
|
|
end: node.selectionEnd
|
|
};
|
|
} else if (window.getSelection) {
|
|
var selection = window.getSelection();
|
|
return {
|
|
anchorNode: selection.anchorNode,
|
|
anchorOffset: selection.anchorOffset,
|
|
focusNode: selection.focusNode,
|
|
focusOffset: selection.focusOffset
|
|
};
|
|
} else if (document.selection) {
|
|
var range = document.selection.createRange();
|
|
return {
|
|
parentElement: range.parentElement(),
|
|
text: range.text,
|
|
top: range.boundingTop,
|
|
left: range.boundingLeft
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Poll selection to see whether it's changed.
|
|
*
|
|
* @param {object} nativeEvent
|
|
* @return {?SyntheticEvent}
|
|
*/
|
|
function constructSelectEvent(nativeEvent, nativeEventTarget) {
|
|
// Ensure we have the right element, and that the user is not dragging a
|
|
// selection (this matches native `select` event behavior). In HTML5, select
|
|
// fires only on input and textarea thus if there's no focused element we
|
|
// won't dispatch.
|
|
if (mouseDown || activeElement == null || activeElement !== getActiveElement()) {
|
|
return null;
|
|
}
|
|
|
|
// Only fire when selection has actually changed.
|
|
var currentSelection = getSelection(activeElement);
|
|
if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
|
|
lastSelection = currentSelection;
|
|
|
|
var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementInst, nativeEvent, nativeEventTarget);
|
|
|
|
syntheticEvent.type = 'select';
|
|
syntheticEvent.target = activeElement;
|
|
|
|
EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);
|
|
|
|
return syntheticEvent;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* This plugin creates an `onSelect` event that normalizes select events
|
|
* across form elements.
|
|
*
|
|
* Supported elements are:
|
|
* - input (see `isTextInputElement`)
|
|
* - textarea
|
|
* - contentEditable
|
|
*
|
|
* This differs from native browser implementations in the following ways:
|
|
* - Fires on contentEditable fields as well as inputs.
|
|
* - Fires for collapsed selection.
|
|
* - Fires after user input.
|
|
*/
|
|
var SelectEventPlugin = {
|
|
eventTypes: eventTypes,
|
|
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
if (!hasListener) {
|
|
return null;
|
|
}
|
|
|
|
var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window;
|
|
|
|
switch (topLevelType) {
|
|
// Track the input node that has focus.
|
|
case 'topFocus':
|
|
if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
|
|
activeElement = targetNode;
|
|
activeElementInst = targetInst;
|
|
lastSelection = null;
|
|
}
|
|
break;
|
|
case 'topBlur':
|
|
activeElement = null;
|
|
activeElementInst = null;
|
|
lastSelection = null;
|
|
break;
|
|
// Don't fire the event while the user is dragging. This matches the
|
|
// semantics of the native select event.
|
|
case 'topMouseDown':
|
|
mouseDown = true;
|
|
break;
|
|
case 'topContextMenu':
|
|
case 'topMouseUp':
|
|
mouseDown = false;
|
|
return constructSelectEvent(nativeEvent, nativeEventTarget);
|
|
// Chrome and IE fire non-standard event when selection is changed (and
|
|
// sometimes when it hasn't). IE's event fires out of order with respect
|
|
// to key and input events on deletion, so we discard it.
|
|
//
|
|
// Firefox doesn't support selectionchange, so check selection status
|
|
// after each key entry. The selection changes after keydown and before
|
|
// keyup, but we check on keydown as well in the case of holding down a
|
|
// key, when multiple keydown events are fired but only one keyup is.
|
|
// This is also our approach for IE handling, for the reason above.
|
|
case 'topSelectionChange':
|
|
if (skipSelectionChangeEvent) {
|
|
break;
|
|
}
|
|
// falls through
|
|
case 'topKeyDown':
|
|
case 'topKeyUp':
|
|
return constructSelectEvent(nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
didPutListener: function didPutListener(inst, registrationName, listener) {
|
|
if (registrationName === 'onSelect') {
|
|
hasListener = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = SelectEventPlugin;
|
|
|
|
/***/ }),
|
|
/* 193 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var EventListener = __webpack_require__(65);
|
|
var EventPropagators = __webpack_require__(28);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var SyntheticAnimationEvent = __webpack_require__(194);
|
|
var SyntheticClipboardEvent = __webpack_require__(195);
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
var SyntheticFocusEvent = __webpack_require__(198);
|
|
var SyntheticKeyboardEvent = __webpack_require__(200);
|
|
var SyntheticMouseEvent = __webpack_require__(35);
|
|
var SyntheticDragEvent = __webpack_require__(197);
|
|
var SyntheticTouchEvent = __webpack_require__(201);
|
|
var SyntheticTransitionEvent = __webpack_require__(202);
|
|
var SyntheticUIEvent = __webpack_require__(30);
|
|
var SyntheticWheelEvent = __webpack_require__(203);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var getEventCharCode = __webpack_require__(54);
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Turns
|
|
* ['abort', ...]
|
|
* into
|
|
* eventTypes = {
|
|
* 'abort': {
|
|
* phasedRegistrationNames: {
|
|
* bubbled: 'onAbort',
|
|
* captured: 'onAbortCapture',
|
|
* },
|
|
* dependencies: ['topAbort'],
|
|
* },
|
|
* ...
|
|
* };
|
|
* topLevelEventsToDispatchConfig = {
|
|
* 'topAbort': { sameConfig }
|
|
* };
|
|
*/
|
|
var eventTypes = {};
|
|
var topLevelEventsToDispatchConfig = {};
|
|
['abort', 'animationEnd', 'animationIteration', 'animationStart', 'blur', 'canPlay', 'canPlayThrough', 'click', 'contextMenu', 'copy', 'cut', 'doubleClick', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'focus', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'progress', 'rateChange', 'reset', 'scroll', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchMove', 'touchStart', 'transitionEnd', 'volumeChange', 'waiting', 'wheel'].forEach(function (event) {
|
|
var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
|
|
var onEvent = 'on' + capitalizedEvent;
|
|
var topEvent = 'top' + capitalizedEvent;
|
|
|
|
var type = {
|
|
phasedRegistrationNames: {
|
|
bubbled: onEvent,
|
|
captured: onEvent + 'Capture'
|
|
},
|
|
dependencies: [topEvent]
|
|
};
|
|
eventTypes[event] = type;
|
|
topLevelEventsToDispatchConfig[topEvent] = type;
|
|
});
|
|
|
|
var onClickListeners = {};
|
|
|
|
function getDictionaryKey(inst) {
|
|
// Prevents V8 performance issue:
|
|
// https://github.com/facebook/react/pull/7232
|
|
return '.' + inst._rootNodeID;
|
|
}
|
|
|
|
function isInteractive(tag) {
|
|
return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
|
|
}
|
|
|
|
var SimpleEventPlugin = {
|
|
eventTypes: eventTypes,
|
|
|
|
extractEvents: function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
|
var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
|
|
if (!dispatchConfig) {
|
|
return null;
|
|
}
|
|
var EventConstructor;
|
|
switch (topLevelType) {
|
|
case 'topAbort':
|
|
case 'topCanPlay':
|
|
case 'topCanPlayThrough':
|
|
case 'topDurationChange':
|
|
case 'topEmptied':
|
|
case 'topEncrypted':
|
|
case 'topEnded':
|
|
case 'topError':
|
|
case 'topInput':
|
|
case 'topInvalid':
|
|
case 'topLoad':
|
|
case 'topLoadedData':
|
|
case 'topLoadedMetadata':
|
|
case 'topLoadStart':
|
|
case 'topPause':
|
|
case 'topPlay':
|
|
case 'topPlaying':
|
|
case 'topProgress':
|
|
case 'topRateChange':
|
|
case 'topReset':
|
|
case 'topSeeked':
|
|
case 'topSeeking':
|
|
case 'topStalled':
|
|
case 'topSubmit':
|
|
case 'topSuspend':
|
|
case 'topTimeUpdate':
|
|
case 'topVolumeChange':
|
|
case 'topWaiting':
|
|
// HTML Events
|
|
// @see http://www.w3.org/TR/html5/index.html#events-0
|
|
EventConstructor = SyntheticEvent;
|
|
break;
|
|
case 'topKeyPress':
|
|
// Firefox creates a keypress event for function keys too. This removes
|
|
// the unwanted keypress events. Enter is however both printable and
|
|
// non-printable. One would expect Tab to be as well (but it isn't).
|
|
if (getEventCharCode(nativeEvent) === 0) {
|
|
return null;
|
|
}
|
|
/* falls through */
|
|
case 'topKeyDown':
|
|
case 'topKeyUp':
|
|
EventConstructor = SyntheticKeyboardEvent;
|
|
break;
|
|
case 'topBlur':
|
|
case 'topFocus':
|
|
EventConstructor = SyntheticFocusEvent;
|
|
break;
|
|
case 'topClick':
|
|
// Firefox creates a click event on right mouse clicks. This removes the
|
|
// unwanted click events.
|
|
if (nativeEvent.button === 2) {
|
|
return null;
|
|
}
|
|
/* falls through */
|
|
case 'topDoubleClick':
|
|
case 'topMouseDown':
|
|
case 'topMouseMove':
|
|
case 'topMouseUp':
|
|
// TODO: Disabled elements should not respond to mouse events
|
|
/* falls through */
|
|
case 'topMouseOut':
|
|
case 'topMouseOver':
|
|
case 'topContextMenu':
|
|
EventConstructor = SyntheticMouseEvent;
|
|
break;
|
|
case 'topDrag':
|
|
case 'topDragEnd':
|
|
case 'topDragEnter':
|
|
case 'topDragExit':
|
|
case 'topDragLeave':
|
|
case 'topDragOver':
|
|
case 'topDragStart':
|
|
case 'topDrop':
|
|
EventConstructor = SyntheticDragEvent;
|
|
break;
|
|
case 'topTouchCancel':
|
|
case 'topTouchEnd':
|
|
case 'topTouchMove':
|
|
case 'topTouchStart':
|
|
EventConstructor = SyntheticTouchEvent;
|
|
break;
|
|
case 'topAnimationEnd':
|
|
case 'topAnimationIteration':
|
|
case 'topAnimationStart':
|
|
EventConstructor = SyntheticAnimationEvent;
|
|
break;
|
|
case 'topTransitionEnd':
|
|
EventConstructor = SyntheticTransitionEvent;
|
|
break;
|
|
case 'topScroll':
|
|
EventConstructor = SyntheticUIEvent;
|
|
break;
|
|
case 'topWheel':
|
|
EventConstructor = SyntheticWheelEvent;
|
|
break;
|
|
case 'topCopy':
|
|
case 'topCut':
|
|
case 'topPaste':
|
|
EventConstructor = SyntheticClipboardEvent;
|
|
break;
|
|
}
|
|
!EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : _prodInvariant('86', topLevelType) : void 0;
|
|
var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
|
|
EventPropagators.accumulateTwoPhaseDispatches(event);
|
|
return event;
|
|
},
|
|
|
|
didPutListener: function didPutListener(inst, registrationName, listener) {
|
|
// Mobile Safari does not fire properly bubble click events on
|
|
// non-interactive elements, which means delegated click listeners do not
|
|
// fire. The workaround for this bug involves attaching an empty click
|
|
// listener on the target node.
|
|
// http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
|
|
if (registrationName === 'onClick' && !isInteractive(inst._tag)) {
|
|
var key = getDictionaryKey(inst);
|
|
var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
|
if (!onClickListeners[key]) {
|
|
onClickListeners[key] = EventListener.listen(node, 'click', emptyFunction);
|
|
}
|
|
}
|
|
},
|
|
|
|
willDeleteListener: function willDeleteListener(inst, registrationName) {
|
|
if (registrationName === 'onClick' && !isInteractive(inst._tag)) {
|
|
var key = getDictionaryKey(inst);
|
|
onClickListeners[key].remove();
|
|
delete onClickListeners[key];
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = SimpleEventPlugin;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 194 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
|
|
*/
|
|
var AnimationEventInterface = {
|
|
animationName: null,
|
|
elapsedTime: null,
|
|
pseudoElement: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticEvent}
|
|
*/
|
|
function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticAnimationEvent, AnimationEventInterface);
|
|
|
|
module.exports = SyntheticAnimationEvent;
|
|
|
|
/***/ }),
|
|
/* 195 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/clipboard-apis/
|
|
*/
|
|
var ClipboardEventInterface = {
|
|
clipboardData: function clipboardData(event) {
|
|
return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);
|
|
|
|
module.exports = SyntheticClipboardEvent;
|
|
|
|
/***/ }),
|
|
/* 196 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
|
|
*/
|
|
var CompositionEventInterface = {
|
|
data: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);
|
|
|
|
module.exports = SyntheticCompositionEvent;
|
|
|
|
/***/ }),
|
|
/* 197 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticMouseEvent = __webpack_require__(35);
|
|
|
|
/**
|
|
* @interface DragEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var DragEventInterface = {
|
|
dataTransfer: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);
|
|
|
|
module.exports = SyntheticDragEvent;
|
|
|
|
/***/ }),
|
|
/* 198 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticUIEvent = __webpack_require__(30);
|
|
|
|
/**
|
|
* @interface FocusEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var FocusEventInterface = {
|
|
relatedTarget: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);
|
|
|
|
module.exports = SyntheticFocusEvent;
|
|
|
|
/***/ }),
|
|
/* 199 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
|
|
* /#events-inputevents
|
|
*/
|
|
var InputEventInterface = {
|
|
data: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);
|
|
|
|
module.exports = SyntheticInputEvent;
|
|
|
|
/***/ }),
|
|
/* 200 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticUIEvent = __webpack_require__(30);
|
|
|
|
var getEventCharCode = __webpack_require__(54);
|
|
var getEventKey = __webpack_require__(209);
|
|
var getEventModifierState = __webpack_require__(55);
|
|
|
|
/**
|
|
* @interface KeyboardEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var KeyboardEventInterface = {
|
|
key: getEventKey,
|
|
location: null,
|
|
ctrlKey: null,
|
|
shiftKey: null,
|
|
altKey: null,
|
|
metaKey: null,
|
|
repeat: null,
|
|
locale: null,
|
|
getModifierState: getEventModifierState,
|
|
// Legacy Interface
|
|
charCode: function charCode(event) {
|
|
// `charCode` is the result of a KeyPress event and represents the value of
|
|
// the actual printable character.
|
|
|
|
// KeyPress is deprecated, but its replacement is not yet final and not
|
|
// implemented in any major browser. Only KeyPress has charCode.
|
|
if (event.type === 'keypress') {
|
|
return getEventCharCode(event);
|
|
}
|
|
return 0;
|
|
},
|
|
keyCode: function keyCode(event) {
|
|
// `keyCode` is the result of a KeyDown/Up event and represents the value of
|
|
// physical keyboard key.
|
|
|
|
// The actual meaning of the value depends on the users' keyboard layout
|
|
// which cannot be detected. Assuming that it is a US keyboard layout
|
|
// provides a surprisingly accurate mapping for US and European users.
|
|
// Due to this, it is left to the user to implement at this time.
|
|
if (event.type === 'keydown' || event.type === 'keyup') {
|
|
return event.keyCode;
|
|
}
|
|
return 0;
|
|
},
|
|
which: function which(event) {
|
|
// `which` is an alias for either `keyCode` or `charCode` depending on the
|
|
// type of the event.
|
|
if (event.type === 'keypress') {
|
|
return getEventCharCode(event);
|
|
}
|
|
if (event.type === 'keydown' || event.type === 'keyup') {
|
|
return event.keyCode;
|
|
}
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);
|
|
|
|
module.exports = SyntheticKeyboardEvent;
|
|
|
|
/***/ }),
|
|
/* 201 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticUIEvent = __webpack_require__(30);
|
|
|
|
var getEventModifierState = __webpack_require__(55);
|
|
|
|
/**
|
|
* @interface TouchEvent
|
|
* @see http://www.w3.org/TR/touch-events/
|
|
*/
|
|
var TouchEventInterface = {
|
|
touches: null,
|
|
targetTouches: null,
|
|
changedTouches: null,
|
|
altKey: null,
|
|
metaKey: null,
|
|
ctrlKey: null,
|
|
shiftKey: null,
|
|
getModifierState: getEventModifierState
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticUIEvent}
|
|
*/
|
|
function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);
|
|
|
|
module.exports = SyntheticTouchEvent;
|
|
|
|
/***/ }),
|
|
/* 202 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticEvent = __webpack_require__(16);
|
|
|
|
/**
|
|
* @interface Event
|
|
* @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
|
|
*/
|
|
var TransitionEventInterface = {
|
|
propertyName: null,
|
|
elapsedTime: null,
|
|
pseudoElement: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticEvent}
|
|
*/
|
|
function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticEvent.augmentClass(SyntheticTransitionEvent, TransitionEventInterface);
|
|
|
|
module.exports = SyntheticTransitionEvent;
|
|
|
|
/***/ }),
|
|
/* 203 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var SyntheticMouseEvent = __webpack_require__(35);
|
|
|
|
/**
|
|
* @interface WheelEvent
|
|
* @see http://www.w3.org/TR/DOM-Level-3-Events/
|
|
*/
|
|
var WheelEventInterface = {
|
|
deltaX: function deltaX(event) {
|
|
return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
|
|
'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
|
|
},
|
|
deltaY: function deltaY(event) {
|
|
return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
|
|
'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
|
|
'wheelDelta' in event ? -event.wheelDelta : 0;
|
|
},
|
|
deltaZ: null,
|
|
|
|
// Browsers without "deltaMode" is reporting in raw wheel delta where one
|
|
// notch on the scroll is always +/- 120, roughly equivalent to pixels.
|
|
// A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
|
|
// ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
|
|
deltaMode: null
|
|
};
|
|
|
|
/**
|
|
* @param {object} dispatchConfig Configuration used to dispatch this event.
|
|
* @param {string} dispatchMarker Marker identifying the event target.
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @extends {SyntheticMouseEvent}
|
|
*/
|
|
function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
|
return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
|
}
|
|
|
|
SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);
|
|
|
|
module.exports = SyntheticWheelEvent;
|
|
|
|
/***/ }),
|
|
/* 204 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var MOD = 65521;
|
|
|
|
// adler32 is not cryptographically strong, and is only used to sanity check that
|
|
// markup generated on the server matches the markup generated on the client.
|
|
// This implementation (a modified version of the SheetJS version) has been optimized
|
|
// for our use case, at the expense of conforming to the adler32 specification
|
|
// for non-ascii inputs.
|
|
function adler32(data) {
|
|
var a = 1;
|
|
var b = 0;
|
|
var i = 0;
|
|
var l = data.length;
|
|
var m = l & ~0x3;
|
|
while (i < m) {
|
|
var n = Math.min(i + 4096, m);
|
|
for (; i < n; i += 4) {
|
|
b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3));
|
|
}
|
|
a %= MOD;
|
|
b %= MOD;
|
|
}
|
|
for (; i < l; i++) {
|
|
b += a += data.charCodeAt(i);
|
|
}
|
|
a %= MOD;
|
|
b %= MOD;
|
|
return a | b << 16;
|
|
}
|
|
|
|
module.exports = adler32;
|
|
|
|
/***/ }),
|
|
/* 205 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactPropTypeLocationNames = __webpack_require__(185);
|
|
var ReactPropTypesSecret = __webpack_require__(84);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ReactComponentTreeHook;
|
|
|
|
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') {
|
|
// Temporary hack.
|
|
// Inline requires don't work well with Jest:
|
|
// https://github.com/facebook/react/issues/7240
|
|
// Remove the inline requires when we don't need them anymore:
|
|
// https://github.com/facebook/react/pull/7178
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
|
|
var loggedTypeFailures = {};
|
|
|
|
/**
|
|
* Assert that the values match with the type specs.
|
|
* Error messages are memorized and will only be shown once.
|
|
*
|
|
* @param {object} typeSpecs Map of name to a ReactPropType
|
|
* @param {object} values Runtime values that need to be type-checked
|
|
* @param {string} location e.g. "prop", "context", "child context"
|
|
* @param {string} componentName Name of the component for error messages.
|
|
* @param {?object} element The React element that is being type-checked
|
|
* @param {?number} debugID The React component instance that is being type-checked
|
|
* @private
|
|
*/
|
|
function checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) {
|
|
for (var typeSpecName in typeSpecs) {
|
|
if (typeSpecs.hasOwnProperty(typeSpecName)) {
|
|
var error;
|
|
// Prop type validation may throw. In case they do, we don't want to
|
|
// fail the render phase where it didn't fail before. So we log it.
|
|
// After these have been cleaned up, we'll let them throw.
|
|
try {
|
|
// This is intentionally an invariant that gets caught. It's the same
|
|
// behavior as without this statement except with a better message.
|
|
!(typeof typeSpecs[typeSpecName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0;
|
|
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
|
|
} catch (ex) {
|
|
error = ex;
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error === 'undefined' ? 'undefined' : _typeof(error)) : void 0;
|
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
|
// Only monitor this failure once because there tends to be a lot of the
|
|
// same error.
|
|
loggedTypeFailures[error.message] = true;
|
|
|
|
var componentStackInfo = '';
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!ReactComponentTreeHook) {
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
if (debugID !== null) {
|
|
componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID);
|
|
} else if (element !== null) {
|
|
componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element);
|
|
}
|
|
}
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = checkReactTypeSpec;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 206 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var CSSProperty = __webpack_require__(73);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var isUnitlessNumber = CSSProperty.isUnitlessNumber;
|
|
var styleWarnings = {};
|
|
|
|
/**
|
|
* Convert a value into the proper css writable value. The style name `name`
|
|
* should be logical (no hyphens), as specified
|
|
* in `CSSProperty.isUnitlessNumber`.
|
|
*
|
|
* @param {string} name CSS property name such as `topMargin`.
|
|
* @param {*} value CSS property value such as `10px`.
|
|
* @param {ReactDOMComponent} component
|
|
* @return {string} Normalized style value with dimensions applied.
|
|
*/
|
|
function dangerousStyleValue(name, value, component, isCustomProperty) {
|
|
// Note that we've removed escapeTextForBrowser() calls here since the
|
|
// whole string will be escaped when the attribute is injected into
|
|
// the markup. If you provide unsafe user data here they can inject
|
|
// arbitrary CSS which may be problematic (I couldn't repro this):
|
|
// https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
|
|
// http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
|
|
// This is not an XSS hole but instead a potential CSS injection issue
|
|
// which has lead to a greater discussion about how we're going to
|
|
// trust URLs moving forward. See #2115901
|
|
|
|
var isEmpty = value == null || typeof value === 'boolean' || value === '';
|
|
if (isEmpty) {
|
|
return '';
|
|
}
|
|
|
|
var isNonNumeric = isNaN(value);
|
|
if (isCustomProperty || isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {
|
|
return '' + value; // cast to string
|
|
}
|
|
|
|
if (typeof value === 'string') {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// Allow '0' to pass through without warning. 0 is already special and
|
|
// doesn't require units, so we don't need to warn about it.
|
|
if (component && value !== '0') {
|
|
var owner = component._currentElement._owner;
|
|
var ownerName = owner ? owner.getName() : null;
|
|
if (ownerName && !styleWarnings[ownerName]) {
|
|
styleWarnings[ownerName] = {};
|
|
}
|
|
var warned = false;
|
|
if (ownerName) {
|
|
var warnings = styleWarnings[ownerName];
|
|
warned = warnings[name];
|
|
if (!warned) {
|
|
warnings[name] = true;
|
|
}
|
|
}
|
|
if (!warned) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'a `%s` tag (owner: `%s`) was passed a numeric string value ' + 'for CSS property `%s` (value: `%s`) which will be treated ' + 'as a unitless number in a future version of React.', component._currentElement.type, ownerName || 'unknown', name, value) : void 0;
|
|
}
|
|
}
|
|
}
|
|
value = value.trim();
|
|
}
|
|
return value + 'px';
|
|
}
|
|
|
|
module.exports = dangerousStyleValue;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 207 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(3);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var ReactDOMComponentTree = __webpack_require__(6);
|
|
var ReactInstanceMap = __webpack_require__(29);
|
|
|
|
var getHostComponentFromComposite = __webpack_require__(88);
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
/**
|
|
* Returns the DOM node rendered by this element.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
|
|
*
|
|
* @param {ReactComponent|DOMElement} componentOrElement
|
|
* @return {?DOMElement} The root node of this element.
|
|
*/
|
|
function findDOMNode(componentOrElement) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var owner = ReactCurrentOwner.current;
|
|
if (owner !== null) {
|
|
process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : void 0;
|
|
owner._warnedAboutRefsInRender = true;
|
|
}
|
|
}
|
|
if (componentOrElement == null) {
|
|
return null;
|
|
}
|
|
if (componentOrElement.nodeType === 1) {
|
|
return componentOrElement;
|
|
}
|
|
|
|
var inst = ReactInstanceMap.get(componentOrElement);
|
|
if (inst) {
|
|
inst = getHostComponentFromComposite(inst);
|
|
return inst ? ReactDOMComponentTree.getNodeFromInstance(inst) : null;
|
|
}
|
|
|
|
if (typeof componentOrElement.render === 'function') {
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : _prodInvariant('44') : void 0;
|
|
} else {
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : _prodInvariant('45', Object.keys(componentOrElement)) : void 0;
|
|
}
|
|
}
|
|
|
|
module.exports = findDOMNode;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 208 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var KeyEscapeUtils = __webpack_require__(48);
|
|
var traverseAllChildren = __webpack_require__(94);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ReactComponentTreeHook;
|
|
|
|
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') {
|
|
// Temporary hack.
|
|
// Inline requires don't work well with Jest:
|
|
// https://github.com/facebook/react/issues/7240
|
|
// Remove the inline requires when we don't need them anymore:
|
|
// https://github.com/facebook/react/pull/7178
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
|
|
/**
|
|
* @param {function} traverseContext Context passed through traversal.
|
|
* @param {?ReactComponent} child React child component.
|
|
* @param {!string} name String name of key path to child.
|
|
* @param {number=} selfDebugID Optional debugID of the current internal instance.
|
|
*/
|
|
function flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) {
|
|
// We found a component instance.
|
|
if (traverseContext && (typeof traverseContext === 'undefined' ? 'undefined' : _typeof(traverseContext)) === 'object') {
|
|
var result = traverseContext;
|
|
var keyUnique = result[name] === undefined;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!ReactComponentTreeHook) {
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
if (!keyUnique) {
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0;
|
|
}
|
|
}
|
|
if (keyUnique && child != null) {
|
|
result[name] = child;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Flattens children that are typically specified as `props.children`. Any null
|
|
* children will not be included in the resulting object.
|
|
* @return {!object} flattened children keyed by name.
|
|
*/
|
|
function flattenChildren(children, selfDebugID) {
|
|
if (children == null) {
|
|
return children;
|
|
}
|
|
var result = {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
traverseAllChildren(children, function (traverseContext, child, name) {
|
|
return flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID);
|
|
}, result);
|
|
} else {
|
|
traverseAllChildren(children, flattenSingleChildIntoContext, result);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
module.exports = flattenChildren;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 209 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var getEventCharCode = __webpack_require__(54);
|
|
|
|
/**
|
|
* Normalization of deprecated HTML5 `key` values
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
|
*/
|
|
var normalizeKey = {
|
|
Esc: 'Escape',
|
|
Spacebar: ' ',
|
|
Left: 'ArrowLeft',
|
|
Up: 'ArrowUp',
|
|
Right: 'ArrowRight',
|
|
Down: 'ArrowDown',
|
|
Del: 'Delete',
|
|
Win: 'OS',
|
|
Menu: 'ContextMenu',
|
|
Apps: 'ContextMenu',
|
|
Scroll: 'ScrollLock',
|
|
MozPrintableKey: 'Unidentified'
|
|
};
|
|
|
|
/**
|
|
* Translation from legacy `keyCode` to HTML5 `key`
|
|
* Only special keys supported, all others depend on keyboard layout or browser
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
|
*/
|
|
var translateToKey = {
|
|
8: 'Backspace',
|
|
9: 'Tab',
|
|
12: 'Clear',
|
|
13: 'Enter',
|
|
16: 'Shift',
|
|
17: 'Control',
|
|
18: 'Alt',
|
|
19: 'Pause',
|
|
20: 'CapsLock',
|
|
27: 'Escape',
|
|
32: ' ',
|
|
33: 'PageUp',
|
|
34: 'PageDown',
|
|
35: 'End',
|
|
36: 'Home',
|
|
37: 'ArrowLeft',
|
|
38: 'ArrowUp',
|
|
39: 'ArrowRight',
|
|
40: 'ArrowDown',
|
|
45: 'Insert',
|
|
46: 'Delete',
|
|
112: 'F1',
|
|
113: 'F2',
|
|
114: 'F3',
|
|
115: 'F4',
|
|
116: 'F5',
|
|
117: 'F6',
|
|
118: 'F7',
|
|
119: 'F8',
|
|
120: 'F9',
|
|
121: 'F10',
|
|
122: 'F11',
|
|
123: 'F12',
|
|
144: 'NumLock',
|
|
145: 'ScrollLock',
|
|
224: 'Meta'
|
|
};
|
|
|
|
/**
|
|
* @param {object} nativeEvent Native browser event.
|
|
* @return {string} Normalized `key` property.
|
|
*/
|
|
function getEventKey(nativeEvent) {
|
|
if (nativeEvent.key) {
|
|
// Normalize inconsistent values reported by browsers due to
|
|
// implementations of a working draft specification.
|
|
|
|
// FireFox implements `key` but returns `MozPrintableKey` for all
|
|
// printable characters (normalized to `Unidentified`), ignore it.
|
|
var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
|
|
if (key !== 'Unidentified') {
|
|
return key;
|
|
}
|
|
}
|
|
|
|
// Browser does not implement `key`, polyfill as much of it as we can.
|
|
if (nativeEvent.type === 'keypress') {
|
|
var charCode = getEventCharCode(nativeEvent);
|
|
|
|
// The enter-key is technically both printable and non-printable and can
|
|
// thus be captured by `keypress`, no other non-printable key should.
|
|
return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
|
|
}
|
|
if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
|
|
// While user keyboard layout determines the actual meaning of each
|
|
// `keyCode` value, almost all function keys have a universal value.
|
|
return translateToKey[nativeEvent.keyCode] || 'Unidentified';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
module.exports = getEventKey;
|
|
|
|
/***/ }),
|
|
/* 210 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/* global Symbol */
|
|
|
|
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
|
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
|
|
|
/**
|
|
* Returns the iterator method function contained on the iterable object.
|
|
*
|
|
* Be sure to invoke the function with the iterable as context:
|
|
*
|
|
* var iteratorFn = getIteratorFn(myIterable);
|
|
* if (iteratorFn) {
|
|
* var iterator = iteratorFn.call(myIterable);
|
|
* ...
|
|
* }
|
|
*
|
|
* @param {?object} maybeIterable
|
|
* @return {?function}
|
|
*/
|
|
function getIteratorFn(maybeIterable) {
|
|
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
|
if (typeof iteratorFn === 'function') {
|
|
return iteratorFn;
|
|
}
|
|
}
|
|
|
|
module.exports = getIteratorFn;
|
|
|
|
/***/ }),
|
|
/* 211 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Given any node return the first leaf node without children.
|
|
*
|
|
* @param {DOMElement|DOMTextNode} node
|
|
* @return {DOMElement|DOMTextNode}
|
|
*/
|
|
|
|
function getLeafNode(node) {
|
|
while (node && node.firstChild) {
|
|
node = node.firstChild;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
/**
|
|
* Get the next sibling within a container. This will walk up the
|
|
* DOM if a node's siblings have been exhausted.
|
|
*
|
|
* @param {DOMElement|DOMTextNode} node
|
|
* @return {?DOMElement|DOMTextNode}
|
|
*/
|
|
function getSiblingNode(node) {
|
|
while (node) {
|
|
if (node.nextSibling) {
|
|
return node.nextSibling;
|
|
}
|
|
node = node.parentNode;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get object describing the nodes which contain characters at offset.
|
|
*
|
|
* @param {DOMElement|DOMTextNode} root
|
|
* @param {number} offset
|
|
* @return {?object}
|
|
*/
|
|
function getNodeForCharacterOffset(root, offset) {
|
|
var node = getLeafNode(root);
|
|
var nodeStart = 0;
|
|
var nodeEnd = 0;
|
|
|
|
while (node) {
|
|
if (node.nodeType === 3) {
|
|
nodeEnd = nodeStart + node.textContent.length;
|
|
|
|
if (nodeStart <= offset && nodeEnd >= offset) {
|
|
return {
|
|
node: node,
|
|
offset: offset - nodeStart
|
|
};
|
|
}
|
|
|
|
nodeStart = nodeEnd;
|
|
}
|
|
|
|
node = getLeafNode(getSiblingNode(node));
|
|
}
|
|
}
|
|
|
|
module.exports = getNodeForCharacterOffset;
|
|
|
|
/***/ }),
|
|
/* 212 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ExecutionEnvironment = __webpack_require__(7);
|
|
|
|
/**
|
|
* Generate a mapping of standard vendor prefixes using the defined style property and event name.
|
|
*
|
|
* @param {string} styleProp
|
|
* @param {string} eventName
|
|
* @returns {object}
|
|
*/
|
|
function makePrefixMap(styleProp, eventName) {
|
|
var prefixes = {};
|
|
|
|
prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
|
|
prefixes['Webkit' + styleProp] = 'webkit' + eventName;
|
|
prefixes['Moz' + styleProp] = 'moz' + eventName;
|
|
prefixes['ms' + styleProp] = 'MS' + eventName;
|
|
prefixes['O' + styleProp] = 'o' + eventName.toLowerCase();
|
|
|
|
return prefixes;
|
|
}
|
|
|
|
/**
|
|
* A list of event names to a configurable list of vendor prefixes.
|
|
*/
|
|
var vendorPrefixes = {
|
|
animationend: makePrefixMap('Animation', 'AnimationEnd'),
|
|
animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
|
|
animationstart: makePrefixMap('Animation', 'AnimationStart'),
|
|
transitionend: makePrefixMap('Transition', 'TransitionEnd')
|
|
};
|
|
|
|
/**
|
|
* Event names that have already been detected and prefixed (if applicable).
|
|
*/
|
|
var prefixedEventNames = {};
|
|
|
|
/**
|
|
* Element to check for prefixes on.
|
|
*/
|
|
var style = {};
|
|
|
|
/**
|
|
* Bootstrap if a DOM exists.
|
|
*/
|
|
if (ExecutionEnvironment.canUseDOM) {
|
|
style = document.createElement('div').style;
|
|
|
|
// On some platforms, in particular some releases of Android 4.x,
|
|
// the un-prefixed "animation" and "transition" properties are defined on the
|
|
// style object but the events that fire will still be prefixed, so we need
|
|
// to check if the un-prefixed events are usable, and if not remove them from the map.
|
|
if (!('AnimationEvent' in window)) {
|
|
delete vendorPrefixes.animationend.animation;
|
|
delete vendorPrefixes.animationiteration.animation;
|
|
delete vendorPrefixes.animationstart.animation;
|
|
}
|
|
|
|
// Same as above
|
|
if (!('TransitionEvent' in window)) {
|
|
delete vendorPrefixes.transitionend.transition;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Attempts to determine the correct vendor prefixed event name.
|
|
*
|
|
* @param {string} eventName
|
|
* @returns {string}
|
|
*/
|
|
function getVendorPrefixedEventName(eventName) {
|
|
if (prefixedEventNames[eventName]) {
|
|
return prefixedEventNames[eventName];
|
|
} else if (!vendorPrefixes[eventName]) {
|
|
return eventName;
|
|
}
|
|
|
|
var prefixMap = vendorPrefixes[eventName];
|
|
|
|
for (var styleProp in prefixMap) {
|
|
if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
|
|
return prefixedEventNames[eventName] = prefixMap[styleProp];
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
module.exports = getVendorPrefixedEventName;
|
|
|
|
/***/ }),
|
|
/* 213 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var escapeTextContentForBrowser = __webpack_require__(37);
|
|
|
|
/**
|
|
* Escapes attribute value to prevent scripting attacks.
|
|
*
|
|
* @param {*} value Value to escape.
|
|
* @return {string} An escaped string.
|
|
*/
|
|
function quoteAttributeValueForBrowser(value) {
|
|
return '"' + escapeTextContentForBrowser(value) + '"';
|
|
}
|
|
|
|
module.exports = quoteAttributeValueForBrowser;
|
|
|
|
/***/ }),
|
|
/* 214 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactMount = __webpack_require__(82);
|
|
|
|
module.exports = ReactMount.renderSubtreeIntoContainer;
|
|
|
|
/***/ }),
|
|
/* 215 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var React = __webpack_require__(4);
|
|
|
|
var FileInput = React.createClass({
|
|
displayName: 'FileInput',
|
|
|
|
getInitialState: function getInitialState() {
|
|
return {
|
|
value: '',
|
|
styles: {
|
|
parent: {
|
|
position: 'relative'
|
|
},
|
|
file: {
|
|
position: 'absolute',
|
|
top: 0,
|
|
left: 0,
|
|
opacity: 0,
|
|
width: '100%',
|
|
zIndex: 1
|
|
},
|
|
text: {
|
|
position: 'relative',
|
|
zIndex: -1
|
|
}
|
|
}
|
|
};
|
|
},
|
|
|
|
handleChange: function handleChange(e) {
|
|
this.setState({
|
|
value: e.target.value.split(/(\\|\/)/g).pop()
|
|
});
|
|
if (this.props.onChange) this.props.onChange(e);
|
|
},
|
|
|
|
render: function render() {
|
|
return React.DOM.div({
|
|
style: this.state.styles.parent
|
|
},
|
|
|
|
// Actual file input
|
|
React.DOM.input({
|
|
type: 'file',
|
|
name: this.props.name,
|
|
className: this.props.className,
|
|
onChange: this.handleChange,
|
|
disabled: this.props.disabled,
|
|
accept: this.props.accept,
|
|
style: this.state.styles.file
|
|
}),
|
|
|
|
// Emulated file input
|
|
React.DOM.input({
|
|
type: 'text',
|
|
tabIndex: -1,
|
|
name: this.props.name + '_filename',
|
|
value: this.state.value,
|
|
className: this.props.className,
|
|
onChange: function onChange() {},
|
|
placeholder: this.props.placeholder,
|
|
disabled: this.props.disabled,
|
|
style: this.state.styles.text
|
|
}));
|
|
}
|
|
});
|
|
|
|
module.exports = FileInput;
|
|
|
|
/***/ }),
|
|
/* 216 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.createProvider = createProvider;
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _PropTypes = __webpack_require__(97);
|
|
|
|
var _warning = __webpack_require__(60);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
var didWarnAboutReceivingStore = false;
|
|
function warnAboutReceivingStore() {
|
|
if (didWarnAboutReceivingStore) {
|
|
return;
|
|
}
|
|
didWarnAboutReceivingStore = true;
|
|
|
|
(0, _warning2.default)('<Provider> does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reactjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.');
|
|
}
|
|
|
|
function createProvider() {
|
|
var _Provider$childContex;
|
|
|
|
var storeKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'store';
|
|
var subKey = arguments[1];
|
|
|
|
var subscriptionKey = subKey || storeKey + 'Subscription';
|
|
|
|
var Provider = function (_Component) {
|
|
_inherits(Provider, _Component);
|
|
|
|
Provider.prototype.getChildContext = function getChildContext() {
|
|
var _ref;
|
|
|
|
return _ref = {}, _ref[storeKey] = this[storeKey], _ref[subscriptionKey] = null, _ref;
|
|
};
|
|
|
|
function Provider(props, context) {
|
|
_classCallCheck(this, Provider);
|
|
|
|
var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
|
|
|
|
_this[storeKey] = props.store;
|
|
return _this;
|
|
}
|
|
|
|
Provider.prototype.render = function render() {
|
|
return _react.Children.only(this.props.children);
|
|
};
|
|
|
|
return Provider;
|
|
}(_react.Component);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Provider.prototype.componentWillReceiveProps = function (nextProps) {
|
|
if (this[storeKey] !== nextProps.store) {
|
|
warnAboutReceivingStore();
|
|
}
|
|
};
|
|
}
|
|
|
|
Provider.propTypes = {
|
|
store: _PropTypes.storeShape.isRequired,
|
|
children: _propTypes2.default.element.isRequired
|
|
};
|
|
Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[storeKey] = _PropTypes.storeShape.isRequired, _Provider$childContex[subscriptionKey] = _PropTypes.subscriptionShape, _Provider$childContex);
|
|
Provider.displayName = 'Provider';
|
|
|
|
return Provider;
|
|
}
|
|
|
|
exports.default = createProvider();
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 217 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.createConnect = createConnect;
|
|
|
|
var _connectAdvanced = __webpack_require__(95);
|
|
|
|
var _connectAdvanced2 = _interopRequireDefault(_connectAdvanced);
|
|
|
|
var _shallowEqual = __webpack_require__(224);
|
|
|
|
var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
|
|
|
|
var _mapDispatchToProps = __webpack_require__(218);
|
|
|
|
var _mapDispatchToProps2 = _interopRequireDefault(_mapDispatchToProps);
|
|
|
|
var _mapStateToProps = __webpack_require__(219);
|
|
|
|
var _mapStateToProps2 = _interopRequireDefault(_mapStateToProps);
|
|
|
|
var _mergeProps = __webpack_require__(220);
|
|
|
|
var _mergeProps2 = _interopRequireDefault(_mergeProps);
|
|
|
|
var _selectorFactory = __webpack_require__(221);
|
|
|
|
var _selectorFactory2 = _interopRequireDefault(_selectorFactory);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
/*
|
|
connect is a facade over connectAdvanced. It turns its args into a compatible
|
|
selectorFactory, which has the signature:
|
|
|
|
(dispatch, options) => (nextState, nextOwnProps) => nextFinalProps
|
|
|
|
connect passes its args to connectAdvanced as options, which will in turn pass them to
|
|
selectorFactory each time a Connect component instance is instantiated or hot reloaded.
|
|
|
|
selectorFactory returns a final props selector from its mapStateToProps,
|
|
mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,
|
|
mergePropsFactories, and pure args.
|
|
|
|
The resulting final props selector is called by the Connect component instance whenever
|
|
it receives new props or store state.
|
|
*/
|
|
|
|
function match(arg, factories, name) {
|
|
for (var i = factories.length - 1; i >= 0; i--) {
|
|
var result = factories[i](arg);
|
|
if (result) return result;
|
|
}
|
|
|
|
return function (dispatch, options) {
|
|
throw new Error('Invalid value of type ' + (typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) + ' for ' + name + ' argument when connecting component ' + options.wrappedComponentName + '.');
|
|
};
|
|
}
|
|
|
|
function strictEqual(a, b) {
|
|
return a === b;
|
|
}
|
|
|
|
// createConnect with default args builds the 'official' connect behavior. Calling it with
|
|
// different options opens up some testing and extensibility scenarios
|
|
function createConnect() {
|
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
_ref$connectHOC = _ref.connectHOC,
|
|
connectHOC = _ref$connectHOC === undefined ? _connectAdvanced2.default : _ref$connectHOC,
|
|
_ref$mapStateToPropsF = _ref.mapStateToPropsFactories,
|
|
mapStateToPropsFactories = _ref$mapStateToPropsF === undefined ? _mapStateToProps2.default : _ref$mapStateToPropsF,
|
|
_ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,
|
|
mapDispatchToPropsFactories = _ref$mapDispatchToPro === undefined ? _mapDispatchToProps2.default : _ref$mapDispatchToPro,
|
|
_ref$mergePropsFactor = _ref.mergePropsFactories,
|
|
mergePropsFactories = _ref$mergePropsFactor === undefined ? _mergeProps2.default : _ref$mergePropsFactor,
|
|
_ref$selectorFactory = _ref.selectorFactory,
|
|
selectorFactory = _ref$selectorFactory === undefined ? _selectorFactory2.default : _ref$selectorFactory;
|
|
|
|
return function connect(mapStateToProps, mapDispatchToProps, mergeProps) {
|
|
var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
|
|
_ref2$pure = _ref2.pure,
|
|
pure = _ref2$pure === undefined ? true : _ref2$pure,
|
|
_ref2$areStatesEqual = _ref2.areStatesEqual,
|
|
areStatesEqual = _ref2$areStatesEqual === undefined ? strictEqual : _ref2$areStatesEqual,
|
|
_ref2$areOwnPropsEqua = _ref2.areOwnPropsEqual,
|
|
areOwnPropsEqual = _ref2$areOwnPropsEqua === undefined ? _shallowEqual2.default : _ref2$areOwnPropsEqua,
|
|
_ref2$areStatePropsEq = _ref2.areStatePropsEqual,
|
|
areStatePropsEqual = _ref2$areStatePropsEq === undefined ? _shallowEqual2.default : _ref2$areStatePropsEq,
|
|
_ref2$areMergedPropsE = _ref2.areMergedPropsEqual,
|
|
areMergedPropsEqual = _ref2$areMergedPropsE === undefined ? _shallowEqual2.default : _ref2$areMergedPropsE,
|
|
extraOptions = _objectWithoutProperties(_ref2, ['pure', 'areStatesEqual', 'areOwnPropsEqual', 'areStatePropsEqual', 'areMergedPropsEqual']);
|
|
|
|
var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');
|
|
var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');
|
|
var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');
|
|
|
|
return connectHOC(selectorFactory, _extends({
|
|
// used in error messages
|
|
methodName: 'connect',
|
|
|
|
// used to compute Connect's displayName from the wrapped component's displayName.
|
|
getDisplayName: function getDisplayName(name) {
|
|
return 'Connect(' + name + ')';
|
|
},
|
|
|
|
// if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes
|
|
shouldHandleStateChanges: Boolean(mapStateToProps),
|
|
|
|
// passed through to selectorFactory
|
|
initMapStateToProps: initMapStateToProps,
|
|
initMapDispatchToProps: initMapDispatchToProps,
|
|
initMergeProps: initMergeProps,
|
|
pure: pure,
|
|
areStatesEqual: areStatesEqual,
|
|
areOwnPropsEqual: areOwnPropsEqual,
|
|
areStatePropsEqual: areStatePropsEqual,
|
|
areMergedPropsEqual: areMergedPropsEqual
|
|
|
|
}, extraOptions));
|
|
};
|
|
}
|
|
|
|
exports.default = createConnect();
|
|
|
|
/***/ }),
|
|
/* 218 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.whenMapDispatchToPropsIsFunction = whenMapDispatchToPropsIsFunction;
|
|
exports.whenMapDispatchToPropsIsMissing = whenMapDispatchToPropsIsMissing;
|
|
exports.whenMapDispatchToPropsIsObject = whenMapDispatchToPropsIsObject;
|
|
|
|
var _redux = __webpack_require__(64);
|
|
|
|
var _wrapMapToProps = __webpack_require__(96);
|
|
|
|
function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {
|
|
return typeof mapDispatchToProps === 'function' ? (0, _wrapMapToProps.wrapMapToPropsFunc)(mapDispatchToProps, 'mapDispatchToProps') : undefined;
|
|
}
|
|
|
|
function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {
|
|
return !mapDispatchToProps ? (0, _wrapMapToProps.wrapMapToPropsConstant)(function (dispatch) {
|
|
return { dispatch: dispatch };
|
|
}) : undefined;
|
|
}
|
|
|
|
function whenMapDispatchToPropsIsObject(mapDispatchToProps) {
|
|
return mapDispatchToProps && (typeof mapDispatchToProps === 'undefined' ? 'undefined' : _typeof(mapDispatchToProps)) === 'object' ? (0, _wrapMapToProps.wrapMapToPropsConstant)(function (dispatch) {
|
|
return (0, _redux.bindActionCreators)(mapDispatchToProps, dispatch);
|
|
}) : undefined;
|
|
}
|
|
|
|
exports.default = [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject];
|
|
|
|
/***/ }),
|
|
/* 219 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.whenMapStateToPropsIsFunction = whenMapStateToPropsIsFunction;
|
|
exports.whenMapStateToPropsIsMissing = whenMapStateToPropsIsMissing;
|
|
|
|
var _wrapMapToProps = __webpack_require__(96);
|
|
|
|
function whenMapStateToPropsIsFunction(mapStateToProps) {
|
|
return typeof mapStateToProps === 'function' ? (0, _wrapMapToProps.wrapMapToPropsFunc)(mapStateToProps, 'mapStateToProps') : undefined;
|
|
}
|
|
|
|
function whenMapStateToPropsIsMissing(mapStateToProps) {
|
|
return !mapStateToProps ? (0, _wrapMapToProps.wrapMapToPropsConstant)(function () {
|
|
return {};
|
|
}) : undefined;
|
|
}
|
|
|
|
exports.default = [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing];
|
|
|
|
/***/ }),
|
|
/* 220 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.defaultMergeProps = defaultMergeProps;
|
|
exports.wrapMergePropsFunc = wrapMergePropsFunc;
|
|
exports.whenMergePropsIsFunction = whenMergePropsIsFunction;
|
|
exports.whenMergePropsIsOmitted = whenMergePropsIsOmitted;
|
|
|
|
var _verifyPlainObject = __webpack_require__(98);
|
|
|
|
var _verifyPlainObject2 = _interopRequireDefault(_verifyPlainObject);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function defaultMergeProps(stateProps, dispatchProps, ownProps) {
|
|
return _extends({}, ownProps, stateProps, dispatchProps);
|
|
}
|
|
|
|
function wrapMergePropsFunc(mergeProps) {
|
|
return function initMergePropsProxy(dispatch, _ref) {
|
|
var displayName = _ref.displayName,
|
|
pure = _ref.pure,
|
|
areMergedPropsEqual = _ref.areMergedPropsEqual;
|
|
|
|
var hasRunOnce = false;
|
|
var mergedProps = void 0;
|
|
|
|
return function mergePropsProxy(stateProps, dispatchProps, ownProps) {
|
|
var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
|
|
|
if (hasRunOnce) {
|
|
if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;
|
|
} else {
|
|
hasRunOnce = true;
|
|
mergedProps = nextMergedProps;
|
|
|
|
if (process.env.NODE_ENV !== 'production') (0, _verifyPlainObject2.default)(mergedProps, displayName, 'mergeProps');
|
|
}
|
|
|
|
return mergedProps;
|
|
};
|
|
};
|
|
}
|
|
|
|
function whenMergePropsIsFunction(mergeProps) {
|
|
return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;
|
|
}
|
|
|
|
function whenMergePropsIsOmitted(mergeProps) {
|
|
return !mergeProps ? function () {
|
|
return defaultMergeProps;
|
|
} : undefined;
|
|
}
|
|
|
|
exports.default = [whenMergePropsIsFunction, whenMergePropsIsOmitted];
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 221 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.impureFinalPropsSelectorFactory = impureFinalPropsSelectorFactory;
|
|
exports.pureFinalPropsSelectorFactory = pureFinalPropsSelectorFactory;
|
|
exports.default = finalPropsSelectorFactory;
|
|
|
|
var _verifySubselectors = __webpack_require__(222);
|
|
|
|
var _verifySubselectors2 = _interopRequireDefault(_verifySubselectors);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {
|
|
return function impureFinalPropsSelector(state, ownProps) {
|
|
return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);
|
|
};
|
|
}
|
|
|
|
function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {
|
|
var areStatesEqual = _ref.areStatesEqual,
|
|
areOwnPropsEqual = _ref.areOwnPropsEqual,
|
|
areStatePropsEqual = _ref.areStatePropsEqual;
|
|
|
|
var hasRunAtLeastOnce = false;
|
|
var state = void 0;
|
|
var ownProps = void 0;
|
|
var stateProps = void 0;
|
|
var dispatchProps = void 0;
|
|
var mergedProps = void 0;
|
|
|
|
function handleFirstCall(firstState, firstOwnProps) {
|
|
state = firstState;
|
|
ownProps = firstOwnProps;
|
|
stateProps = mapStateToProps(state, ownProps);
|
|
dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
|
hasRunAtLeastOnce = true;
|
|
return mergedProps;
|
|
}
|
|
|
|
function handleNewPropsAndNewState() {
|
|
stateProps = mapStateToProps(state, ownProps);
|
|
|
|
if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
|
|
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
|
return mergedProps;
|
|
}
|
|
|
|
function handleNewProps() {
|
|
if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);
|
|
|
|
if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
|
|
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
|
return mergedProps;
|
|
}
|
|
|
|
function handleNewState() {
|
|
var nextStateProps = mapStateToProps(state, ownProps);
|
|
var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);
|
|
stateProps = nextStateProps;
|
|
|
|
if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
|
|
|
return mergedProps;
|
|
}
|
|
|
|
function handleSubsequentCalls(nextState, nextOwnProps) {
|
|
var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);
|
|
var stateChanged = !areStatesEqual(nextState, state);
|
|
state = nextState;
|
|
ownProps = nextOwnProps;
|
|
|
|
if (propsChanged && stateChanged) return handleNewPropsAndNewState();
|
|
if (propsChanged) return handleNewProps();
|
|
if (stateChanged) return handleNewState();
|
|
return mergedProps;
|
|
}
|
|
|
|
return function pureFinalPropsSelector(nextState, nextOwnProps) {
|
|
return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);
|
|
};
|
|
}
|
|
|
|
// TODO: Add more comments
|
|
|
|
// If pure is true, the selector returned by selectorFactory will memoize its results,
|
|
// allowing connectAdvanced's shouldComponentUpdate to return false if final
|
|
// props have not changed. If false, the selector will always return a new
|
|
// object and shouldComponentUpdate will always return true.
|
|
|
|
function finalPropsSelectorFactory(dispatch, _ref2) {
|
|
var initMapStateToProps = _ref2.initMapStateToProps,
|
|
initMapDispatchToProps = _ref2.initMapDispatchToProps,
|
|
initMergeProps = _ref2.initMergeProps,
|
|
options = _objectWithoutProperties(_ref2, ['initMapStateToProps', 'initMapDispatchToProps', 'initMergeProps']);
|
|
|
|
var mapStateToProps = initMapStateToProps(dispatch, options);
|
|
var mapDispatchToProps = initMapDispatchToProps(dispatch, options);
|
|
var mergeProps = initMergeProps(dispatch, options);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
(0, _verifySubselectors2.default)(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);
|
|
}
|
|
|
|
var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;
|
|
|
|
return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 222 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = verifySubselectors;
|
|
|
|
var _warning = __webpack_require__(60);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function verify(selector, methodName, displayName) {
|
|
if (!selector) {
|
|
throw new Error('Unexpected value for ' + methodName + ' in ' + displayName + '.');
|
|
} else if (methodName === 'mapStateToProps' || methodName === 'mapDispatchToProps') {
|
|
if (!selector.hasOwnProperty('dependsOnOwnProps')) {
|
|
(0, _warning2.default)('The selector for ' + methodName + ' of ' + displayName + ' did not specify a value for dependsOnOwnProps.');
|
|
}
|
|
}
|
|
}
|
|
|
|
function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, displayName) {
|
|
verify(mapStateToProps, 'mapStateToProps', displayName);
|
|
verify(mapDispatchToProps, 'mapDispatchToProps', displayName);
|
|
verify(mergeProps, 'mergeProps', displayName);
|
|
}
|
|
|
|
/***/ }),
|
|
/* 223 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
// encapsulates the subscription logic for connecting a component to the redux store, as
|
|
// well as nesting subscriptions of descendant components, so that we can ensure the
|
|
// ancestor components re-render before descendants
|
|
|
|
var CLEARED = null;
|
|
var nullListeners = {
|
|
notify: function notify() {}
|
|
};
|
|
|
|
function createListenerCollection() {
|
|
// the current/next pattern is copied from redux's createStore code.
|
|
// TODO: refactor+expose that code to be reusable here?
|
|
var current = [];
|
|
var next = [];
|
|
|
|
return {
|
|
clear: function clear() {
|
|
next = CLEARED;
|
|
current = CLEARED;
|
|
},
|
|
notify: function notify() {
|
|
var listeners = current = next;
|
|
for (var i = 0; i < listeners.length; i++) {
|
|
listeners[i]();
|
|
}
|
|
},
|
|
subscribe: function subscribe(listener) {
|
|
var isSubscribed = true;
|
|
if (next === current) next = current.slice();
|
|
next.push(listener);
|
|
|
|
return function unsubscribe() {
|
|
if (!isSubscribed || current === CLEARED) return;
|
|
isSubscribed = false;
|
|
|
|
if (next === current) next = current.slice();
|
|
next.splice(next.indexOf(listener), 1);
|
|
};
|
|
}
|
|
};
|
|
}
|
|
|
|
var Subscription = function () {
|
|
function Subscription(store, parentSub, onStateChange) {
|
|
_classCallCheck(this, Subscription);
|
|
|
|
this.store = store;
|
|
this.parentSub = parentSub;
|
|
this.onStateChange = onStateChange;
|
|
this.unsubscribe = null;
|
|
this.listeners = nullListeners;
|
|
}
|
|
|
|
Subscription.prototype.addNestedSub = function addNestedSub(listener) {
|
|
this.trySubscribe();
|
|
return this.listeners.subscribe(listener);
|
|
};
|
|
|
|
Subscription.prototype.notifyNestedSubs = function notifyNestedSubs() {
|
|
this.listeners.notify();
|
|
};
|
|
|
|
Subscription.prototype.isSubscribed = function isSubscribed() {
|
|
return Boolean(this.unsubscribe);
|
|
};
|
|
|
|
Subscription.prototype.trySubscribe = function trySubscribe() {
|
|
if (!this.unsubscribe) {
|
|
this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.onStateChange) : this.store.subscribe(this.onStateChange);
|
|
|
|
this.listeners = createListenerCollection();
|
|
}
|
|
};
|
|
|
|
Subscription.prototype.tryUnsubscribe = function tryUnsubscribe() {
|
|
if (this.unsubscribe) {
|
|
this.unsubscribe();
|
|
this.unsubscribe = null;
|
|
this.listeners.clear();
|
|
this.listeners = nullListeners;
|
|
}
|
|
};
|
|
|
|
return Subscription;
|
|
}();
|
|
|
|
exports.default = Subscription;
|
|
|
|
/***/ }),
|
|
/* 224 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.default = shallowEqual;
|
|
var hasOwn = Object.prototype.hasOwnProperty;
|
|
|
|
function is(x, y) {
|
|
if (x === y) {
|
|
return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
|
} else {
|
|
return x !== x && y !== y;
|
|
}
|
|
}
|
|
|
|
function shallowEqual(objA, objB) {
|
|
if (is(objA, objB)) return true;
|
|
|
|
if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {
|
|
return false;
|
|
}
|
|
|
|
var keysA = Object.keys(objA);
|
|
var keysB = Object.keys(objB);
|
|
|
|
if (keysA.length !== keysB.length) return false;
|
|
|
|
for (var i = 0; i < keysA.length; i++) {
|
|
if (!hasOwn.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/***/ }),
|
|
/* 225 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _createBrowserHistory = __webpack_require__(132);
|
|
|
|
var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory);
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for a <Router> that uses HTML5 history.
|
|
*/
|
|
|
|
var BrowserRouter = function (_React$Component) {
|
|
_inherits(BrowserRouter, _React$Component);
|
|
|
|
function BrowserRouter() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, BrowserRouter);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = (0, _createBrowserHistory2.default)(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
BrowserRouter.prototype.render = function render() {
|
|
return _react2.default.createElement(_reactRouter.Router, { history: this.history, children: this.props.children });
|
|
};
|
|
|
|
return BrowserRouter;
|
|
}(_react2.default.Component);
|
|
|
|
BrowserRouter.propTypes = {
|
|
basename: _propTypes2.default.string,
|
|
forceRefresh: _propTypes2.default.bool,
|
|
getUserConfirmation: _propTypes2.default.func,
|
|
keyLength: _propTypes2.default.number,
|
|
children: _propTypes2.default.node
|
|
};
|
|
|
|
exports.default = BrowserRouter;
|
|
|
|
/***/ }),
|
|
/* 226 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _createHashHistory = __webpack_require__(133);
|
|
|
|
var _createHashHistory2 = _interopRequireDefault(_createHashHistory);
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for a <Router> that uses window.location.hash.
|
|
*/
|
|
|
|
var HashRouter = function (_React$Component) {
|
|
_inherits(HashRouter, _React$Component);
|
|
|
|
function HashRouter() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, HashRouter);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = (0, _createHashHistory2.default)(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
HashRouter.prototype.render = function render() {
|
|
return _react2.default.createElement(_reactRouter.Router, { history: this.history, children: this.props.children });
|
|
};
|
|
|
|
return HashRouter;
|
|
}(_react2.default.Component);
|
|
|
|
HashRouter.propTypes = {
|
|
basename: _propTypes2.default.string,
|
|
getUserConfirmation: _propTypes2.default.func,
|
|
hashType: _propTypes2.default.oneOf(['hashbang', 'noslash', 'slash']),
|
|
children: _propTypes2.default.node
|
|
};
|
|
|
|
exports.default = HashRouter;
|
|
|
|
/***/ }),
|
|
/* 227 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.MemoryRouter;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 228 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
var _Link = __webpack_require__(99);
|
|
|
|
var _Link2 = _interopRequireDefault(_Link);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
|
|
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
} : function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
};
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
/**
|
|
* A <Link> wrapper that knows if it's "active" or not.
|
|
*/
|
|
var NavLink = function NavLink(_ref) {
|
|
var to = _ref.to,
|
|
exact = _ref.exact,
|
|
strict = _ref.strict,
|
|
location = _ref.location,
|
|
activeClassName = _ref.activeClassName,
|
|
className = _ref.className,
|
|
activeStyle = _ref.activeStyle,
|
|
style = _ref.style,
|
|
getIsActive = _ref.isActive,
|
|
rest = _objectWithoutProperties(_ref, ['to', 'exact', 'strict', 'location', 'activeClassName', 'className', 'activeStyle', 'style', 'isActive']);
|
|
|
|
return _react2.default.createElement(_reactRouter.Route, {
|
|
path: (typeof to === 'undefined' ? 'undefined' : _typeof(to)) === 'object' ? to.pathname : to,
|
|
exact: exact,
|
|
strict: strict,
|
|
location: location,
|
|
children: function children(_ref2) {
|
|
var location = _ref2.location,
|
|
match = _ref2.match;
|
|
|
|
var isActive = !!(getIsActive ? getIsActive(match, location) : match);
|
|
|
|
return _react2.default.createElement(_Link2.default, _extends({
|
|
to: to,
|
|
className: isActive ? [activeClassName, className].filter(function (i) {
|
|
return i;
|
|
}).join(' ') : className,
|
|
style: isActive ? _extends({}, style, activeStyle) : style
|
|
}, rest));
|
|
}
|
|
});
|
|
};
|
|
|
|
NavLink.propTypes = {
|
|
to: _Link2.default.propTypes.to,
|
|
exact: _propTypes2.default.bool,
|
|
strict: _propTypes2.default.bool,
|
|
location: _propTypes2.default.object,
|
|
activeClassName: _propTypes2.default.string,
|
|
className: _propTypes2.default.string,
|
|
activeStyle: _propTypes2.default.object,
|
|
style: _propTypes2.default.object,
|
|
isActive: _propTypes2.default.func
|
|
};
|
|
|
|
NavLink.defaultProps = {
|
|
activeClassName: 'active'
|
|
};
|
|
|
|
exports.default = NavLink;
|
|
|
|
/***/ }),
|
|
/* 229 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.Prompt;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 230 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.Redirect;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 231 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.Route;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 232 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.Router;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 233 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.StaticRouter;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 234 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.Switch;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 235 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.matchPath;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 236 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRouter = __webpack_require__(12);
|
|
|
|
Object.defineProperty(exports, 'default', {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return _reactRouter.withRouter;
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
/* 237 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _createMemoryHistory = __webpack_require__(134);
|
|
|
|
var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
|
|
|
|
var _Router = __webpack_require__(61);
|
|
|
|
var _Router2 = _interopRequireDefault(_Router);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for a <Router> that stores location in memory.
|
|
*/
|
|
|
|
var MemoryRouter = function (_React$Component) {
|
|
_inherits(MemoryRouter, _React$Component);
|
|
|
|
function MemoryRouter() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, MemoryRouter);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.history = (0, _createMemoryHistory2.default)(_this.props), _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
MemoryRouter.prototype.render = function render() {
|
|
return _react2.default.createElement(_Router2.default, { history: this.history, children: this.props.children });
|
|
};
|
|
|
|
return MemoryRouter;
|
|
}(_react2.default.Component);
|
|
|
|
MemoryRouter.propTypes = {
|
|
initialEntries: _propTypes2.default.array,
|
|
initialIndex: _propTypes2.default.number,
|
|
getUserConfirmation: _propTypes2.default.func,
|
|
keyLength: _propTypes2.default.number,
|
|
children: _propTypes2.default.node
|
|
};
|
|
|
|
exports.default = MemoryRouter;
|
|
|
|
/***/ }),
|
|
/* 238 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for prompting the user before navigating away
|
|
* from a screen with a component.
|
|
*/
|
|
|
|
var Prompt = function (_React$Component) {
|
|
_inherits(Prompt, _React$Component);
|
|
|
|
function Prompt() {
|
|
_classCallCheck(this, Prompt);
|
|
|
|
return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
|
}
|
|
|
|
Prompt.prototype.enable = function enable(message) {
|
|
if (this.unblock) this.unblock();
|
|
|
|
this.unblock = this.context.router.history.block(message);
|
|
};
|
|
|
|
Prompt.prototype.disable = function disable() {
|
|
if (this.unblock) {
|
|
this.unblock();
|
|
this.unblock = null;
|
|
}
|
|
};
|
|
|
|
Prompt.prototype.componentWillMount = function componentWillMount() {
|
|
if (this.props.when) this.enable(this.props.message);
|
|
};
|
|
|
|
Prompt.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
|
if (nextProps.when) {
|
|
if (!this.props.when || this.props.message !== nextProps.message) this.enable(nextProps.message);
|
|
} else {
|
|
this.disable();
|
|
}
|
|
};
|
|
|
|
Prompt.prototype.componentWillUnmount = function componentWillUnmount() {
|
|
this.disable();
|
|
};
|
|
|
|
Prompt.prototype.render = function render() {
|
|
return null;
|
|
};
|
|
|
|
return Prompt;
|
|
}(_react2.default.Component);
|
|
|
|
Prompt.propTypes = {
|
|
when: _propTypes2.default.bool,
|
|
message: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.string]).isRequired
|
|
};
|
|
Prompt.defaultProps = {
|
|
when: true
|
|
};
|
|
Prompt.contextTypes = {
|
|
router: _propTypes2.default.shape({
|
|
history: _propTypes2.default.shape({
|
|
block: _propTypes2.default.func.isRequired
|
|
}).isRequired
|
|
}).isRequired
|
|
};
|
|
|
|
exports.default = Prompt;
|
|
|
|
/***/ }),
|
|
/* 239 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for updating the location programatically
|
|
* with a component.
|
|
*/
|
|
|
|
var Redirect = function (_React$Component) {
|
|
_inherits(Redirect, _React$Component);
|
|
|
|
function Redirect() {
|
|
_classCallCheck(this, Redirect);
|
|
|
|
return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
|
}
|
|
|
|
Redirect.prototype.isStatic = function isStatic() {
|
|
return this.context.router && this.context.router.staticContext;
|
|
};
|
|
|
|
Redirect.prototype.componentWillMount = function componentWillMount() {
|
|
if (this.isStatic()) this.perform();
|
|
};
|
|
|
|
Redirect.prototype.componentDidMount = function componentDidMount() {
|
|
if (!this.isStatic()) this.perform();
|
|
};
|
|
|
|
Redirect.prototype.perform = function perform() {
|
|
var history = this.context.router.history;
|
|
var _props = this.props,
|
|
push = _props.push,
|
|
to = _props.to;
|
|
|
|
if (push) {
|
|
history.push(to);
|
|
} else {
|
|
history.replace(to);
|
|
}
|
|
};
|
|
|
|
Redirect.prototype.render = function render() {
|
|
return null;
|
|
};
|
|
|
|
return Redirect;
|
|
}(_react2.default.Component);
|
|
|
|
Redirect.propTypes = {
|
|
push: _propTypes2.default.bool,
|
|
from: _propTypes2.default.string,
|
|
to: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object])
|
|
};
|
|
Redirect.defaultProps = {
|
|
push: false
|
|
};
|
|
Redirect.contextTypes = {
|
|
router: _propTypes2.default.shape({
|
|
history: _propTypes2.default.shape({
|
|
push: _propTypes2.default.func.isRequired,
|
|
replace: _propTypes2.default.func.isRequired
|
|
}).isRequired,
|
|
staticContext: _propTypes2.default.object
|
|
}).isRequired
|
|
};
|
|
|
|
exports.default = Redirect;
|
|
|
|
/***/ }),
|
|
/* 240 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _invariant = __webpack_require__(26);
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _PathUtils = __webpack_require__(25);
|
|
|
|
var _Router = __webpack_require__(61);
|
|
|
|
var _Router2 = _interopRequireDefault(_Router);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
var normalizeLocation = function normalizeLocation(object) {
|
|
var _object$pathname = object.pathname,
|
|
pathname = _object$pathname === undefined ? '/' : _object$pathname,
|
|
_object$search = object.search,
|
|
search = _object$search === undefined ? '' : _object$search,
|
|
_object$hash = object.hash,
|
|
hash = _object$hash === undefined ? '' : _object$hash;
|
|
|
|
return {
|
|
pathname: pathname,
|
|
search: search === '?' ? '' : search,
|
|
hash: hash === '#' ? '' : hash
|
|
};
|
|
};
|
|
|
|
var addBasename = function addBasename(basename, location) {
|
|
if (!basename) return location;
|
|
|
|
return _extends({}, location, {
|
|
pathname: (0, _PathUtils.addLeadingSlash)(basename) + location.pathname
|
|
});
|
|
};
|
|
|
|
var stripBasename = function stripBasename(basename, location) {
|
|
if (!basename) return location;
|
|
|
|
var base = (0, _PathUtils.addLeadingSlash)(basename);
|
|
|
|
if (location.pathname.indexOf(base) !== 0) return location;
|
|
|
|
return _extends({}, location, {
|
|
pathname: location.pathname.substr(base.length)
|
|
});
|
|
};
|
|
|
|
var createLocation = function createLocation(location) {
|
|
return typeof location === 'string' ? (0, _PathUtils.parsePath)(location) : normalizeLocation(location);
|
|
};
|
|
|
|
var createURL = function createURL(location) {
|
|
return typeof location === 'string' ? location : (0, _PathUtils.createPath)(location);
|
|
};
|
|
|
|
var staticHandler = function staticHandler(methodName) {
|
|
return function () {
|
|
(0, _invariant2.default)(false, 'You cannot %s with <StaticRouter>', methodName);
|
|
};
|
|
};
|
|
|
|
var noop = function noop() {};
|
|
|
|
/**
|
|
* The public top-level API for a "static" <Router>, so-called because it
|
|
* can't actually change the current location. Instead, it just records
|
|
* location changes in a context object. Useful mainly in testing and
|
|
* server-rendering scenarios.
|
|
*/
|
|
|
|
var StaticRouter = function (_React$Component) {
|
|
_inherits(StaticRouter, _React$Component);
|
|
|
|
function StaticRouter() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, StaticRouter);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.createHref = function (path) {
|
|
return (0, _PathUtils.addLeadingSlash)(_this.props.basename + createURL(path));
|
|
}, _this.handlePush = function (location) {
|
|
var _this$props = _this.props,
|
|
basename = _this$props.basename,
|
|
context = _this$props.context;
|
|
|
|
context.action = 'PUSH';
|
|
context.location = addBasename(basename, createLocation(location));
|
|
context.url = createURL(context.location);
|
|
}, _this.handleReplace = function (location) {
|
|
var _this$props2 = _this.props,
|
|
basename = _this$props2.basename,
|
|
context = _this$props2.context;
|
|
|
|
context.action = 'REPLACE';
|
|
context.location = addBasename(basename, createLocation(location));
|
|
context.url = createURL(context.location);
|
|
}, _this.handleListen = function () {
|
|
return noop;
|
|
}, _this.handleBlock = function () {
|
|
return noop;
|
|
}, _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
StaticRouter.prototype.getChildContext = function getChildContext() {
|
|
return {
|
|
router: {
|
|
staticContext: this.props.context
|
|
}
|
|
};
|
|
};
|
|
|
|
StaticRouter.prototype.render = function render() {
|
|
var _props = this.props,
|
|
basename = _props.basename,
|
|
context = _props.context,
|
|
location = _props.location,
|
|
props = _objectWithoutProperties(_props, ['basename', 'context', 'location']);
|
|
|
|
var history = {
|
|
createHref: this.createHref,
|
|
action: 'POP',
|
|
location: stripBasename(basename, createLocation(location)),
|
|
push: this.handlePush,
|
|
replace: this.handleReplace,
|
|
go: staticHandler('go'),
|
|
goBack: staticHandler('goBack'),
|
|
goForward: staticHandler('goForward'),
|
|
listen: this.handleListen,
|
|
block: this.handleBlock
|
|
};
|
|
|
|
return _react2.default.createElement(_Router2.default, _extends({}, props, { history: history }));
|
|
};
|
|
|
|
return StaticRouter;
|
|
}(_react2.default.Component);
|
|
|
|
StaticRouter.propTypes = {
|
|
basename: _propTypes2.default.string,
|
|
context: _propTypes2.default.object.isRequired,
|
|
location: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object])
|
|
};
|
|
StaticRouter.defaultProps = {
|
|
basename: '',
|
|
location: '/'
|
|
};
|
|
StaticRouter.childContextTypes = {
|
|
router: _propTypes2.default.object.isRequired
|
|
};
|
|
|
|
exports.default = StaticRouter;
|
|
|
|
/***/ }),
|
|
/* 241 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _warning = __webpack_require__(20);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _matchPath = __webpack_require__(62);
|
|
|
|
var _matchPath2 = _interopRequireDefault(_matchPath);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
|
|
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
}
|
|
|
|
/**
|
|
* The public API for rendering the first <Route> that matches.
|
|
*/
|
|
|
|
var Switch = function (_React$Component) {
|
|
_inherits(Switch, _React$Component);
|
|
|
|
function Switch() {
|
|
_classCallCheck(this, Switch);
|
|
|
|
return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
|
}
|
|
|
|
Switch.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
|
(0, _warning2.default)(!(nextProps.location && !this.props.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');
|
|
|
|
(0, _warning2.default)(!(!nextProps.location && this.props.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.');
|
|
};
|
|
|
|
Switch.prototype.render = function render() {
|
|
var route = this.context.router.route;
|
|
var children = this.props.children;
|
|
|
|
var location = this.props.location || route.location;
|
|
|
|
var match = void 0,
|
|
child = void 0;
|
|
_react2.default.Children.forEach(children, function (element) {
|
|
if (!_react2.default.isValidElement(element)) return;
|
|
|
|
var _element$props = element.props,
|
|
pathProp = _element$props.path,
|
|
exact = _element$props.exact,
|
|
strict = _element$props.strict,
|
|
from = _element$props.from;
|
|
|
|
var path = pathProp || from;
|
|
|
|
if (match == null) {
|
|
child = element;
|
|
match = path ? (0, _matchPath2.default)(location.pathname, { path: path, exact: exact, strict: strict }) : route.match;
|
|
}
|
|
});
|
|
|
|
return match ? _react2.default.cloneElement(child, { location: location, computedMatch: match }) : null;
|
|
};
|
|
|
|
return Switch;
|
|
}(_react2.default.Component);
|
|
|
|
Switch.contextTypes = {
|
|
router: _propTypes2.default.shape({
|
|
route: _propTypes2.default.object.isRequired
|
|
}).isRequired
|
|
};
|
|
Switch.propTypes = {
|
|
children: _propTypes2.default.node,
|
|
location: _propTypes2.default.object
|
|
};
|
|
|
|
exports.default = Switch;
|
|
|
|
/***/ }),
|
|
/* 242 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _propTypes = __webpack_require__(8);
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _hoistNonReactStatics = __webpack_require__(69);
|
|
|
|
var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
|
|
|
|
var _Route = __webpack_require__(100);
|
|
|
|
var _Route2 = _interopRequireDefault(_Route);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
function _objectWithoutProperties(obj, keys) {
|
|
var target = {};for (var i in obj) {
|
|
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
|
|
}return target;
|
|
}
|
|
|
|
/**
|
|
* A public higher-order component to access the imperative API
|
|
*/
|
|
var withRouter = function withRouter(Component) {
|
|
var C = function C(props) {
|
|
var wrappedComponentRef = props.wrappedComponentRef,
|
|
remainingProps = _objectWithoutProperties(props, ['wrappedComponentRef']);
|
|
|
|
return _react2.default.createElement(_Route2.default, { render: function render(routeComponentProps) {
|
|
return _react2.default.createElement(Component, _extends({}, remainingProps, routeComponentProps, { ref: wrappedComponentRef }));
|
|
} });
|
|
};
|
|
|
|
C.displayName = 'withRouter(' + (Component.displayName || Component.name) + ')';
|
|
C.WrappedComponent = Component;
|
|
C.propTypes = {
|
|
wrappedComponentRef: _propTypes2.default.func
|
|
};
|
|
|
|
return (0, _hoistNonReactStatics2.default)(C, Component);
|
|
};
|
|
|
|
exports.default = withRouter;
|
|
|
|
/***/ }),
|
|
/* 243 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = Array.isArray || function (arr) {
|
|
return Object.prototype.toString.call(arr) == '[object Array]';
|
|
};
|
|
|
|
/***/ }),
|
|
/* 244 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var isarray = __webpack_require__(243
|
|
|
|
/**
|
|
* Expose `pathToRegexp`.
|
|
*/
|
|
);module.exports = pathToRegexp;
|
|
module.exports.parse = parse;
|
|
module.exports.compile = compile;
|
|
module.exports.tokensToFunction = tokensToFunction;
|
|
module.exports.tokensToRegExp = tokensToRegExp;
|
|
|
|
/**
|
|
* The main path matching regexp utility.
|
|
*
|
|
* @type {RegExp}
|
|
*/
|
|
var PATH_REGEXP = new RegExp([
|
|
// Match escaped characters that would otherwise appear in future matches.
|
|
// This allows the user to escape special characters that won't transform.
|
|
'(\\\\.)',
|
|
// Match Express-style parameters and un-named parameters with a prefix
|
|
// and optional suffixes. Matches appear as:
|
|
//
|
|
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
|
|
// "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined]
|
|
// "/*" => ["/", undefined, undefined, undefined, undefined, "*"]
|
|
'([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'].join('|'), 'g');
|
|
|
|
/**
|
|
* Parse a string for the raw tokens.
|
|
*
|
|
* @param {string} str
|
|
* @param {Object=} options
|
|
* @return {!Array}
|
|
*/
|
|
function parse(str, options) {
|
|
var tokens = [];
|
|
var key = 0;
|
|
var index = 0;
|
|
var path = '';
|
|
var defaultDelimiter = options && options.delimiter || '/';
|
|
var res;
|
|
|
|
while ((res = PATH_REGEXP.exec(str)) != null) {
|
|
var m = res[0];
|
|
var escaped = res[1];
|
|
var offset = res.index;
|
|
path += str.slice(index, offset);
|
|
index = offset + m.length;
|
|
|
|
// Ignore already escaped sequences.
|
|
if (escaped) {
|
|
path += escaped[1];
|
|
continue;
|
|
}
|
|
|
|
var next = str[index];
|
|
var prefix = res[2];
|
|
var name = res[3];
|
|
var capture = res[4];
|
|
var group = res[5];
|
|
var modifier = res[6];
|
|
var asterisk = res[7];
|
|
|
|
// Push the current path onto the tokens.
|
|
if (path) {
|
|
tokens.push(path);
|
|
path = '';
|
|
}
|
|
|
|
var partial = prefix != null && next != null && next !== prefix;
|
|
var repeat = modifier === '+' || modifier === '*';
|
|
var optional = modifier === '?' || modifier === '*';
|
|
var delimiter = res[2] || defaultDelimiter;
|
|
var pattern = capture || group;
|
|
|
|
tokens.push({
|
|
name: name || key++,
|
|
prefix: prefix || '',
|
|
delimiter: delimiter,
|
|
optional: optional,
|
|
repeat: repeat,
|
|
partial: partial,
|
|
asterisk: !!asterisk,
|
|
pattern: pattern ? escapeGroup(pattern) : asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?'
|
|
});
|
|
}
|
|
|
|
// Match any characters still remaining.
|
|
if (index < str.length) {
|
|
path += str.substr(index);
|
|
}
|
|
|
|
// If the path exists, push it onto the end.
|
|
if (path) {
|
|
tokens.push(path);
|
|
}
|
|
|
|
return tokens;
|
|
}
|
|
|
|
/**
|
|
* Compile a string to a template function for the path.
|
|
*
|
|
* @param {string} str
|
|
* @param {Object=} options
|
|
* @return {!function(Object=, Object=)}
|
|
*/
|
|
function compile(str, options) {
|
|
return tokensToFunction(parse(str, options));
|
|
}
|
|
|
|
/**
|
|
* Prettier encoding of URI path segments.
|
|
*
|
|
* @param {string}
|
|
* @return {string}
|
|
*/
|
|
function encodeURIComponentPretty(str) {
|
|
return encodeURI(str).replace(/[\/?#]/g, function (c) {
|
|
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
|
|
*
|
|
* @param {string}
|
|
* @return {string}
|
|
*/
|
|
function encodeAsterisk(str) {
|
|
return encodeURI(str).replace(/[?#]/g, function (c) {
|
|
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Expose a method for transforming tokens into the path function.
|
|
*/
|
|
function tokensToFunction(tokens) {
|
|
// Compile all the tokens into regexps.
|
|
var matches = new Array(tokens.length);
|
|
|
|
// Compile all the patterns before compilation.
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
if (_typeof(tokens[i]) === 'object') {
|
|
matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');
|
|
}
|
|
}
|
|
|
|
return function (obj, opts) {
|
|
var path = '';
|
|
var data = obj || {};
|
|
var options = opts || {};
|
|
var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;
|
|
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
var token = tokens[i];
|
|
|
|
if (typeof token === 'string') {
|
|
path += token;
|
|
|
|
continue;
|
|
}
|
|
|
|
var value = data[token.name];
|
|
var segment;
|
|
|
|
if (value == null) {
|
|
if (token.optional) {
|
|
// Prepend partial segment prefixes.
|
|
if (token.partial) {
|
|
path += token.prefix;
|
|
}
|
|
|
|
continue;
|
|
} else {
|
|
throw new TypeError('Expected "' + token.name + '" to be defined');
|
|
}
|
|
}
|
|
|
|
if (isarray(value)) {
|
|
if (!token.repeat) {
|
|
throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`');
|
|
}
|
|
|
|
if (value.length === 0) {
|
|
if (token.optional) {
|
|
continue;
|
|
} else {
|
|
throw new TypeError('Expected "' + token.name + '" to not be empty');
|
|
}
|
|
}
|
|
|
|
for (var j = 0; j < value.length; j++) {
|
|
segment = encode(value[j]);
|
|
|
|
if (!matches[i].test(segment)) {
|
|
throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`');
|
|
}
|
|
|
|
path += (j === 0 ? token.prefix : token.delimiter) + segment;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
segment = token.asterisk ? encodeAsterisk(value) : encode(value);
|
|
|
|
if (!matches[i].test(segment)) {
|
|
throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"');
|
|
}
|
|
|
|
path += token.prefix + segment;
|
|
}
|
|
|
|
return path;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Escape a regular expression string.
|
|
*
|
|
* @param {string} str
|
|
* @return {string}
|
|
*/
|
|
function escapeString(str) {
|
|
return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1');
|
|
}
|
|
|
|
/**
|
|
* Escape the capturing group by escaping special characters and meaning.
|
|
*
|
|
* @param {string} group
|
|
* @return {string}
|
|
*/
|
|
function escapeGroup(group) {
|
|
return group.replace(/([=!:$\/()])/g, '\\$1');
|
|
}
|
|
|
|
/**
|
|
* Attach the keys as a property of the regexp.
|
|
*
|
|
* @param {!RegExp} re
|
|
* @param {Array} keys
|
|
* @return {!RegExp}
|
|
*/
|
|
function attachKeys(re, keys) {
|
|
re.keys = keys;
|
|
return re;
|
|
}
|
|
|
|
/**
|
|
* Get the flags for a regexp from the options.
|
|
*
|
|
* @param {Object} options
|
|
* @return {string}
|
|
*/
|
|
function flags(options) {
|
|
return options.sensitive ? '' : 'i';
|
|
}
|
|
|
|
/**
|
|
* Pull out keys from a regexp.
|
|
*
|
|
* @param {!RegExp} path
|
|
* @param {!Array} keys
|
|
* @return {!RegExp}
|
|
*/
|
|
function regexpToRegexp(path, keys) {
|
|
// Use a negative lookahead to match only capturing groups.
|
|
var groups = path.source.match(/\((?!\?)/g);
|
|
|
|
if (groups) {
|
|
for (var i = 0; i < groups.length; i++) {
|
|
keys.push({
|
|
name: i,
|
|
prefix: null,
|
|
delimiter: null,
|
|
optional: false,
|
|
repeat: false,
|
|
partial: false,
|
|
asterisk: false,
|
|
pattern: null
|
|
});
|
|
}
|
|
}
|
|
|
|
return attachKeys(path, keys);
|
|
}
|
|
|
|
/**
|
|
* Transform an array into a regexp.
|
|
*
|
|
* @param {!Array} path
|
|
* @param {Array} keys
|
|
* @param {!Object} options
|
|
* @return {!RegExp}
|
|
*/
|
|
function arrayToRegexp(path, keys, options) {
|
|
var parts = [];
|
|
|
|
for (var i = 0; i < path.length; i++) {
|
|
parts.push(pathToRegexp(path[i], keys, options).source);
|
|
}
|
|
|
|
var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));
|
|
|
|
return attachKeys(regexp, keys);
|
|
}
|
|
|
|
/**
|
|
* Create a path regexp from string input.
|
|
*
|
|
* @param {string} path
|
|
* @param {!Array} keys
|
|
* @param {!Object} options
|
|
* @return {!RegExp}
|
|
*/
|
|
function stringToRegexp(path, keys, options) {
|
|
return tokensToRegExp(parse(path, options), keys, options);
|
|
}
|
|
|
|
/**
|
|
* Expose a function for taking tokens and returning a RegExp.
|
|
*
|
|
* @param {!Array} tokens
|
|
* @param {(Array|Object)=} keys
|
|
* @param {Object=} options
|
|
* @return {!RegExp}
|
|
*/
|
|
function tokensToRegExp(tokens, keys, options) {
|
|
if (!isarray(keys)) {
|
|
options = /** @type {!Object} */keys || options;
|
|
keys = [];
|
|
}
|
|
|
|
options = options || {};
|
|
|
|
var strict = options.strict;
|
|
var end = options.end !== false;
|
|
var route = '';
|
|
|
|
// Iterate over the tokens and create our regexp string.
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
var token = tokens[i];
|
|
|
|
if (typeof token === 'string') {
|
|
route += escapeString(token);
|
|
} else {
|
|
var prefix = escapeString(token.prefix);
|
|
var capture = '(?:' + token.pattern + ')';
|
|
|
|
keys.push(token);
|
|
|
|
if (token.repeat) {
|
|
capture += '(?:' + prefix + capture + ')*';
|
|
}
|
|
|
|
if (token.optional) {
|
|
if (!token.partial) {
|
|
capture = '(?:' + prefix + '(' + capture + '))?';
|
|
} else {
|
|
capture = prefix + '(' + capture + ')?';
|
|
}
|
|
} else {
|
|
capture = prefix + '(' + capture + ')';
|
|
}
|
|
|
|
route += capture;
|
|
}
|
|
}
|
|
|
|
var delimiter = escapeString(options.delimiter || '/');
|
|
var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;
|
|
|
|
// In non-strict mode we allow a slash at the end of match. If the path to
|
|
// match already ends with a slash, we remove it for consistency. The slash
|
|
// is valid at the end of a path match, not in the middle. This is important
|
|
// in non-ending mode, where "/test/" shouldn't match "/test//route".
|
|
if (!strict) {
|
|
route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';
|
|
}
|
|
|
|
if (end) {
|
|
route += '$';
|
|
} else {
|
|
// In non-ending mode, we need the capturing groups to match as much as
|
|
// possible by using a positive lookahead to the end or next path segment.
|
|
route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';
|
|
}
|
|
|
|
return attachKeys(new RegExp('^' + route, flags(options)), keys);
|
|
}
|
|
|
|
/**
|
|
* Normalize the given path string, returning a regular expression.
|
|
*
|
|
* An empty array can be passed in for the keys, which will hold the
|
|
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
|
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
|
*
|
|
* @param {(string|RegExp|Array)} path
|
|
* @param {(Array|Object)=} keys
|
|
* @param {Object=} options
|
|
* @return {!RegExp}
|
|
*/
|
|
function pathToRegexp(path, keys, options) {
|
|
if (!isarray(keys)) {
|
|
options = /** @type {!Object} */keys || options;
|
|
keys = [];
|
|
}
|
|
|
|
options = options || {};
|
|
|
|
if (path instanceof RegExp) {
|
|
return regexpToRegexp(path, /** @type {!Array} */keys);
|
|
}
|
|
|
|
if (isarray(path)) {
|
|
return arrayToRegexp( /** @type {!Array} */path, /** @type {!Array} */keys, options);
|
|
}
|
|
|
|
return stringToRegexp( /** @type {string} */path, /** @type {!Array} */keys, options);
|
|
}
|
|
|
|
/***/ }),
|
|
/* 245 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Escape and wrap key so it is safe to use as a reactid
|
|
*
|
|
* @param {string} key to be escaped.
|
|
* @return {string} the escaped key.
|
|
*/
|
|
|
|
function escape(key) {
|
|
var escapeRegex = /[=:]/g;
|
|
var escaperLookup = {
|
|
'=': '=0',
|
|
':': '=2'
|
|
};
|
|
var escapedString = ('' + key).replace(escapeRegex, function (match) {
|
|
return escaperLookup[match];
|
|
});
|
|
|
|
return '$' + escapedString;
|
|
}
|
|
|
|
/**
|
|
* Unescape and unwrap key for human-readable display
|
|
*
|
|
* @param {string} key to unescape.
|
|
* @return {string} the unescaped key.
|
|
*/
|
|
function unescape(key) {
|
|
var unescapeRegex = /(=0|=2)/g;
|
|
var unescaperLookup = {
|
|
'=0': '=',
|
|
'=2': ':'
|
|
};
|
|
var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);
|
|
|
|
return ('' + keySubstring).replace(unescapeRegex, function (match) {
|
|
return unescaperLookup[match];
|
|
});
|
|
}
|
|
|
|
var KeyEscapeUtils = {
|
|
escape: escape,
|
|
unescape: unescape
|
|
};
|
|
|
|
module.exports = KeyEscapeUtils;
|
|
|
|
/***/ }),
|
|
/* 246 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(24);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Static poolers. Several custom versions for each potential number of
|
|
* arguments. A completely generic pooler is easy to implement, but would
|
|
* require accessing the `arguments` object. In each of these, `this` refers to
|
|
* the Class itself, not an instance. If any others are needed, simply add them
|
|
* here, or in their own files.
|
|
*/
|
|
var oneArgumentPooler = function oneArgumentPooler(copyFieldsFrom) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, copyFieldsFrom);
|
|
return instance;
|
|
} else {
|
|
return new Klass(copyFieldsFrom);
|
|
}
|
|
};
|
|
|
|
var twoArgumentPooler = function twoArgumentPooler(a1, a2) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2);
|
|
}
|
|
};
|
|
|
|
var threeArgumentPooler = function threeArgumentPooler(a1, a2, a3) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2, a3);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2, a3);
|
|
}
|
|
};
|
|
|
|
var fourArgumentPooler = function fourArgumentPooler(a1, a2, a3, a4) {
|
|
var Klass = this;
|
|
if (Klass.instancePool.length) {
|
|
var instance = Klass.instancePool.pop();
|
|
Klass.call(instance, a1, a2, a3, a4);
|
|
return instance;
|
|
} else {
|
|
return new Klass(a1, a2, a3, a4);
|
|
}
|
|
};
|
|
|
|
var standardReleaser = function standardReleaser(instance) {
|
|
var Klass = this;
|
|
!(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;
|
|
instance.destructor();
|
|
if (Klass.instancePool.length < Klass.poolSize) {
|
|
Klass.instancePool.push(instance);
|
|
}
|
|
};
|
|
|
|
var DEFAULT_POOL_SIZE = 10;
|
|
var DEFAULT_POOLER = oneArgumentPooler;
|
|
|
|
/**
|
|
* Augments `CopyConstructor` to be a poolable class, augmenting only the class
|
|
* itself (statically) not adding any prototypical fields. Any CopyConstructor
|
|
* you give this may have a `poolSize` property, and will look for a
|
|
* prototypical `destructor` on instances.
|
|
*
|
|
* @param {Function} CopyConstructor Constructor that can be used to reset.
|
|
* @param {Function} pooler Customizable pooler.
|
|
*/
|
|
var addPoolingTo = function addPoolingTo(CopyConstructor, pooler) {
|
|
// Casting as any so that flow ignores the actual implementation and trusts
|
|
// it to match the type we declared
|
|
var NewKlass = CopyConstructor;
|
|
NewKlass.instancePool = [];
|
|
NewKlass.getPooled = pooler || DEFAULT_POOLER;
|
|
if (!NewKlass.poolSize) {
|
|
NewKlass.poolSize = DEFAULT_POOL_SIZE;
|
|
}
|
|
NewKlass.release = standardReleaser;
|
|
return NewKlass;
|
|
};
|
|
|
|
var PooledClass = {
|
|
addPoolingTo: addPoolingTo,
|
|
oneArgumentPooler: oneArgumentPooler,
|
|
twoArgumentPooler: twoArgumentPooler,
|
|
threeArgumentPooler: threeArgumentPooler,
|
|
fourArgumentPooler: fourArgumentPooler
|
|
};
|
|
|
|
module.exports = PooledClass;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 247 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var PooledClass = __webpack_require__(246);
|
|
var ReactElement = __webpack_require__(19);
|
|
|
|
var emptyFunction = __webpack_require__(10);
|
|
var traverseAllChildren = __webpack_require__(257);
|
|
|
|
var twoArgumentPooler = PooledClass.twoArgumentPooler;
|
|
var fourArgumentPooler = PooledClass.fourArgumentPooler;
|
|
|
|
var userProvidedKeyEscapeRegex = /\/+/g;
|
|
function escapeUserProvidedKey(text) {
|
|
return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');
|
|
}
|
|
|
|
/**
|
|
* PooledClass representing the bookkeeping associated with performing a child
|
|
* traversal. Allows avoiding binding callbacks.
|
|
*
|
|
* @constructor ForEachBookKeeping
|
|
* @param {!function} forEachFunction Function to perform traversal with.
|
|
* @param {?*} forEachContext Context to perform context with.
|
|
*/
|
|
function ForEachBookKeeping(forEachFunction, forEachContext) {
|
|
this.func = forEachFunction;
|
|
this.context = forEachContext;
|
|
this.count = 0;
|
|
}
|
|
ForEachBookKeeping.prototype.destructor = function () {
|
|
this.func = null;
|
|
this.context = null;
|
|
this.count = 0;
|
|
};
|
|
PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);
|
|
|
|
function forEachSingleChild(bookKeeping, child, name) {
|
|
var func = bookKeeping.func,
|
|
context = bookKeeping.context;
|
|
|
|
func.call(context, child, bookKeeping.count++);
|
|
}
|
|
|
|
/**
|
|
* Iterates through children that are typically specified as `props.children`.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach
|
|
*
|
|
* The provided forEachFunc(child, index) will be called for each
|
|
* leaf child.
|
|
*
|
|
* @param {?*} children Children tree container.
|
|
* @param {function(*, int)} forEachFunc
|
|
* @param {*} forEachContext Context for forEachContext.
|
|
*/
|
|
function forEachChildren(children, forEachFunc, forEachContext) {
|
|
if (children == null) {
|
|
return children;
|
|
}
|
|
var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);
|
|
traverseAllChildren(children, forEachSingleChild, traverseContext);
|
|
ForEachBookKeeping.release(traverseContext);
|
|
}
|
|
|
|
/**
|
|
* PooledClass representing the bookkeeping associated with performing a child
|
|
* mapping. Allows avoiding binding callbacks.
|
|
*
|
|
* @constructor MapBookKeeping
|
|
* @param {!*} mapResult Object containing the ordered map of results.
|
|
* @param {!function} mapFunction Function to perform mapping with.
|
|
* @param {?*} mapContext Context to perform mapping with.
|
|
*/
|
|
function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {
|
|
this.result = mapResult;
|
|
this.keyPrefix = keyPrefix;
|
|
this.func = mapFunction;
|
|
this.context = mapContext;
|
|
this.count = 0;
|
|
}
|
|
MapBookKeeping.prototype.destructor = function () {
|
|
this.result = null;
|
|
this.keyPrefix = null;
|
|
this.func = null;
|
|
this.context = null;
|
|
this.count = 0;
|
|
};
|
|
PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);
|
|
|
|
function mapSingleChildIntoContext(bookKeeping, child, childKey) {
|
|
var result = bookKeeping.result,
|
|
keyPrefix = bookKeeping.keyPrefix,
|
|
func = bookKeeping.func,
|
|
context = bookKeeping.context;
|
|
|
|
var mappedChild = func.call(context, child, bookKeeping.count++);
|
|
if (Array.isArray(mappedChild)) {
|
|
mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);
|
|
} else if (mappedChild != null) {
|
|
if (ReactElement.isValidElement(mappedChild)) {
|
|
mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,
|
|
// Keep both the (mapped) and old keys if they differ, just as
|
|
// traverseAllChildren used to do for objects as children
|
|
keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);
|
|
}
|
|
result.push(mappedChild);
|
|
}
|
|
}
|
|
|
|
function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
|
|
var escapedPrefix = '';
|
|
if (prefix != null) {
|
|
escapedPrefix = escapeUserProvidedKey(prefix) + '/';
|
|
}
|
|
var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);
|
|
traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);
|
|
MapBookKeeping.release(traverseContext);
|
|
}
|
|
|
|
/**
|
|
* Maps children that are typically specified as `props.children`.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.children.map
|
|
*
|
|
* The provided mapFunction(child, key, index) will be called for each
|
|
* leaf child.
|
|
*
|
|
* @param {?*} children Children tree container.
|
|
* @param {function(*, int)} func The map function.
|
|
* @param {*} context Context for mapFunction.
|
|
* @return {object} Object containing the ordered map of results.
|
|
*/
|
|
function mapChildren(children, func, context) {
|
|
if (children == null) {
|
|
return children;
|
|
}
|
|
var result = [];
|
|
mapIntoWithKeyPrefixInternal(children, result, null, func, context);
|
|
return result;
|
|
}
|
|
|
|
function forEachSingleChildDummy(traverseContext, child, name) {
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Count the number of children that are typically specified as
|
|
* `props.children`.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.children.count
|
|
*
|
|
* @param {?*} children Children tree container.
|
|
* @return {number} The number of children.
|
|
*/
|
|
function countChildren(children, context) {
|
|
return traverseAllChildren(children, forEachSingleChildDummy, null);
|
|
}
|
|
|
|
/**
|
|
* Flatten a children object (typically specified as `props.children`) and
|
|
* return an array with appropriately re-keyed children.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray
|
|
*/
|
|
function toArray(children) {
|
|
var result = [];
|
|
mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);
|
|
return result;
|
|
}
|
|
|
|
var ReactChildren = {
|
|
forEach: forEachChildren,
|
|
map: mapChildren,
|
|
mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,
|
|
count: countChildren,
|
|
toArray: toArray
|
|
};
|
|
|
|
module.exports = ReactChildren;
|
|
|
|
/***/ }),
|
|
/* 248 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactElement = __webpack_require__(19);
|
|
|
|
/**
|
|
* Create a factory that creates HTML tag elements.
|
|
*
|
|
* @private
|
|
*/
|
|
var createDOMFactory = ReactElement.createFactory;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var ReactElementValidator = __webpack_require__(103);
|
|
createDOMFactory = ReactElementValidator.createFactory;
|
|
}
|
|
|
|
/**
|
|
* Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.
|
|
*
|
|
* @public
|
|
*/
|
|
var ReactDOMFactories = {
|
|
a: createDOMFactory('a'),
|
|
abbr: createDOMFactory('abbr'),
|
|
address: createDOMFactory('address'),
|
|
area: createDOMFactory('area'),
|
|
article: createDOMFactory('article'),
|
|
aside: createDOMFactory('aside'),
|
|
audio: createDOMFactory('audio'),
|
|
b: createDOMFactory('b'),
|
|
base: createDOMFactory('base'),
|
|
bdi: createDOMFactory('bdi'),
|
|
bdo: createDOMFactory('bdo'),
|
|
big: createDOMFactory('big'),
|
|
blockquote: createDOMFactory('blockquote'),
|
|
body: createDOMFactory('body'),
|
|
br: createDOMFactory('br'),
|
|
button: createDOMFactory('button'),
|
|
canvas: createDOMFactory('canvas'),
|
|
caption: createDOMFactory('caption'),
|
|
cite: createDOMFactory('cite'),
|
|
code: createDOMFactory('code'),
|
|
col: createDOMFactory('col'),
|
|
colgroup: createDOMFactory('colgroup'),
|
|
data: createDOMFactory('data'),
|
|
datalist: createDOMFactory('datalist'),
|
|
dd: createDOMFactory('dd'),
|
|
del: createDOMFactory('del'),
|
|
details: createDOMFactory('details'),
|
|
dfn: createDOMFactory('dfn'),
|
|
dialog: createDOMFactory('dialog'),
|
|
div: createDOMFactory('div'),
|
|
dl: createDOMFactory('dl'),
|
|
dt: createDOMFactory('dt'),
|
|
em: createDOMFactory('em'),
|
|
embed: createDOMFactory('embed'),
|
|
fieldset: createDOMFactory('fieldset'),
|
|
figcaption: createDOMFactory('figcaption'),
|
|
figure: createDOMFactory('figure'),
|
|
footer: createDOMFactory('footer'),
|
|
form: createDOMFactory('form'),
|
|
h1: createDOMFactory('h1'),
|
|
h2: createDOMFactory('h2'),
|
|
h3: createDOMFactory('h3'),
|
|
h4: createDOMFactory('h4'),
|
|
h5: createDOMFactory('h5'),
|
|
h6: createDOMFactory('h6'),
|
|
head: createDOMFactory('head'),
|
|
header: createDOMFactory('header'),
|
|
hgroup: createDOMFactory('hgroup'),
|
|
hr: createDOMFactory('hr'),
|
|
html: createDOMFactory('html'),
|
|
i: createDOMFactory('i'),
|
|
iframe: createDOMFactory('iframe'),
|
|
img: createDOMFactory('img'),
|
|
input: createDOMFactory('input'),
|
|
ins: createDOMFactory('ins'),
|
|
kbd: createDOMFactory('kbd'),
|
|
keygen: createDOMFactory('keygen'),
|
|
label: createDOMFactory('label'),
|
|
legend: createDOMFactory('legend'),
|
|
li: createDOMFactory('li'),
|
|
link: createDOMFactory('link'),
|
|
main: createDOMFactory('main'),
|
|
map: createDOMFactory('map'),
|
|
mark: createDOMFactory('mark'),
|
|
menu: createDOMFactory('menu'),
|
|
menuitem: createDOMFactory('menuitem'),
|
|
meta: createDOMFactory('meta'),
|
|
meter: createDOMFactory('meter'),
|
|
nav: createDOMFactory('nav'),
|
|
noscript: createDOMFactory('noscript'),
|
|
object: createDOMFactory('object'),
|
|
ol: createDOMFactory('ol'),
|
|
optgroup: createDOMFactory('optgroup'),
|
|
option: createDOMFactory('option'),
|
|
output: createDOMFactory('output'),
|
|
p: createDOMFactory('p'),
|
|
param: createDOMFactory('param'),
|
|
picture: createDOMFactory('picture'),
|
|
pre: createDOMFactory('pre'),
|
|
progress: createDOMFactory('progress'),
|
|
q: createDOMFactory('q'),
|
|
rp: createDOMFactory('rp'),
|
|
rt: createDOMFactory('rt'),
|
|
ruby: createDOMFactory('ruby'),
|
|
s: createDOMFactory('s'),
|
|
samp: createDOMFactory('samp'),
|
|
script: createDOMFactory('script'),
|
|
section: createDOMFactory('section'),
|
|
select: createDOMFactory('select'),
|
|
small: createDOMFactory('small'),
|
|
source: createDOMFactory('source'),
|
|
span: createDOMFactory('span'),
|
|
strong: createDOMFactory('strong'),
|
|
style: createDOMFactory('style'),
|
|
sub: createDOMFactory('sub'),
|
|
summary: createDOMFactory('summary'),
|
|
sup: createDOMFactory('sup'),
|
|
table: createDOMFactory('table'),
|
|
tbody: createDOMFactory('tbody'),
|
|
td: createDOMFactory('td'),
|
|
textarea: createDOMFactory('textarea'),
|
|
tfoot: createDOMFactory('tfoot'),
|
|
th: createDOMFactory('th'),
|
|
thead: createDOMFactory('thead'),
|
|
time: createDOMFactory('time'),
|
|
title: createDOMFactory('title'),
|
|
tr: createDOMFactory('tr'),
|
|
track: createDOMFactory('track'),
|
|
u: createDOMFactory('u'),
|
|
ul: createDOMFactory('ul'),
|
|
'var': createDOMFactory('var'),
|
|
video: createDOMFactory('video'),
|
|
wbr: createDOMFactory('wbr'),
|
|
|
|
// SVG
|
|
circle: createDOMFactory('circle'),
|
|
clipPath: createDOMFactory('clipPath'),
|
|
defs: createDOMFactory('defs'),
|
|
ellipse: createDOMFactory('ellipse'),
|
|
g: createDOMFactory('g'),
|
|
image: createDOMFactory('image'),
|
|
line: createDOMFactory('line'),
|
|
linearGradient: createDOMFactory('linearGradient'),
|
|
mask: createDOMFactory('mask'),
|
|
path: createDOMFactory('path'),
|
|
pattern: createDOMFactory('pattern'),
|
|
polygon: createDOMFactory('polygon'),
|
|
polyline: createDOMFactory('polyline'),
|
|
radialGradient: createDOMFactory('radialGradient'),
|
|
rect: createDOMFactory('rect'),
|
|
stop: createDOMFactory('stop'),
|
|
svg: createDOMFactory('svg'),
|
|
text: createDOMFactory('text'),
|
|
tspan: createDOMFactory('tspan')
|
|
};
|
|
|
|
module.exports = ReactDOMFactories;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 249 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactPropTypeLocationNames = {};
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
ReactPropTypeLocationNames = {
|
|
prop: 'prop',
|
|
context: 'context',
|
|
childContext: 'child context'
|
|
};
|
|
}
|
|
|
|
module.exports = ReactPropTypeLocationNames;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 250 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _require = __webpack_require__(19),
|
|
isValidElement = _require.isValidElement;
|
|
|
|
var factory = __webpack_require__(71);
|
|
|
|
module.exports = factory(isValidElement);
|
|
|
|
/***/ }),
|
|
/* 251 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
|
|
|
module.exports = ReactPropTypesSecret;
|
|
|
|
/***/ }),
|
|
/* 252 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
module.exports = '15.6.1';
|
|
|
|
/***/ }),
|
|
/* 253 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(24);
|
|
|
|
var ReactPropTypeLocationNames = __webpack_require__(249);
|
|
var ReactPropTypesSecret = __webpack_require__(251);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var ReactComponentTreeHook;
|
|
|
|
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') {
|
|
// Temporary hack.
|
|
// Inline requires don't work well with Jest:
|
|
// https://github.com/facebook/react/issues/7240
|
|
// Remove the inline requires when we don't need them anymore:
|
|
// https://github.com/facebook/react/pull/7178
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
|
|
var loggedTypeFailures = {};
|
|
|
|
/**
|
|
* Assert that the values match with the type specs.
|
|
* Error messages are memorized and will only be shown once.
|
|
*
|
|
* @param {object} typeSpecs Map of name to a ReactPropType
|
|
* @param {object} values Runtime values that need to be type-checked
|
|
* @param {string} location e.g. "prop", "context", "child context"
|
|
* @param {string} componentName Name of the component for error messages.
|
|
* @param {?object} element The React element that is being type-checked
|
|
* @param {?number} debugID The React component instance that is being type-checked
|
|
* @private
|
|
*/
|
|
function checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) {
|
|
for (var typeSpecName in typeSpecs) {
|
|
if (typeSpecs.hasOwnProperty(typeSpecName)) {
|
|
var error;
|
|
// Prop type validation may throw. In case they do, we don't want to
|
|
// fail the render phase where it didn't fail before. So we log it.
|
|
// After these have been cleaned up, we'll let them throw.
|
|
try {
|
|
// This is intentionally an invariant that gets caught. It's the same
|
|
// behavior as without this statement except with a better message.
|
|
!(typeof typeSpecs[typeSpecName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0;
|
|
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
|
|
} catch (ex) {
|
|
error = ex;
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error === 'undefined' ? 'undefined' : _typeof(error)) : void 0;
|
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
|
// Only monitor this failure once because there tends to be a lot of the
|
|
// same error.
|
|
loggedTypeFailures[error.message] = true;
|
|
|
|
var componentStackInfo = '';
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!ReactComponentTreeHook) {
|
|
ReactComponentTreeHook = __webpack_require__(9);
|
|
}
|
|
if (debugID !== null) {
|
|
componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID);
|
|
} else if (element !== null) {
|
|
componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element);
|
|
}
|
|
}
|
|
|
|
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = checkReactTypeSpec;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 254 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _require = __webpack_require__(101),
|
|
Component = _require.Component;
|
|
|
|
var _require2 = __webpack_require__(19),
|
|
isValidElement = _require2.isValidElement;
|
|
|
|
var ReactNoopUpdateQueue = __webpack_require__(104);
|
|
var factory = __webpack_require__(117);
|
|
|
|
module.exports = factory(Component, isValidElement, ReactNoopUpdateQueue);
|
|
|
|
/***/ }),
|
|
/* 255 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var nextDebugID = 1;
|
|
|
|
function getNextDebugID() {
|
|
return nextDebugID++;
|
|
}
|
|
|
|
module.exports = getNextDebugID;
|
|
|
|
/***/ }),
|
|
/* 256 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
var _prodInvariant = __webpack_require__(24);
|
|
|
|
var ReactElement = __webpack_require__(19);
|
|
|
|
var invariant = __webpack_require__(1);
|
|
|
|
/**
|
|
* Returns the first child in a collection of children and verifies that there
|
|
* is only one child in the collection.
|
|
*
|
|
* See https://facebook.github.io/react/docs/top-level-api.html#react.children.only
|
|
*
|
|
* The current implementation of this function assumes that a single child gets
|
|
* passed without a wrapper, but the purpose of this helper function is to
|
|
* abstract away the particular structure of children.
|
|
*
|
|
* @param {?object} children Child collection structure.
|
|
* @return {ReactElement} The first and only `ReactElement` contained in the
|
|
* structure.
|
|
*/
|
|
function onlyChild(children) {
|
|
!ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React.Children.only expected to receive a single React element child.') : _prodInvariant('143') : void 0;
|
|
return children;
|
|
}
|
|
|
|
module.exports = onlyChild;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 257 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {/**
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _prodInvariant = __webpack_require__(24);
|
|
|
|
var ReactCurrentOwner = __webpack_require__(15);
|
|
var REACT_ELEMENT_TYPE = __webpack_require__(102);
|
|
|
|
var getIteratorFn = __webpack_require__(105);
|
|
var invariant = __webpack_require__(1);
|
|
var KeyEscapeUtils = __webpack_require__(245);
|
|
var warning = __webpack_require__(2);
|
|
|
|
var SEPARATOR = '.';
|
|
var SUBSEPARATOR = ':';
|
|
|
|
/**
|
|
* This is inlined from ReactElement since this file is shared between
|
|
* isomorphic and renderers. We could extract this to a
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* TODO: Test that a single child and an array with one item have the same key
|
|
* pattern.
|
|
*/
|
|
|
|
var didWarnAboutMaps = false;
|
|
|
|
/**
|
|
* Generate a key string that identifies a component within a set.
|
|
*
|
|
* @param {*} component A component that could contain a manual key.
|
|
* @param {number} index Index that is used if a manual key is not provided.
|
|
* @return {string}
|
|
*/
|
|
function getComponentKey(component, index) {
|
|
// Do some typechecking here since we call this blindly. We want to ensure
|
|
// that we don't block potential future ES APIs.
|
|
if (component && (typeof component === 'undefined' ? 'undefined' : _typeof(component)) === 'object' && component.key != null) {
|
|
// Explicit key
|
|
return KeyEscapeUtils.escape(component.key);
|
|
}
|
|
// Implicit key determined by the index in the set
|
|
return index.toString(36);
|
|
}
|
|
|
|
/**
|
|
* @param {?*} children Children tree container.
|
|
* @param {!string} nameSoFar Name of the key path so far.
|
|
* @param {!function} callback Callback to invoke with each child found.
|
|
* @param {?*} traverseContext Used to pass information throughout the traversal
|
|
* process.
|
|
* @return {!number} The number of children in this subtree.
|
|
*/
|
|
function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
|
|
var type = typeof children === 'undefined' ? 'undefined' : _typeof(children);
|
|
|
|
if (type === 'undefined' || type === 'boolean') {
|
|
// All of the above are perceived as null.
|
|
children = null;
|
|
}
|
|
|
|
if (children === null || type === 'string' || type === 'number' ||
|
|
// The following is inlined from ReactElement. This means we can optimize
|
|
// some checks. React Fiber also inlines this logic for similar purposes.
|
|
type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {
|
|
callback(traverseContext, children,
|
|
// If it's the only child, treat the name as if it was wrapped in an array
|
|
// so that it's consistent if the number of children grows.
|
|
nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
|
|
return 1;
|
|
}
|
|
|
|
var child;
|
|
var nextName;
|
|
var subtreeCount = 0; // Count of children found in the current subtree.
|
|
var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
|
|
|
if (Array.isArray(children)) {
|
|
for (var i = 0; i < children.length; i++) {
|
|
child = children[i];
|
|
nextName = nextNamePrefix + getComponentKey(child, i);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
} else {
|
|
var iteratorFn = getIteratorFn(children);
|
|
if (iteratorFn) {
|
|
var iterator = iteratorFn.call(children);
|
|
var step;
|
|
if (iteratorFn !== children.entries) {
|
|
var ii = 0;
|
|
while (!(step = iterator.next()).done) {
|
|
child = step.value;
|
|
nextName = nextNamePrefix + getComponentKey(child, ii++);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var mapsAsChildrenAddendum = '';
|
|
if (ReactCurrentOwner.current) {
|
|
var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();
|
|
if (mapsAsChildrenOwnerName) {
|
|
mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';
|
|
}
|
|
}
|
|
process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;
|
|
didWarnAboutMaps = true;
|
|
}
|
|
// Iterator will provide entry [k,v] tuples rather than values.
|
|
while (!(step = iterator.next()).done) {
|
|
var entry = step.value;
|
|
if (entry) {
|
|
child = entry[1];
|
|
nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);
|
|
subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
|
}
|
|
}
|
|
}
|
|
} else if (type === 'object') {
|
|
var addendum = '';
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';
|
|
if (children._isReactElement) {
|
|
addendum = " It looks like you're using an element created by a different " + 'version of React. Make sure to use only one copy of React.';
|
|
}
|
|
if (ReactCurrentOwner.current) {
|
|
var name = ReactCurrentOwner.current.getName();
|
|
if (name) {
|
|
addendum += ' Check the render method of `' + name + '`.';
|
|
}
|
|
}
|
|
}
|
|
var childrenString = String(children);
|
|
true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;
|
|
}
|
|
}
|
|
|
|
return subtreeCount;
|
|
}
|
|
|
|
/**
|
|
* Traverses children that are typically specified as `props.children`, but
|
|
* might also be specified through attributes:
|
|
*
|
|
* - `traverseAllChildren(this.props.children, ...)`
|
|
* - `traverseAllChildren(this.props.leftPanelChildren, ...)`
|
|
*
|
|
* The `traverseContext` is an optional argument that is passed through the
|
|
* entire traversal. It can be used to store accumulations or anything else that
|
|
* the callback might find relevant.
|
|
*
|
|
* @param {?*} children Children tree object.
|
|
* @param {!function} callback To invoke upon traversing each child.
|
|
* @param {?*} traverseContext Context for traversal.
|
|
* @return {!number} The number of children in this subtree.
|
|
*/
|
|
function traverseAllChildren(children, callback, traverseContext) {
|
|
if (children == null) {
|
|
return 0;
|
|
}
|
|
|
|
return traverseAllChildrenImpl(children, '', callback, traverseContext);
|
|
}
|
|
|
|
module.exports = traverseAllChildren;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 258 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = applyMiddleware;
|
|
|
|
var _compose = __webpack_require__(106);
|
|
|
|
var _compose2 = _interopRequireDefault(_compose);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}return target;
|
|
};
|
|
|
|
/**
|
|
* Creates a store enhancer that applies middleware to the dispatch method
|
|
* of the Redux store. This is handy for a variety of tasks, such as expressing
|
|
* asynchronous actions in a concise manner, or logging every action payload.
|
|
*
|
|
* See `redux-thunk` package as an example of the Redux middleware.
|
|
*
|
|
* Because middleware is potentially asynchronous, this should be the first
|
|
* store enhancer in the composition chain.
|
|
*
|
|
* Note that each middleware will be given the `dispatch` and `getState` functions
|
|
* as named arguments.
|
|
*
|
|
* @param {...Function} middlewares The middleware chain to be applied.
|
|
* @returns {Function} A store enhancer applying the middleware.
|
|
*/
|
|
function applyMiddleware() {
|
|
for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
|
|
middlewares[_key] = arguments[_key];
|
|
}
|
|
|
|
return function (createStore) {
|
|
return function (reducer, preloadedState, enhancer) {
|
|
var store = createStore(reducer, preloadedState, enhancer);
|
|
var _dispatch = store.dispatch;
|
|
var chain = [];
|
|
|
|
var middlewareAPI = {
|
|
getState: store.getState,
|
|
dispatch: function dispatch(action) {
|
|
return _dispatch(action);
|
|
}
|
|
};
|
|
chain = middlewares.map(function (middleware) {
|
|
return middleware(middlewareAPI);
|
|
});
|
|
_dispatch = _compose2.default.apply(undefined, chain)(store.dispatch);
|
|
|
|
return _extends({}, store, {
|
|
dispatch: _dispatch
|
|
});
|
|
};
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
/* 259 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.default = bindActionCreators;
|
|
function bindActionCreator(actionCreator, dispatch) {
|
|
return function () {
|
|
return dispatch(actionCreator.apply(undefined, arguments));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Turns an object whose values are action creators, into an object with the
|
|
* same keys, but with every function wrapped into a `dispatch` call so they
|
|
* may be invoked directly. This is just a convenience method, as you can call
|
|
* `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
|
|
*
|
|
* For convenience, you can also pass a single function as the first argument,
|
|
* and get a function in return.
|
|
*
|
|
* @param {Function|Object} actionCreators An object whose values are action
|
|
* creator functions. One handy way to obtain it is to use ES6 `import * as`
|
|
* syntax. You may also pass a single function.
|
|
*
|
|
* @param {Function} dispatch The `dispatch` function available on your Redux
|
|
* store.
|
|
*
|
|
* @returns {Function|Object} The object mimicking the original object, but with
|
|
* every action creator wrapped into the `dispatch` call. If you passed a
|
|
* function as `actionCreators`, the return value will also be a single
|
|
* function.
|
|
*/
|
|
function bindActionCreators(actionCreators, dispatch) {
|
|
if (typeof actionCreators === 'function') {
|
|
return bindActionCreator(actionCreators, dispatch);
|
|
}
|
|
|
|
if ((typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) !== 'object' || actionCreators === null) {
|
|
throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');
|
|
}
|
|
|
|
var keys = Object.keys(actionCreators);
|
|
var boundActionCreators = {};
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
var actionCreator = actionCreators[key];
|
|
if (typeof actionCreator === 'function') {
|
|
boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
|
|
}
|
|
}
|
|
return boundActionCreators;
|
|
}
|
|
|
|
/***/ }),
|
|
/* 260 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(process) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = combineReducers;
|
|
|
|
var _createStore = __webpack_require__(107);
|
|
|
|
var _isPlainObject = __webpack_require__(43);
|
|
|
|
var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
|
|
|
|
var _warning = __webpack_require__(108);
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getUndefinedStateErrorMessage(key, action) {
|
|
var actionType = action && action.type;
|
|
var actionName = actionType && '"' + actionType.toString() + '"' || 'an action';
|
|
|
|
return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state.';
|
|
}
|
|
|
|
function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {
|
|
var reducerKeys = Object.keys(reducers);
|
|
var argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';
|
|
|
|
if (reducerKeys.length === 0) {
|
|
return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';
|
|
}
|
|
|
|
if (!(0, _isPlainObject2.default)(inputState)) {
|
|
return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"');
|
|
}
|
|
|
|
var unexpectedKeys = Object.keys(inputState).filter(function (key) {
|
|
return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];
|
|
});
|
|
|
|
unexpectedKeys.forEach(function (key) {
|
|
unexpectedKeyCache[key] = true;
|
|
});
|
|
|
|
if (unexpectedKeys.length > 0) {
|
|
return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.');
|
|
}
|
|
}
|
|
|
|
function assertReducerSanity(reducers) {
|
|
Object.keys(reducers).forEach(function (key) {
|
|
var reducer = reducers[key];
|
|
var initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT });
|
|
|
|
if (typeof initialState === 'undefined') {
|
|
throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.');
|
|
}
|
|
|
|
var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');
|
|
if (typeof reducer(undefined, { type: type }) === 'undefined') {
|
|
throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.');
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Turns an object whose values are different reducer functions, into a single
|
|
* reducer function. It will call every child reducer, and gather their results
|
|
* into a single state object, whose keys correspond to the keys of the passed
|
|
* reducer functions.
|
|
*
|
|
* @param {Object} reducers An object whose values correspond to different
|
|
* reducer functions that need to be combined into one. One handy way to obtain
|
|
* it is to use ES6 `import * as reducers` syntax. The reducers may never return
|
|
* undefined for any action. Instead, they should return their initial state
|
|
* if the state passed to them was undefined, and the current state for any
|
|
* unrecognized action.
|
|
*
|
|
* @returns {Function} A reducer function that invokes every reducer inside the
|
|
* passed object, and builds a state object with the same shape.
|
|
*/
|
|
function combineReducers(reducers) {
|
|
var reducerKeys = Object.keys(reducers);
|
|
var finalReducers = {};
|
|
for (var i = 0; i < reducerKeys.length; i++) {
|
|
var key = reducerKeys[i];
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (typeof reducers[key] === 'undefined') {
|
|
(0, _warning2.default)('No reducer provided for key "' + key + '"');
|
|
}
|
|
}
|
|
|
|
if (typeof reducers[key] === 'function') {
|
|
finalReducers[key] = reducers[key];
|
|
}
|
|
}
|
|
var finalReducerKeys = Object.keys(finalReducers);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var unexpectedKeyCache = {};
|
|
}
|
|
|
|
var sanityError;
|
|
try {
|
|
assertReducerSanity(finalReducers);
|
|
} catch (e) {
|
|
sanityError = e;
|
|
}
|
|
|
|
return function combination() {
|
|
var state = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
|
var action = arguments[1];
|
|
|
|
if (sanityError) {
|
|
throw sanityError;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);
|
|
if (warningMessage) {
|
|
(0, _warning2.default)(warningMessage);
|
|
}
|
|
}
|
|
|
|
var hasChanged = false;
|
|
var nextState = {};
|
|
for (var i = 0; i < finalReducerKeys.length; i++) {
|
|
var key = finalReducerKeys[i];
|
|
var reducer = finalReducers[key];
|
|
var previousStateForKey = state[key];
|
|
var nextStateForKey = reducer(previousStateForKey, action);
|
|
if (typeof nextStateForKey === 'undefined') {
|
|
var errorMessage = getUndefinedStateErrorMessage(key, action);
|
|
throw new Error(errorMessage);
|
|
}
|
|
nextState[key] = nextStateForKey;
|
|
hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
|
|
}
|
|
return hasChanged ? nextState : state;
|
|
};
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
|
|
|
/***/ }),
|
|
/* 261 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var isAbsolute = function isAbsolute(pathname) {
|
|
return pathname.charAt(0) === '/';
|
|
};
|
|
|
|
// About 1.5x faster than the two-arg version of Array#splice()
|
|
var spliceOne = function spliceOne(list, index) {
|
|
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
|
|
list[i] = list[k];
|
|
}list.pop();
|
|
};
|
|
|
|
// This implementation is based heavily on node's url.parse
|
|
var resolvePathname = function resolvePathname(to) {
|
|
var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
|
|
var toParts = to && to.split('/') || [];
|
|
var fromParts = from && from.split('/') || [];
|
|
|
|
var isToAbs = to && isAbsolute(to);
|
|
var isFromAbs = from && isAbsolute(from);
|
|
var mustEndAbs = isToAbs || isFromAbs;
|
|
|
|
if (to && isAbsolute(to)) {
|
|
// to is absolute
|
|
fromParts = toParts;
|
|
} else if (toParts.length) {
|
|
// to is relative, drop the filename
|
|
fromParts.pop();
|
|
fromParts = fromParts.concat(toParts);
|
|
}
|
|
|
|
if (!fromParts.length) return '/';
|
|
|
|
var hasTrailingSlash = void 0;
|
|
if (fromParts.length) {
|
|
var last = fromParts[fromParts.length - 1];
|
|
hasTrailingSlash = last === '.' || last === '..' || last === '';
|
|
} else {
|
|
hasTrailingSlash = false;
|
|
}
|
|
|
|
var up = 0;
|
|
for (var i = fromParts.length; i >= 0; i--) {
|
|
var part = fromParts[i];
|
|
|
|
if (part === '.') {
|
|
spliceOne(fromParts, i);
|
|
} else if (part === '..') {
|
|
spliceOne(fromParts, i);
|
|
up++;
|
|
} else if (up) {
|
|
spliceOne(fromParts, i);
|
|
up--;
|
|
}
|
|
}
|
|
|
|
if (!mustEndAbs) for (; up--; up) {
|
|
fromParts.unshift('..');
|
|
}if (mustEndAbs && fromParts[0] !== '' && (!fromParts[0] || !isAbsolute(fromParts[0]))) fromParts.unshift('');
|
|
|
|
var result = fromParts.join('/');
|
|
|
|
if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';
|
|
|
|
return result;
|
|
};
|
|
|
|
module.exports = resolvePathname;
|
|
|
|
/***/ }),
|
|
/* 262 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = __webpack_require__(263);
|
|
|
|
/***/ }),
|
|
/* 263 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(global, module) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _ponyfill = __webpack_require__(264);
|
|
|
|
var _ponyfill2 = _interopRequireDefault(_ponyfill);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : { 'default': obj };
|
|
}
|
|
|
|
var root; /* global window */
|
|
|
|
if (typeof self !== 'undefined') {
|
|
root = self;
|
|
} else if (typeof window !== 'undefined') {
|
|
root = window;
|
|
} else if (typeof global !== 'undefined') {
|
|
root = global;
|
|
} else if (true) {
|
|
root = module;
|
|
} else {
|
|
root = Function('return this')();
|
|
}
|
|
|
|
var result = (0, _ponyfill2['default'])(root);
|
|
exports['default'] = result;
|
|
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(109), __webpack_require__(266)(module)))
|
|
|
|
/***/ }),
|
|
/* 264 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports['default'] = symbolObservablePonyfill;
|
|
function symbolObservablePonyfill(root) {
|
|
var result;
|
|
var _Symbol = root.Symbol;
|
|
|
|
if (typeof _Symbol === 'function') {
|
|
if (_Symbol.observable) {
|
|
result = _Symbol.observable;
|
|
} else {
|
|
result = _Symbol('observable');
|
|
_Symbol.observable = result;
|
|
}
|
|
} else {
|
|
result = '@@observable';
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 265 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
|
|
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
} : function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
|
|
};
|
|
|
|
var valueEqual = function valueEqual(a, b) {
|
|
if (a === b) return true;
|
|
|
|
if (a == null || b == null) return false;
|
|
|
|
if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every(function (item, index) {
|
|
return valueEqual(item, b[index]);
|
|
});
|
|
|
|
var aType = typeof a === 'undefined' ? 'undefined' : _typeof(a);
|
|
var bType = typeof b === 'undefined' ? 'undefined' : _typeof(b);
|
|
|
|
if (aType !== bType) return false;
|
|
|
|
if (aType === 'object') {
|
|
var aValue = a.valueOf();
|
|
var bValue = b.valueOf();
|
|
|
|
if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);
|
|
|
|
var aKeys = Object.keys(a);
|
|
var bKeys = Object.keys(b);
|
|
|
|
if (aKeys.length !== bKeys.length) return false;
|
|
|
|
return aKeys.every(function (key) {
|
|
return valueEqual(a[key], b[key]);
|
|
});
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
exports.default = valueEqual;
|
|
|
|
/***/ }),
|
|
/* 266 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = function (module) {
|
|
if (!module.webpackPolyfill) {
|
|
module.deprecate = function () {};
|
|
module.paths = [];
|
|
// module.parent = undefined by default
|
|
if (!module.children) module.children = [];
|
|
Object.defineProperty(module, "loaded", {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return module.l;
|
|
}
|
|
});
|
|
Object.defineProperty(module, "id", {
|
|
enumerable: true,
|
|
get: function get() {
|
|
return module.i;
|
|
}
|
|
});
|
|
module.webpackPolyfill = 1;
|
|
}
|
|
return module;
|
|
};
|
|
|
|
/***/ }),
|
|
/* 267 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _reactFileInput = __webpack_require__(215);
|
|
|
|
var _reactFileInput2 = _interopRequireDefault(_reactFileInput);
|
|
|
|
var _itemList = __webpack_require__(31);
|
|
|
|
var _itemList2 = _interopRequireDefault(_itemList);
|
|
|
|
var _getPath = __webpack_require__(111);
|
|
|
|
var _getPath2 = _interopRequireDefault(_getPath);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getFiles(fs) {
|
|
return fs.filter(function (item) {
|
|
return item.type === 'file';
|
|
});
|
|
}
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
title: 'Files',
|
|
items: getFiles((0, _getPath2.default)(state)),
|
|
headerExtras: _react2.default.createElement('input', { className: 'files-upload', type: 'file' })
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, function () {
|
|
return {};
|
|
})(_itemList2.default);
|
|
|
|
/***/ }),
|
|
/* 268 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _itemList = __webpack_require__(31);
|
|
|
|
var _itemList2 = _interopRequireDefault(_itemList);
|
|
|
|
var _getPath = __webpack_require__(111);
|
|
|
|
var _getPath2 = _interopRequireDefault(_getPath);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getFolders(fs) {
|
|
return fs.filter(function (item) {
|
|
return item.type === 'folder';
|
|
});
|
|
}
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
title: 'Folders',
|
|
items: getFolders((0, _getPath2.default)(state), state.currentPath),
|
|
headerExtras: _react2.default.createElement('span', { className: 'fa fa-folder' })
|
|
};
|
|
};
|
|
|
|
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|
return {
|
|
handleItemClick: function handleItemClick(path) {
|
|
dispatch({
|
|
type: 'navigate-to',
|
|
payload: { path: path }
|
|
});
|
|
}
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_itemList2.default);
|
|
|
|
/***/ }),
|
|
/* 269 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var iconMap = {
|
|
file: 'acrobat-file',
|
|
folder: 'shared1',
|
|
music: 'music',
|
|
picture: 'photos',
|
|
shared: 'shared1'
|
|
};
|
|
|
|
function getImagePath(item) {
|
|
if (item.backgroundImage || item.type === 'picture') {
|
|
return './images/' + (item.backgroundImage || item.title);
|
|
}
|
|
return './icons/text-file.png';
|
|
}
|
|
|
|
function createClickHandler(handleClick) {
|
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
return function (e) {
|
|
e.preventDefault();
|
|
handleClick.apply(null, args);
|
|
};
|
|
}
|
|
|
|
var Item = function Item(_ref) {
|
|
var item = _ref.item,
|
|
selectMode = _ref.selectMode,
|
|
handleClick = _ref.handleClick,
|
|
currentPath = _ref.currentPath;
|
|
|
|
|
|
var icon = iconMap[item.type];
|
|
var elementStyle = {
|
|
backgroundImage: 'url(' + getImagePath(item) + ')',
|
|
backgroundRepeat: 'no-repeat',
|
|
backgroundSize: 'contain'
|
|
};
|
|
|
|
return _react2.default.createElement(
|
|
'a',
|
|
{ href: '#', onClick: selectMode ? function () {} : createClickHandler(handleClick, currentPath + '/' + item.title) },
|
|
_react2.default.createElement(
|
|
'label',
|
|
{ className: 'files-content-item' + (selectMode && item.selected ? ' files-content-item--selected' : ''), htmlFor: 'chk-' + item.title.split('.')[0] },
|
|
_react2.default.createElement('div', { className: 'image-placeholder', style: elementStyle }),
|
|
_react2.default.createElement(
|
|
'p',
|
|
null,
|
|
selectMode ? _react2.default.createElement('input', { type: 'checkbox', id: 'chk-' + item.title.split('.')[0] }) : _react2.default.createElement('img', { src: '/icons/' + icon + '.png' }),
|
|
item.title
|
|
)
|
|
)
|
|
);
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(function (state) {
|
|
return { currentPath: state.currentPath };
|
|
}, function () {
|
|
return {};
|
|
})(Item);
|
|
|
|
/***/ }),
|
|
/* 270 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _itemList = __webpack_require__(31);
|
|
|
|
var _itemList2 = _interopRequireDefault(_itemList);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getMusic(fs) {
|
|
return fs.filter(function (item) {
|
|
return item.type === 'music';
|
|
});
|
|
}
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
title: 'Music',
|
|
items: getMusic(state.filesystem.contents)
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, function () {
|
|
return {};
|
|
})(_itemList2.default);
|
|
|
|
/***/ }),
|
|
/* 271 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _itemList = __webpack_require__(31);
|
|
|
|
var _itemList2 = _interopRequireDefault(_itemList);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getPhotos(fs) {
|
|
return fs.filter(function (item) {
|
|
return item.type === 'picture';
|
|
});
|
|
}
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
title: 'Photos',
|
|
items: getPhotos(state.filesystem.contents)
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, function () {
|
|
return {};
|
|
})(_itemList2.default);
|
|
|
|
/***/ }),
|
|
/* 272 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _itemList = __webpack_require__(31);
|
|
|
|
var _itemList2 = _interopRequireDefault(_itemList);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getShared(fs) {
|
|
return fs.filter(function (item) {
|
|
return item.type === 'shared';
|
|
});
|
|
}
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
title: 'Shared',
|
|
items: getShared(state.filesystem.contents)
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, function () {
|
|
return {};
|
|
})(_itemList2.default);
|
|
|
|
/***/ }),
|
|
/* 273 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var Breadcrumbs = function Breadcrumbs(_ref) {
|
|
var currentPath = _ref.currentPath,
|
|
handleClick = _ref.handleClick;
|
|
|
|
var crumbs = [];
|
|
|
|
function createClickHandler(path) {
|
|
return function (e) {
|
|
e.preventDefault();
|
|
return handleClick(path);
|
|
};
|
|
}
|
|
|
|
if (currentPath) {
|
|
var currentLink = [''];
|
|
crumbs = currentPath.split('/').slice(1).map(function (crumb, idx) {
|
|
currentLink.push(crumb);
|
|
|
|
return _react2.default.createElement(
|
|
'li',
|
|
{ key: idx + 1 },
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '', onClick: createClickHandler(currentLink.join('/')) },
|
|
crumb,
|
|
' ',
|
|
_react2.default.createElement('span', { className: 'fa fa-ellipsis-h', 'aria-hidden': 'true' })
|
|
)
|
|
);
|
|
});
|
|
}
|
|
return _react2.default.createElement(
|
|
'ol',
|
|
{ className: 'breadcrumb' },
|
|
_react2.default.createElement(
|
|
'li',
|
|
{ key: 0 },
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '', onClick: createClickHandler('') },
|
|
'Home ',
|
|
_react2.default.createElement('span', { className: 'fa fa-ellipsis-h', 'aria-hidden': 'true' })
|
|
)
|
|
),
|
|
crumbs
|
|
);
|
|
};
|
|
|
|
var mapStateToProps = function mapStateToProps(state) {
|
|
return {
|
|
currentPath: state.currentPath
|
|
};
|
|
};
|
|
|
|
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|
return {
|
|
handleClick: function handleClick(path) {
|
|
dispatch({ type: 'navigate-to', payload: { path: path } });
|
|
}
|
|
};
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(Breadcrumbs);
|
|
|
|
/***/ }),
|
|
/* 274 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var DisplayMenu = function DisplayMenu() {
|
|
'use strict';
|
|
|
|
return _react2.default.createElement(
|
|
'div',
|
|
{ className: 'display-menu' },
|
|
_react2.default.createElement(
|
|
'span',
|
|
{ className: 'sort' },
|
|
'Sort'
|
|
),
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'dropdown' },
|
|
_react2.default.createElement(
|
|
'button',
|
|
{ className: 'btn btn-default dropdown-toggle', type: 'button', id: 'dropdownMenu1', 'data-toggle': '.dropdown', 'aria-haspopup': 'true', 'aria-expanded': 'true' },
|
|
'Name (Descending)',
|
|
_react2.default.createElement('span', { className: 'caret' })
|
|
),
|
|
_react2.default.createElement(
|
|
'ul',
|
|
{ className: 'dropdown-menu', 'aria-labelledby': 'dropdownMenu1' },
|
|
_react2.default.createElement(
|
|
'li',
|
|
null,
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '#' },
|
|
'Action'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'li',
|
|
null,
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '#' },
|
|
'Another action'
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'li',
|
|
null,
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '#' },
|
|
'Something else here'
|
|
)
|
|
),
|
|
_react2.default.createElement('li', { role: 'separator', className: 'divider' }),
|
|
_react2.default.createElement(
|
|
'li',
|
|
null,
|
|
_react2.default.createElement(
|
|
'a',
|
|
{ href: '#' },
|
|
'Separated link'
|
|
)
|
|
)
|
|
)
|
|
),
|
|
_react2.default.createElement(
|
|
'button',
|
|
{ className: 'viewstyle-left viewstyle-active' },
|
|
_react2.default.createElement('span', { className: 'fa fa-th' })
|
|
),
|
|
_react2.default.createElement(
|
|
'button',
|
|
{ className: 'viewstyle-right viewstyle-inactive' },
|
|
_react2.default.createElement('span', { className: 'fa fa-list-ul' })
|
|
)
|
|
);
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(function () {
|
|
return {};
|
|
}, function () {
|
|
return {};
|
|
})(DisplayMenu);
|
|
|
|
/***/ }),
|
|
/* 275 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var TopNav = function TopNav(_ref) {
|
|
var querystring = _ref.querystring,
|
|
searchByQuery = _ref.searchByQuery;
|
|
|
|
return _react2.default.createElement(
|
|
'div',
|
|
{ className: 'header' },
|
|
_react2.default.createElement(
|
|
'form',
|
|
{ className: 'navbar-form navbar-left', onSubmit: searchByQuery },
|
|
_react2.default.createElement(
|
|
'div',
|
|
{ className: 'form-group' },
|
|
_react2.default.createElement('input', { type: 'text', className: 'form-control', placeholder: 'Search', value: querystring }),
|
|
_react2.default.createElement('input', { type: 'submit', className: 'btn btn-default navbar-btn', value: 'Select' })
|
|
)
|
|
)
|
|
);
|
|
};
|
|
|
|
exports.default = (0, _reactRedux.connect)(function () {
|
|
return {};
|
|
}, function () {
|
|
return {};
|
|
})(TopNav);
|
|
|
|
/***/ }),
|
|
/* 276 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _react = __webpack_require__(4);
|
|
|
|
var _react2 = _interopRequireDefault(_react);
|
|
|
|
var _reactDom = __webpack_require__(112);
|
|
|
|
var _redux = __webpack_require__(64);
|
|
|
|
var _reactRedux = __webpack_require__(13);
|
|
|
|
var _reactRouterDom = __webpack_require__(113);
|
|
|
|
var _main = __webpack_require__(114);
|
|
|
|
var _main2 = _interopRequireDefault(_main);
|
|
|
|
var _menu = __webpack_require__(115);
|
|
|
|
var _menu2 = _interopRequireDefault(_menu);
|
|
|
|
var _main3 = __webpack_require__(116);
|
|
|
|
var _main4 = _interopRequireDefault(_main3);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
(0, _reactDom.render)(_react2.default.createElement(
|
|
_reactRedux.Provider,
|
|
{ store: (0, _redux.createStore)(_main4.default) },
|
|
_react2.default.createElement(
|
|
_reactRouterDom.HashRouter,
|
|
null,
|
|
_react2.default.createElement(
|
|
_reactRouterDom.Switch,
|
|
null,
|
|
_react2.default.createElement(_reactRouterDom.Route, { component: _menu2.default, path: '/menu' }),
|
|
_react2.default.createElement(_reactRouterDom.Route, { component: _main2.default, path: '/' })
|
|
)
|
|
)
|
|
), document.getElementById('main'));
|
|
|
|
/***/ }),
|
|
/* 277 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = {
|
|
currentPath: '',
|
|
filesystem: {
|
|
contents: [{
|
|
contents: [{
|
|
contents: [{
|
|
contents: [],
|
|
title: '2016.12.14journal.doc',
|
|
date: '2016.12.14',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}],
|
|
backgroundImage: 'folder2.png',
|
|
title: 'Folder 2',
|
|
date: '2016.12.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: '2016.12.14journal.doc',
|
|
date: '2016.12.14',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}],
|
|
backgroundImage: 'folder1.png',
|
|
title: 'Final Papers',
|
|
date: '2016.12.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [{
|
|
contents: [],
|
|
title: '2016.12.14journal.doc',
|
|
date: '2016.12.14',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}],
|
|
backgroundImage: 'folder2.png',
|
|
title: 'Group Projects',
|
|
date: '2016.12.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
backgroundImage: 'folder3.png',
|
|
title: 'Family Memories',
|
|
date: '2016.12.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
backgroundImage: 'folder4.png',
|
|
title: 'Winter Vacation',
|
|
date: '2017.1.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
backgroundImage: 'folder5.png',
|
|
title: 'Nature Pics',
|
|
date: '2017.1.24',
|
|
type: 'folder',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: false
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0145.png',
|
|
date: '2016.12.24',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0146.png',
|
|
date: '2016.12.25',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0147.png',
|
|
date: '2016.12.25',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrchristmaspresent.png',
|
|
date: '2016.12.25',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrawkwardfam.png',
|
|
date: '2016.12.27',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0150.png',
|
|
date: '2016.12.30',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrbluesteelman.png',
|
|
date: '2017.01.02',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0152.png',
|
|
date: '2017.01.02',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0153.png',
|
|
date: '2017.01.06',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrchristmaspresent.png',
|
|
date: '2017.01.07',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0148.png',
|
|
date: '2017.01.25',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrcountryroad.png',
|
|
date: '2017.01.25',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'sqrdeptstore.png',
|
|
date: '2017.02.02',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0158.png',
|
|
date: '2017.02.05',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0159.png',
|
|
date: '2017.02.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0160.png',
|
|
date: '2017.02.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0161.png',
|
|
date: '2017.12.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0162.png',
|
|
date: '2017.02.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0163.png',
|
|
date: '2017.02.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
contents: [],
|
|
title: 'IMG_0164.png',
|
|
date: '2017.02.14',
|
|
type: 'picture',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0149.png',
|
|
contents: [],
|
|
title: '2016.12.14journal.doc',
|
|
date: '2016.12.14',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0154.png',
|
|
contents: [],
|
|
title: '2016.12.28journal.doc',
|
|
date: '2016.12.28',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0155.png',
|
|
contents: [],
|
|
title: '2017.1.1journal.doc',
|
|
date: '2017.01.01',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0149.png',
|
|
contents: [],
|
|
title: '2017.1.2journal.doc',
|
|
date: '2017.01.02',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0157.png',
|
|
contents: [],
|
|
title: '2017.1.11journal.doc',
|
|
date: '2017.01.11',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0154.png',
|
|
contents: [],
|
|
title: '2017.1.14journal.doc',
|
|
date: '2017.01.14',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0151.png',
|
|
contents: [],
|
|
title: '2017.1.15journal.doc',
|
|
date: '2017.01.15',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0149.png',
|
|
contents: [],
|
|
title: '2017.1.16journal.doc',
|
|
date: '2017.01.16',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: false,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0155.png',
|
|
contents: [],
|
|
title: 'econ457finalnotes.doc',
|
|
date: '2016.12.16',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0157.png',
|
|
contents: [],
|
|
title: 'drknitzclassnotes.doc',
|
|
date: '2016.12.01',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0154.png',
|
|
contents: [],
|
|
title: 'psychsyllabus.doc',
|
|
date: '2017.01.08',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0157.png',
|
|
contents: [],
|
|
title: 'geog101syllabus.doc',
|
|
date: '2017.01.06',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0149.png',
|
|
contents: [],
|
|
title: 'econ458syllabus.doc',
|
|
date: '2017.01.06',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}, {
|
|
backgroundImage: 'IMG_0151.png',
|
|
contents: [],
|
|
title: 'econ458presentationplan.doc',
|
|
date: '2017.01.19',
|
|
type: 'file',
|
|
visibility: {
|
|
owner: true,
|
|
anon: false,
|
|
usergroup: true,
|
|
specificUser: true
|
|
}
|
|
}],
|
|
currentPath: ''
|
|
} };
|
|
|
|
/***/ })
|
|
/******/ ]);
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNDg5MWNmNWI1ZThhZTEyNDI2YTciLCJ3ZWJwYWNrOi8vLy4vfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi93YXJuaW5nLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9yZWFjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50VHJlZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50LmpzIiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvZW1wdHlGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0cnVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXIvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yZWR1eC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNFdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1Bvb2xlZENsYXNzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1JlYWN0RWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3dhcm5pbmcvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvRE9NTGF6eVRyZWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9SZWFjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9oaXN0b3J5L1BhdGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L2ludmFyaWFudC9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpbkh1Yi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvRXZlbnRQcm9wYWdhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0YW5jZU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljVUlFdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jb250ZW50L2l0ZW0tbGlzdC5qc3giLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9lbXB0eU9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvRXZlbnRQbHVnaW5SZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9UcmFuc2FjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9zZXRJbm5lckhUTUwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvY2FuRGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9zaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9oaXN0b3J5L0xvY2F0aW9uVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9oaXN0b3J5L2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoLWVzL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9ET01OYW1lc3BhY2VzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblV0aWxzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9LZXlFc2NhcGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvTGlua2VkVmFsdWVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFcnJvclV0aWxzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdFVwZGF0ZVF1ZXVlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9nZXRFdmVudENoYXJDb2RlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9nZXRFdmVudE1vZGlmaWVyU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2dldEV2ZW50VGFyZ2V0LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9pc0V2ZW50U3VwcG9ydGVkLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvdmFsaWRhdGVET01OZXN0aW5nLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci9lcy9Sb3V0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXIvZXMvbWF0Y2hQYXRoLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL2xvd1ByaW9yaXR5V2FybmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlZHV4L2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2ZvY3VzTm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9oaXN0b3J5L0RPTVV0aWxzLmpzIiwid2VicGFjazovLy8uL34vaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gtZXMvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvZmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9DYWxsYmFja1F1ZXVlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdEVtcHR5Q29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdEZlYXR1cmVGbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RIb3N0Q29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdElucHV0U2VsZWN0aW9uLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdE1vdW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdE5vZGVUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1ZpZXdwb3J0TWV0cmljcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvYWNjdW11bGF0ZUludG8uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2ZvckVhY2hBY2N1bXVsYXRlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2dldFRleHRDb250ZW50QWNjZXNzb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2lucHV0VmFsdWVUcmFja2luZy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvaXNUZXh0SW5wdXRFbGVtZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9zZXRUZXh0Q29udGVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtcmVkdXgvZXMvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL3V0aWxzL1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9MaW5rLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyL2VzL1JvdXRlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1JlYWN0QmFzZUNsYXNzZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1JlYWN0RWxlbWVudFZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9SZWFjdE5vb3BVcGRhdGVRdWV1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9nZXRJdGVyYXRvckZuLmpzIiwid2VicGFjazovLy8uL34vcmVkdXgvZXMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlZHV4L2VzL2NyZWF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL34vcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vYm90dG9tLW5hdi5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWwvZ2V0UGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbWFpbi5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9tZW51LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVkdWNlcnMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NyZWF0ZS1yZWFjdC1jbGFzcy9mYWN0b3J5LmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvY2FtZWxpemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2NvbnRhaW5zTm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2NyZWF0ZUFycmF5RnJvbU1peGVkLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvY3JlYXRlTm9kZXNGcm9tTWFya3VwLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvZ2V0TWFya3VwV3JhcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2dldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvaHlwaGVuYXRlLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvaHlwaGVuYXRlU3R5bGVOYW1lLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvaXNOb2RlLmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvaXNUZXh0Tm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL21lbW9pemVTdHJpbmdPbmx5LmpzIiwid2VicGFjazovLy8uL34vZmJqcy9saWIvcGVyZm9ybWFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9wZXJmb3JtYW5jZU5vdy5qcyIsIndlYnBhY2s6Ly8vLi9+L2hpc3RvcnkvY3JlYXRlQnJvd3Nlckhpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9oaXN0b3J5L2NyZWF0ZUhhc2hIaXN0b3J5LmpzIiwid2VicGFjazovLy8uL34vaGlzdG9yeS9jcmVhdGVNZW1vcnlIaXN0b3J5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoLWVzL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoLWVzL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoLWVzL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gtZXMvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC1lcy9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gtZXMvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gtZXMvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gtZXMvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9BUklBRE9NUHJvcGVydHlDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL0F1dG9Gb2N1c1V0aWxzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eU9wZXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL0NoYW5nZUV2ZW50UGx1Z2luLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9EYW5nZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9FbnRlckxlYXZlRXZlbnRQbHVnaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvSFRNTERPTVByb3BlcnR5Q29uZmlnLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdENoaWxkUmVjb25jaWxlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29udGFpbmVySW5mby5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01FbXB0eUNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01GZWF0dXJlRmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NSURPcGVyYXRpb25zLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUlucHV0LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUludmFsaWRBUklBSG9vay5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTU9wdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01TZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01UZXh0YXJlYS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVyc2FsLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RGVidWdUb29sLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRJbmplY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudEVtaXR0ZXJNaXhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudExpc3RlbmVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0TWFya3VwQ2hlY2tzdW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0TXVsdGlDaGlsZC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RPd25lci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1JlYWN0UmVmLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9SZWFjdFZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TZWxlY3RFdmVudFBsdWdpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvU2ltcGxlRXZlbnRQbHVnaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDbGlwYm9hcmRFdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljRHJhZ0V2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNJbnB1dEV2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNLZXlib2FyZEV2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNUb3VjaEV2ZW50LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1doZWVsRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvZmluZERPTU5vZGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2ZsYXR0ZW5DaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRLZXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1kb20vbGliL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtZG9tL2xpYi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWRvbS9saWIvcmVuZGVyU3VidHJlZUludG9Db250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1maWxlLWlucHV0L2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L2Nvbm5lY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJlZHV4L2VzL3V0aWxzL3NoYWxsb3dFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvQnJvd3NlclJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvSGFzaFJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvTWVtb3J5Um91dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9OYXZMaW5rLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9Qcm9tcHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXItZG9tL2VzL1JlZGlyZWN0LmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9Sb3V0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvUm91dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9TdGF0aWNSb3V0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXItZG9tL2VzL1N3aXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvbWF0Y2hQYXRoLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyLWRvbS9lcy93aXRoUm91dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyL2VzL01lbW9yeVJvdXRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci9lcy9Qcm9tcHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXIvZXMvUmVkaXJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1yb3V0ZXIvZXMvU3RhdGljUm91dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyL2VzL1N3aXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci9lcy93aXRoUm91dGVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qtcm91dGVyL34vaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LXJvdXRlci9+L3BhdGgtdG8tcmVnZXhwL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL0tleUVzY2FwZVV0aWxzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1Bvb2xlZENsYXNzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL1JlYWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RET01GYWN0b3JpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RWZXJzaW9uLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9vbmx5Q2hpbGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlZHV4L2VzL2FwcGx5TWlkZGxld2FyZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlZHV4L2VzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlZHV4L2VzL2NvbWJpbmVSZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9+L3Jlc29sdmUtcGF0aG5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zeW1ib2wtb2JzZXJ2YWJsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3N5bWJvbC1vYnNlcnZhYmxlL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3N5bWJvbC1vYnNlcnZhYmxlL2xpYi9wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ZhbHVlLWVxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9maWxlLWxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvZm9sZGVyLWxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvaXRlbS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9tdXNpYy1saXN0LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jb250ZW50L3Bob3RvLWxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvc2hhcmVkLWxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vYnJlYWRjcnVtYnMuanN4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vZGlzcGxheS1tZW51LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9uYXZpZ2F0aW9uL3RvcC1uYXYuanN4Iiwid2VicGFjazovLy8uL3NyYy9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vc3RhdGUuanMiXSwibmFtZXMiOlsicHJvY2VzcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsIkVycm9yIiwiZGVmYXVsdENsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJlIiwiY2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImNhbGwiLCJydW5DbGVhclRpbWVvdXQiLCJtYXJrZXIiLCJxdWV1ZSIsImRyYWluaW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImxlbmd0aCIsImNvbmNhdCIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwibGVuIiwicnVuIiwibmV4dFRpY2siLCJhcmdzIiwiQXJyYXkiLCJhcmd1bWVudHMiLCJpIiwicHVzaCIsIkl0ZW0iLCJhcnJheSIsInByb3RvdHlwZSIsImFwcGx5IiwidGl0bGUiLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsIm5vb3AiLCJvbiIsImFkZExpc3RlbmVyIiwib25jZSIsIm9mZiIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW1pdCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJsaXN0ZW5lcnMiLCJuYW1lIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJ2YWxpZGF0ZUZvcm1hdCIsImZvcm1hdCIsIk5PREVfRU5WIiwidW5kZWZpbmVkIiwiaW52YXJpYW50IiwiY29uZGl0aW9uIiwiYSIsImIiLCJjIiwiZCIsImYiLCJlcnJvciIsImFyZ0luZGV4IiwicmVwbGFjZSIsImZyYW1lc1RvUG9wIiwiZW1wdHlGdW5jdGlvbiIsInJlcXVpcmUiLCJ3YXJuaW5nIiwicHJpbnRXYXJuaW5nIiwiX2xlbiIsIl9rZXkiLCJtZXNzYWdlIiwiY29uc29sZSIsIngiLCJpbmRleE9mIiwiX2xlbjIiLCJfa2V5MiIsInJlYWN0UHJvZEludmFyaWFudCIsImNvZGUiLCJhcmdDb3VudCIsImFyZ0lkeCIsImVuY29kZVVSSUNvbXBvbmVudCIsImdldE93blByb3BlcnR5U3ltYm9scyIsIk9iamVjdCIsImhhc093blByb3BlcnR5IiwicHJvcElzRW51bWVyYWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidG9PYmplY3QiLCJ2YWwiLCJUeXBlRXJyb3IiLCJzaG91bGRVc2VOYXRpdmUiLCJhc3NpZ24iLCJ0ZXN0MSIsIlN0cmluZyIsImdldE93blByb3BlcnR5TmFtZXMiLCJ0ZXN0MiIsImZyb21DaGFyQ29kZSIsIm9yZGVyMiIsIm1hcCIsIm4iLCJqb2luIiwidGVzdDMiLCJzcGxpdCIsImZvckVhY2giLCJsZXR0ZXIiLCJrZXlzIiwiZXJyIiwidGFyZ2V0Iiwic291cmNlIiwiZnJvbSIsInRvIiwic3ltYm9scyIsInMiLCJrZXkiLCJfcHJvZEludmFyaWFudCIsIkRPTVByb3BlcnR5IiwiUmVhY3RET01Db21wb25lbnRGbGFncyIsIkFUVFJfTkFNRSIsIklEX0FUVFJJQlVURV9OQU1FIiwiRmxhZ3MiLCJpbnRlcm5hbEluc3RhbmNlS2V5IiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic2xpY2UiLCJzaG91bGRQcmVjYWNoZU5vZGUiLCJub2RlIiwibm9kZUlEIiwibm9kZVR5cGUiLCJnZXRBdHRyaWJ1dGUiLCJub2RlVmFsdWUiLCJnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50IiwiY29tcG9uZW50IiwicmVuZGVyZWQiLCJfcmVuZGVyZWRDb21wb25lbnQiLCJwcmVjYWNoZU5vZGUiLCJpbnN0IiwiaG9zdEluc3QiLCJfaG9zdE5vZGUiLCJ1bmNhY2hlTm9kZSIsInByZWNhY2hlQ2hpbGROb2RlcyIsIl9mbGFncyIsImhhc0NhY2hlZENoaWxkTm9kZXMiLCJjaGlsZHJlbiIsIl9yZW5kZXJlZENoaWxkcmVuIiwiY2hpbGROb2RlIiwiZmlyc3RDaGlsZCIsIm91dGVyIiwiY2hpbGRJbnN0IiwiY2hpbGRJRCIsIl9kb21JRCIsIm5leHRTaWJsaW5nIiwiZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUiLCJwYXJlbnRzIiwicGFyZW50Tm9kZSIsImNsb3Nlc3QiLCJwb3AiLCJnZXRJbnN0YW5jZUZyb21Ob2RlIiwiZ2V0Tm9kZUZyb21JbnN0YW5jZSIsIl9ob3N0UGFyZW50IiwiUmVhY3RET01Db21wb25lbnRUcmVlIiwiY2FuVXNlRE9NIiwid2luZG93IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiRXhlY3V0aW9uRW52aXJvbm1lbnQiLCJjYW5Vc2VXb3JrZXJzIiwiV29ya2VyIiwiY2FuVXNlRXZlbnRMaXN0ZW5lcnMiLCJhZGRFdmVudExpc3RlbmVyIiwiYXR0YWNoRXZlbnQiLCJjYW5Vc2VWaWV3cG9ydCIsInNjcmVlbiIsImlzSW5Xb3JrZXIiLCJSRUFDVF9FTEVNRU5UX1RZUEUiLCJTeW1ib2wiLCJmb3IiLCJpc1ZhbGlkRWxlbWVudCIsIm9iamVjdCIsIiQkdHlwZW9mIiwidGhyb3dPbkRpcmVjdEFjY2VzcyIsIlJlYWN0Q3VycmVudE93bmVyIiwiaXNOYXRpdmUiLCJmbiIsImZ1bmNUb1N0cmluZyIsIkZ1bmN0aW9uIiwicmVJc05hdGl2ZSIsIlJlZ0V4cCIsInRlc3QiLCJjYW5Vc2VDb2xsZWN0aW9ucyIsIk1hcCIsIlNldCIsInNldEl0ZW0iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImdldEl0ZW1JRHMiLCJhZGRSb290IiwicmVtb3ZlUm9vdCIsImdldFJvb3RJRHMiLCJpdGVtTWFwIiwicm9vdElEU2V0IiwiaWQiLCJpdGVtIiwic2V0IiwiZ2V0IiwiYWRkIiwiaXRlbUJ5S2V5Iiwicm9vdEJ5S2V5IiwiZ2V0S2V5RnJvbUlEIiwiZ2V0SURGcm9tS2V5IiwicGFyc2VJbnQiLCJzdWJzdHIiLCJ1bm1vdW50ZWRJRHMiLCJwdXJnZURlZXAiLCJjaGlsZElEcyIsImRlc2NyaWJlQ29tcG9uZW50RnJhbWUiLCJvd25lck5hbWUiLCJmaWxlTmFtZSIsImxpbmVOdW1iZXIiLCJnZXREaXNwbGF5TmFtZSIsImVsZW1lbnQiLCJ0eXBlIiwiZGlzcGxheU5hbWUiLCJkZXNjcmliZUlEIiwiUmVhY3RDb21wb25lbnRUcmVlSG9vayIsImdldEVsZW1lbnQiLCJvd25lcklEIiwiZ2V0T3duZXJJRCIsIl9zb3VyY2UiLCJvblNldENoaWxkcmVuIiwibmV4dENoaWxkSURzIiwibmV4dENoaWxkSUQiLCJuZXh0Q2hpbGQiLCJpc01vdW50ZWQiLCJwYXJlbnRJRCIsIm9uQmVmb3JlTW91bnRDb21wb25lbnQiLCJ0ZXh0IiwidXBkYXRlQ291bnQiLCJvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudCIsIm9uTW91bnRDb21wb25lbnQiLCJpc1Jvb3QiLCJvblVwZGF0ZUNvbXBvbmVudCIsIm9uVW5tb3VudENvbXBvbmVudCIsInB1cmdlVW5tb3VudGVkQ29tcG9uZW50cyIsIl9wcmV2ZW50UHVyZ2luZyIsImdldEN1cnJlbnRTdGFja0FkZGVuZHVtIiwidG9wRWxlbWVudCIsImluZm8iLCJvd25lciIsIl9vd25lciIsImdldE5hbWUiLCJjdXJyZW50T3duZXIiLCJjdXJyZW50IiwiX2RlYnVnSUQiLCJnZXRTdGFja0FkZGVuZHVtQnlJRCIsImdldFBhcmVudElEIiwiZ2V0Q2hpbGRJRHMiLCJnZXRTb3VyY2UiLCJnZXRUZXh0IiwiZ2V0VXBkYXRlQ291bnQiLCJnZXRSZWdpc3RlcmVkSURzIiwicHVzaE5vblN0YW5kYXJkV2FybmluZ1N0YWNrIiwiaXNDcmVhdGluZ0VsZW1lbnQiLCJjdXJyZW50U291cmNlIiwicmVhY3RTdGFjayIsInN0YWNrIiwicG9wTm9uU3RhbmRhcmRXYXJuaW5nU3RhY2siLCJyZWFjdFN0YWNrRW5kIiwibWFrZUVtcHR5RnVuY3Rpb24iLCJhcmciLCJ0aGF0UmV0dXJucyIsInRoYXRSZXR1cm5zRmFsc2UiLCJ0aGF0UmV0dXJuc1RydWUiLCJ0aGF0UmV0dXJuc051bGwiLCJ0aGF0UmV0dXJuc1RoaXMiLCJ0aGF0UmV0dXJuc0FyZ3VtZW50IiwiZGVidWdUb29sIiwiUmVhY3REZWJ1Z1Rvb2wiLCJNZW1vcnlSb3V0ZXIiLCJQcm9tcHQiLCJSZWRpcmVjdCIsIlJvdXRlIiwiUm91dGVyIiwiU3RhdGljUm91dGVyIiwiU3dpdGNoIiwibWF0Y2hQYXRoIiwid2l0aFJvdXRlciIsIlByb3ZpZGVyIiwiY3JlYXRlUHJvdmlkZXIiLCJjb25uZWN0QWR2YW5jZWQiLCJjb25uZWN0IiwiX2Fzc2lnbiIsIkNhbGxiYWNrUXVldWUiLCJQb29sZWRDbGFzcyIsIlJlYWN0RmVhdHVyZUZsYWdzIiwiUmVhY3RSZWNvbmNpbGVyIiwiVHJhbnNhY3Rpb24iLCJkaXJ0eUNvbXBvbmVudHMiLCJ1cGRhdGVCYXRjaE51bWJlciIsImFzYXBDYWxsYmFja1F1ZXVlIiwiZ2V0UG9vbGVkIiwiYXNhcEVucXVldWVkIiwiYmF0Y2hpbmdTdHJhdGVneSIsImVuc3VyZUluamVjdGVkIiwiUmVhY3RVcGRhdGVzIiwiUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiIsIk5FU1RFRF9VUERBVEVTIiwiaW5pdGlhbGl6ZSIsImRpcnR5Q29tcG9uZW50c0xlbmd0aCIsImNsb3NlIiwic3BsaWNlIiwiZmx1c2hCYXRjaGVkVXBkYXRlcyIsIlVQREFURV9RVUVVRUlORyIsImNhbGxiYWNrUXVldWUiLCJyZXNldCIsIm5vdGlmeUFsbCIsIlRSQU5TQUNUSU9OX1dSQVBQRVJTIiwiUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbiIsInJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uIiwicmVjb25jaWxlVHJhbnNhY3Rpb24iLCJnZXRUcmFuc2FjdGlvbldyYXBwZXJzIiwiZGVzdHJ1Y3RvciIsInJlbGVhc2UiLCJwZXJmb3JtIiwibWV0aG9kIiwic2NvcGUiLCJhZGRQb29saW5nVG8iLCJiYXRjaGVkVXBkYXRlcyIsImNhbGxiYWNrIiwibW91bnRPcmRlckNvbXBhcmF0b3IiLCJjMSIsImMyIiwiX21vdW50T3JkZXIiLCJydW5CYXRjaGVkVXBkYXRlcyIsInRyYW5zYWN0aW9uIiwic29ydCIsImNhbGxiYWNrcyIsIl9wZW5kaW5nQ2FsbGJhY2tzIiwibWFya2VyTmFtZSIsImxvZ1RvcExldmVsUmVuZGVycyIsIm5hbWVkQ29tcG9uZW50IiwiX2N1cnJlbnRFbGVtZW50IiwiaXNSZWFjdFRvcExldmVsV3JhcHBlciIsInRpbWUiLCJwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkiLCJ0aW1lRW5kIiwiaiIsImVucXVldWUiLCJnZXRQdWJsaWNJbnN0YW5jZSIsImVucXVldWVVcGRhdGUiLCJpc0JhdGNoaW5nVXBkYXRlcyIsIl91cGRhdGVCYXRjaE51bWJlciIsImFzYXAiLCJjb250ZXh0IiwiUmVhY3RVcGRhdGVzSW5qZWN0aW9uIiwiaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb24iLCJSZWNvbmNpbGVUcmFuc2FjdGlvbiIsImluamVjdEJhdGNoaW5nU3RyYXRlZ3kiLCJfYmF0Y2hpbmdTdHJhdGVneSIsImluamVjdGlvbiIsImRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5IiwiaXNQcm94eVN1cHBvcnRlZCIsIlByb3h5Iiwic2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMiLCJFdmVudEludGVyZmFjZSIsImN1cnJlbnRUYXJnZXQiLCJldmVudFBoYXNlIiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJ0aW1lU3RhbXAiLCJldmVudCIsIkRhdGUiLCJub3ciLCJkZWZhdWx0UHJldmVudGVkIiwiaXNUcnVzdGVkIiwiU3ludGhldGljRXZlbnQiLCJkaXNwYXRjaENvbmZpZyIsInRhcmdldEluc3QiLCJuYXRpdmVFdmVudCIsIm5hdGl2ZUV2ZW50VGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJfdGFyZ2V0SW5zdCIsIkludGVyZmFjZSIsImNvbnN0cnVjdG9yIiwicHJvcE5hbWUiLCJub3JtYWxpemUiLCJyZXR1cm5WYWx1ZSIsImlzRGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiY2FuY2VsQnViYmxlIiwicGVyc2lzdCIsImlzUGVyc2lzdGVudCIsImRlZmluZVByb3BlcnR5IiwiZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbiIsImNvbnN0cnVjdCIsImNyZWF0ZSIsInRoYXQiLCJwcm9wIiwidmFsdWUiLCJhdWdtZW50Q2xhc3MiLCJDbGFzcyIsIlN1cGVyIiwiRSIsImZvdXJBcmd1bWVudFBvb2xlciIsImdldFZhbCIsImlzRnVuY3Rpb24iLCJjb25maWd1cmFibGUiLCJhY3Rpb24iLCJ3YXJuIiwicmVzdWx0Iiwid2FybmluZ0NvbmRpdGlvbiIsImNoZWNrTWFzayIsImJpdG1hc2siLCJET01Qcm9wZXJ0eUluamVjdGlvbiIsIk1VU1RfVVNFX1BST1BFUlRZIiwiSEFTX0JPT0xFQU5fVkFMVUUiLCJIQVNfTlVNRVJJQ19WQUxVRSIsIkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFIiwiSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSIsImluamVjdERPTVByb3BlcnR5Q29uZmlnIiwiZG9tUHJvcGVydHlDb25maWciLCJJbmplY3Rpb24iLCJQcm9wZXJ0aWVzIiwiRE9NQXR0cmlidXRlTmFtZXNwYWNlcyIsIkRPTUF0dHJpYnV0ZU5hbWVzIiwiRE9NUHJvcGVydHlOYW1lcyIsIkRPTU11dGF0aW9uTWV0aG9kcyIsImlzQ3VzdG9tQXR0cmlidXRlIiwiX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zIiwicHJvcGVydGllcyIsImxvd2VyQ2FzZWQiLCJ0b0xvd2VyQ2FzZSIsInByb3BDb25maWciLCJwcm9wZXJ0eUluZm8iLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlTmFtZXNwYWNlIiwicHJvcGVydHlOYW1lIiwibXV0YXRpb25NZXRob2QiLCJtdXN0VXNlUHJvcGVydHkiLCJoYXNCb29sZWFuVmFsdWUiLCJoYXNOdW1lcmljVmFsdWUiLCJoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSIsImhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUiLCJnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZSIsIkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIiLCJST09UX0FUVFJJQlVURV9OQU1FIiwiQVRUUklCVVRFX05BTUVfQ0hBUiIsImF1dG9mb2N1cyIsImlzQ3VzdG9tQXR0cmlidXRlRm4iLCJvbmVBcmd1bWVudFBvb2xlciIsImNvcHlGaWVsZHNGcm9tIiwiS2xhc3MiLCJpbnN0YW5jZVBvb2wiLCJpbnN0YW5jZSIsInR3b0FyZ3VtZW50UG9vbGVyIiwiYTEiLCJhMiIsInRocmVlQXJndW1lbnRQb29sZXIiLCJhMyIsImE0Iiwic3RhbmRhcmRSZWxlYXNlciIsInBvb2xTaXplIiwiREVGQVVMVF9QT09MX1NJWkUiLCJERUZBVUxUX1BPT0xFUiIsIkNvcHlDb25zdHJ1Y3RvciIsInBvb2xlciIsIk5ld0tsYXNzIiwiY2FuRGVmaW5lUHJvcGVydHkiLCJSRVNFUlZFRF9QUk9QUyIsInJlZiIsIl9fc2VsZiIsIl9fc291cmNlIiwic3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24iLCJzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biIsImhhc1ZhbGlkUmVmIiwiY29uZmlnIiwiZ2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNSZWFjdFdhcm5pbmciLCJoYXNWYWxpZEtleSIsImRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyIiwicHJvcHMiLCJ3YXJuQWJvdXRBY2Nlc3NpbmdLZXkiLCJkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlciIsIndhcm5BYm91dEFjY2Vzc2luZ1JlZiIsIlJlYWN0RWxlbWVudCIsInNlbGYiLCJfc3RvcmUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJ2YWxpZGF0ZWQiLCJfc2VsZiIsImZyZWV6ZSIsImNoaWxkcmVuTGVuZ3RoIiwiY2hpbGRBcnJheSIsImRlZmF1bHRQcm9wcyIsImNyZWF0ZUZhY3RvcnkiLCJmYWN0b3J5IiwiYmluZCIsImNsb25lQW5kUmVwbGFjZUtleSIsIm9sZEVsZW1lbnQiLCJuZXdLZXkiLCJuZXdFbGVtZW50IiwiY2xvbmVFbGVtZW50IiwiRE9NTmFtZXNwYWNlcyIsInNldElubmVySFRNTCIsImNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24iLCJzZXRUZXh0Q29udGVudCIsIkVMRU1FTlRfTk9ERV9UWVBFIiwiRE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFIiwiZW5hYmxlTGF6eSIsImRvY3VtZW50TW9kZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluc2VydFRyZWVDaGlsZHJlbiIsInRyZWUiLCJpbnNlcnRUcmVlQmVmb3JlIiwiaHRtbCIsInJlZmVyZW5jZU5vZGUiLCJub2RlTmFtZSIsIm5hbWVzcGFjZVVSSSIsImluc2VydEJlZm9yZSIsInJlcGxhY2VDaGlsZFdpdGhUcmVlIiwib2xkTm9kZSIsIm5ld1RyZWUiLCJyZXBsYWNlQ2hpbGQiLCJxdWV1ZUNoaWxkIiwicGFyZW50VHJlZSIsImNoaWxkVHJlZSIsImFwcGVuZENoaWxkIiwicXVldWVIVE1MIiwicXVldWVUZXh0IiwiRE9NTGF6eVRyZWUiLCJSZWFjdFJlZiIsIlJlYWN0SW5zdHJ1bWVudGF0aW9uIiwiYXR0YWNoUmVmcyIsIm1vdW50Q29tcG9uZW50IiwiaW50ZXJuYWxJbnN0YW5jZSIsImhvc3RQYXJlbnQiLCJob3N0Q29udGFpbmVySW5mbyIsInBhcmVudERlYnVnSUQiLCJtYXJrdXAiLCJnZXRSZWFjdE1vdW50UmVhZHkiLCJnZXRIb3N0Tm9kZSIsInVubW91bnRDb21wb25lbnQiLCJzYWZlbHkiLCJvbkJlZm9yZVVubW91bnRDb21wb25lbnQiLCJkZXRhY2hSZWZzIiwicmVjZWl2ZUNvbXBvbmVudCIsIm5leHRFbGVtZW50IiwicHJldkVsZW1lbnQiLCJfY29udGV4dCIsInJlZnNDaGFuZ2VkIiwic2hvdWxkVXBkYXRlUmVmcyIsIlJlYWN0QmFzZUNsYXNzZXMiLCJSZWFjdENoaWxkcmVuIiwiUmVhY3RET01GYWN0b3JpZXMiLCJSZWFjdFByb3BUeXBlcyIsIlJlYWN0VmVyc2lvbiIsImNyZWF0ZVJlYWN0Q2xhc3MiLCJvbmx5Q2hpbGQiLCJsb3dQcmlvcml0eVdhcm5pbmciLCJSZWFjdEVsZW1lbnRWYWxpZGF0b3IiLCJkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCIsIl9fc3ByZWFkIiwiY3JlYXRlTWl4aW4iLCJtaXhpbiIsIndhcm5lZEZvclNwcmVhZCIsIndhcm5lZEZvckNyZWF0ZU1peGluIiwiUmVhY3QiLCJDaGlsZHJlbiIsImNvdW50IiwidG9BcnJheSIsIm9ubHkiLCJDb21wb25lbnQiLCJQdXJlQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiY3JlYXRlQ2xhc3MiLCJET00iLCJ3YXJuZWRGb3JDcmVhdGVDbGFzcyIsIndhcm5lZEZvckZhY3RvcmllcyIsIl9fZXNNb2R1bGUiLCJhZGRMZWFkaW5nU2xhc2giLCJwYXRoIiwiY2hhckF0Iiwic3RyaXBMZWFkaW5nU2xhc2giLCJoYXNCYXNlbmFtZSIsInByZWZpeCIsInN0cmlwQmFzZW5hbWUiLCJzdHJpcFRyYWlsaW5nU2xhc2giLCJwYXJzZVBhdGgiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJoYXNoSW5kZXgiLCJzZWFyY2hJbmRleCIsImNyZWF0ZVBhdGgiLCJsb2NhdGlvbiIsIkV2ZW50UGx1Z2luUmVnaXN0cnkiLCJFdmVudFBsdWdpblV0aWxzIiwiUmVhY3RFcnJvclV0aWxzIiwiYWNjdW11bGF0ZUludG8iLCJmb3JFYWNoQWNjdW11bGF0ZWQiLCJsaXN0ZW5lckJhbmsiLCJldmVudFF1ZXVlIiwiZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlIiwic2ltdWxhdGVkIiwiZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyIiwiZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkIiwiZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwiLCJnZXREaWN0aW9uYXJ5S2V5IiwiX3Jvb3ROb2RlSUQiLCJpc0ludGVyYWN0aXZlIiwidGFnIiwic2hvdWxkUHJldmVudE1vdXNlRXZlbnQiLCJkaXNhYmxlZCIsIkV2ZW50UGx1Z2luSHViIiwiaW5qZWN0RXZlbnRQbHVnaW5PcmRlciIsImluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSIsInB1dExpc3RlbmVyIiwicmVnaXN0cmF0aW9uTmFtZSIsImxpc3RlbmVyIiwiYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUiLCJQbHVnaW5Nb2R1bGUiLCJyZWdpc3RyYXRpb25OYW1lTW9kdWxlcyIsImRpZFB1dExpc3RlbmVyIiwiZ2V0TGlzdGVuZXIiLCJkZWxldGVMaXN0ZW5lciIsIndpbGxEZWxldGVMaXN0ZW5lciIsImRlbGV0ZUFsbExpc3RlbmVycyIsImV4dHJhY3RFdmVudHMiLCJ0b3BMZXZlbFR5cGUiLCJldmVudHMiLCJwbHVnaW5zIiwicG9zc2libGVQbHVnaW4iLCJleHRyYWN0ZWRFdmVudHMiLCJlbnF1ZXVlRXZlbnRzIiwicHJvY2Vzc0V2ZW50UXVldWUiLCJwcm9jZXNzaW5nRXZlbnRRdWV1ZSIsInJldGhyb3dDYXVnaHRFcnJvciIsIl9fcHVyZ2UiLCJfX2dldExpc3RlbmVyQmFuayIsImxpc3RlbmVyQXRQaGFzZSIsInByb3BhZ2F0aW9uUGhhc2UiLCJwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyIsImFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMiLCJwaGFzZSIsIl9kaXNwYXRjaExpc3RlbmVycyIsIl9kaXNwYXRjaEluc3RhbmNlcyIsImFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUiLCJ0cmF2ZXJzZVR3b1BoYXNlIiwiYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQiLCJwYXJlbnRJbnN0IiwiZ2V0UGFyZW50SW5zdGFuY2UiLCJhY2N1bXVsYXRlRGlzcGF0Y2hlcyIsImlnbm9yZWREaXJlY3Rpb24iLCJhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSIsImFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMiLCJhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCIsImFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyIsImxlYXZlIiwiZW50ZXIiLCJ0cmF2ZXJzZUVudGVyTGVhdmUiLCJhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyIsIkV2ZW50UHJvcGFnYXRvcnMiLCJSZWFjdEluc3RhbmNlTWFwIiwicmVtb3ZlIiwiX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSIsImhhcyIsImdldEV2ZW50VGFyZ2V0IiwiVUlFdmVudEludGVyZmFjZSIsInZpZXciLCJkb2MiLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJwYXJlbnRXaW5kb3ciLCJkZXRhaWwiLCJTeW50aGV0aWNVSUV2ZW50IiwiZGlzcGF0Y2hNYXJrZXIiLCJJdGVtTGlzdCIsIml0ZW1zIiwiaGVhZGVyRXh0cmFzIiwiaGFuZGxlSXRlbUNsaWNrIiwiZWxlbWVudHMiLCJpZHgiLCJlbXB0eU9iamVjdCIsImV2ZW50UGx1Z2luT3JkZXIiLCJuYW1lc1RvUGx1Z2lucyIsInJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nIiwicGx1Z2luTmFtZSIsInBsdWdpbk1vZHVsZSIsInBsdWdpbkluZGV4IiwicHVibGlzaGVkRXZlbnRzIiwiZXZlbnRUeXBlcyIsImV2ZW50TmFtZSIsInB1Ymxpc2hFdmVudEZvclBsdWdpbiIsImV2ZW50TmFtZURpc3BhdGNoQ29uZmlncyIsInBoYXNlTmFtZSIsInBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUiLCJwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZSIsInJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmNpZXMiLCJsb3dlckNhc2VkTmFtZSIsInBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMiLCJvbmRibGNsaWNrIiwiaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyIiwiaW5qZWN0ZWROYW1lc1RvUGx1Z2lucyIsImlzT3JkZXJpbmdEaXJ0eSIsImdldFBsdWdpbk1vZHVsZUZvckV2ZW50IiwiX3Jlc2V0RXZlbnRQbHVnaW5zIiwiUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiIsIlZpZXdwb3J0TWV0cmljcyIsImdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lIiwiaXNFdmVudFN1cHBvcnRlZCIsImhhc0V2ZW50UGFnZVhZIiwiYWxyZWFkeUxpc3RlbmluZ1RvIiwiaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUiLCJyZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIiLCJ0b3BFdmVudE1hcHBpbmciLCJ0b3BBYm9ydCIsInRvcEFuaW1hdGlvbkVuZCIsInRvcEFuaW1hdGlvbkl0ZXJhdGlvbiIsInRvcEFuaW1hdGlvblN0YXJ0IiwidG9wQmx1ciIsInRvcENhblBsYXkiLCJ0b3BDYW5QbGF5VGhyb3VnaCIsInRvcENoYW5nZSIsInRvcENsaWNrIiwidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BDb21wb3NpdGlvblN0YXJ0IiwidG9wQ29tcG9zaXRpb25VcGRhdGUiLCJ0b3BDb250ZXh0TWVudSIsInRvcENvcHkiLCJ0b3BDdXQiLCJ0b3BEb3VibGVDbGljayIsInRvcERyYWciLCJ0b3BEcmFnRW5kIiwidG9wRHJhZ0VudGVyIiwidG9wRHJhZ0V4aXQiLCJ0b3BEcmFnTGVhdmUiLCJ0b3BEcmFnT3ZlciIsInRvcERyYWdTdGFydCIsInRvcERyb3AiLCJ0b3BEdXJhdGlvbkNoYW5nZSIsInRvcEVtcHRpZWQiLCJ0b3BFbmNyeXB0ZWQiLCJ0b3BFbmRlZCIsInRvcEVycm9yIiwidG9wRm9jdXMiLCJ0b3BJbnB1dCIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTG9hZGVkRGF0YSIsInRvcExvYWRlZE1ldGFkYXRhIiwidG9wTG9hZFN0YXJ0IiwidG9wTW91c2VEb3duIiwidG9wTW91c2VNb3ZlIiwidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIiLCJ0b3BNb3VzZVVwIiwidG9wUGFzdGUiLCJ0b3BQYXVzZSIsInRvcFBsYXkiLCJ0b3BQbGF5aW5nIiwidG9wUHJvZ3Jlc3MiLCJ0b3BSYXRlQ2hhbmdlIiwidG9wU2Nyb2xsIiwidG9wU2Vla2VkIiwidG9wU2Vla2luZyIsInRvcFNlbGVjdGlvbkNoYW5nZSIsInRvcFN0YWxsZWQiLCJ0b3BTdXNwZW5kIiwidG9wVGV4dElucHV0IiwidG9wVGltZVVwZGF0ZSIsInRvcFRvdWNoQ2FuY2VsIiwidG9wVG91Y2hFbmQiLCJ0b3BUb3VjaE1vdmUiLCJ0b3BUb3VjaFN0YXJ0IiwidG9wVHJhbnNpdGlvbkVuZCIsInRvcFZvbHVtZUNoYW5nZSIsInRvcFdhaXRpbmciLCJ0b3BXaGVlbCIsInRvcExpc3RlbmVyc0lES2V5IiwiZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQiLCJtb3VudEF0IiwiUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyIiwiUmVhY3RFdmVudExpc3RlbmVyIiwiaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyIiwic2V0SGFuZGxlVG9wTGV2ZWwiLCJoYW5kbGVUb3BMZXZlbCIsInNldEVuYWJsZWQiLCJlbmFibGVkIiwiaXNFbmFibGVkIiwibGlzdGVuVG8iLCJjb250ZW50RG9jdW1lbnRIYW5kbGUiLCJpc0xpc3RlbmluZyIsImRlcGVuZGVuY3kiLCJ0cmFwQnViYmxlZEV2ZW50IiwidHJhcENhcHR1cmVkRXZlbnQiLCJXSU5ET1dfSEFORExFIiwiaGFuZGxlckJhc2VOYW1lIiwiaGFuZGxlIiwic3VwcG9ydHNFdmVudFBhZ2VYWSIsImNyZWF0ZUV2ZW50IiwiZXYiLCJlbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmciLCJyZWZyZXNoIiwicmVmcmVzaFNjcm9sbFZhbHVlcyIsIm1vbml0b3JTY3JvbGxWYWx1ZSIsImdldEV2ZW50TW9kaWZpZXJTdGF0ZSIsIk1vdXNlRXZlbnRJbnRlcmZhY2UiLCJzY3JlZW5YIiwic2NyZWVuWSIsImNsaWVudFgiLCJjbGllbnRZIiwiY3RybEtleSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwibWV0YUtleSIsImdldE1vZGlmaWVyU3RhdGUiLCJidXR0b24iLCJidXR0b25zIiwicmVsYXRlZFRhcmdldCIsImZyb21FbGVtZW50Iiwic3JjRWxlbWVudCIsInRvRWxlbWVudCIsInBhZ2VYIiwiY3VycmVudFNjcm9sbExlZnQiLCJwYWdlWSIsImN1cnJlbnRTY3JvbGxUb3AiLCJTeW50aGV0aWNNb3VzZUV2ZW50IiwiT0JTRVJWRURfRVJST1IiLCJUcmFuc2FjdGlvbkltcGwiLCJ0cmFuc2FjdGlvbldyYXBwZXJzIiwid3JhcHBlckluaXREYXRhIiwiX2lzSW5UcmFuc2FjdGlvbiIsImlzSW5UcmFuc2FjdGlvbiIsImVycm9yVGhyb3duIiwicmV0IiwiaW5pdGlhbGl6ZUFsbCIsImNsb3NlQWxsIiwic3RhcnRJbmRleCIsIndyYXBwZXIiLCJpbml0RGF0YSIsIm1hdGNoSHRtbFJlZ0V4cCIsImVzY2FwZUh0bWwiLCJzdHJpbmciLCJzdHIiLCJtYXRjaCIsImV4ZWMiLCJlc2NhcGUiLCJpbmRleCIsImxhc3RJbmRleCIsImNoYXJDb2RlQXQiLCJzdWJzdHJpbmciLCJlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIiLCJXSElURVNQQUNFX1RFU1QiLCJOT05WSVNJQkxFX1RFU1QiLCJyZXVzYWJsZVNWR0NvbnRhaW5lciIsInN2ZyIsImlubmVySFRNTCIsInN2Z05vZGUiLCJ0ZXN0RWxlbWVudCIsInRleHROb2RlIiwiZGF0YSIsInJlbW92ZUNoaWxkIiwiZGVsZXRlRGF0YSIsImlzIiwieSIsInNoYWxsb3dFcXVhbCIsIm9iakEiLCJvYmpCIiwia2V5c0EiLCJrZXlzQiIsImxvY2F0aW9uc0FyZUVxdWFsIiwiY3JlYXRlTG9jYXRpb24iLCJfZXh0ZW5kcyIsIl9yZXNvbHZlUGF0aG5hbWUiLCJfcmVzb2x2ZVBhdGhuYW1lMiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdmFsdWVFcXVhbCIsIl92YWx1ZUVxdWFsMiIsIl9QYXRoVXRpbHMiLCJvYmoiLCJkZWZhdWx0Iiwic3RhdGUiLCJjdXJyZW50TG9jYXRpb24iLCJkZWNvZGVVUkkiLCJVUklFcnJvciIsIl93YXJuaW5nIiwiX3dhcm5pbmcyIiwiY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIiLCJwcm9tcHQiLCJzZXRQcm9tcHQiLCJuZXh0UHJvbXB0IiwiY29uZmlybVRyYW5zaXRpb25UbyIsImdldFVzZXJDb25maXJtYXRpb24iLCJhcHBlbmRMaXN0ZW5lciIsImlzQWN0aXZlIiwiZmlsdGVyIiwibm90aWZ5TGlzdGVuZXJzIiwib2JqZWN0VGFnIiwiZnVuY1Byb3RvIiwib2JqZWN0UHJvdG8iLCJvYmplY3RDdG9yU3RyaW5nIiwiaXNQbGFpbk9iamVjdCIsInByb3RvIiwiQ3RvciIsIlJlYWN0UHJvcFR5cGVzU2VjcmV0IiwiRGFuZ2VyIiwiZ2V0Tm9kZUFmdGVyIiwiaXNBcnJheSIsImluc2VydENoaWxkQXQiLCJpbnNlcnRMYXp5VHJlZUNoaWxkQXQiLCJtb3ZlQ2hpbGQiLCJtb3ZlRGVsaW1pdGVkVGV4dCIsImNsb3NpbmdDb21tZW50IiwicmVtb3ZlRGVsaW1pdGVkVGV4dCIsIm9wZW5pbmdDb21tZW50IiwibmV4dE5vZGUiLCJzdGFydE5vZGUiLCJyZXBsYWNlRGVsaW1pdGVkVGV4dCIsInN0cmluZ1RleHQiLCJub2RlQWZ0ZXJDb21tZW50IiwiY3JlYXRlVGV4dE5vZGUiLCJvbkhvc3RPcGVyYXRpb24iLCJpbnN0YW5jZUlEIiwicGF5bG9hZCIsImRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwIiwib2xkQ2hpbGQiLCJwcmV2SW5zdGFuY2UiLCJuZXh0SW5zdGFuY2UiLCJET01DaGlsZHJlbk9wZXJhdGlvbnMiLCJwcm9jZXNzVXBkYXRlcyIsInVwZGF0ZXMiLCJwYXJlbnROb2RlRGVidWdJRCIsImsiLCJ1cGRhdGUiLCJjb250ZW50IiwiYWZ0ZXJOb2RlIiwidG9JbmRleCIsImZyb21Ob2RlIiwiZnJvbUluZGV4IiwibWF0aG1sIiwiQ29tcG9uZW50VHJlZSIsIlRyZWVUcmF2ZXJzYWwiLCJpbmplY3RDb21wb25lbnRUcmVlIiwiSW5qZWN0ZWQiLCJpbmplY3RUcmVlVHJhdmVyc2FsIiwiaXNBbmNlc3RvciIsImdldExvd2VzdENvbW1vbkFuY2VzdG9yIiwiaXNFbmRpc2giLCJpc01vdmVpc2giLCJpc1N0YXJ0aXNoIiwidmFsaWRhdGVFdmVudERpc3BhdGNoZXMiLCJkaXNwYXRjaExpc3RlbmVycyIsImRpc3BhdGNoSW5zdGFuY2VzIiwibGlzdGVuZXJzSXNBcnIiLCJsaXN0ZW5lcnNMZW4iLCJpbnN0YW5jZXNJc0FyciIsImluc3RhbmNlc0xlbiIsImV4ZWN1dGVEaXNwYXRjaCIsImludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaCIsImludm9rZUd1YXJkZWRDYWxsYmFjayIsImV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsIiwiZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZSIsImV4ZWN1dGVEaXJlY3REaXNwYXRjaCIsImRpc3BhdGNoTGlzdGVuZXIiLCJkaXNwYXRjaEluc3RhbmNlIiwicmVzIiwiaGFzRGlzcGF0Y2hlcyIsImFyZ0Zyb20iLCJhcmdUbyIsImVzY2FwZVJlZ2V4IiwiZXNjYXBlckxvb2t1cCIsImVzY2FwZWRTdHJpbmciLCJ1bmVzY2FwZSIsInVuZXNjYXBlUmVnZXgiLCJ1bmVzY2FwZXJMb29rdXAiLCJrZXlTdWJzdHJpbmciLCJLZXlFc2NhcGVVdGlscyIsInByb3BUeXBlc0ZhY3RvcnkiLCJoYXNSZWFkT25seVZhbHVlIiwiY2hlY2tib3giLCJpbWFnZSIsImhpZGRlbiIsInJhZGlvIiwic3VibWl0IiwiX2Fzc2VydFNpbmdsZUxpbmsiLCJpbnB1dFByb3BzIiwiY2hlY2tlZExpbmsiLCJ2YWx1ZUxpbmsiLCJfYXNzZXJ0VmFsdWVMaW5rIiwib25DaGFuZ2UiLCJfYXNzZXJ0Q2hlY2tlZExpbmsiLCJjaGVja2VkIiwicHJvcFR5cGVzIiwiY29tcG9uZW50TmFtZSIsInJlYWRPbmx5IiwiZnVuYyIsImxvZ2dlZFR5cGVGYWlsdXJlcyIsImdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSIsIkxpbmtlZFZhbHVlVXRpbHMiLCJjaGVja1Byb3BUeXBlcyIsInRhZ05hbWUiLCJhZGRlbmR1bSIsImdldFZhbHVlIiwiZ2V0Q2hlY2tlZCIsImV4ZWN1dGVPbkNoYW5nZSIsInJlcXVlc3RDaGFuZ2UiLCJpbmplY3RlZCIsIlJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQiLCJyZXBsYWNlTm9kZVdpdGhNYXJrdXAiLCJwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzIiwiaW5qZWN0RW52aXJvbm1lbnQiLCJlbnZpcm9ubWVudCIsImNhdWdodEVycm9yIiwiZGlzcGF0Y2hFdmVudCIsImZha2VOb2RlIiwiYm91bmRGdW5jIiwiZXZ0VHlwZSIsImV2dCIsImluaXRFdmVudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQiLCJnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUiLCJwdWJsaWNJbnN0YW5jZSIsImNhbGxlck5hbWUiLCJjdG9yIiwiUmVhY3RVcGRhdGVRdWV1ZSIsIl93YXJuZWRBYm91dFJlZnNJblJlbmRlciIsImVucXVldWVDYWxsYmFjayIsInZhbGlkYXRlQ2FsbGJhY2siLCJlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbCIsImVucXVldWVGb3JjZVVwZGF0ZSIsIl9wZW5kaW5nRm9yY2VVcGRhdGUiLCJlbnF1ZXVlUmVwbGFjZVN0YXRlIiwiY29tcGxldGVTdGF0ZSIsIl9wZW5kaW5nU3RhdGVRdWV1ZSIsIl9wZW5kaW5nUmVwbGFjZVN0YXRlIiwiZW5xdWV1ZVNldFN0YXRlIiwicGFydGlhbFN0YXRlIiwib25TZXRTdGF0ZSIsImVucXVldWVFbGVtZW50SW50ZXJuYWwiLCJuZXh0Q29udGV4dCIsIl9wZW5kaW5nRWxlbWVudCIsIk1TQXBwIiwiZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24iLCJhcmcwIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZ2V0RXZlbnRDaGFyQ29kZSIsImNoYXJDb2RlIiwia2V5Q29kZSIsIm1vZGlmaWVyS2V5VG9Qcm9wIiwiQWx0IiwiQ29udHJvbCIsIk1ldGEiLCJTaGlmdCIsIm1vZGlmaWVyU3RhdGVHZXR0ZXIiLCJrZXlBcmciLCJzeW50aGV0aWNFdmVudCIsImtleVByb3AiLCJjb3JyZXNwb25kaW5nVXNlRWxlbWVudCIsInVzZUhhc0ZlYXR1cmUiLCJpbXBsZW1lbnRhdGlvbiIsImhhc0ZlYXR1cmUiLCJldmVudE5hbWVTdWZmaXgiLCJjYXB0dXJlIiwiaXNTdXBwb3J0ZWQiLCJzZXRBdHRyaWJ1dGUiLCJzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCIsInByZXZFbXB0eSIsIm5leHRFbXB0eSIsInByZXZUeXBlIiwibmV4dFR5cGUiLCJ2YWxpZGF0ZURPTU5lc3RpbmciLCJzcGVjaWFsVGFncyIsImluU2NvcGVUYWdzIiwiYnV0dG9uU2NvcGVUYWdzIiwiaW1wbGllZEVuZFRhZ3MiLCJlbXB0eUFuY2VzdG9ySW5mbyIsImZvcm1UYWciLCJhVGFnSW5TY29wZSIsImJ1dHRvblRhZ0luU2NvcGUiLCJub2JyVGFnSW5TY29wZSIsInBUYWdJbkJ1dHRvblNjb3BlIiwibGlzdEl0ZW1UYWdBdXRvY2xvc2luZyIsImRsSXRlbVRhZ0F1dG9jbG9zaW5nIiwidXBkYXRlZEFuY2VzdG9ySW5mbyIsIm9sZEluZm8iLCJhbmNlc3RvckluZm8iLCJpc1RhZ1ZhbGlkV2l0aFBhcmVudCIsInBhcmVudFRhZyIsImZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWciLCJmaW5kT3duZXJTdGFjayIsInJldmVyc2UiLCJkaWRXYXJuIiwiY2hpbGRUYWciLCJjaGlsZFRleHQiLCJjaGlsZEluc3RhbmNlIiwicGFyZW50SW5mbyIsImludmFsaWRQYXJlbnQiLCJpbnZhbGlkQW5jZXN0b3IiLCJwcm9ibGVtYXRpYyIsImFuY2VzdG9yVGFnIiwiYW5jZXN0b3JJbnN0YW5jZSIsImNoaWxkT3duZXIiLCJhbmNlc3Rvck93bmVyIiwiY2hpbGRPd25lcnMiLCJhbmNlc3Rvck93bmVycyIsIm1pblN0YWNrTGVuIiwibWluIiwiZGVlcGVzdENvbW1vbiIsIlVOS05PV04iLCJjaGlsZE93bmVyTmFtZXMiLCJhbmNlc3Rvck93bmVyTmFtZXMiLCJvd25lckluZm8iLCJ3YXJuS2V5IiwidGFnRGlzcGxheU5hbWUiLCJ3aGl0ZXNwYWNlSW5mbyIsImlzVGFnVmFsaWRJbkNvbnRleHQiLCJfY2xhc3NDYWxsQ2hlY2siLCJDb25zdHJ1Y3RvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9SZWFjdCRDb21wb25lbnQiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsImNvbXB1dGVNYXRjaCIsImhpc3RvcnkiLCJnZXRDaGlsZENvbnRleHQiLCJyb3V0ZXIiLCJyb3V0ZSIsInVybCIsInBhcmFtcyIsImlzRXhhY3QiLCJjb21wb25lbnRXaWxsTW91bnQiLCJfdGhpczIiLCJfcHJvcHMiLCJ1bmxpc3RlbiIsImxpc3RlbiIsInNldFN0YXRlIiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5leHRQcm9wcyIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVuZGVyIiwiaXNSZXF1aXJlZCIsImNvbnRleHRUeXBlcyIsImNoaWxkQ29udGV4dFR5cGVzIiwicGF0dGVybkNhY2hlIiwiY2FjaGVMaW1pdCIsImNhY2hlQ291bnQiLCJjb21waWxlUGF0aCIsInBhdHRlcm4iLCJvcHRpb25zIiwiY2FjaGVLZXkiLCJlbmQiLCJzdHJpY3QiLCJjYWNoZSIsInJlIiwiY29tcGlsZWRQYXR0ZXJuIiwiX29wdGlvbnMiLCJfb3B0aW9ucyRwYXRoIiwiX29wdGlvbnMkZXhhY3QiLCJleGFjdCIsIl9vcHRpb25zJHN0cmljdCIsIl9jb21waWxlUGF0aCIsInZhbHVlcyIsInJlZHVjZSIsIm1lbW8iLCJpc0NydXNoZWQiLCJjcmVhdGVTdG9yZSIsImNvbWJpbmVSZWR1Y2VycyIsImJpbmRBY3Rpb25DcmVhdG9ycyIsImFwcGx5TWlkZGxld2FyZSIsImNvbXBvc2UiLCJFdmVudExpc3RlbmVyIiwiZXZlbnRUeXBlIiwiZGV0YWNoRXZlbnQiLCJyZWdpc3RlckRlZmF1bHQiLCJmb2N1c05vZGUiLCJmb2N1cyIsImdldEFjdGl2ZUVsZW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiYm9keSIsImdldENvbmZpcm1hdGlvbiIsImNvbmZpcm0iLCJzdXBwb3J0c0hpc3RvcnkiLCJ1YSIsInN1cHBvcnRzUG9wU3RhdGVPbkhhc2hDaGFuZ2UiLCJzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaCIsImlzRXh0cmFuZW91c1BvcHN0YXRlRXZlbnQiLCJSRUFDVF9TVEFUSUNTIiwiZ2V0RGVmYXVsdFByb3BzIiwibWl4aW5zIiwiS05PV05fU1RBVElDUyIsImNhbGxlciIsImFyaXR5IiwiaXNHZXRPd25Qcm9wZXJ0eVN5bWJvbHNBdmFpbGFibGUiLCJob2lzdE5vblJlYWN0U3RhdGljcyIsInRhcmdldENvbXBvbmVudCIsInNvdXJjZUNvbXBvbmVudCIsImN1c3RvbVN0YXRpY3MiLCJJVEVSQVRPUl9TWU1CT0wiLCJpdGVyYXRvciIsIkZBVVhfSVRFUkFUT1JfU1lNQk9MIiwiZ2V0SXRlcmF0b3JGbiIsIm1heWJlSXRlcmFibGUiLCJpdGVyYXRvckZuIiwiQU5PTllNT1VTIiwiY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIiLCJib29sIiwibnVtYmVyIiwic3ltYm9sIiwiYW55IiwiY3JlYXRlQW55VHlwZUNoZWNrZXIiLCJhcnJheU9mIiwiY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyIiwiY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyIiwiaW5zdGFuY2VPZiIsImNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIiLCJjcmVhdGVOb2RlQ2hlY2tlciIsIm9iamVjdE9mIiwiY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlciIsIm9uZU9mIiwiY3JlYXRlRW51bVR5cGVDaGVja2VyIiwib25lT2ZUeXBlIiwiY3JlYXRlVW5pb25UeXBlQ2hlY2tlciIsInNoYXBlIiwiY3JlYXRlU2hhcGVUeXBlQ2hlY2tlciIsIlByb3BUeXBlRXJyb3IiLCJjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciIsInZhbGlkYXRlIiwibWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUiLCJtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCIsImNoZWNrVHlwZSIsInByb3BGdWxsTmFtZSIsInNlY3JldCIsImNoYWluZWRDaGVja1R5cGUiLCJleHBlY3RlZFR5cGUiLCJwcm9wVmFsdWUiLCJwcm9wVHlwZSIsImdldFByb3BUeXBlIiwicHJlY2lzZVR5cGUiLCJnZXRQcmVjaXNlVHlwZSIsInR5cGVDaGVja2VyIiwiZXhwZWN0ZWRDbGFzcyIsImV4cGVjdGVkQ2xhc3NOYW1lIiwiYWN0dWFsQ2xhc3NOYW1lIiwiZ2V0Q2xhc3NOYW1lIiwiZXhwZWN0ZWRWYWx1ZXMiLCJ2YWx1ZXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXJyYXlPZlR5cGVDaGVja2VycyIsImNoZWNrZXIiLCJnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmciLCJpc05vZGUiLCJzaGFwZVR5cGVzIiwiZXZlcnkiLCJzdGVwIiwiZW50cmllcyIsIm5leHQiLCJkb25lIiwiZW50cnkiLCJpc1N5bWJvbCIsImlzVW5pdGxlc3NOdW1iZXIiLCJhbmltYXRpb25JdGVyYXRpb25Db3VudCIsImJvcmRlckltYWdlT3V0c2V0IiwiYm9yZGVySW1hZ2VTbGljZSIsImJvcmRlckltYWdlV2lkdGgiLCJib3hGbGV4IiwiYm94RmxleEdyb3VwIiwiYm94T3JkaW5hbEdyb3VwIiwiY29sdW1uQ291bnQiLCJmbGV4IiwiZmxleEdyb3ciLCJmbGV4UG9zaXRpdmUiLCJmbGV4U2hyaW5rIiwiZmxleE5lZ2F0aXZlIiwiZmxleE9yZGVyIiwiZ3JpZFJvdyIsImdyaWRSb3dFbmQiLCJncmlkUm93U3BhbiIsImdyaWRSb3dTdGFydCIsImdyaWRDb2x1bW4iLCJncmlkQ29sdW1uRW5kIiwiZ3JpZENvbHVtblNwYW4iLCJncmlkQ29sdW1uU3RhcnQiLCJmb250V2VpZ2h0IiwibGluZUNsYW1wIiwibGluZUhlaWdodCIsIm9wYWNpdHkiLCJvcmRlciIsIm9ycGhhbnMiLCJ0YWJTaXplIiwid2lkb3dzIiwiekluZGV4Iiwiem9vbSIsImZpbGxPcGFjaXR5IiwiZmxvb2RPcGFjaXR5Iiwic3RvcE9wYWNpdHkiLCJzdHJva2VEYXNoYXJyYXkiLCJzdHJva2VEYXNob2Zmc2V0Iiwic3Ryb2tlTWl0ZXJsaW1pdCIsInN0cm9rZU9wYWNpdHkiLCJzdHJva2VXaWR0aCIsInByZWZpeEtleSIsInRvVXBwZXJDYXNlIiwicHJlZml4ZXMiLCJzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnMiLCJiYWNrZ3JvdW5kIiwiYmFja2dyb3VuZEF0dGFjaG1lbnQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb25YIiwiYmFja2dyb3VuZFBvc2l0aW9uWSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJib3JkZXIiLCJib3JkZXJXaWR0aCIsImJvcmRlclN0eWxlIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJCb3R0b20iLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJUb3AiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiLCJmb250IiwiZm9udFN0eWxlIiwiZm9udFZhcmlhbnQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJvdXRsaW5lIiwib3V0bGluZVdpZHRoIiwib3V0bGluZVN0eWxlIiwib3V0bGluZUNvbG9yIiwiQ1NTUHJvcGVydHkiLCJfY2FsbGJhY2tzIiwiX2NvbnRleHRzIiwiX2FyZyIsImNvbnRleHRzIiwiY2hlY2twb2ludCIsInJvbGxiYWNrIiwicXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIiLCJWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCIsImlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUiLCJ2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUiLCJpc0F0dHJpYnV0ZU5hbWVTYWZlIiwic2hvdWxkSWdub3JlVmFsdWUiLCJpc05hTiIsIkRPTVByb3BlcnR5T3BlcmF0aW9ucyIsImNyZWF0ZU1hcmt1cEZvcklEIiwic2V0QXR0cmlidXRlRm9ySUQiLCJjcmVhdGVNYXJrdXBGb3JSb290Iiwic2V0QXR0cmlidXRlRm9yUm9vdCIsImNyZWF0ZU1hcmt1cEZvclByb3BlcnR5IiwiY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlIiwic2V0VmFsdWVGb3JQcm9wZXJ0eSIsImRlbGV0ZVZhbHVlRm9yUHJvcGVydHkiLCJuYW1lc3BhY2UiLCJzZXRBdHRyaWJ1dGVOUyIsInNldFZhbHVlRm9yQXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUiLCJkaWRXYXJuVmFsdWVMaW5rIiwiZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlIiwidXBkYXRlT3B0aW9uc0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQiLCJfd3JhcHBlclN0YXRlIiwicGVuZGluZ1VwZGF0ZSIsInVwZGF0ZU9wdGlvbnMiLCJCb29sZWFuIiwibXVsdGlwbGUiLCJ2YWx1ZVByb3BOYW1lcyIsImNoZWNrU2VsZWN0UHJvcFR5cGVzIiwic2VsZWN0ZWRWYWx1ZSIsInNlbGVjdGVkIiwiUmVhY3RET01TZWxlY3QiLCJnZXRIb3N0UHJvcHMiLCJtb3VudFdyYXBwZXIiLCJpbml0aWFsVmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJfaGFuZGxlQ2hhbmdlIiwid2FzTXVsdGlwbGUiLCJnZXRTZWxlY3RWYWx1ZUNvbnRleHQiLCJwb3N0VXBkYXRlV3JhcHBlciIsImVtcHR5Q29tcG9uZW50RmFjdG9yeSIsIlJlYWN0RW1wdHlDb21wb25lbnRJbmplY3Rpb24iLCJpbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkiLCJSZWFjdEVtcHR5Q29tcG9uZW50IiwiaW5zdGFudGlhdGUiLCJnZW5lcmljQ29tcG9uZW50Q2xhc3MiLCJ0ZXh0Q29tcG9uZW50Q2xhc3MiLCJSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb24iLCJpbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MiLCJjb21wb25lbnRDbGFzcyIsImluamVjdFRleHRDb21wb25lbnRDbGFzcyIsImNyZWF0ZUludGVybmFsQ29tcG9uZW50IiwiY3JlYXRlSW5zdGFuY2VGb3JUZXh0IiwiaXNUZXh0Q29tcG9uZW50IiwiUmVhY3RIb3N0Q29tcG9uZW50IiwiUmVhY3RET01TZWxlY3Rpb24iLCJjb250YWluc05vZGUiLCJpc0luRG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJSZWFjdElucHV0U2VsZWN0aW9uIiwiaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzIiwiZWxlbSIsImNvbnRlbnRFZGl0YWJsZSIsImdldFNlbGVjdGlvbkluZm9ybWF0aW9uIiwiZm9jdXNlZEVsZW0iLCJzZWxlY3Rpb25SYW5nZSIsImdldFNlbGVjdGlvbiIsInJlc3RvcmVTZWxlY3Rpb24iLCJwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uIiwiY3VyRm9jdXNlZEVsZW0iLCJwcmlvckZvY3VzZWRFbGVtIiwicHJpb3JTZWxlY3Rpb25SYW5nZSIsInNldFNlbGVjdGlvbiIsImlucHV0Iiwic2VsZWN0aW9uIiwic3RhcnQiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJwYXJlbnRFbGVtZW50IiwibW92ZVN0YXJ0IiwibW92ZUVuZCIsImdldE9mZnNldHMiLCJvZmZzZXRzIiwiY3JlYXRlVGV4dFJhbmdlIiwiY29sbGFwc2UiLCJzZWxlY3QiLCJzZXRPZmZzZXRzIiwiUmVhY3RET01Db250YWluZXJJbmZvIiwiUmVhY3RET01GZWF0dXJlRmxhZ3MiLCJSZWFjdE1hcmt1cENoZWNrc3VtIiwiaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCIsIlJPT1RfQVRUUl9OQU1FIiwiRE9DX05PREVfVFlQRSIsImluc3RhbmNlc0J5UmVhY3RSb290SUQiLCJmaXJzdERpZmZlcmVuY2VJbmRleCIsInN0cmluZzEiLCJzdHJpbmcyIiwibWluTGVuIiwiZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyIiwiY29udGFpbmVyIiwiaW50ZXJuYWxHZXRJRCIsIm1vdW50Q29tcG9uZW50SW50b05vZGUiLCJ3cmFwcGVySW5zdGFuY2UiLCJzaG91bGRSZXVzZU1hcmt1cCIsIndyYXBwZWRFbGVtZW50IiwiY2hpbGQiLCJfdG9wTGV2ZWxXcmFwcGVyIiwiUmVhY3RNb3VudCIsIl9tb3VudEltYWdlSW50b05vZGUiLCJiYXRjaGVkTW91bnRDb21wb25lbnRJbnRvTm9kZSIsImNvbXBvbmVudEluc3RhbmNlIiwidXNlQ3JlYXRlRWxlbWVudCIsInVubW91bnRDb21wb25lbnRGcm9tTm9kZSIsIm9uQmVnaW5GbHVzaCIsIm9uRW5kRmx1c2giLCJsYXN0Q2hpbGQiLCJoYXNOb25Sb290UmVhY3RDaGlsZCIsInJvb3RFbCIsIm5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlIiwiaXNSZWFjdE5vZGUiLCJpc1ZhbGlkQ29udGFpbmVyIiwiaGFzQXR0cmlidXRlIiwiZ2V0SG9zdFJvb3RJbnN0YW5jZUluQ29udGFpbmVyIiwicHJldkhvc3RJbnN0YW5jZSIsImdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyIiwicm9vdCIsIl9ob3N0Q29udGFpbmVySW5mbyIsInRvcExldmVsUm9vdENvdW50ZXIiLCJUb3BMZXZlbFdyYXBwZXIiLCJyb290SUQiLCJpc1JlYWN0Q29tcG9uZW50IiwiX2luc3RhbmNlc0J5UmVhY3RSb290SUQiLCJzY3JvbGxNb25pdG9yIiwicmVuZGVyQ2FsbGJhY2siLCJfdXBkYXRlUm9vdENvbXBvbmVudCIsInByZXZDb21wb25lbnQiLCJfcmVuZGVyTmV3Um9vdENvbXBvbmVudCIsIndyYXBwZXJJRCIsIl9pbnN0YW5jZSIsInJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIiwicGFyZW50Q29tcG9uZW50IiwiX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIiwibmV4dFdyYXBwZWRFbGVtZW50IiwiX3Byb2Nlc3NDaGlsZENvbnRleHQiLCJwcmV2V3JhcHBlZEVsZW1lbnQiLCJwdWJsaWNJbnN0IiwidXBkYXRlZENhbGxiYWNrIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsInJlYWN0Um9vdEVsZW1lbnQiLCJjb250YWluZXJIYXNSZWFjdE1hcmt1cCIsImNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkIiwicm9vdEVsZW1lbnRTaWJsaW5nIiwiaXNDb250YWluZXJSZWFjdFJvb3QiLCJyb290RWxlbWVudCIsImNhblJldXNlTWFya3VwIiwiY2hlY2tzdW0iLCJDSEVDS1NVTV9BVFRSX05BTUUiLCJyb290TWFya3VwIiwib3V0ZXJIVE1MIiwibm9ybWFsaXplZE1hcmt1cCIsIm5vcm1hbGl6ZXIiLCJjb250ZW50RG9jdW1lbnQiLCJ3cml0ZSIsImRpZmZJbmRleCIsImRpZmZlcmVuY2UiLCJob3N0Tm9kZSIsIlJlYWN0Tm9kZVR5cGVzIiwiSE9TVCIsIkNPTVBPU0lURSIsIkVNUFRZIiwiZ2V0VHlwZSIsInNjcm9sbFBvc2l0aW9uIiwiYXJyIiwiY2IiLCJnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSIsIl9yZW5kZXJlZE5vZGVUeXBlIiwiY29udGVudEtleSIsImdldFRleHRDb250ZW50QWNjZXNzb3IiLCJpc0NoZWNrYWJsZSIsImdldFRyYWNrZXIiLCJ2YWx1ZVRyYWNrZXIiLCJhdHRhY2hUcmFja2VyIiwidHJhY2tlciIsImRldGFjaFRyYWNrZXIiLCJnZXRWYWx1ZUZyb21Ob2RlIiwiaW5wdXRWYWx1ZVRyYWNraW5nIiwiX2dldFRyYWNrZXJGcm9tTm9kZSIsInRyYWNrIiwidmFsdWVGaWVsZCIsImRlc2NyaXB0b3IiLCJjdXJyZW50VmFsdWUiLCJzZXRWYWx1ZSIsInN0b3BUcmFja2luZyIsInVwZGF0ZVZhbHVlSWZDaGFuZ2VkIiwibGFzdFZhbHVlIiwibmV4dFZhbHVlIiwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiLCJnZXROZXh0RGVidWdJRCIsIlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlciIsImlzSW50ZXJuYWxDb21wb25lbnRUeXBlIiwic2hvdWxkSGF2ZURlYnVnSUQiLCJnZXROYXRpdmVOb2RlIiwiX21vdW50SW5kZXgiLCJfbW91bnRJbWFnZSIsInByZXZlbnRFeHRlbnNpb25zIiwiX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQiLCJzdXBwb3J0ZWRJbnB1dFR5cGVzIiwiY29sb3IiLCJkYXRlIiwiZGF0ZXRpbWUiLCJlbWFpbCIsIm1vbnRoIiwicGFzc3dvcmQiLCJ0ZWwiLCJ3ZWVrIiwiaXNUZXh0SW5wdXRFbGVtZW50IiwidGV4dENvbnRlbnQiLCJTRVBBUkFUT1IiLCJTVUJTRVBBUkFUT1IiLCJkaWRXYXJuQWJvdXRNYXBzIiwiZ2V0Q29tcG9uZW50S2V5IiwidHJhdmVyc2VBbGxDaGlsZHJlbkltcGwiLCJuYW1lU29GYXIiLCJ0cmF2ZXJzZUNvbnRleHQiLCJuZXh0TmFtZSIsInN1YnRyZWVDb3VudCIsIm5leHROYW1lUHJlZml4IiwiaWkiLCJtYXBzQXNDaGlsZHJlbkFkZGVuZHVtIiwibWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUiLCJfaXNSZWFjdEVsZW1lbnQiLCJjaGlsZHJlblN0cmluZyIsInRyYXZlcnNlQWxsQ2hpbGRyZW4iLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJob3RSZWxvYWRpbmdWZXJzaW9uIiwiZHVtbXlTdGF0ZSIsIm1ha2VTZWxlY3RvclN0YXRlZnVsIiwic291cmNlU2VsZWN0b3IiLCJzdG9yZSIsInNlbGVjdG9yIiwicnVuQ29tcG9uZW50U2VsZWN0b3IiLCJnZXRTdGF0ZSIsInNob3VsZENvbXBvbmVudFVwZGF0ZSIsInNlbGVjdG9yRmFjdG9yeSIsIl9jb250ZXh0VHlwZXMiLCJfY2hpbGRDb250ZXh0VHlwZXMiLCJfcmVmIiwiX3JlZiRnZXREaXNwbGF5TmFtZSIsIl9yZWYkbWV0aG9kTmFtZSIsIm1ldGhvZE5hbWUiLCJfcmVmJHJlbmRlckNvdW50UHJvcCIsInJlbmRlckNvdW50UHJvcCIsIl9yZWYkc2hvdWxkSGFuZGxlU3RhdCIsInNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyIsIl9yZWYkc3RvcmVLZXkiLCJzdG9yZUtleSIsIl9yZWYkd2l0aFJlZiIsIndpdGhSZWYiLCJjb25uZWN0T3B0aW9ucyIsInN1YnNjcmlwdGlvbktleSIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0IiwiX0NvbXBvbmVudCIsInJlbmRlckNvdW50IiwicHJvcHNNb2RlIiwic2V0V3JhcHBlZEluc3RhbmNlIiwiaW5pdFNlbGVjdG9yIiwiaW5pdFN1YnNjcmlwdGlvbiIsIl9yZWYyIiwic3Vic2NyaXB0aW9uIiwiY29tcG9uZW50RGlkTW91bnQiLCJ0cnlTdWJzY3JpYmUiLCJmb3JjZVVwZGF0ZSIsInRyeVVuc3Vic2NyaWJlIiwibm90aWZ5TmVzdGVkU3VicyIsImdldFdyYXBwZWRJbnN0YW5jZSIsIndyYXBwZWRJbnN0YW5jZSIsImRpc3BhdGNoIiwicGFyZW50U3ViIiwib25TdGF0ZUNoYW5nZSIsImNvbXBvbmVudERpZFVwZGF0ZSIsIm5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSIsImlzU3Vic2NyaWJlZCIsImFkZEV4dHJhUHJvcHMiLCJ3aXRoRXh0cmFzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSIsIndyYXBNYXBUb1Byb3BzQ29uc3RhbnQiLCJnZXREZXBlbmRzT25Pd25Qcm9wcyIsIndyYXBNYXBUb1Byb3BzRnVuYyIsImdldENvbnN0YW50IiwiaW5pdENvbnN0YW50U2VsZWN0b3IiLCJjb25zdGFudCIsImNvbnN0YW50U2VsZWN0b3IiLCJkZXBlbmRzT25Pd25Qcm9wcyIsIm1hcFRvUHJvcHMiLCJpbml0UHJveHlTZWxlY3RvciIsInByb3h5IiwibWFwVG9Qcm9wc1Byb3h5Iiwic3RhdGVPckRpc3BhdGNoIiwib3duUHJvcHMiLCJkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5Iiwic3Vic2NyaXB0aW9uU2hhcGUiLCJzdG9yZVNoYXBlIiwic3Vic2NyaWJlIiwidmVyaWZ5UGxhaW5PYmplY3QiLCJpc01vZGlmaWVkRXZlbnQiLCJMaW5rIiwiaGFuZGxlQ2xpY2siLCJvbkNsaWNrIiwiX3RoaXMkcHJvcHMiLCJocmVmIiwiY3JlYXRlSHJlZiIsImNvbXB1dGVkTWF0Y2giLCJfcHJvcHMyIiwiX2NvbnRleHQkcm91dGVyIiwic3RhdGljQ29udGV4dCIsIlJlYWN0Tm9vcFVwZGF0ZVF1ZXVlIiwiUmVhY3RDb21wb25lbnQiLCJ1cGRhdGVyIiwicmVmcyIsImRlcHJlY2F0ZWRBUElzIiwicmVwbGFjZVN0YXRlIiwiZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nIiwiZm5OYW1lIiwiUmVhY3RQdXJlQ29tcG9uZW50IiwiQ29tcG9uZW50RHVtbXkiLCJpc1B1cmVSZWFjdENvbXBvbmVudCIsImNoZWNrUmVhY3RUeXBlU3BlYyIsImdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtIiwiZWxlbWVudFByb3BzIiwib3duZXJIYXNLZXlVc2VXYXJuaW5nIiwiZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyIsInBhcmVudFR5cGUiLCJwYXJlbnROYW1lIiwidmFsaWRhdGVFeHBsaWNpdEtleSIsIm1lbW9pemVyIiwidW5pcXVlS2V5IiwiY3VycmVudENvbXBvbmVudEVycm9ySW5mbyIsInZhbGlkYXRlQ2hpbGRLZXlzIiwidmFsaWRhdGVQcm9wVHlwZXMiLCJpc1JlYWN0Q2xhc3NBcHByb3ZlZCIsInZhbGlkVHlwZSIsInNvdXJjZUluZm8iLCJ2YWxpZGF0ZWRGYWN0b3J5Iiwid2Fybk5vb3AiLCJmdW5jcyIsImxhc3QiLCJyZXN0IiwicmVkdWNlUmlnaHQiLCJjb21wb3NlZCIsIkFjdGlvblR5cGVzIiwiSU5JVCIsInJlZHVjZXIiLCJwcmVsb2FkZWRTdGF0ZSIsImVuaGFuY2VyIiwiY3VycmVudFJlZHVjZXIiLCJjdXJyZW50U3RhdGUiLCJjdXJyZW50TGlzdGVuZXJzIiwibmV4dExpc3RlbmVycyIsImlzRGlzcGF0Y2hpbmciLCJlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzIiwidW5zdWJzY3JpYmUiLCJyZXBsYWNlUmVkdWNlciIsIm5leHRSZWR1Y2VyIiwib2JzZXJ2YWJsZSIsIm91dGVyU3Vic2NyaWJlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlU3RhdGUiLCJnIiwiZXZhbCIsIkJvdHRvbU5hdiIsImZvb3Rlckl0ZW1zIiwiaWNvbk1hcCIsImZpbGVzIiwicGhvdG9zIiwic2hhcmVkIiwibXVzaWMiLCJtZW51IiwiZm9vdGVyRWxlbWVudHMiLCJnZXRQYXRoIiwidHJhdmVyc2UiLCJvcmlnaW4iLCJwcm9wbGlzdCIsInNoaWZ0IiwiY29udGVudHMiLCJmaW5kIiwiY3VycmVudFBhdGgiLCJmaWxlc3lzdGVtIiwiQnJvd3NlclJvdXRlciIsIkhhc2hSb3V0ZXIiLCJOYXZMaW5rIiwiaXRlbUxpc3RzIiwiTWFpbiIsImN1cnJlbnRMaXN0IiwiTWVudSIsInNlbGVjdE1vZGUiLCJ0b2dnbGVTZWxlY3Rpb24iLCJzZWxlY3Rpb25Nb2RlIiwibmF2aWdhdGVUbyIsIl9pbnZhcmlhbnQiLCJNSVhJTlNfS0VZIiwiaWRlbnRpdHkiLCJSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyIsImNoaWxkQ29udGV4dCIsImluamVjdGVkTWl4aW5zIiwiUmVhY3RDbGFzc0ludGVyZmFjZSIsInN0YXRpY3MiLCJnZXRJbml0aWFsU3RhdGUiLCJ1cGRhdGVDb21wb25lbnQiLCJSRVNFUlZFRF9TUEVDX0tFWVMiLCJtaXhTcGVjSW50b0NvbXBvbmVudCIsInZhbGlkYXRlVHlwZURlZiIsImNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uIiwibWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQiLCJhdXRvYmluZCIsInR5cGVEZWYiLCJ2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlIiwiaXNBbHJlYWR5RGVmaW5lZCIsInNwZWNQb2xpY3kiLCJSZWFjdENsYXNzTWl4aW4iLCJzcGVjIiwidHlwZW9mU3BlYyIsImlzTWl4aW5WYWxpZCIsImF1dG9CaW5kUGFpcnMiLCJfX3JlYWN0QXV0b0JpbmRQYWlycyIsInByb3BlcnR5IiwiaXNSZWFjdENsYXNzTWV0aG9kIiwic2hvdWxkQXV0b0JpbmQiLCJjcmVhdGVDaGFpbmVkRnVuY3Rpb24iLCJpc1Jlc2VydmVkIiwiaXNJbmhlcml0ZWQiLCJtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzIiwib25lIiwidHdvIiwibWVyZ2VkUmVzdWx0IiwiY2hhaW5lZEZ1bmN0aW9uIiwiYmluZEF1dG9CaW5kTWV0aG9kIiwiYm91bmRNZXRob2QiLCJfX3JlYWN0Qm91bmRDb250ZXh0IiwiX19yZWFjdEJvdW5kTWV0aG9kIiwiX19yZWFjdEJvdW5kQXJndW1lbnRzIiwiX2JpbmQiLCJuZXdUaGlzIiwicmVib3VuZE1ldGhvZCIsImJpbmRBdXRvQmluZE1ldGhvZHMiLCJwYWlycyIsImF1dG9CaW5kS2V5IiwiSXNNb3VudGVkUHJlTWl4aW4iLCJfX2lzTW91bnRlZCIsIklzTW91bnRlZFBvc3RNaXhpbiIsIm5ld1N0YXRlIiwiX19kaWRXYXJuSXNNb3VudGVkIiwiUmVhY3RDbGFzc0NvbXBvbmVudCIsImluaXRpYWxTdGF0ZSIsIl9pc01vY2tGdW5jdGlvbiIsImNvbXBvbmVudFNob3VsZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMiLCJfaHlwaGVuUGF0dGVybiIsImNhbWVsaXplIiwiXyIsImNoYXJhY3RlciIsIm1zUGF0dGVybiIsImNhbWVsaXplU3R5bGVOYW1lIiwiaXNUZXh0Tm9kZSIsIm91dGVyTm9kZSIsImlubmVyTm9kZSIsImNvbnRhaW5zIiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJjYWxsZWUiLCJoYXNBcnJheU5hdHVyZSIsImNyZWF0ZUFycmF5RnJvbU1peGVkIiwiZ2V0TWFya3VwV3JhcCIsImR1bW15Tm9kZSIsIm5vZGVOYW1lUGF0dGVybiIsImdldE5vZGVOYW1lIiwibm9kZU5hbWVNYXRjaCIsImNyZWF0ZU5vZGVzRnJvbU1hcmt1cCIsImhhbmRsZVNjcmlwdCIsIndyYXAiLCJ3cmFwRGVwdGgiLCJzY3JpcHRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJub2RlcyIsImNoaWxkTm9kZXMiLCJzaG91bGRXcmFwIiwic2VsZWN0V3JhcCIsInRhYmxlV3JhcCIsInRyV3JhcCIsInN2Z1dyYXAiLCJtYXJrdXBXcmFwIiwic3ZnRWxlbWVudHMiLCJnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbiIsInNjcm9sbGFibGUiLCJXaW5kb3ciLCJwYWdlWE9mZnNldCIsInNjcm9sbExlZnQiLCJwYWdlWU9mZnNldCIsInNjcm9sbFRvcCIsIl91cHBlcmNhc2VQYXR0ZXJuIiwiaHlwaGVuYXRlIiwiaHlwaGVuYXRlU3R5bGVOYW1lIiwiTm9kZSIsIm1lbW9pemVTdHJpbmdPbmx5IiwicGVyZm9ybWFuY2UiLCJtc1BlcmZvcm1hbmNlIiwid2Via2l0UGVyZm9ybWFuY2UiLCJwZXJmb3JtYW5jZU5vdyIsIl90eXBlb2YiLCJfaW52YXJpYW50MiIsIl9Mb2NhdGlvblV0aWxzIiwiX2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyIiwiX2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyMiIsIl9ET01VdGlscyIsIlBvcFN0YXRlRXZlbnQiLCJIYXNoQ2hhbmdlRXZlbnQiLCJnZXRIaXN0b3J5U3RhdGUiLCJjcmVhdGVCcm93c2VySGlzdG9yeSIsImdsb2JhbEhpc3RvcnkiLCJjYW5Vc2VIaXN0b3J5IiwibmVlZHNIYXNoQ2hhbmdlTGlzdGVuZXIiLCJfcHJvcHMkZm9yY2VSZWZyZXNoIiwiZm9yY2VSZWZyZXNoIiwiX3Byb3BzJGdldFVzZXJDb25maXJtIiwiX3Byb3BzJGtleUxlbmd0aCIsImtleUxlbmd0aCIsImJhc2VuYW1lIiwiZ2V0RE9NTG9jYXRpb24iLCJoaXN0b3J5U3RhdGUiLCJfd2luZG93JGxvY2F0aW9uIiwiY3JlYXRlS2V5IiwidHJhbnNpdGlvbk1hbmFnZXIiLCJuZXh0U3RhdGUiLCJoYW5kbGVQb3BTdGF0ZSIsImhhbmRsZVBvcCIsImhhbmRsZUhhc2hDaGFuZ2UiLCJmb3JjZU5leHRQb3AiLCJvayIsInJldmVydFBvcCIsImZyb21Mb2NhdGlvbiIsInRvTG9jYXRpb24iLCJhbGxLZXlzIiwiZGVsdGEiLCJnbyIsImluaXRpYWxMb2NhdGlvbiIsInB1c2hTdGF0ZSIsInByZXZJbmRleCIsIm5leHRLZXlzIiwiZ29CYWNrIiwiZ29Gb3J3YXJkIiwibGlzdGVuZXJDb3VudCIsImNoZWNrRE9NTGlzdGVuZXJzIiwiaXNCbG9ja2VkIiwiYmxvY2siLCJ1bmJsb2NrIiwiSGFzaFBhdGhDb2RlcnMiLCJoYXNoYmFuZyIsImVuY29kZVBhdGgiLCJkZWNvZGVQYXRoIiwibm9zbGFzaCIsInNsYXNoIiwiZ2V0SGFzaFBhdGgiLCJwdXNoSGFzaFBhdGgiLCJyZXBsYWNlSGFzaFBhdGgiLCJjcmVhdGVIYXNoSGlzdG9yeSIsImNhbkdvV2l0aG91dFJlbG9hZCIsIl9wcm9wcyRoYXNoVHlwZSIsImhhc2hUeXBlIiwiX0hhc2hQYXRoQ29kZXJzJGhhc2hUIiwiaWdub3JlUGF0aCIsImVuY29kZWRQYXRoIiwicHJldkxvY2F0aW9uIiwiYWxsUGF0aHMiLCJsYXN0SW5kZXhPZiIsImhhc2hDaGFuZ2VkIiwibmV4dFBhdGhzIiwiY2xhbXAiLCJsb3dlckJvdW5kIiwidXBwZXJCb3VuZCIsIm1heCIsImNyZWF0ZU1lbW9yeUhpc3RvcnkiLCJfcHJvcHMkaW5pdGlhbEVudHJpZXMiLCJpbml0aWFsRW50cmllcyIsIl9wcm9wcyRpbml0aWFsSW5kZXgiLCJpbml0aWFsSW5kZXgiLCJuZXh0SW5kZXgiLCJuZXh0RW50cmllcyIsImNhbkdvIiwibnVsbFRhZyIsInVuZGVmaW5lZFRhZyIsInN5bVRvU3RyaW5nVGFnIiwidG9TdHJpbmdUYWciLCJiYXNlR2V0VGFnIiwiZnJlZUdsb2JhbCIsImdsb2JhbCIsImdldFByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJnZXRSYXdUYWciLCJpc093biIsInVubWFza2VkIiwib2JqZWN0VG9TdHJpbmciLCJvdmVyQXJnIiwidHJhbnNmb3JtIiwiZnJlZVNlbGYiLCJpc09iamVjdExpa2UiLCJ0eXBlU3BlY3MiLCJnZXRTdGFjayIsInR5cGVTcGVjTmFtZSIsImV4Iiwic2hpbSIsImdldFNoaW0iLCJBUklBRE9NUHJvcGVydHlDb25maWciLCJBdXRvRm9jdXNVdGlscyIsImZvY3VzRE9NQ29tcG9uZW50IiwiRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlIiwiU3ludGhldGljQ29tcG9zaXRpb25FdmVudCIsIlN5bnRoZXRpY0lucHV0RXZlbnQiLCJFTkRfS0VZQ09ERVMiLCJTVEFSVF9LRVlDT0RFIiwiY2FuVXNlQ29tcG9zaXRpb25FdmVudCIsImNhblVzZVRleHRJbnB1dEV2ZW50IiwiaXNQcmVzdG8iLCJ1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSIsIm9wZXJhIiwiU1BBQ0VCQVJfQ09ERSIsIlNQQUNFQkFSX0NIQVIiLCJiZWZvcmVJbnB1dCIsImJ1YmJsZWQiLCJjYXB0dXJlZCIsImNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uVXBkYXRlIiwiaGFzU3BhY2VLZXlwcmVzcyIsImlzS2V5cHJlc3NDb21tYW5kIiwiZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUiLCJpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCIsImlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCIsImdldERhdGFGcm9tQ3VzdG9tRXZlbnQiLCJjdXJyZW50Q29tcG9zaXRpb24iLCJleHRyYWN0Q29tcG9zaXRpb25FdmVudCIsImZhbGxiYWNrRGF0YSIsImdldERhdGEiLCJjdXN0b21EYXRhIiwiZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyIsIndoaWNoIiwiY2hhcnMiLCJnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMiLCJleHRyYWN0QmVmb3JlSW5wdXRFdmVudCIsIkJlZm9yZUlucHV0RXZlbnRQbHVnaW4iLCJkYW5nZXJvdXNTdHlsZVZhbHVlIiwicHJvY2Vzc1N0eWxlTmFtZSIsInN0eWxlTmFtZSIsImhhc1Nob3J0aGFuZFByb3BlcnR5QnVnIiwic3R5bGVGbG9hdEFjY2Vzc29yIiwidGVtcFN0eWxlIiwic3R5bGUiLCJjc3NGbG9hdCIsImJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiIsImJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiIsIndhcm5lZFN0eWxlTmFtZXMiLCJ3YXJuZWRTdHlsZVZhbHVlcyIsIndhcm5lZEZvck5hTlZhbHVlIiwid2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUiLCJjaGVja1JlbmRlck1lc3NhZ2UiLCJ3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUiLCJ3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24iLCJ3YXJuU3R5bGVWYWx1ZUlzTmFOIiwid2FyblZhbGlkU3R5bGUiLCJDU1NQcm9wZXJ0eU9wZXJhdGlvbnMiLCJjcmVhdGVNYXJrdXBGb3JTdHlsZXMiLCJzdHlsZXMiLCJzZXJpYWxpemVkIiwiaXNDdXN0b21Qcm9wZXJ0eSIsInN0eWxlVmFsdWUiLCJzZXRWYWx1ZUZvclN0eWxlcyIsInNldFByb3BlcnR5IiwiZXhwYW5zaW9uIiwiaW5kaXZpZHVhbFN0eWxlTmFtZSIsImNoYW5nZSIsImNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudCIsImFjdGl2ZUVsZW1lbnRJbnN0Iiwic2hvdWxkVXNlQ2hhbmdlRXZlbnQiLCJkb2VzQ2hhbmdlRXZlbnRCdWJibGUiLCJtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50IiwicnVuRXZlbnRJbkJhdGNoIiwic3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4Iiwic3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgiLCJnZXRJbnN0SWZWYWx1ZUNoYW5nZWQiLCJ1cGRhdGVkIiwiQ2hhbmdlRXZlbnRQbHVnaW4iLCJfYWxsb3dTaW11bGF0ZWRQYXNzVGhyb3VnaCIsImdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudCIsImhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4IiwiaXNJbnB1dEV2ZW50U3VwcG9ydGVkIiwic3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlIiwiaGFuZGxlUHJvcGVydHlDaGFuZ2UiLCJzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSIsImhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbCIsImdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwiLCJzaG91bGRVc2VDbGlja0V2ZW50IiwiZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQiLCJnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50IiwiaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1ciIsImNvbnRyb2xsZWQiLCJfaXNJbnB1dEV2ZW50U3VwcG9ydGVkIiwidGFyZ2V0Tm9kZSIsImdldFRhcmdldEluc3RGdW5jIiwiaGFuZGxlRXZlbnRGdW5jIiwibmV3Q2hpbGQiLCJEZWZhdWx0RXZlbnRQbHVnaW5PcmRlciIsIm1vdXNlRW50ZXIiLCJtb3VzZUxlYXZlIiwiRW50ZXJMZWF2ZUV2ZW50UGx1Z2luIiwid2luIiwicmVsYXRlZCIsInRvTm9kZSIsIl9yb290IiwiX3N0YXJ0VGV4dCIsIl9mYWxsYmFja1RleHQiLCJzdGFydFZhbHVlIiwic3RhcnRMZW5ndGgiLCJlbmRWYWx1ZSIsImVuZExlbmd0aCIsIm1pbkVuZCIsInNsaWNlVGFpbCIsIkhUTUxET01Qcm9wZXJ0eUNvbmZpZyIsImFjY2VwdCIsImFjY2VwdENoYXJzZXQiLCJhY2Nlc3NLZXkiLCJhbGxvd0Z1bGxTY3JlZW4iLCJhbGxvd1RyYW5zcGFyZW5jeSIsImFsdCIsImFzIiwiYXN5bmMiLCJhdXRvQ29tcGxldGUiLCJhdXRvUGxheSIsImNlbGxQYWRkaW5nIiwiY2VsbFNwYWNpbmciLCJjaGFyU2V0IiwiY2hhbGxlbmdlIiwiY2l0ZSIsImNsYXNzSUQiLCJjbGFzc05hbWUiLCJjb2xzIiwiY29sU3BhbiIsImNvbnRleHRNZW51IiwiY29udHJvbHMiLCJjb29yZHMiLCJjcm9zc09yaWdpbiIsImRhdGVUaW1lIiwiZGVmZXIiLCJkb3dubG9hZCIsImRyYWdnYWJsZSIsImVuY1R5cGUiLCJmb3JtIiwiZm9ybUFjdGlvbiIsImZvcm1FbmNUeXBlIiwiZm9ybU1ldGhvZCIsImZvcm1Ob1ZhbGlkYXRlIiwiZm9ybVRhcmdldCIsImZyYW1lQm9yZGVyIiwiaGVhZGVycyIsImhlaWdodCIsImhpZ2giLCJocmVmTGFuZyIsImh0bWxGb3IiLCJodHRwRXF1aXYiLCJpY29uIiwiaW5wdXRNb2RlIiwiaW50ZWdyaXR5Iiwia2V5UGFyYW1zIiwia2V5VHlwZSIsImtpbmQiLCJsYWJlbCIsImxhbmciLCJsaXN0IiwibG9vcCIsImxvdyIsIm1hbmlmZXN0IiwibWFyZ2luSGVpZ2h0IiwibWFyZ2luV2lkdGgiLCJtYXhMZW5ndGgiLCJtZWRpYSIsIm1lZGlhR3JvdXAiLCJtaW5MZW5ndGgiLCJtdXRlZCIsIm5vbmNlIiwibm9WYWxpZGF0ZSIsIm9wZW4iLCJvcHRpbXVtIiwicGxhY2Vob2xkZXIiLCJwbGF5c0lubGluZSIsInBvc3RlciIsInByZWxvYWQiLCJwcm9maWxlIiwicmFkaW9Hcm91cCIsInJlZmVycmVyUG9saWN5IiwicmVsIiwicmVxdWlyZWQiLCJyZXZlcnNlZCIsInJvbGUiLCJyb3dzIiwicm93U3BhbiIsInNhbmRib3giLCJzY29wZWQiLCJzY3JvbGxpbmciLCJzZWFtbGVzcyIsInNpemUiLCJzaXplcyIsInNwYW4iLCJzcGVsbENoZWNrIiwic3JjIiwic3JjRG9jIiwic3JjTGFuZyIsInNyY1NldCIsInN1bW1hcnkiLCJ0YWJJbmRleCIsInVzZU1hcCIsIndpZHRoIiwid21vZGUiLCJhYm91dCIsImRhdGF0eXBlIiwiaW5saXN0IiwicmVzb3VyY2UiLCJ2b2NhYiIsImF1dG9DYXBpdGFsaXplIiwiYXV0b0NvcnJlY3QiLCJhdXRvU2F2ZSIsIml0ZW1Qcm9wIiwiaXRlbVNjb3BlIiwiaXRlbVR5cGUiLCJpdGVtSUQiLCJpdGVtUmVmIiwicmVzdWx0cyIsInNlY3VyaXR5IiwidW5zZWxlY3RhYmxlIiwidmFsaWRpdHkiLCJiYWRJbnB1dCIsImluc3RhbnRpYXRlQ2hpbGQiLCJjaGlsZEluc3RhbmNlcyIsInNlbGZEZWJ1Z0lEIiwia2V5VW5pcXVlIiwiUmVhY3RDaGlsZFJlY29uY2lsZXIiLCJpbnN0YW50aWF0ZUNoaWxkcmVuIiwibmVzdGVkQ2hpbGROb2RlcyIsImNoaWxkSW5zdHMiLCJ1cGRhdGVDaGlsZHJlbiIsInByZXZDaGlsZHJlbiIsIm5leHRDaGlsZHJlbiIsIm1vdW50SW1hZ2VzIiwicmVtb3ZlZE5vZGVzIiwicHJldkNoaWxkIiwibmV4dENoaWxkSW5zdGFuY2UiLCJuZXh0Q2hpbGRNb3VudEltYWdlIiwidW5tb3VudENoaWxkcmVuIiwicmVuZGVyZWRDaGlsZHJlbiIsInJlbmRlcmVkQ2hpbGQiLCJSZWFjdERPTUlET3BlcmF0aW9ucyIsIlJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50IiwiZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzIiwiQ29tcG9zaXRlVHlwZXMiLCJJbXB1cmVDbGFzcyIsIlB1cmVDbGFzcyIsIlN0YXRlbGVzc0Z1bmN0aW9uYWwiLCJTdGF0ZWxlc3NDb21wb25lbnQiLCJ3YXJuSWZJbnZhbGlkRWxlbWVudCIsInNob3VsZENvbnN0cnVjdCIsImlzUHVyZUNvbXBvbmVudCIsIm1lYXN1cmVMaWZlQ3ljbGVQZXJmIiwiZGVidWdJRCIsInRpbWVyVHlwZSIsIm9uQmVnaW5MaWZlQ3ljbGVUaW1lciIsIm9uRW5kTGlmZUN5Y2xlVGltZXIiLCJuZXh0TW91bnRJRCIsIl9jb21wb3NpdGVUeXBlIiwiX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50IiwicHVibGljUHJvcHMiLCJwdWJsaWNDb250ZXh0IiwiX3Byb2Nlc3NDb250ZXh0IiwidXBkYXRlUXVldWUiLCJnZXRVcGRhdGVRdWV1ZSIsImRvQ29uc3RydWN0IiwiX2NvbnN0cnVjdENvbXBvbmVudCIsInJlbmRlcmVkRWxlbWVudCIsInByb3BzTXV0YXRlZCIsImNvbXBvbmVudERpZFVubW91bnQiLCJ1bnN0YWJsZV9oYW5kbGVFcnJvciIsInBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyIsInBlcmZvcm1Jbml0aWFsTW91bnQiLCJfY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyIiwiX3Byb2Nlc3NQZW5kaW5nU3RhdGUiLCJfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50IiwiY2hpbGREZWJ1Z0lEcyIsIl9tYXNrQ29udGV4dCIsIm1hc2tlZENvbnRleHQiLCJjb250ZXh0TmFtZSIsIl9jaGVja0NvbnRleHRUeXBlcyIsImN1cnJlbnRDb250ZXh0Iiwib25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQiLCJvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQiLCJwcmV2Q29udGV4dCIsInByZXZQYXJlbnRFbGVtZW50IiwibmV4dFBhcmVudEVsZW1lbnQiLCJwcmV2VW5tYXNrZWRDb250ZXh0IiwibmV4dFVubWFza2VkQ29udGV4dCIsIndpbGxSZWNlaXZlIiwicHJldlByb3BzIiwic2hvdWxkVXBkYXRlIiwiX3BlcmZvcm1Db21wb25lbnRVcGRhdGUiLCJwYXJ0aWFsIiwidW5tYXNrZWRDb250ZXh0IiwiaGFzQ29tcG9uZW50RGlkVXBkYXRlIiwicHJldlN0YXRlIiwiX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50IiwicHJldkNvbXBvbmVudEluc3RhbmNlIiwicHJldlJlbmRlcmVkRWxlbWVudCIsIm5leHRSZW5kZXJlZEVsZW1lbnQiLCJvbGRIb3N0Tm9kZSIsIm5leHRNYXJrdXAiLCJfcmVwbGFjZU5vZGVXaXRoTWFya3VwIiwiX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCIsImF0dGFjaFJlZiIsInB1YmxpY0NvbXBvbmVudEluc3RhbmNlIiwiZGV0YWNoUmVmIiwiUmVhY3REZWZhdWx0SW5qZWN0aW9uIiwiZmluZERPTU5vZGUiLCJpbmplY3QiLCJSZWFjdERPTSIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIiLCJfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18iLCJNb3VudCIsIlJlY29uY2lsZXIiLCJ0b3AiLCJzaG93RmlsZVVybE1lc3NhZ2UiLCJwcm90b2NvbCIsImRlYnVnIiwidGVzdEZ1bmMiLCJ0ZXN0Rm4iLCJpZUNvbXBhdGliaWxpdHlNb2RlIiwiZXhwZWN0ZWRGZWF0dXJlcyIsInRyaW0iLCJSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2siLCJSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2siLCJSZWFjdERPTUludmFsaWRBUklBSG9vayIsImFkZEhvb2siLCJSZWFjdERPTUlucHV0IiwiUmVhY3RET01PcHRpb24iLCJSZWFjdERPTVRleHRhcmVhIiwiUmVhY3RNdWx0aUNoaWxkIiwiUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiIsImdldE5vZGUiLCJDT05URU5UX1RZUEVTIiwiU1RZTEUiLCJIVE1MIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciLCJET0NfRlJBR01FTlRfVFlQRSIsImZyaWVuZGx5U3RyaW5naWZ5Iiwia2V5RXNjYXBlZCIsInN0eWxlTXV0YXRpb25XYXJuaW5nIiwiY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlIiwic3R5bGUxIiwic3R5bGUyIiwiX3RhZyIsImFzc2VydFZhbGlkUHJvcHMiLCJ2b2lkRWxlbWVudFRhZ3MiLCJvbkZvY3VzSW4iLCJvbkZvY3VzT3V0IiwiZW5xdWV1ZVB1dExpc3RlbmVyIiwiY29udGFpbmVySW5mbyIsImlzRG9jdW1lbnRGcmFnbWVudCIsIl9ub2RlIiwiX293bmVyRG9jdW1lbnQiLCJsaXN0ZW5lclRvUHV0IiwiaW5wdXRQb3N0TW91bnQiLCJwb3N0TW91bnRXcmFwcGVyIiwidGV4dGFyZWFQb3N0TW91bnQiLCJvcHRpb25Qb3N0TW91bnQiLCJzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldiIsImhhc0V4aXN0aW5nQ29udGVudCIsIl9jb250ZW50RGVidWdJRCIsImNvbnRlbnREZWJ1Z0lEIiwiX2FuY2VzdG9ySW5mbyIsIm1lZGlhRXZlbnRzIiwidHJhY2tJbnB1dFZhbHVlIiwidHJhcEJ1YmJsZWRFdmVudHNMb2NhbCIsInBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyIiwib21pdHRlZENsb3NlVGFncyIsImFyZWEiLCJiYXNlIiwiYnIiLCJjb2wiLCJlbWJlZCIsImhyIiwiaW1nIiwia2V5Z2VuIiwibGluayIsIm1ldGEiLCJwYXJhbSIsIndiciIsIm5ld2xpbmVFYXRpbmdUYWdzIiwibGlzdGluZyIsInByZSIsInRleHRhcmVhIiwibWVudWl0ZW0iLCJWQUxJRF9UQUdfUkVHRVgiLCJ2YWxpZGF0ZWRUYWdDYWNoZSIsInZhbGlkYXRlRGFuZ2Vyb3VzVGFnIiwiaXNDdXN0b21Db21wb25lbnQiLCJnbG9iYWxJZENvdW50ZXIiLCJSZWFjdERPTUNvbXBvbmVudCIsIl9uYW1lc3BhY2VVUkkiLCJfcHJldmlvdXNTdHlsZSIsIl9wcmV2aW91c1N0eWxlQ29weSIsIk1peGluIiwiX2lkQ291bnRlciIsIm1vdW50SW1hZ2UiLCJlbCIsImRpdiIsImNyZWF0ZUVsZW1lbnROUyIsIl91cGRhdGVET01Qcm9wZXJ0aWVzIiwibGF6eVRyZWUiLCJfY3JlYXRlSW5pdGlhbENoaWxkcmVuIiwidGFnT3BlbiIsIl9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzIiwidGFnQ29udGVudCIsIl9jcmVhdGVDb250ZW50TWFya3VwIiwiYXV0b0ZvY3VzIiwicHJvcEtleSIsInJlbmRlclRvU3RhdGljTWFya3VwIiwiX19odG1sIiwiY29udGVudFRvVXNlIiwiY2hpbGRyZW5Ub1VzZSIsIm1vdW50Q2hpbGRyZW4iLCJsYXN0UHJvcHMiLCJfdXBkYXRlRE9NQ2hpbGRyZW4iLCJ1cGRhdGVXcmFwcGVyIiwic3R5bGVVcGRhdGVzIiwibGFzdFN0eWxlIiwibmV4dFByb3AiLCJsYXN0UHJvcCIsImxhc3RDb250ZW50IiwibmV4dENvbnRlbnQiLCJsYXN0SHRtbCIsIm5leHRIdG1sIiwibGFzdENoaWxkcmVuIiwibGFzdEhhc0NvbnRlbnRPckh0bWwiLCJuZXh0SGFzQ29udGVudE9ySHRtbCIsInVwZGF0ZVRleHRDb250ZW50IiwidXBkYXRlTWFya3VwIiwidG9wTGV2ZWxXcmFwcGVyIiwiUmVhY3RET01FbXB0eUNvbXBvbmVudCIsImRvbUlEIiwiY3JlYXRlQ29tbWVudCIsInVzZUZpYmVyIiwiZGlkV2FybkNoZWNrZWRMaW5rIiwiZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCIsImRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQiLCJkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkIiwiZm9yY2VVcGRhdGVJZk1vdW50ZWQiLCJpc0NvbnRyb2xsZWQiLCJ1c2VzQ2hlY2tlZCIsImhvc3RQcm9wcyIsImRlZmF1bHRDaGVja2VkIiwiaW5pdGlhbENoZWNrZWQiLCJ2YWx1ZUFzTnVtYmVyIiwicGFyc2VGbG9hdCIsInJvb3ROb2RlIiwicXVlcnlSb290IiwiZ3JvdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwib3RoZXJOb2RlIiwib3RoZXJJbnN0YW5jZSIsIndhcm5lZFByb3BlcnRpZXMiLCJyQVJJQSIsInZhbGlkYXRlUHJvcGVydHkiLCJzdGFuZGFyZE5hbWUiLCJ3YXJuSW52YWxpZEFSSUFQcm9wcyIsImludmFsaWRQcm9wcyIsImlzVmFsaWQiLCJ1bmtub3duUHJvcFN0cmluZyIsImhhbmRsZUVsZW1lbnQiLCJkaWRXYXJuVmFsdWVOdWxsIiwiZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbiIsImZsYXR0ZW5DaGlsZHJlbiIsInNlbGVjdFZhbHVlIiwic2VsZWN0UGFyZW50IiwiZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldCIsImlzQ29sbGFwc2VkIiwiYW5jaG9yTm9kZSIsImFuY2hvck9mZnNldCIsImZvY3VzT2Zmc2V0IiwiZ2V0SUVPZmZzZXRzIiwic2VsZWN0ZWRSYW5nZSIsInNlbGVjdGVkTGVuZ3RoIiwiZnJvbVN0YXJ0IiwiZHVwbGljYXRlIiwibW92ZVRvRWxlbWVudFRleHQiLCJzZXRFbmRQb2ludCIsInN0YXJ0T2Zmc2V0IiwiZW5kT2Zmc2V0IiwiZ2V0TW9kZXJuT2Zmc2V0cyIsInJhbmdlQ291bnQiLCJjdXJyZW50UmFuZ2UiLCJnZXRSYW5nZUF0Iiwic3RhcnRDb250YWluZXIiLCJlbmRDb250YWluZXIiLCJpc1NlbGVjdGlvbkNvbGxhcHNlZCIsInJhbmdlTGVuZ3RoIiwidGVtcFJhbmdlIiwiY2xvbmVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNldEVuZCIsImlzVGVtcFJhbmdlQ29sbGFwc2VkIiwiZGV0ZWN0aW9uUmFuZ2UiLCJzZXRTdGFydCIsImlzQmFja3dhcmQiLCJjb2xsYXBzZWQiLCJzZXRJRU9mZnNldHMiLCJzZXRNb2Rlcm5PZmZzZXRzIiwiZXh0ZW5kIiwidGVtcCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwib2Zmc2V0IiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJ1c2VJRU9mZnNldHMiLCJSZWFjdERPTVRleHRDb21wb25lbnQiLCJfc3RyaW5nVGV4dCIsIl9jbG9zaW5nQ29tbWVudCIsIl9jb21tZW50Tm9kZXMiLCJvcGVuaW5nVmFsdWUiLCJjbG9zaW5nVmFsdWUiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiZXNjYXBlZFRleHQiLCJuZXh0VGV4dCIsIm5leHRTdHJpbmdUZXh0IiwiY29tbWVudE5vZGVzIiwiZGlkV2FyblZhbERlZmF1bHRWYWwiLCJuZXdWYWx1ZSIsImluc3RBIiwiaW5zdEIiLCJkZXB0aEEiLCJ0ZW1wQSIsImRlcHRoQiIsInRlbXBCIiwiZGVwdGgiLCJjb21tb24iLCJwYXRoRnJvbSIsInBhdGhUbyIsInJlYWN0UHJvcHMiLCJ3YXJuVW5rbm93blByb3BlcnRpZXMiLCJ1bmtub3duUHJvcHMiLCJSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rIiwiUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2siLCJob29rcyIsImRpZEhvb2tUaHJvd0ZvckV2ZW50IiwiY2FsbEhvb2siLCJhcmc0IiwiYXJnNSIsImVtaXRFdmVudCIsImhvb2siLCJpc1Byb2ZpbGluZyIsImZsdXNoSGlzdG9yeSIsImxpZmVDeWNsZVRpbWVyU3RhY2siLCJjdXJyZW50Rmx1c2hOZXN0aW5nIiwiY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzIiwiY3VycmVudEZsdXNoU3RhcnRUaW1lIiwiY3VycmVudFRpbWVyRGVidWdJRCIsImN1cnJlbnRUaW1lclN0YXJ0VGltZSIsImN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24iLCJjdXJyZW50VGltZXJUeXBlIiwibGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQiLCJjbGVhckhpc3RvcnkiLCJnZXRUcmVlU25hcHNob3QiLCJyZWdpc3RlcmVkSURzIiwicmVzZXRNZWFzdXJlbWVudHMiLCJwcmV2aW91c1N0YXJ0VGltZSIsInByZXZpb3VzTWVhc3VyZW1lbnRzIiwicHJldmlvdXNPcGVyYXRpb25zIiwiZ2V0SGlzdG9yeSIsImR1cmF0aW9uIiwibWVhc3VyZW1lbnRzIiwib3BlcmF0aW9ucyIsInRyZWVTbmFwc2hvdCIsImNoZWNrRGVidWdJRCIsImFsbG93Um9vdCIsImJlZ2luTGlmZUN5Y2xlVGltZXIiLCJlbmRMaWZlQ3ljbGVUaW1lciIsInBhdXNlQ3VycmVudExpZmVDeWNsZVRpbWVyIiwiY3VycmVudFRpbWVyIiwic3RhcnRUaW1lIiwibmVzdGVkRmx1c2hTdGFydFRpbWUiLCJyZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIiLCJfbGlmZUN5Y2xlVGltZXJTdGFjayQiLCJuZXN0ZWRGbHVzaER1cmF0aW9uIiwibGFzdE1hcmtUaW1lU3RhbXAiLCJjYW5Vc2VQZXJmb3JtYW5jZU1lYXN1cmUiLCJtYXJrIiwiY2xlYXJNYXJrcyIsIm1lYXN1cmUiLCJjbGVhck1lYXN1cmVzIiwic2hvdWxkTWFyayIsImlzSG9zdEVsZW1lbnQiLCJtYXJrQmVnaW4iLCJtYXJrVHlwZSIsIm1hcmtOYW1lIiwibWFya0VuZCIsIm1lYXN1cmVtZW50TmFtZSIsInJlbW92ZUhvb2siLCJiZWdpblByb2ZpbGluZyIsImVuZFByb2ZpbGluZyIsImdldEZsdXNoSGlzdG9yeSIsIm9wZXJhdGlvbiIsIm9uVGVzdEV2ZW50IiwiYWRkRGV2dG9vbCIsInJlbW92ZURldnRvb2wiLCJSRVNFVF9CQVRDSEVEX1VQREFURVMiLCJSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5IiwiRkxVU0hfQkFUQ0hFRF9VUERBVEVTIiwiUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uIiwiYWxyZWFkeUJhdGNoaW5nVXBkYXRlcyIsIlJlYWN0RE9NVHJlZVRyYXZlcnNhbCIsIlJlYWN0SW5qZWN0aW9uIiwiU1ZHRE9NUHJvcGVydHlDb25maWciLCJTZWxlY3RFdmVudFBsdWdpbiIsIlNpbXBsZUV2ZW50UGx1Z2luIiwiYWxyZWFkeUluamVjdGVkIiwiRXZlbnRFbWl0dGVyIiwiSG9zdENvbXBvbmVudCIsIkVtcHR5Q29tcG9uZW50IiwiVXBkYXRlcyIsInJ1bkV2ZW50UXVldWVJbkJhdGNoIiwiZmluZFBhcmVudCIsIlRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyIsImFuY2VzdG9ycyIsImhhbmRsZVRvcExldmVsSW1wbCIsImJvb2tLZWVwaW5nIiwiYW5jZXN0b3IiLCJfaGFuZGxlVG9wTGV2ZWwiLCJzY3JvbGxWYWx1ZU1vbml0b3IiLCJfZW5hYmxlZCIsIl9wcmV2ZW50Q2xlYXJpbmciLCJwcm9jZXNzaW5nQ2hpbGRDb250ZXh0Iiwid2FybkludmFsaWRTZXRTdGF0ZSIsImFkbGVyMzIiLCJUQUdfRU5EIiwiQ09NTUVOVF9TVEFSVCIsImFkZENoZWNrc3VtVG9NYXJrdXAiLCJleGlzdGluZ0NoZWNrc3VtIiwibWFya3VwQ2hlY2tzdW0iLCJtYWtlSW5zZXJ0TWFya3VwIiwibWFrZU1vdmUiLCJtYWtlUmVtb3ZlIiwibWFrZVNldE1hcmt1cCIsIm1ha2VUZXh0Q29udGVudCIsInByb2Nlc3NRdWV1ZSIsInNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uIiwiZ2V0RGVidWdJRCIsImludGVybmFsIiwiX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuIiwibmVzdGVkQ2hpbGRyZW4iLCJfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuIiwibmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMiLCJfdXBkYXRlQ2hpbGRyZW4iLCJuZXh0TW91bnRJbmRleCIsImxhc3RQbGFjZWROb2RlIiwiX21vdW50Q2hpbGRBdEluZGV4IiwiX3VubW91bnRDaGlsZCIsImNyZWF0ZUNoaWxkIiwiaXNWYWxpZE93bmVyIiwiUmVhY3RPd25lciIsImFkZENvbXBvbmVudEFzUmVmVG8iLCJyZW1vdmVDb21wb25lbnRBc1JlZkZyb20iLCJvd25lclB1YmxpY0luc3RhbmNlIiwiU0VMRUNUSU9OX1JFU1RPUkFUSU9OIiwiRVZFTlRfU1VQUFJFU1NJT04iLCJjdXJyZW50bHlFbmFibGVkIiwicHJldmlvdXNseUVuYWJsZWQiLCJPTl9ET01fUkVBRFlfUVVFVUVJTkciLCJyZWFjdE1vdW50UmVhZHkiLCJwcmV2UmVmIiwicHJldk93bmVyIiwibmV4dFJlZiIsIm5leHRPd25lciIsIlJlYWN0U2VydmVyVXBkYXRlUXVldWUiLCJub29wQ2FsbGJhY2tRdWV1ZSIsIk5TIiwieGxpbmsiLCJ4bWwiLCJBVFRSUyIsImFjY2VudEhlaWdodCIsImFjY3VtdWxhdGUiLCJhZGRpdGl2ZSIsImFsaWdubWVudEJhc2VsaW5lIiwiYWxsb3dSZW9yZGVyIiwiYWxwaGFiZXRpYyIsImFtcGxpdHVkZSIsImFyYWJpY0Zvcm0iLCJhc2NlbnQiLCJhdHRyaWJ1dGVUeXBlIiwiYXV0b1JldmVyc2UiLCJhemltdXRoIiwiYmFzZUZyZXF1ZW5jeSIsImJhc2VQcm9maWxlIiwiYmFzZWxpbmVTaGlmdCIsImJib3giLCJiZWdpbiIsImJpYXMiLCJieSIsImNhbGNNb2RlIiwiY2FwSGVpZ2h0IiwiY2xpcCIsImNsaXBQYXRoIiwiY2xpcFJ1bGUiLCJjbGlwUGF0aFVuaXRzIiwiY29sb3JJbnRlcnBvbGF0aW9uIiwiY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycyIsImNvbG9yUHJvZmlsZSIsImNvbG9yUmVuZGVyaW5nIiwiY29udGVudFNjcmlwdFR5cGUiLCJjb250ZW50U3R5bGVUeXBlIiwiY3Vyc29yIiwiY3giLCJjeSIsImRlY2VsZXJhdGUiLCJkZXNjZW50IiwiZGlmZnVzZUNvbnN0YW50IiwiZGlyZWN0aW9uIiwiZGlzcGxheSIsImRpdmlzb3IiLCJkb21pbmFudEJhc2VsaW5lIiwiZHVyIiwiZHgiLCJkeSIsImVkZ2VNb2RlIiwiZWxldmF0aW9uIiwiZW5hYmxlQmFja2dyb3VuZCIsImV4cG9uZW50IiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZpbGwiLCJmaWxsUnVsZSIsImZpbHRlclJlcyIsImZpbHRlclVuaXRzIiwiZmxvb2RDb2xvciIsImZvY3VzYWJsZSIsImZvbnRTaXplQWRqdXN0IiwiZm9udFN0cmV0Y2giLCJmeCIsImZ5IiwiZzEiLCJnMiIsImdseXBoTmFtZSIsImdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsIiwiZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsIiwiZ2x5cGhSZWYiLCJncmFkaWVudFRyYW5zZm9ybSIsImdyYWRpZW50VW5pdHMiLCJoYW5naW5nIiwiaG9yaXpBZHZYIiwiaG9yaXpPcmlnaW5YIiwiaWRlb2dyYXBoaWMiLCJpbWFnZVJlbmRlcmluZyIsImluMiIsImludGVyY2VwdCIsImsxIiwiazIiLCJrMyIsIms0Iiwia2VybmVsTWF0cml4Iiwia2VybmVsVW5pdExlbmd0aCIsImtlcm5pbmciLCJrZXlQb2ludHMiLCJrZXlTcGxpbmVzIiwia2V5VGltZXMiLCJsZW5ndGhBZGp1c3QiLCJsZXR0ZXJTcGFjaW5nIiwibGlnaHRpbmdDb2xvciIsImxpbWl0aW5nQ29uZUFuZ2xlIiwibG9jYWwiLCJtYXJrZXJFbmQiLCJtYXJrZXJNaWQiLCJtYXJrZXJTdGFydCIsIm1hcmtlckhlaWdodCIsIm1hcmtlclVuaXRzIiwibWFya2VyV2lkdGgiLCJtYXNrIiwibWFza0NvbnRlbnRVbml0cyIsIm1hc2tVbml0cyIsIm1hdGhlbWF0aWNhbCIsIm1vZGUiLCJudW1PY3RhdmVzIiwib3BlcmF0b3IiLCJvcmllbnQiLCJvcmllbnRhdGlvbiIsIm92ZXJmbG93Iiwib3ZlcmxpbmVQb3NpdGlvbiIsIm92ZXJsaW5lVGhpY2tuZXNzIiwicGFpbnRPcmRlciIsInBhbm9zZTEiLCJwYXRoTGVuZ3RoIiwicGF0dGVybkNvbnRlbnRVbml0cyIsInBhdHRlcm5UcmFuc2Zvcm0iLCJwYXR0ZXJuVW5pdHMiLCJwb2ludGVyRXZlbnRzIiwicG9pbnRzIiwicG9pbnRzQXRYIiwicG9pbnRzQXRZIiwicG9pbnRzQXRaIiwicHJlc2VydmVBbHBoYSIsInByZXNlcnZlQXNwZWN0UmF0aW8iLCJwcmltaXRpdmVVbml0cyIsInIiLCJyYWRpdXMiLCJyZWZYIiwicmVmWSIsInJlbmRlcmluZ0ludGVudCIsInJlcGVhdENvdW50IiwicmVwZWF0RHVyIiwicmVxdWlyZWRFeHRlbnNpb25zIiwicmVxdWlyZWRGZWF0dXJlcyIsInJlc3RhcnQiLCJyb3RhdGUiLCJyeCIsInJ5Iiwic2NhbGUiLCJzZWVkIiwic2hhcGVSZW5kZXJpbmciLCJzbG9wZSIsInNwYWNpbmciLCJzcGVjdWxhckNvbnN0YW50Iiwic3BlY3VsYXJFeHBvbmVudCIsInNwZWVkIiwic3ByZWFkTWV0aG9kIiwic3RkRGV2aWF0aW9uIiwic3RlbWgiLCJzdGVtdiIsInN0aXRjaFRpbGVzIiwic3RvcENvbG9yIiwic3RyaWtldGhyb3VnaFBvc2l0aW9uIiwic3RyaWtldGhyb3VnaFRoaWNrbmVzcyIsInN0cm9rZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsInN1cmZhY2VTY2FsZSIsInN5c3RlbUxhbmd1YWdlIiwidGFibGVWYWx1ZXMiLCJ0YXJnZXRYIiwidGFyZ2V0WSIsInRleHRBbmNob3IiLCJ0ZXh0RGVjb3JhdGlvbiIsInRleHRSZW5kZXJpbmciLCJ0ZXh0TGVuZ3RoIiwidTEiLCJ1MiIsInVuZGVybGluZVBvc2l0aW9uIiwidW5kZXJsaW5lVGhpY2tuZXNzIiwidW5pY29kZSIsInVuaWNvZGVCaWRpIiwidW5pY29kZVJhbmdlIiwidW5pdHNQZXJFbSIsInZBbHBoYWJldGljIiwidkhhbmdpbmciLCJ2SWRlb2dyYXBoaWMiLCJ2TWF0aGVtYXRpY2FsIiwidmVjdG9yRWZmZWN0IiwidmVydEFkdlkiLCJ2ZXJ0T3JpZ2luWCIsInZlcnRPcmlnaW5ZIiwidmlld0JveCIsInZpZXdUYXJnZXQiLCJ2aXNpYmlsaXR5Iiwid2lkdGhzIiwid29yZFNwYWNpbmciLCJ3cml0aW5nTW9kZSIsInhIZWlnaHQiLCJ4MSIsIngyIiwieENoYW5uZWxTZWxlY3RvciIsInhsaW5rQWN0dWF0ZSIsInhsaW5rQXJjcm9sZSIsInhsaW5rSHJlZiIsInhsaW5rUm9sZSIsInhsaW5rU2hvdyIsInhsaW5rVGl0bGUiLCJ4bGlua1R5cGUiLCJ4bWxCYXNlIiwieG1sbnMiLCJ4bWxuc1hsaW5rIiwieG1sTGFuZyIsInhtbFNwYWNlIiwieTEiLCJ5MiIsInlDaGFubmVsU2VsZWN0b3IiLCJ6Iiwiem9vbUFuZFBhbiIsInNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCIsImxhc3RTZWxlY3Rpb24iLCJtb3VzZURvd24iLCJoYXNMaXN0ZW5lciIsImJvdW5kaW5nVG9wIiwibGVmdCIsImJvdW5kaW5nTGVmdCIsImNvbnN0cnVjdFNlbGVjdEV2ZW50IiwiY3VycmVudFNlbGVjdGlvbiIsIlN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50IiwiU3ludGhldGljQ2xpcGJvYXJkRXZlbnQiLCJTeW50aGV0aWNGb2N1c0V2ZW50IiwiU3ludGhldGljS2V5Ym9hcmRFdmVudCIsIlN5bnRoZXRpY0RyYWdFdmVudCIsIlN5bnRoZXRpY1RvdWNoRXZlbnQiLCJTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQiLCJTeW50aGV0aWNXaGVlbEV2ZW50IiwidG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnIiwiY2FwaXRhbGl6ZWRFdmVudCIsIm9uRXZlbnQiLCJ0b3BFdmVudCIsIm9uQ2xpY2tMaXN0ZW5lcnMiLCJFdmVudENvbnN0cnVjdG9yIiwiQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UiLCJhbmltYXRpb25OYW1lIiwiZWxhcHNlZFRpbWUiLCJwc2V1ZG9FbGVtZW50IiwiQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UiLCJjbGlwYm9hcmREYXRhIiwiQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSIsIkRyYWdFdmVudEludGVyZmFjZSIsImRhdGFUcmFuc2ZlciIsIkZvY3VzRXZlbnRJbnRlcmZhY2UiLCJJbnB1dEV2ZW50SW50ZXJmYWNlIiwiZ2V0RXZlbnRLZXkiLCJLZXlib2FyZEV2ZW50SW50ZXJmYWNlIiwicmVwZWF0IiwibG9jYWxlIiwiVG91Y2hFdmVudEludGVyZmFjZSIsInRvdWNoZXMiLCJ0YXJnZXRUb3VjaGVzIiwiY2hhbmdlZFRvdWNoZXMiLCJUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UiLCJXaGVlbEV2ZW50SW50ZXJmYWNlIiwiZGVsdGFYIiwid2hlZWxEZWx0YVgiLCJkZWx0YVkiLCJ3aGVlbERlbHRhWSIsIndoZWVsRGVsdGEiLCJkZWx0YVoiLCJkZWx0YU1vZGUiLCJNT0QiLCJsIiwibSIsImNvbXBvbmVudFN0YWNrSW5mbyIsInN0eWxlV2FybmluZ3MiLCJpc0VtcHR5IiwiaXNOb25OdW1lcmljIiwid2FybmVkIiwid2FybmluZ3MiLCJjb21wb25lbnRPckVsZW1lbnQiLCJmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCIsIm5vcm1hbGl6ZUtleSIsIkVzYyIsIlNwYWNlYmFyIiwiTGVmdCIsIlVwIiwiUmlnaHQiLCJEb3duIiwiRGVsIiwiV2luIiwiQXBwcyIsIlNjcm9sbCIsIk1velByaW50YWJsZUtleSIsInRyYW5zbGF0ZVRvS2V5IiwiZ2V0TGVhZk5vZGUiLCJnZXRTaWJsaW5nTm9kZSIsIm5vZGVTdGFydCIsIm5vZGVFbmQiLCJtYWtlUHJlZml4TWFwIiwic3R5bGVQcm9wIiwidmVuZG9yUHJlZml4ZXMiLCJhbmltYXRpb25lbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJhbmltYXRpb25zdGFydCIsInRyYW5zaXRpb25lbmQiLCJwcmVmaXhlZEV2ZW50TmFtZXMiLCJhbmltYXRpb24iLCJ0cmFuc2l0aW9uIiwicHJlZml4TWFwIiwiRmlsZUlucHV0IiwicGFyZW50IiwicG9zaXRpb24iLCJmaWxlIiwiaGFuZGxlQ2hhbmdlIiwiZGlkV2FybkFib3V0UmVjZWl2aW5nU3RvcmUiLCJ3YXJuQWJvdXRSZWNlaXZpbmdTdG9yZSIsIl9Qcm92aWRlciRjaGlsZENvbnRleCIsInN1YktleSIsImNyZWF0ZUNvbm5lY3QiLCJmYWN0b3JpZXMiLCJzdHJpY3RFcXVhbCIsIl9yZWYkY29ubmVjdEhPQyIsImNvbm5lY3RIT0MiLCJfcmVmJG1hcFN0YXRlVG9Qcm9wc0YiLCJtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMiLCJfcmVmJG1hcERpc3BhdGNoVG9Qcm8iLCJtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMiLCJfcmVmJG1lcmdlUHJvcHNGYWN0b3IiLCJtZXJnZVByb3BzRmFjdG9yaWVzIiwiX3JlZiRzZWxlY3RvckZhY3RvcnkiLCJtYXBTdGF0ZVRvUHJvcHMiLCJtYXBEaXNwYXRjaFRvUHJvcHMiLCJtZXJnZVByb3BzIiwiX3JlZjIkcHVyZSIsInB1cmUiLCJfcmVmMiRhcmVTdGF0ZXNFcXVhbCIsImFyZVN0YXRlc0VxdWFsIiwiX3JlZjIkYXJlT3duUHJvcHNFcXVhIiwiYXJlT3duUHJvcHNFcXVhbCIsIl9yZWYyJGFyZVN0YXRlUHJvcHNFcSIsImFyZVN0YXRlUHJvcHNFcXVhbCIsIl9yZWYyJGFyZU1lcmdlZFByb3BzRSIsImFyZU1lcmdlZFByb3BzRXF1YWwiLCJleHRyYU9wdGlvbnMiLCJpbml0TWFwU3RhdGVUb1Byb3BzIiwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyIsImluaXRNZXJnZVByb3BzIiwid2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24iLCJ3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nIiwid2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0Iiwid2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24iLCJ3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nIiwiZGVmYXVsdE1lcmdlUHJvcHMiLCJ3cmFwTWVyZ2VQcm9wc0Z1bmMiLCJ3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24iLCJ3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZCIsInN0YXRlUHJvcHMiLCJkaXNwYXRjaFByb3BzIiwiaW5pdE1lcmdlUHJvcHNQcm94eSIsImhhc1J1bk9uY2UiLCJtZXJnZWRQcm9wcyIsIm1lcmdlUHJvcHNQcm94eSIsIm5leHRNZXJnZWRQcm9wcyIsImltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsImZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3IiLCJoYXNSdW5BdExlYXN0T25jZSIsImhhbmRsZUZpcnN0Q2FsbCIsImZpcnN0U3RhdGUiLCJmaXJzdE93blByb3BzIiwiaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSIsImhhbmRsZU5ld1Byb3BzIiwiaGFuZGxlTmV3U3RhdGUiLCJuZXh0U3RhdGVQcm9wcyIsInN0YXRlUHJvcHNDaGFuZ2VkIiwiaGFuZGxlU3Vic2VxdWVudENhbGxzIiwibmV4dE93blByb3BzIiwicHJvcHNDaGFuZ2VkIiwic3RhdGVDaGFuZ2VkIiwicHVyZUZpbmFsUHJvcHNTZWxlY3RvciIsInZlcmlmeVN1YnNlbGVjdG9ycyIsInZlcmlmeSIsIkNMRUFSRUQiLCJudWxsTGlzdGVuZXJzIiwibm90aWZ5IiwiY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uIiwiY2xlYXIiLCJTdWJzY3JpcHRpb24iLCJhZGROZXN0ZWRTdWIiLCJoYXNPd24iLCJhY3RpdmVDbGFzc05hbWUiLCJhY3RpdmVTdHlsZSIsImdldElzQWN0aXZlIiwiZW5hYmxlIiwiZGlzYWJsZSIsIndoZW4iLCJpc1N0YXRpYyIsIm5vcm1hbGl6ZUxvY2F0aW9uIiwiX29iamVjdCRwYXRobmFtZSIsIl9vYmplY3Qkc2VhcmNoIiwiX29iamVjdCRoYXNoIiwiYWRkQmFzZW5hbWUiLCJjcmVhdGVVUkwiLCJzdGF0aWNIYW5kbGVyIiwiaGFuZGxlUHVzaCIsImhhbmRsZVJlcGxhY2UiLCJfdGhpcyRwcm9wczIiLCJoYW5kbGVMaXN0ZW4iLCJoYW5kbGVCbG9jayIsIl9lbGVtZW50JHByb3BzIiwicGF0aFByb3AiLCJDIiwid3JhcHBlZENvbXBvbmVudFJlZiIsInJlbWFpbmluZ1Byb3BzIiwicm91dGVDb21wb25lbnRQcm9wcyIsImlzYXJyYXkiLCJwYXRoVG9SZWdleHAiLCJwYXJzZSIsImNvbXBpbGUiLCJ0b2tlbnNUb0Z1bmN0aW9uIiwidG9rZW5zVG9SZWdFeHAiLCJQQVRIX1JFR0VYUCIsInRva2VucyIsImRlZmF1bHREZWxpbWl0ZXIiLCJkZWxpbWl0ZXIiLCJlc2NhcGVkIiwibW9kaWZpZXIiLCJhc3RlcmlzayIsIm9wdGlvbmFsIiwiZXNjYXBlR3JvdXAiLCJlc2NhcGVTdHJpbmciLCJlbmNvZGVVUklDb21wb25lbnRQcmV0dHkiLCJlbmNvZGVVUkkiLCJlbmNvZGVBc3RlcmlzayIsIm1hdGNoZXMiLCJvcHRzIiwiZW5jb2RlIiwicHJldHR5IiwidG9rZW4iLCJzZWdtZW50IiwiYXR0YWNoS2V5cyIsImZsYWdzIiwic2Vuc2l0aXZlIiwicmVnZXhwVG9SZWdleHAiLCJncm91cHMiLCJhcnJheVRvUmVnZXhwIiwicGFydHMiLCJyZWdleHAiLCJzdHJpbmdUb1JlZ2V4cCIsImVuZHNXaXRoRGVsaW1pdGVyIiwidXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgiLCJlc2NhcGVVc2VyUHJvdmlkZWRLZXkiLCJGb3JFYWNoQm9va0tlZXBpbmciLCJmb3JFYWNoRnVuY3Rpb24iLCJmb3JFYWNoQ29udGV4dCIsImZvckVhY2hTaW5nbGVDaGlsZCIsImZvckVhY2hDaGlsZHJlbiIsImZvckVhY2hGdW5jIiwiTWFwQm9va0tlZXBpbmciLCJtYXBSZXN1bHQiLCJrZXlQcmVmaXgiLCJtYXBGdW5jdGlvbiIsIm1hcENvbnRleHQiLCJtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0IiwiY2hpbGRLZXkiLCJtYXBwZWRDaGlsZCIsIm1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwiLCJlc2NhcGVkUHJlZml4IiwibWFwQ2hpbGRyZW4iLCJmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSIsImNvdW50Q2hpbGRyZW4iLCJjcmVhdGVET01GYWN0b3J5IiwiYWJiciIsImFkZHJlc3MiLCJhcnRpY2xlIiwiYXNpZGUiLCJhdWRpbyIsImJkaSIsImJkbyIsImJpZyIsImJsb2NrcXVvdGUiLCJjYW52YXMiLCJjYXB0aW9uIiwiY29sZ3JvdXAiLCJkYXRhbGlzdCIsImRkIiwiZGVsIiwiZGV0YWlscyIsImRmbiIsImRpYWxvZyIsImRsIiwiZHQiLCJlbSIsImZpZWxkc2V0IiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvb3RlciIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWQiLCJoZWFkZXIiLCJoZ3JvdXAiLCJpZnJhbWUiLCJpbnMiLCJrYmQiLCJsZWdlbmQiLCJsaSIsIm1haW4iLCJtZXRlciIsIm5hdiIsIm5vc2NyaXB0Iiwib2wiLCJvcHRncm91cCIsIm9wdGlvbiIsIm91dHB1dCIsInAiLCJwaWN0dXJlIiwicHJvZ3Jlc3MiLCJxIiwicnAiLCJydCIsInJ1YnkiLCJzYW1wIiwic2NyaXB0Iiwic2VjdGlvbiIsInNtYWxsIiwic3Ryb25nIiwic3ViIiwic3VwIiwidGFibGUiLCJ0Ym9keSIsInRkIiwidGZvb3QiLCJ0aCIsInRoZWFkIiwidHIiLCJ1IiwidWwiLCJ2aWRlbyIsImNpcmNsZSIsImRlZnMiLCJlbGxpcHNlIiwibGluZSIsImxpbmVhckdyYWRpZW50IiwicG9seWdvbiIsInBvbHlsaW5lIiwicmFkaWFsR3JhZGllbnQiLCJyZWN0Iiwic3RvcCIsInRzcGFuIiwiX3JlcXVpcmUiLCJfcmVxdWlyZTIiLCJuZXh0RGVidWdJRCIsIm1pZGRsZXdhcmVzIiwiX2Rpc3BhdGNoIiwiY2hhaW4iLCJtaWRkbGV3YXJlQVBJIiwibWlkZGxld2FyZSIsImJpbmRBY3Rpb25DcmVhdG9yIiwiYWN0aW9uQ3JlYXRvciIsImFjdGlvbkNyZWF0b3JzIiwiYm91bmRBY3Rpb25DcmVhdG9ycyIsImdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlIiwiYWN0aW9uVHlwZSIsImFjdGlvbk5hbWUiLCJnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlIiwiaW5wdXRTdGF0ZSIsInJlZHVjZXJzIiwidW5leHBlY3RlZEtleUNhY2hlIiwicmVkdWNlcktleXMiLCJhcmd1bWVudE5hbWUiLCJ1bmV4cGVjdGVkS2V5cyIsImFzc2VydFJlZHVjZXJTYW5pdHkiLCJmaW5hbFJlZHVjZXJzIiwiZmluYWxSZWR1Y2VyS2V5cyIsInNhbml0eUVycm9yIiwiY29tYmluYXRpb24iLCJ3YXJuaW5nTWVzc2FnZSIsImhhc0NoYW5nZWQiLCJwcmV2aW91c1N0YXRlRm9yS2V5IiwibmV4dFN0YXRlRm9yS2V5IiwiZXJyb3JNZXNzYWdlIiwiaXNBYnNvbHV0ZSIsInNwbGljZU9uZSIsInJlc29sdmVQYXRobmFtZSIsInRvUGFydHMiLCJmcm9tUGFydHMiLCJpc1RvQWJzIiwiaXNGcm9tQWJzIiwibXVzdEVuZEFicyIsImhhc1RyYWlsaW5nU2xhc2giLCJ1cCIsInBhcnQiLCJ1bnNoaWZ0IiwiX3BvbnlmaWxsIiwiX3BvbnlmaWxsMiIsInN5bWJvbE9ic2VydmFibGVQb255ZmlsbCIsIl9TeW1ib2wiLCJ2YWx1ZUVxdWFsIiwiYVR5cGUiLCJiVHlwZSIsImFWYWx1ZSIsInZhbHVlT2YiLCJiVmFsdWUiLCJhS2V5cyIsImJLZXlzIiwid2VicGFja1BvbHlmaWxsIiwiZGVwcmVjYXRlIiwicGF0aHMiLCJnZXRGaWxlcyIsImZzIiwiZ2V0Rm9sZGVycyIsImZvbGRlciIsImdldEltYWdlUGF0aCIsImNyZWF0ZUNsaWNrSGFuZGxlciIsImVsZW1lbnRTdHlsZSIsImJhY2tncm91bmRTaXplIiwiZ2V0TXVzaWMiLCJnZXRQaG90b3MiLCJnZXRTaGFyZWQiLCJCcmVhZGNydW1icyIsImNydW1icyIsImN1cnJlbnRMaW5rIiwiY3J1bWIiLCJEaXNwbGF5TWVudSIsIlRvcE5hdiIsInF1ZXJ5c3RyaW5nIiwic2VhcmNoQnlRdWVyeSIsImdldEVsZW1lbnRCeUlkIiwiYW5vbiIsInVzZXJncm91cCIsInNwZWNpZmljVXNlciJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FB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QU0sS0FGSTtBQUdWQyxtQkFBVyxJQUhEO0FBSVZDLHNCQUFjO0FBSko7QUFOZCxLQWxnQlEsRUErZ0JSO0FBQ0UzNkQsdUJBQWlCLGNBRG5CO0FBRUVnYixnQkFBVSxFQUZaO0FBR0Vqc0QsYUFBTyw2QkFIVDtBQUlFOGdELFlBQU0sWUFKUjtBQUtFNTBDLFlBQU0sTUFMUjtBQU1FZ2tGLGtCQUFZO0FBQ1ZyaUYsZUFBTyxJQURHO0FBRVY2OUYsY0FBTSxLQUZJO0FBR1ZDLG1CQUFXLElBSEQ7QUFJVkMsc0JBQWM7QUFKSjtBQU5kLEtBL2dCUSxDQURBO0FBZ2lCVnovQyxpQkFBYTtBQWhpQkgsR0FGQyxFIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyNzYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDQ4OTFjZjViNWU4YWUxMjQyNmE3IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvY2Vzcy9icm93c2VyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFsaWRhdGVGb3JtYXQoZm9ybWF0KTtcblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSkpO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJy4vZW1wdHlGdW5jdGlvbicpO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgd2FybmluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgfTtcblxuICAgIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICsgJ21lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdC5pbmRleE9mKCdGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAnKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47IC8vIElnbm9yZSBDb21wb3NpdGVDb21wb25lbnQgcHJvcHR5cGUgY2hlY2suXG4gICAgICB9XG5cbiAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi93YXJuaW5nLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogV0FSTklORzogRE8gTk9UIG1hbnVhbGx5IHJlcXVpcmUgdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGBpbnZhcmlhbnQoLi4uKWAgdXNlZCBieSB0aGUgZXJyb3IgY29kZSBzeXN0ZW1cbiAqIGFuZCB3aWxsIF9vbmx5XyBiZSByZXF1aXJlZCBieSB0aGUgY29ycmVzcG9uZGluZyBiYWJlbCBwYXNzLlxuICogSXQgYWx3YXlzIHRocm93cy5cbiAqL1xuXG5mdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSkge1xuICB2YXIgYXJnQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICB2YXIgbWVzc2FnZSA9ICdNaW5pZmllZCBSZWFjdCBlcnJvciAjJyArIGNvZGUgKyAnOyB2aXNpdCAnICsgJ2h0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PScgKyBjb2RlO1xuXG4gIGZvciAodmFyIGFyZ0lkeCA9IDA7IGFyZ0lkeCA8IGFyZ0NvdW50OyBhcmdJZHgrKykge1xuICAgIG1lc3NhZ2UgKz0gJyZhcmdzW109JyArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4ICsgMV0pO1xuICB9XG5cbiAgbWVzc2FnZSArPSAnIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCcgKyAnIGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLic7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhY3RQcm9kSW52YXJpYW50J3Mgb3duIGZyYW1lXG5cbiAgdGhyb3cgZXJyb3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3RQcm9kSW52YXJpYW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvUmVhY3QnKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvcmVhY3QuanMiLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUU7XG52YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xuXG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBnaXZlbiBub2RlIHNob3VsZCBiZSBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByZWNhY2hlTm9kZShub2RlLCBub2RlSUQpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKSA9PT0gU3RyaW5nKG5vZGVJRCkgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC10ZXh0OiAnICsgbm9kZUlEICsgJyAnIHx8IG5vZGUubm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtZW1wdHk6ICcgKyBub2RlSUQgKyAnICc7XG59XG5cbi8qKlxuICogRHJpbGwgZG93biAodGhyb3VnaCBjb21wb3NpdGVzIGFuZCBlbXB0eSBjb21wb25lbnRzKSB1bnRpbCB3ZSBnZXQgYSBob3N0IG9yXG4gKiBob3N0IHRleHQgY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaXMgcHJldHR5IHBvbHltb3JwaGljIGJ1dCB1bmF2b2lkYWJsZSB3aXRoIHRoZSBjdXJyZW50IHN0cnVjdHVyZSB3ZSBoYXZlXG4gKiBmb3IgYF9yZW5kZXJlZENoaWxkcmVuYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgdmFyIHJlbmRlcmVkO1xuICB3aGlsZSAocmVuZGVyZWQgPSBjb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gcmVuZGVyZWQ7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiB0aGUgcmVuZGVyZWQgaG9zdC90ZXh0IGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlblxuICogRE9NIG5vZGUuIFRoZSBwYXNzZWQgYGluc3RgIGNhbiBiZSBhIGNvbXBvc2l0ZS5cbiAqL1xuZnVuY3Rpb24gcHJlY2FjaGVOb2RlKGluc3QsIG5vZGUpIHtcbiAgdmFyIGhvc3RJbnN0ID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChpbnN0KTtcbiAgaG9zdEluc3QuX2hvc3ROb2RlID0gbm9kZTtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuXG5mdW5jdGlvbiB1bmNhY2hlTm9kZShpbnN0KSB7XG4gIHZhciBub2RlID0gaW5zdC5faG9zdE5vZGU7XG4gIGlmIChub2RlKSB7XG4gICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gICAgaW5zdC5faG9zdE5vZGUgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUG9wdWxhdGUgYF9ob3N0Tm9kZWAgb24gZWFjaCBjaGlsZCBvZiBgaW5zdGAsIGFzc3VtaW5nIHRoYXQgdGhlIGNoaWxkcmVuXG4gKiBtYXRjaCB1cCB3aXRoIHRoZSBET00gKGVsZW1lbnQpIGNoaWxkcmVuIG9mIGBub2RlYC5cbiAqXG4gKiBXZSBjYWNoZSBlbnRpcmUgbGV2ZWxzIGF0IG9uY2UgdG8gYXZvaWQgYW4gbl4yIHByb2JsZW0gd2hlcmUgd2UgYWNjZXNzIHRoZVxuICogY2hpbGRyZW4gb2YgYSBub2RlIHNlcXVlbnRpYWxseSBhbmQgaGF2ZSB0byB3YWxrIGZyb20gdGhlIHN0YXJ0IHRvIG91ciB0YXJnZXRcbiAqIG5vZGUgZXZlcnkgdGltZS5cbiAqXG4gKiBTaW5jZSB3ZSB1cGRhdGUgYF9yZW5kZXJlZENoaWxkcmVuYCBhbmQgdGhlIGFjdHVhbCBET00gYXQgKHNsaWdodGx5KVxuICogZGlmZmVyZW50IHRpbWVzLCB3ZSBjb3VsZCByYWNlIGhlcmUgYW5kIHNlZSBhIG5ld2VyIGBfcmVuZGVyZWRDaGlsZHJlbmAgdGhhblxuICogdGhlIERPTSBub2RlcyB3ZSBzZWUuIFRvIGF2b2lkIHRoaXMsIFJlYWN0TXVsdGlDaGlsZCBjYWxsc1xuICogYHByZXBhcmVUb01hbmFnZUNoaWxkcmVuYCBiZWZvcmUgd2UgY2hhbmdlIGBfcmVuZGVyZWRDaGlsZHJlbmAsIGF0IHdoaWNoXG4gKiB0aW1lIHRoZSBjb250YWluZXIncyBjaGlsZCBub2RlcyBhcmUgYWx3YXlzIGNhY2hlZCAodW50aWwgaXQgdW5tb3VudHMpLlxuICovXG5mdW5jdGlvbiBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgbm9kZSkge1xuICBpZiAoaW5zdC5fZmxhZ3MgJiBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IGluc3QuX3JlbmRlcmVkQ2hpbGRyZW47XG4gIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIG91dGVyOiBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVuKSB7XG4gICAgaWYgKCFjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBjaGlsZEluc3QgPSBjaGlsZHJlbltuYW1lXTtcbiAgICB2YXIgY2hpbGRJRCA9IGdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY2hpbGRJbnN0KS5fZG9tSUQ7XG4gICAgaWYgKGNoaWxkSUQgPT09IDApIHtcbiAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSB1bm1vdW50aW5nIHRoaXMgY2hpbGQgaW4gUmVhY3RNdWx0aUNoaWxkOyBza2lwIGl0LlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFdlIGFzc3VtZSB0aGUgY2hpbGQgbm9kZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjaGlsZCBpbnN0YW5jZXMuXG4gICAgZm9yICg7IGNoaWxkTm9kZSAhPT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICBpZiAoc2hvdWxkUHJlY2FjaGVOb2RlKGNoaWxkTm9kZSwgY2hpbGRJRCkpIHtcbiAgICAgICAgcHJlY2FjaGVOb2RlKGNoaWxkSW5zdCwgY2hpbGROb2RlKTtcbiAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgRE9NIGNoaWxkcmVuIHdpdGhvdXQgZmluZGluZyBhbiBJRCBtYXRjaC5cbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudCB3aXRoIElEICVzLicsIGNoaWxkSUQpIDogX3Byb2RJbnZhcmlhbnQoJzMyJywgY2hpbGRJRCkgOiB2b2lkIDA7XG4gIH1cbiAgaW5zdC5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2Rlcztcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgUmVhY3RET01Db21wb25lbnQgb3JcbiAqIFJlYWN0RE9NVGV4dENvbXBvbmVudCBpbnN0YW5jZSBhbmNlc3Rvci5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICBpZiAobm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIHJldHVybiBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICB9XG5cbiAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdob3NlIGluc3RhbmNlIHdlIGhhdmUgY2FjaGVkLlxuICB2YXIgcGFyZW50cyA9IFtdO1xuICB3aGlsZSAoIW5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG9wIG9mIHRoZSB0cmVlLiBUaGlzIG5vZGUgbXVzdCBub3QgYmUgcGFydCBvZiBhIFJlYWN0IHRyZWUgKG9yIGlzXG4gICAgICAvLyB1bm1vdW50ZWQsIHBvdGVudGlhbGx5KS5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjbG9zZXN0O1xuICB2YXIgaW5zdDtcbiAgZm9yICg7IG5vZGUgJiYgKGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKTsgbm9kZSA9IHBhcmVudHMucG9wKCkpIHtcbiAgICBjbG9zZXN0ID0gaW5zdDtcbiAgICBpZiAocGFyZW50cy5sZW5ndGgpIHtcbiAgICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xvc2VzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIG5vZGUgd2FzIG5vdCByZW5kZXJlZCBieSB0aGlzIFJlYWN0LlxuICovXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKTtcbiAgaWYgKGluc3QgIT0gbnVsbCAmJiBpbnN0Ll9ob3N0Tm9kZSA9PT0gbm9kZSkge1xuICAgIHJldHVybiBpbnN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG4gICEoaW5zdC5faG9zdE5vZGUgIT09IHVuZGVmaW5lZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwO1xuXG4gIGlmIChpbnN0Ll9ob3N0Tm9kZSkge1xuICAgIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTtcbiAgfVxuXG4gIC8vIFdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB3aG9zZSBET00gbm9kZSB3ZSBoYXZlIGNhY2hlZC5cbiAgdmFyIHBhcmVudHMgPSBbXTtcbiAgd2hpbGUgKCFpbnN0Ll9ob3N0Tm9kZSkge1xuICAgIHBhcmVudHMucHVzaChpbnN0KTtcbiAgICAhaW5zdC5faG9zdFBhcmVudCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdCBET00gdHJlZSByb290IHNob3VsZCBhbHdheXMgaGF2ZSBhIG5vZGUgcmVmZXJlbmNlLicpIDogX3Byb2RJbnZhcmlhbnQoJzM0JykgOiB2b2lkIDA7XG4gICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7XG4gIH1cblxuICAvLyBOb3cgcGFyZW50cyBjb250YWlucyBlYWNoIGFuY2VzdG9yIHRoYXQgZG9lcyAqbm90KiBoYXZlIGEgY2FjaGVkIG5hdGl2ZVxuICAvLyBub2RlLCBhbmQgYGluc3RgIGlzIHRoZSBkZWVwZXN0IGFuY2VzdG9yIHRoYXQgZG9lcy5cbiAgZm9yICg7IHBhcmVudHMubGVuZ3RoOyBpbnN0ID0gcGFyZW50cy5wb3AoKSkge1xuICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBpbnN0Ll9ob3N0Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdC5faG9zdE5vZGU7XG59XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSB7XG4gIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZ2V0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZ2V0Tm9kZUZyb21JbnN0YW5jZSxcbiAgcHJlY2FjaGVDaGlsZE5vZGVzOiBwcmVjYWNoZUNoaWxkTm9kZXMsXG4gIHByZWNhY2hlTm9kZTogcHJlY2FjaGVOb2RlLFxuICB1bmNhY2hlTm9kZTogdW5jYWNoZU5vZGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnRUcmVlO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudFRyZWUuanMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbi8qKlxuICogU2ltcGxlLCBsaWdodHdlaWdodCBtb2R1bGUgYXNzaXN0aW5nIHdpdGggdGhlIGRldGVjdGlvbiBhbmQgY29udGV4dCBvZlxuICogV29ya2VyLiBIZWxwcyBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYW5kIGFsbG93cyBjb2RlIHRvIHJlYXNvbiBhYm91dFxuICogd2hldGhlciBvciBub3QgdGhleSBhcmUgaW4gYSBXb3JrZXIsIGV2ZW4gaWYgdGhleSBuZXZlciBpbmNsdWRlIHRoZSBtYWluXG4gKiBgUmVhY3RXb3JrZXJgIGRlcGVuZGVuY3kuXG4gKi9cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHtcblxuICBjYW5Vc2VET006IGNhblVzZURPTSxcblxuICBjYW5Vc2VXb3JrZXJzOiB0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJyxcblxuICBjYW5Vc2VFdmVudExpc3RlbmVyczogY2FuVXNlRE9NICYmICEhKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8IHdpbmRvdy5hdHRhY2hFdmVudCksXG5cbiAgY2FuVXNlVmlld3BvcnQ6IGNhblVzZURPTSAmJiAhIXdpbmRvdy5zY3JlZW4sXG5cbiAgaXNJbldvcmtlcjogIWNhblVzZURPTSAvLyBGb3Igbm93LCB0aGlzIGlzIHRydWUgLSBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFeGVjdXRpb25FbnZpcm9ubWVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmXG4gICAgU3ltYm9sLmZvciAmJlxuICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSkgfHxcbiAgICAweGVhYzc7XG5cbiAgdmFyIGlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICBvYmplY3QgIT09IG51bGwgJiZcbiAgICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9O1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gaXNOYXRpdmUoZm4pIHtcbiAgLy8gQmFzZWQgb24gaXNOYXRpdmUoKSBmcm9tIExvZGFzaFxuICB2YXIgZnVuY1RvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgKyBmdW5jVG9TdHJpbmdcbiAgLy8gVGFrZSBhbiBleGFtcGxlIG5hdGl2ZSBmdW5jdGlvbiBzb3VyY2UgZm9yIGNvbXBhcmlzb25cbiAgLmNhbGwoaGFzT3duUHJvcGVydHlcbiAgLy8gU3RyaXAgcmVnZXggY2hhcmFjdGVycyBzbyB3ZSBjYW4gdXNlIGl0IGZvciByZWdleFxuICApLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnXFxcXCQmJ1xuICAvLyBSZW1vdmUgaGFzT3duUHJvcGVydHkgZnJvbSB0aGUgdGVtcGxhdGUgdG8gbWFrZSBpdCBnZW5lcmljXG4gICkucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCcpO1xuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSBmdW5jVG9TdHJpbmcuY2FsbChmbik7XG4gICAgcmV0dXJuIHJlSXNOYXRpdmUudGVzdChzb3VyY2UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxudmFyIGNhblVzZUNvbGxlY3Rpb25zID1cbi8vIEFycmF5LmZyb21cbnR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nICYmXG4vLyBNYXBcbnR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFwKSAmJlxuLy8gTWFwLnByb3RvdHlwZS5rZXlzXG5NYXAucHJvdG90eXBlICE9IG51bGwgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShNYXAucHJvdG90eXBlLmtleXMpICYmXG4vLyBTZXRcbnR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoU2V0KSAmJlxuLy8gU2V0LnByb3RvdHlwZS5rZXlzXG5TZXQucHJvdG90eXBlICE9IG51bGwgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShTZXQucHJvdG90eXBlLmtleXMpO1xuXG52YXIgc2V0SXRlbTtcbnZhciBnZXRJdGVtO1xudmFyIHJlbW92ZUl0ZW07XG52YXIgZ2V0SXRlbUlEcztcbnZhciBhZGRSb290O1xudmFyIHJlbW92ZVJvb3Q7XG52YXIgZ2V0Um9vdElEcztcblxuaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gIHZhciBpdGVtTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgcm9vdElEU2V0ID0gbmV3IFNldCgpO1xuXG4gIHNldEl0ZW0gPSBmdW5jdGlvbiAoaWQsIGl0ZW0pIHtcbiAgICBpdGVtTWFwLnNldChpZCwgaXRlbSk7XG4gIH07XG4gIGdldEl0ZW0gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gaXRlbU1hcC5nZXQoaWQpO1xuICB9O1xuICByZW1vdmVJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgaXRlbU1hcFsnZGVsZXRlJ10oaWQpO1xuICB9O1xuICBnZXRJdGVtSURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGl0ZW1NYXAua2V5cygpKTtcbiAgfTtcblxuICBhZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcm9vdElEU2V0LmFkZChpZCk7XG4gIH07XG4gIHJlbW92ZVJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByb290SURTZXRbJ2RlbGV0ZSddKGlkKTtcbiAgfTtcbiAgZ2V0Um9vdElEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShyb290SURTZXQua2V5cygpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBpdGVtQnlLZXkgPSB7fTtcbiAgdmFyIHJvb3RCeUtleSA9IHt9O1xuXG4gIC8vIFVzZSBub24tbnVtZXJpYyBrZXlzIHRvIHByZXZlbnQgVjggcGVyZm9ybWFuY2UgaXNzdWVzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyXG4gIHZhciBnZXRLZXlGcm9tSUQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gJy4nICsgaWQ7XG4gIH07XG4gIHZhciBnZXRJREZyb21LZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KGtleS5zdWJzdHIoMSksIDEwKTtcbiAgfTtcblxuICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgaXRlbUJ5S2V5W2tleV0gPSBpdGVtO1xuICB9O1xuICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgcmV0dXJuIGl0ZW1CeUtleVtrZXldO1xuICB9O1xuICByZW1vdmVJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgZGVsZXRlIGl0ZW1CeUtleVtrZXldO1xuICB9O1xuICBnZXRJdGVtSURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhpdGVtQnlLZXkpLm1hcChnZXRJREZyb21LZXkpO1xuICB9O1xuXG4gIGFkZFJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICByb290QnlLZXlba2V5XSA9IHRydWU7XG4gIH07XG4gIHJlbW92ZVJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICBkZWxldGUgcm9vdEJ5S2V5W2tleV07XG4gIH07XG4gIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJvb3RCeUtleSkubWFwKGdldElERnJvbUtleSk7XG4gIH07XG59XG5cbnZhciB1bm1vdW50ZWRJRHMgPSBbXTtcblxuZnVuY3Rpb24gcHVyZ2VEZWVwKGlkKSB7XG4gIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gIGlmIChpdGVtKSB7XG4gICAgdmFyIGNoaWxkSURzID0gaXRlbS5jaGlsZElEcztcblxuICAgIHJlbW92ZUl0ZW0oaWQpO1xuICAgIGNoaWxkSURzLmZvckVhY2gocHVyZ2VEZWVwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJOYW1lKSB7XG4gIHJldHVybiAnXFxuICAgIGluICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgKHNvdXJjZSA/ICcgKGF0ICcgKyBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKScgOiBvd25lck5hbWUgPyAnIChjcmVhdGVkIGJ5ICcgKyBvd25lck5hbWUgKyAnKScgOiAnJyk7XG59XG5cbmZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiAnI2VtcHR5JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuICcjdGV4dCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGVtZW50LnR5cGUuZGlzcGxheU5hbWUgfHwgZWxlbWVudC50eXBlLm5hbWUgfHwgJ1Vua25vd24nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlSUQoaWQpIHtcbiAgdmFyIG5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKTtcbiAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICB2YXIgb3duZXJJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcklEKSB7XG4gICAgb3duZXJOYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShvd25lcklEKTtcbiAgfVxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhlbGVtZW50LCAnUmVhY3RDb21wb25lbnRUcmVlSG9vazogTWlzc2luZyBSZWFjdCBlbGVtZW50IGZvciBkZWJ1Z0lEICVzIHdoZW4gJyArICdidWlsZGluZyBzdGFjaycsIGlkKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgZWxlbWVudCAmJiBlbGVtZW50Ll9zb3VyY2UsIG93bmVyTmFtZSk7XG59XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0ge1xuICBvblNldENoaWxkcmVuOiBmdW5jdGlvbiAoaWQsIG5leHRDaGlsZElEcykge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgIWl0ZW0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSXRlbSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9wcm9kSW52YXJpYW50KCcxNDQnKSA6IHZvaWQgMDtcbiAgICBpdGVtLmNoaWxkSURzID0gbmV4dENoaWxkSURzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Q2hpbGRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0Q2hpbGRJRCA9IG5leHRDaGlsZElEc1tpXTtcbiAgICAgIHZhciBuZXh0Q2hpbGQgPSBnZXRJdGVtKG5leHRDaGlsZElEKTtcbiAgICAgICFuZXh0Q2hpbGQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9vayBldmVudHMgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDAnKSA6IHZvaWQgMDtcbiAgICAgICEobmV4dENoaWxkLmNoaWxkSURzICE9IG51bGwgfHwgdHlwZW9mIG5leHRDaGlsZC5lbGVtZW50ICE9PSAnb2JqZWN0JyB8fCBuZXh0Q2hpbGQuZWxlbWVudCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvblNldENoaWxkcmVuKCkgdG8gZmlyZSBmb3IgYSBjb250YWluZXIgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MScpIDogdm9pZCAwO1xuICAgICAgIW5leHRDaGlsZC5pc01vdW50ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25Nb3VudENvbXBvbmVudCgpIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnNzEnKSA6IHZvaWQgMDtcbiAgICAgIGlmIChuZXh0Q2hpbGQucGFyZW50SUQgPT0gbnVsbCkge1xuICAgICAgICBuZXh0Q2hpbGQucGFyZW50SUQgPSBpZDtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCBtb3VudGluZyBhIG5ldyByb290IGR1cmluZyBpblxuICAgICAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgY3VycmVudGx5IGNhdXNlcyBub3QteWV0LW1vdW50ZWQgY29tcG9uZW50cyB0b1xuICAgICAgICAvLyBiZSBwdXJnZWQgZnJvbSBvdXIgdHJlZSBkYXRhIHNvIHRoZWlyIHBhcmVudCBpZCBpcyBtaXNzaW5nLlxuICAgICAgfVxuICAgICAgIShuZXh0Q2hpbGQucGFyZW50SUQgPT09IGlkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbkJlZm9yZU1vdW50Q29tcG9uZW50KCkgcGFyZW50IGFuZCBvblNldENoaWxkcmVuKCkgdG8gYmUgY29uc2lzdGVudCAoJXMgaGFzIHBhcmVudHMgJXMgYW5kICVzKS4nLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiBfcHJvZEludmFyaWFudCgnMTQyJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogdm9pZCAwO1xuICAgIH1cbiAgfSxcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50LCBwYXJlbnRJRCkge1xuICAgIHZhciBpdGVtID0ge1xuICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgIHBhcmVudElEOiBwYXJlbnRJRCxcbiAgICAgIHRleHQ6IG51bGwsXG4gICAgICBjaGlsZElEczogW10sXG4gICAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgICAgdXBkYXRlQ291bnQ6IDBcbiAgICB9O1xuICAgIHNldEl0ZW0oaWQsIGl0ZW0pO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50KSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7XG4gICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0uZWxlbWVudCA9IGVsZW1lbnQ7XG4gIH0sXG4gIG9uTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgIWl0ZW0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSXRlbSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9wcm9kSW52YXJpYW50KCcxNDQnKSA6IHZvaWQgMDtcbiAgICBpdGVtLmlzTW91bnRlZCA9IHRydWU7XG4gICAgdmFyIGlzUm9vdCA9IGl0ZW0ucGFyZW50SUQgPT09IDA7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgYWRkUm9vdChpZCk7XG4gICAgfVxuICB9LFxuICBvblVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7XG4gICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlQ291bnQrKztcbiAgfSxcbiAgb25Vbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGV4aXN0cy5cbiAgICAgIC8vIGBpdGVtYCBtaWdodCBub3QgZXhpc3QgaWYgaXQgaXMgaW5zaWRlIGFuIGVycm9yIGJvdW5kYXJ5LCBhbmQgYSBzaWJsaW5nXG4gICAgICAvLyBlcnJvciBib3VuZGFyeSBjaGlsZCB0aHJldyB3aGlsZSBtb3VudGluZy4gVGhlbiB0aGlzIGluc3RhbmNlIG5ldmVyXG4gICAgICAvLyBnb3QgYSBjaGFuY2UgdG8gbW91bnQsIGJ1dCBpdCBzdGlsbCBnZXRzIGFuIHVubW91bnRpbmcgZXZlbnQgZHVyaW5nXG4gICAgICAvLyB0aGUgZXJyb3IgYm91bmRhcnkgY2xlYW51cC5cbiAgICAgIGl0ZW0uaXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDtcbiAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlUm9vdChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHVubW91bnRlZElEcy5wdXNoKGlkKTtcbiAgfSxcbiAgcHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKFJlYWN0Q29tcG9uZW50VHJlZUhvb2suX3ByZXZlbnRQdXJnaW5nKSB7XG4gICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudGVkSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWQgPSB1bm1vdW50ZWRJRHNbaV07XG4gICAgICBwdXJnZURlZXAoaWQpO1xuICAgIH1cbiAgICB1bm1vdW50ZWRJRHMubGVuZ3RoID0gMDtcbiAgfSxcbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5pc01vdW50ZWQgOiBmYWxzZTtcbiAgfSxcbiAgZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW06IGZ1bmN0aW9uICh0b3BFbGVtZW50KSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICBpZiAodG9wRWxlbWVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXREaXNwbGF5TmFtZSh0b3BFbGVtZW50KTtcbiAgICAgIHZhciBvd25lciA9IHRvcEVsZW1lbnQuX293bmVyO1xuICAgICAgaW5mbyArPSBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHRvcEVsZW1lbnQuX3NvdXJjZSwgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpKTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB2YXIgaWQgPSBjdXJyZW50T3duZXIgJiYgY3VycmVudE93bmVyLl9kZWJ1Z0lEO1xuXG4gICAgaW5mbyArPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGlkKTtcbiAgICByZXR1cm4gaW5mbztcbiAgfSxcbiAgZ2V0U3RhY2tBZGRlbmR1bUJ5SUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgd2hpbGUgKGlkKSB7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlSUQoaWQpO1xuICAgICAgaWQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBhcmVudElEKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH0sXG4gIGdldENoaWxkSURzOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5jaGlsZElEcyA6IFtdO1xuICB9LFxuICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBnZXREaXNwbGF5TmFtZShlbGVtZW50KTtcbiAgfSxcbiAgZ2V0RWxlbWVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7XG4gIH0sXG4gIGdldE93bmVySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQuX293bmVyLl9kZWJ1Z0lEO1xuICB9LFxuICBnZXRQYXJlbnRJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0ucGFyZW50SUQgOiBudWxsO1xuICB9LFxuICBnZXRTb3VyY2U6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDtcbiAgICB2YXIgc291cmNlID0gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5fc291cmNlIDogbnVsbDtcbiAgICByZXR1cm4gc291cmNlO1xuICB9LFxuICBnZXRUZXh0OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiAnJyArIGVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgZ2V0VXBkYXRlQ291bnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnVwZGF0ZUNvdW50IDogMDtcbiAgfSxcblxuXG4gIGdldFJvb3RJRHM6IGdldFJvb3RJRHMsXG4gIGdldFJlZ2lzdGVyZWRJRHM6IGdldEl0ZW1JRHMsXG5cbiAgcHVzaE5vblN0YW5kYXJkV2FybmluZ1N0YWNrOiBmdW5jdGlvbiAoaXNDcmVhdGluZ0VsZW1lbnQsIGN1cnJlbnRTb3VyY2UpIHtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUucmVhY3RTdGFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBjdXJyZW50T3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIHZhciBpZCA9IGN1cnJlbnRPd25lciAmJiBjdXJyZW50T3duZXIuX2RlYnVnSUQ7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGlzQ3JlYXRpbmdFbGVtZW50KSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGlkID8gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShpZCkgOiBudWxsLFxuICAgICAgICAgIGZpbGVOYW1lOiBjdXJyZW50U291cmNlID8gY3VycmVudFNvdXJjZS5maWxlTmFtZSA6IG51bGwsXG4gICAgICAgICAgbGluZU51bWJlcjogY3VycmVudFNvdXJjZSA/IGN1cnJlbnRTb3VyY2UubGluZU51bWJlciA6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpZCkge1xuICAgICAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgICAgIHZhciBwYXJlbnRJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgICAgICB2YXIgb3duZXJJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lcklEID8gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShvd25lcklEKSA6IG51bGw7XG4gICAgICAgIHZhciBzb3VyY2UgPSBlbGVtZW50ICYmIGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbmFtZTogb3duZXJOYW1lLFxuICAgICAgICAgIGZpbGVOYW1lOiBzb3VyY2UgPyBzb3VyY2UuZmlsZU5hbWUgOiBudWxsLFxuICAgICAgICAgIGxpbmVOdW1iZXI6IHNvdXJjZSA/IHNvdXJjZS5saW5lTnVtYmVyIDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgaWQgPSBwYXJlbnRJRDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEludGVybmFsIHN0YXRlIGlzIG1lc3NlZCB1cC5cbiAgICAgIC8vIFN0b3AgYnVpbGRpbmcgdGhlIHN0YWNrIChpdCdzIGp1c3QgYSBuaWNlIHRvIGhhdmUpLlxuICAgIH1cblxuICAgIGNvbnNvbGUucmVhY3RTdGFjayhzdGFjayk7XG4gIH0sXG4gIHBvcE5vblN0YW5kYXJkV2FybmluZ1N0YWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlLnJlYWN0U3RhY2tFbmQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5yZWFjdFN0YWNrRW5kKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFyZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlvbjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2VtcHR5RnVuY3Rpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgUmVhY3RJbnN0cnVtZW50YXRpb24gd2l0aCBhIF9fREVWX18gY2hlY2tcblxudmFyIGRlYnVnVG9vbCA9IG51bGw7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdERlYnVnVG9vbCA9IHJlcXVpcmUoJy4vUmVhY3REZWJ1Z1Rvb2wnKTtcbiAgZGVidWdUb29sID0gUmVhY3REZWJ1Z1Rvb2w7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBkZWJ1Z1Rvb2w6IGRlYnVnVG9vbCB9O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RydW1lbnRhdGlvbi5qcyIsImltcG9ydCBfTWVtb3J5Um91dGVyIGZyb20gJy4vTWVtb3J5Um91dGVyJztcbmV4cG9ydCB7IF9NZW1vcnlSb3V0ZXIgYXMgTWVtb3J5Um91dGVyIH07XG5pbXBvcnQgX1Byb21wdCBmcm9tICcuL1Byb21wdCc7XG5leHBvcnQgeyBfUHJvbXB0IGFzIFByb21wdCB9O1xuaW1wb3J0IF9SZWRpcmVjdCBmcm9tICcuL1JlZGlyZWN0JztcbmV4cG9ydCB7IF9SZWRpcmVjdCBhcyBSZWRpcmVjdCB9O1xuaW1wb3J0IF9Sb3V0ZSBmcm9tICcuL1JvdXRlJztcbmV4cG9ydCB7IF9Sb3V0ZSBhcyBSb3V0ZSB9O1xuaW1wb3J0IF9Sb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xuZXhwb3J0IHsgX1JvdXRlciBhcyBSb3V0ZXIgfTtcbmltcG9ydCBfU3RhdGljUm91dGVyIGZyb20gJy4vU3RhdGljUm91dGVyJztcbmV4cG9ydCB7IF9TdGF0aWNSb3V0ZXIgYXMgU3RhdGljUm91dGVyIH07XG5pbXBvcnQgX1N3aXRjaCBmcm9tICcuL1N3aXRjaCc7XG5leHBvcnQgeyBfU3dpdGNoIGFzIFN3aXRjaCB9O1xuaW1wb3J0IF9tYXRjaFBhdGggZnJvbSAnLi9tYXRjaFBhdGgnO1xuZXhwb3J0IHsgX21hdGNoUGF0aCBhcyBtYXRjaFBhdGggfTtcbmltcG9ydCBfd2l0aFJvdXRlciBmcm9tICcuL3dpdGhSb3V0ZXInO1xuZXhwb3J0IHsgX3dpdGhSb3V0ZXIgYXMgd2l0aFJvdXRlciB9O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyL2VzL2luZGV4LmpzIiwiaW1wb3J0IFByb3ZpZGVyLCB7IGNyZWF0ZVByb3ZpZGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL1Byb3ZpZGVyJztcbmltcG9ydCBjb25uZWN0QWR2YW5jZWQgZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZCc7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2Nvbm5lY3QvY29ubmVjdCc7XG5cbmV4cG9ydCB7IFByb3ZpZGVyLCBjcmVhdGVQcm92aWRlciwgY29ubmVjdEFkdmFuY2VkLCBjb25uZWN0IH07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy9pbmRleC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIENhbGxiYWNrUXVldWUgPSByZXF1aXJlKCcuL0NhbGxiYWNrUXVldWUnKTtcbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RGZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBkaXJ0eUNvbXBvbmVudHMgPSBbXTtcbnZhciB1cGRhdGVCYXRjaE51bWJlciA9IDA7XG52YXIgYXNhcENhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xudmFyIGFzYXBFbnF1ZXVlZCA9IGZhbHNlO1xuXG52YXIgYmF0Y2hpbmdTdHJhdGVneSA9IG51bGw7XG5cbmZ1bmN0aW9uIGVuc3VyZUluamVjdGVkKCkge1xuICAhKFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uICYmIGJhdGNoaW5nU3RyYXRlZ3kpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBpbmplY3QgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MgYW5kIGJhdGNoaW5nIHN0cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTIzJykgOiB2b2lkIDA7XG59XG5cbnZhciBORVNURURfVVBEQVRFUyA9IHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gZGlydHlDb21wb25lbnRzLmxlbmd0aDtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggIT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIEFkZGl0aW9uYWwgdXBkYXRlcyB3ZXJlIGVucXVldWVkIGJ5IGNvbXBvbmVudERpZFVwZGF0ZSBoYW5kbGVycyBvclxuICAgICAgLy8gc2ltaWxhcjsgYmVmb3JlIG91ciBvd24gVVBEQVRFX1FVRVVFSU5HIHdyYXBwZXIgY2xvc2VzLCB3ZSB3YW50IHRvIHJ1blxuICAgICAgLy8gdGhlc2UgbmV3IHVwZGF0ZXMgc28gdGhhdCBpZiBBJ3MgY29tcG9uZW50RGlkVXBkYXRlIGNhbGxzIHNldFN0YXRlIG9uXG4gICAgICAvLyBCLCBCIHdpbGwgdXBkYXRlIGJlZm9yZSB0aGUgY2FsbGJhY2sgQSdzIHVwZGF0ZXIgcHJvdmlkZWQgd2hlbiBjYWxsaW5nXG4gICAgICAvLyBzZXRTdGF0ZS5cbiAgICAgIGRpcnR5Q29tcG9uZW50cy5zcGxpY2UoMCwgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGgpO1xuICAgICAgZmx1c2hCYXRjaGVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBVUERBVEVfUVVFVUVJTkcgPSB7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUucmVzZXQoKTtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUubm90aWZ5QWxsKCk7XG4gIH1cbn07XG5cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtORVNURURfVVBEQVRFUywgVVBEQVRFX1FVRVVFSU5HXTtcblxuZnVuY3Rpb24gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbigpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xuICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7XG4gIHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoXG4gIC8qIHVzZUNyZWF0ZUVsZW1lbnQgKi90cnVlKTtcbn1cblxuX2Fzc2lnbihSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIHtcbiAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSUztcbiAgfSxcblxuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsO1xuICAgIENhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpO1xuICAgIHRoaXMuY2FsbGJhY2tRdWV1ZSA9IG51bGw7XG4gICAgUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfSxcblxuICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSkge1xuICAgIC8vIEVzc2VudGlhbGx5IGNhbGxzIGB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLnBlcmZvcm0obWV0aG9kLCBzY29wZSwgYSlgXG4gICAgLy8gd2l0aCB0aGlzIHRyYW5zYWN0aW9uJ3Mgd3JhcHBlcnMgYXJvdW5kIGl0LlxuICAgIHJldHVybiBUcmFuc2FjdGlvbi5wZXJmb3JtLmNhbGwodGhpcywgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtLCB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLCBtZXRob2QsIHNjb3BlLCBhKTtcbiAgfVxufSk7XG5cblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uKTtcblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpIHtcbiAgZW5zdXJlSW5qZWN0ZWQoKTtcbiAgcmV0dXJuIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpO1xufVxuXG4vKipcbiAqIEFycmF5IGNvbXBhcmF0b3IgZm9yIFJlYWN0Q29tcG9uZW50cyBieSBtb3VudCBvcmRlcmluZy5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjMSBmaXJzdCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZ1xuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzIgc2Vjb25kIGNvbXBvbmVudCB5b3UncmUgY29tcGFyaW5nXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJldHVybiB2YWx1ZSB1c2FibGUgYnkgQXJyYXkucHJvdG90eXBlLnNvcnQoKS5cbiAqL1xuZnVuY3Rpb24gbW91bnRPcmRlckNvbXBhcmF0b3IoYzEsIGMyKSB7XG4gIHJldHVybiBjMS5fbW91bnRPcmRlciAtIGMyLl9tb3VudE9yZGVyO1xufVxuXG5mdW5jdGlvbiBydW5CYXRjaGVkVXBkYXRlcyh0cmFuc2FjdGlvbikge1xuICB2YXIgbGVuID0gdHJhbnNhY3Rpb24uZGlydHlDb21wb25lbnRzTGVuZ3RoO1xuICAhKGxlbiA9PT0gZGlydHlDb21wb25lbnRzLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgZmx1c2ggdHJhbnNhY3Rpb25cXCdzIHN0b3JlZCBkaXJ0eS1jb21wb25lbnRzIGxlbmd0aCAoJXMpIHRvIG1hdGNoIGRpcnR5LWNvbXBvbmVudHMgYXJyYXkgbGVuZ3RoICglcykuJywgbGVuLCBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSA6IF9wcm9kSW52YXJpYW50KCcxMjQnLCBsZW4sIGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIDogdm9pZCAwO1xuXG4gIC8vIFNpbmNlIHJlY29uY2lsaW5nIGEgY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgb3duZXIgaGllcmFyY2h5IHVzdWFsbHkgKG5vdFxuICAvLyBhbHdheXMgLS0gc2VlIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpKSB3aWxsIHJlY29uY2lsZSBjaGlsZHJlbiwgcmVjb25jaWxlXG4gIC8vIHRoZW0gYmVmb3JlIHRoZWlyIGNoaWxkcmVuIGJ5IHNvcnRpbmcgdGhlIGFycmF5LlxuICBkaXJ0eUNvbXBvbmVudHMuc29ydChtb3VudE9yZGVyQ29tcGFyYXRvcik7XG5cbiAgLy8gQW55IHVwZGF0ZXMgZW5xdWV1ZWQgd2hpbGUgcmVjb25jaWxpbmcgbXVzdCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhpcyBlbnRpcmVcbiAgLy8gYmF0Y2guIE90aGVyd2lzZSwgaWYgZGlydHlDb21wb25lbnRzIGlzIFtBLCBCXSB3aGVyZSBBIGhhcyBjaGlsZHJlbiBCIGFuZFxuICAvLyBDLCBCIGNvdWxkIHVwZGF0ZSB0d2ljZSBpbiBhIHNpbmdsZSBiYXRjaCBpZiBDJ3MgcmVuZGVyIGVucXVldWVzIGFuIHVwZGF0ZVxuICAvLyB0byBCIChzaW5jZSBCIHdvdWxkIGhhdmUgYWxyZWFkeSB1cGRhdGVkLCB3ZSBzaG91bGQgc2tpcCBpdCwgYW5kIHRoZSBvbmx5XG4gIC8vIHdheSB3ZSBjYW4ga25vdyB0byBkbyBzbyBpcyBieSBjaGVja2luZyB0aGUgYmF0Y2ggY291bnRlcikuXG4gIHVwZGF0ZUJhdGNoTnVtYmVyKys7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IGlzIHVubW91bnRlZCBiZWZvcmUgcGVuZGluZyBjaGFuZ2VzIGFwcGx5LCBpdCB3aWxsIHN0aWxsXG4gICAgLy8gYmUgaGVyZSwgYnV0IHdlIGFzc3VtZSB0aGF0IGl0IGhhcyBjbGVhcmVkIGl0cyBfcGVuZGluZ0NhbGxiYWNrcyBhbmRcbiAgICAvLyB0aGF0IHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSBpcyBhIG5vb3AuXG4gICAgdmFyIGNvbXBvbmVudCA9IGRpcnR5Q29tcG9uZW50c1tpXTtcblxuICAgIC8vIElmIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSBoYXBwZW5zIHRvIGVucXVldWUgYW55IG5ldyB1cGRhdGVzLCB3ZVxuICAgIC8vIHNob3VsZG4ndCBleGVjdXRlIHRoZSBjYWxsYmFja3MgdW50aWwgdGhlIG5leHQgcmVuZGVyIGhhcHBlbnMsIHNvXG4gICAgLy8gc3Rhc2ggdGhlIGNhbGxiYWNrcyBmaXJzdFxuICAgIHZhciBjYWxsYmFja3MgPSBjb21wb25lbnQuX3BlbmRpbmdDYWxsYmFja3M7XG4gICAgY29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcblxuICAgIHZhciBtYXJrZXJOYW1lO1xuICAgIGlmIChSZWFjdEZlYXR1cmVGbGFncy5sb2dUb3BMZXZlbFJlbmRlcnMpIHtcbiAgICAgIHZhciBuYW1lZENvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgIC8vIER1Y2sgdHlwZSBUb3BMZXZlbFdyYXBwZXIuIFRoaXMgaXMgcHJvYmFibHkgYWx3YXlzIHRydWUuXG4gICAgICBpZiAoY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC50eXBlLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXIpIHtcbiAgICAgICAgbmFtZWRDb21wb25lbnQgPSBjb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgICAgfVxuICAgICAgbWFya2VyTmFtZSA9ICdSZWFjdCB1cGRhdGU6ICcgKyBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7XG4gICAgICBjb25zb2xlLnRpbWUobWFya2VyTmFtZSk7XG4gICAgfVxuXG4gICAgUmVhY3RSZWNvbmNpbGVyLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeShjb21wb25lbnQsIHRyYW5zYWN0aW9uLnJlY29uY2lsZVRyYW5zYWN0aW9uLCB1cGRhdGVCYXRjaE51bWJlcik7XG5cbiAgICBpZiAobWFya2VyTmFtZSkge1xuICAgICAgY29uc29sZS50aW1lRW5kKG1hcmtlck5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmNhbGxiYWNrUXVldWUuZW5xdWV1ZShjYWxsYmFja3Nbal0sIGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZsdXNoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24ncyB3cmFwcGVycyB3aWxsIGNsZWFyIHRoZSBkaXJ0eUNvbXBvbmVudHNcbiAgLy8gYXJyYXkgYW5kIHBlcmZvcm0gYW55IHVwZGF0ZXMgZW5xdWV1ZWQgYnkgbW91bnQtcmVhZHkgaGFuZGxlcnMgKGkuZS4sXG4gIC8vIGNvbXBvbmVudERpZFVwZGF0ZSkgYnV0IHdlIG5lZWQgdG8gY2hlY2sgaGVyZSB0b28gaW4gb3JkZXIgdG8gY2F0Y2hcbiAgLy8gdXBkYXRlcyBlbnF1ZXVlZCBieSBzZXRTdGF0ZSBjYWxsYmFja3MgYW5kIGFzYXAgY2FsbHMuXG4gIHdoaWxlIChkaXJ0eUNvbXBvbmVudHMubGVuZ3RoIHx8IGFzYXBFbnF1ZXVlZCkge1xuICAgIGlmIChkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICB2YXIgdHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLmdldFBvb2xlZCgpO1xuICAgICAgdHJhbnNhY3Rpb24ucGVyZm9ybShydW5CYXRjaGVkVXBkYXRlcywgbnVsbCwgdHJhbnNhY3Rpb24pO1xuICAgICAgUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5zYWN0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYXNhcEVucXVldWVkKSB7XG4gICAgICBhc2FwRW5xdWV1ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBxdWV1ZSA9IGFzYXBDYWxsYmFja1F1ZXVlO1xuICAgICAgYXNhcENhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xuICAgICAgcXVldWUubm90aWZ5QWxsKCk7XG4gICAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UocXVldWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBNYXJrIGEgY29tcG9uZW50IGFzIG5lZWRpbmcgYSByZXJlbmRlciwgYWRkaW5nIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIGFcbiAqIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSB0aGUgcmVyZW5kZXIgb2NjdXJzLlxuICovXG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGNvbXBvbmVudCkge1xuICBlbnN1cmVJbmplY3RlZCgpO1xuXG4gIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQnc1xuICAvLyBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUgdGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5lc3RlZDtcbiAgLy8gdmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLiAoVGhpcyBpcyBjYWxsZWQgYnkgZWFjaCB0b3AtbGV2ZWwgdXBkYXRlXG4gIC8vIGZ1bmN0aW9uLCBsaWtlIHNldFN0YXRlLCBmb3JjZVVwZGF0ZSwgZXRjLjsgY3JlYXRpb24gYW5kXG4gIC8vIGRlc3RydWN0aW9uIG9mIHRvcC1sZXZlbCBjb21wb25lbnRzIGlzIGd1YXJkZWQgaW4gUmVhY3RNb3VudC4pXG5cbiAgaWYgKCFiYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgYmF0Y2hpbmdTdHJhdGVneS5iYXRjaGVkVXBkYXRlcyhlbnF1ZXVlVXBkYXRlLCBjb21wb25lbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGRpcnR5Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIGlmIChjb21wb25lbnQuX3VwZGF0ZUJhdGNoTnVtYmVyID09IG51bGwpIHtcbiAgICBjb21wb25lbnQuX3VwZGF0ZUJhdGNoTnVtYmVyID0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxO1xuICB9XG59XG5cbi8qKlxuICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRvIGJlIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJhdGNoaW5nIGN5Y2xlLiBUaHJvd3NcbiAqIGlmIG5vIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBiZWluZyBwZXJmb3JtZWQuXG4gKi9cbmZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgIWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzLmFzYXA6IENhblxcJ3QgZW5xdWV1ZSBhbiBhc2FwIGNhbGxiYWNrIGluIGEgY29udGV4dCB3aGVyZXVwZGF0ZXMgYXJlIG5vdCBiZWluZyBiYXRjaGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzEyNScpIDogdm9pZCAwO1xuICBhc2FwQ2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgYXNhcEVucXVldWVkID0gdHJ1ZTtcbn1cblxudmFyIFJlYWN0VXBkYXRlc0luamVjdGlvbiA9IHtcbiAgaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IGZ1bmN0aW9uIChSZWNvbmNpbGVUcmFuc2FjdGlvbikge1xuICAgICFSZWNvbmNpbGVUcmFuc2FjdGlvbiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIHJlY29uY2lsZSB0cmFuc2FjdGlvbiBjbGFzcycpIDogX3Byb2RJbnZhcmlhbnQoJzEyNicpIDogdm9pZCAwO1xuICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gUmVjb25jaWxlVHJhbnNhY3Rpb247XG4gIH0sXG5cbiAgaW5qZWN0QmF0Y2hpbmdTdHJhdGVneTogZnVuY3Rpb24gKF9iYXRjaGluZ1N0cmF0ZWd5KSB7XG4gICAgIV9iYXRjaGluZ1N0cmF0ZWd5ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgYmF0Y2hpbmcgc3RyYXRlZ3knKSA6IF9wcm9kSW52YXJpYW50KCcxMjcnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBfYmF0Y2hpbmdTdHJhdGVneS5iYXRjaGVkVXBkYXRlcyA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSBiYXRjaGVkVXBkYXRlcygpIGZ1bmN0aW9uJykgOiBfcHJvZEludmFyaWFudCgnMTI4JykgOiB2b2lkIDA7XG4gICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPT09ICdib29sZWFuJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYW4gaXNCYXRjaGluZ1VwZGF0ZXMgYm9vbGVhbiBhdHRyaWJ1dGUnKSA6IF9wcm9kSW52YXJpYW50KCcxMjknKSA6IHZvaWQgMDtcbiAgICBiYXRjaGluZ1N0cmF0ZWd5ID0gX2JhdGNoaW5nU3RyYXRlZ3k7XG4gIH1cbn07XG5cbnZhciBSZWFjdFVwZGF0ZXMgPSB7XG4gIC8qKlxuICAgKiBSZWFjdCByZWZlcmVuY2VzIGBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uYCB1c2luZyB0aGlzIHByb3BlcnR5IGluIG9yZGVyXG4gICAqIHRvIGFsbG93IGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IG51bGwsXG5cbiAgYmF0Y2hlZFVwZGF0ZXM6IGJhdGNoZWRVcGRhdGVzLFxuICBlbnF1ZXVlVXBkYXRlOiBlbnF1ZXVlVXBkYXRlLFxuICBmbHVzaEJhdGNoZWRVcGRhdGVzOiBmbHVzaEJhdGNoZWRVcGRhdGVzLFxuICBpbmplY3Rpb246IFJlYWN0VXBkYXRlc0luamVjdGlvbixcbiAgYXNhcDogYXNhcFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFVwZGF0ZXM7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlcy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q3VycmVudE93bmVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5ID0gZmFsc2U7XG52YXIgaXNQcm94eVN1cHBvcnRlZCA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJztcblxudmFyIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzID0gWydkaXNwYXRjaENvbmZpZycsICdfdGFyZ2V0SW5zdCcsICduYXRpdmVFdmVudCcsICdpc0RlZmF1bHRQcmV2ZW50ZWQnLCAnaXNQcm9wYWdhdGlvblN0b3BwZWQnLCAnX2Rpc3BhdGNoTGlzdGVuZXJzJywgJ19kaXNwYXRjaEluc3RhbmNlcyddO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHR5cGU6IG51bGwsXG4gIHRhcmdldDogbnVsbCxcbiAgLy8gY3VycmVudFRhcmdldCBpcyBzZXQgd2hlbiBkaXNwYXRjaGluZzsgbm8gdXNlIGluIGNvcHlpbmcgaXQgaGVyZVxuICBjdXJyZW50VGFyZ2V0OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCxcbiAgZXZlbnRQaGFzZTogbnVsbCxcbiAgYnViYmxlczogbnVsbCxcbiAgY2FuY2VsYWJsZTogbnVsbCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsXG4gIGlzVHJ1c3RlZDogbnVsbFxufTtcblxuLyoqXG4gKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICpcbiAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gKlxuICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVudFRhcmdldCBUYXJnZXQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIHRoZXNlIGhhdmUgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5nc1xuICAgIGRlbGV0ZSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgIGRlbGV0ZSB0aGlzLnByZXZlbnREZWZhdWx0O1xuICAgIGRlbGV0ZSB0aGlzLnN0b3BQcm9wYWdhdGlvbjtcbiAgfVxuXG4gIHRoaXMuZGlzcGF0Y2hDb25maWcgPSBkaXNwYXRjaENvbmZpZztcbiAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcblxuICB2YXIgSW50ZXJmYWNlID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWxldGUgdGhpc1twcm9wTmFtZV07IC8vIHRoaXMgaGFzIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3NcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtwcm9wTmFtZV07XG4gICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcE5hbWUgPT09ICd0YXJnZXQnKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG4gIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTtcbiAgfVxuICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlO1xuICByZXR1cm4gdGhpcztcbn1cblxuX2Fzc2lnbihTeW50aGV0aWNFdmVudC5wcm90b3R5cGUsIHtcbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YWxpZC10eXBlb2ZcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICovXG4gIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmlzUGVyc2lzdGVudCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNQZXJzaXN0ZW50OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UsXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIGBkZXN0cnVjdG9yYCBvbiBlYWNoIGluc3RhbmNlIGl0IHJlbGVhc2VzLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgSW50ZXJmYWNlW3Byb3BOYW1lXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzW3Nob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzW2ldXSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hdGl2ZUV2ZW50JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignbmF0aXZlRXZlbnQnLCBudWxsKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ByZXZlbnREZWZhdWx0JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigncHJldmVudERlZmF1bHQnLCBlbXB0eUZ1bmN0aW9uKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGVtcHR5RnVuY3Rpb24pKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5TeW50aGV0aWNFdmVudC5JbnRlcmZhY2UgPSBFdmVudEludGVyZmFjZTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgaWYgKGlzUHJveHlTdXBwb3J0ZWQpIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLWZ1bmMtYXNzaWduICovXG4gICAgU3ludGhldGljRXZlbnQgPSBuZXcgUHJveHkoU3ludGhldGljRXZlbnQsIHtcbiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKHRhcmdldCwgYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0YXJnZXQsIE9iamVjdC5jcmVhdGUodGFyZ2V0LnByb3RvdHlwZSksIGFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGFwcGx5OiBmdW5jdGlvbiAoY29uc3RydWN0b3IsIHRoYXQsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb25zdHJ1Y3Rvci5hcHBseSh0aGF0LCBhcmdzKSwge1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChwcm9wICE9PSAnaXNQZXJzaXN0ZW50JyAmJiAhdGFyZ2V0LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuRm9yQWRkZWROZXdQcm9wZXJ0eSB8fCB0YXJnZXQuaXNQZXJzaXN0ZW50KCksIFwiVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3UncmUgXCIgKyBcInNlZWluZyB0aGlzLCB5b3UncmUgYWRkaW5nIGEgbmV3IHByb3BlcnR5IGluIHRoZSBzeW50aGV0aWMgZXZlbnQgb2JqZWN0LiBcIiArICdUaGUgcHJvcGVydHkgaXMgbmV2ZXIgcmVsZWFzZWQuIFNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8qZXNsaW50LWVuYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xuICB9XG59XG4vKipcbiAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzXG4gKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZVxuICovXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkge1xuICB2YXIgU3VwZXIgPSB0aGlzO1xuXG4gIHZhciBFID0gZnVuY3Rpb24gKCkge307XG4gIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90eXBlO1xuICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTtcblxuICBfYXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzcztcblxuICBDbGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7XG4gIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzcztcblxuICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG59O1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRXZlbnQ7XG5cbi8qKlxuICAqIEhlbHBlciB0byBudWxsaWZ5IHN5bnRoZXRpY0V2ZW50IGluc3RhbmNlIHByb3BlcnRpZXMgd2hlbiBkZXN0cnVjdGluZ1xuICAqXG4gICogQHBhcmFtIHtvYmplY3R9IFN5bnRoZXRpY0V2ZW50XG4gICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3RcbiAgKi9cbmZ1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIGdldFZhbCkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBnZXRWYWwgPT09ICdmdW5jdGlvbic7XG4gIHJldHVybiB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogc2V0LFxuICAgIGdldDogZ2V0XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ3NldHRpbmcgdGhlIG1ldGhvZCcgOiAnc2V0dGluZyB0aGUgcHJvcGVydHknO1xuICAgIHdhcm4oYWN0aW9uLCAnVGhpcyBpcyBlZmZlY3RpdmVseSBhIG5vLW9wJyk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldCgpIHtcbiAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdhY2Nlc3NpbmcgdGhlIG1ldGhvZCcgOiAnYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSc7XG4gICAgdmFyIHJlc3VsdCA9IGlzRnVuY3Rpb24gPyAnVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uJyA6ICdUaGlzIGlzIHNldCB0byBudWxsJztcbiAgICB3YXJuKGFjdGlvbiwgcmVzdWx0KTtcbiAgICByZXR1cm4gZ2V0VmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gd2FybihhY3Rpb24sIHJlc3VsdCkge1xuICAgIHZhciB3YXJuaW5nQ29uZGl0aW9uID0gZmFsc2U7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmluZ0NvbmRpdGlvbiwgXCJUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgXCIgKyBcInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuIFwiICsgJ0lmIHlvdSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBhY3Rpb24sIHByb3BOYW1lLCByZXN1bHQpIDogdm9pZCAwO1xuICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0V2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBjaGVja01hc2sodmFsdWUsIGJpdG1hc2spIHtcbiAgcmV0dXJuICh2YWx1ZSAmIGJpdG1hc2spID09PSBiaXRtYXNrO1xufVxuXG52YXIgRE9NUHJvcGVydHlJbmplY3Rpb24gPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbm9ybWFsaXplZCwgY2FtZWxjYXNlZCBwcm9wZXJ0eSBuYW1lcyB0byBhIGNvbmZpZ3VyYXRpb24gdGhhdFxuICAgKiBzcGVjaWZpZXMgaG93IHRoZSBhc3NvY2lhdGVkIERPTSBwcm9wZXJ0eSBzaG91bGQgYmUgYWNjZXNzZWQgb3IgcmVuZGVyZWQuXG4gICAqL1xuICBNVVNUX1VTRV9QUk9QRVJUWTogMHgxLFxuICBIQVNfQk9PTEVBTl9WQUxVRTogMHg0LFxuICBIQVNfTlVNRVJJQ19WQUxVRTogMHg4LFxuICBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTogMHgxMCB8IDB4OCxcbiAgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTogMHgyMCxcblxuICAvKipcbiAgICogSW5qZWN0IHNvbWUgc3BlY2lhbGl6ZWQga25vd2xlZGdlIGFib3V0IHRoZSBET00uIFRoaXMgdGFrZXMgYSBjb25maWcgb2JqZWN0XG4gICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiBpc0N1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gdGhhdCBnaXZlbiBhbiBhdHRyaWJ1dGUgbmFtZSB3aWxsIHJldHVybiB0cnVlXG4gICAqIGlmIGl0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00gdmVyYmF0aW0uIFVzZWZ1bCBmb3IgZGF0YS0qIG9yIGFyaWEtKlxuICAgKiBhdHRyaWJ1dGVzIHdoZXJlIGl0J3MgaW1wb3NzaWJsZSB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBwb3NzaWJsZVxuICAgKiBhdHRyaWJ1dGUgbmFtZXMsXG4gICAqXG4gICAqIFByb3BlcnRpZXM6IG9iamVjdCBtYXBwaW5nIERPTSBwcm9wZXJ0eSBuYW1lIHRvIG9uZSBvZiB0aGVcbiAgICogRE9NUHJvcGVydHlJbmplY3Rpb24gY29uc3RhbnRzIG9yIG51bGwuIElmIHlvdXIgYXR0cmlidXRlIGlzbid0IGluIGhlcmUsXG4gICAqIGl0IHdvbid0IGdldCB3cml0dGVuIHRvIHRoZSBET00uXG4gICAqXG4gICAqIERPTUF0dHJpYnV0ZU5hbWVzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lLiBBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlICoqbG93ZXJjYXNlKipcbiAgICogbm9ybWFsaXplZCBuYW1lLlxuICAgKlxuICAgKiBET01BdHRyaWJ1dGVOYW1lc3BhY2VzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lc3BhY2UgVVJMLiAoQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIG5vIG5hbWVzcGFjZS4pXG4gICAqXG4gICAqIERPTVByb3BlcnR5TmFtZXM6IHNpbWlsYXIgdG8gRE9NQXR0cmlidXRlTmFtZXMgYnV0IGZvciBET00gcHJvcGVydGllcy5cbiAgICogUHJvcGVydHkgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlIG5vcm1hbGl6ZWQgbmFtZS5cbiAgICpcbiAgICogRE9NTXV0YXRpb25NZXRob2RzOiBQcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIG11dGF0aW9uIG1ldGhvZHMuIElmXG4gICAqIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLCB0aGUgbXV0YXRpb24gbWV0aG9kIHNob3VsZCB1bnNldCB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Qcm9wZXJ0eUNvbmZpZyB0aGUgY29uZmlnIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICovXG4gIGluamVjdERPTVByb3BlcnR5Q29uZmlnOiBmdW5jdGlvbiAoZG9tUHJvcGVydHlDb25maWcpIHtcbiAgICB2YXIgSW5qZWN0aW9uID0gRE9NUHJvcGVydHlJbmplY3Rpb247XG4gICAgdmFyIFByb3BlcnRpZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHZhciBET01BdHRyaWJ1dGVOYW1lc3BhY2VzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNwYWNlcyB8fCB7fTtcbiAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lcyB8fCB7fTtcbiAgICB2YXIgRE9NUHJvcGVydHlOYW1lcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTVByb3BlcnR5TmFtZXMgfHwge307XG4gICAgdmFyIERPTU11dGF0aW9uTWV0aG9kcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTU11dGF0aW9uTWV0aG9kcyB8fCB7fTtcblxuICAgIGlmIChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSkge1xuICAgICAgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIFByb3BlcnRpZXMpIHtcbiAgICAgICEhRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaW5qZWN0RE9NUHJvcGVydHlDb25maWcoLi4uKTogWW91XFwncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgXFwnJXNcXCcgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBpbmplY3RlZC4gWW91IG1heSBiZSBhY2NpZGVudGFsbHkgaW5qZWN0aW5nIHRoZSBzYW1lIERPTSBwcm9wZXJ0eSBjb25maWcgdHdpY2UsIG9yIHlvdSBtYXkgYmUgaW5qZWN0aW5nIHR3byBjb25maWdzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBwcm9wZXJ0eSBuYW1lcy4nLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNDgnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIHZhciBsb3dlckNhc2VkID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBwcm9wQ29uZmlnID0gUHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGxvd2VyQ2FzZWQsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZTogbnVsbCxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgbXV0YXRpb25NZXRob2Q6IG51bGwsXG5cbiAgICAgICAgbXVzdFVzZVByb3BlcnR5OiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZKSxcbiAgICAgICAgaGFzQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFKSxcbiAgICAgICAgaGFzTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFKSxcbiAgICAgICAgaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLFxuICAgICAgICBoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpXG4gICAgICB9O1xuICAgICAgIShwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICsgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSArIHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlIDw9IDEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0RPTVByb3BlcnR5OiBWYWx1ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2FkZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcycsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc1MCcsIHByb3BOYW1lKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZF0gPSBwcm9wTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IERPTUF0dHJpYnV0ZU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgICAgcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2F0dHJpYnV0ZU5hbWVdID0gcHJvcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBET01BdHRyaWJ1dGVOYW1lc3BhY2VzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTVByb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWUgPSBET01Qcm9wZXJ0eU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTU11dGF0aW9uTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kID0gRE9NTXV0YXRpb25NZXRob2RzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wTmFtZV0gPSBwcm9wZXJ0eUluZm87XG4gICAgfVxuICB9XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9ICc6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEJztcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIERPTVByb3BlcnR5IGV4cG9ydHMgbG9va3VwIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBsaWtlIGZ1bmN0aW9uczpcbiAqXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnaWQnXVxuICogICB0cnVlXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnZm9vYmFyJ11cbiAqICAgdW5kZWZpbmVkXG4gKlxuICogQWx0aG91Z2ggdGhpcyBtYXkgYmUgY29uZnVzaW5nLCBpdCBwZXJmb3JtcyBiZXR0ZXIgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1leGlzdHNcbiAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LW1pc3NpbmdcbiAqL1xudmFyIERPTVByb3BlcnR5ID0ge1xuICBJRF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3RpZCcsXG4gIFJPT1RfQVRUUklCVVRFX05BTUU6ICdkYXRhLXJlYWN0cm9vdCcsXG5cbiAgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUixcbiAgQVRUUklCVVRFX05BTUVfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICdcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MCcsXG5cbiAgLyoqXG4gICAqIE1hcCBmcm9tIHByb3BlcnR5IFwic3RhbmRhcmQgbmFtZVwiIHRvIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgaG93IHRvIHNldFxuICAgKiB0aGUgcHJvcGVydHkgaW4gdGhlIERPTS4gRWFjaCBvYmplY3QgY29udGFpbnM6XG4gICAqXG4gICAqIGF0dHJpYnV0ZU5hbWU6XG4gICAqICAgVXNlZCB3aGVuIHJlbmRlcmluZyBtYXJrdXAgb3Igd2l0aCBgKkF0dHJpYnV0ZSgpYC5cbiAgICogYXR0cmlidXRlTmFtZXNwYWNlXG4gICAqIHByb3BlcnR5TmFtZTpcbiAgICogICBVc2VkIG9uIERPTSBub2RlIGluc3RhbmNlcy4gKFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IG11dGF0ZSBkdWUgdG9cbiAgICogICBleHRlcm5hbCBmYWN0b3JzLilcbiAgICogbXV0YXRpb25NZXRob2Q6XG4gICAqICAgSWYgbm9uLW51bGwsIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvcGVydHkgb3IgYHNldEF0dHJpYnV0ZSgpYCBhZnRlclxuICAgKiAgIGluaXRpYWwgcmVuZGVyLlxuICAgKiBtdXN0VXNlUHJvcGVydHk6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBhY2Nlc3NlZCBhbmQgbXV0YXRlZCBhcyBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAqIGhhc0Jvb2xlYW5WYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMgYW5kIHNob3VsZCBiZVxuICAgKiAgIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlXG4gICAqICAgbnVtZXJpYyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuICAgKiAgIFJlbW92ZWQgd2hlbiBzdHJpY3RseSBlcXVhbCB0byBmYWxzZTsgcHJlc2VudCB3aXRob3V0IGEgdmFsdWUgd2hlblxuICAgKiAgIHN0cmljdGx5IGVxdWFsIHRvIHRydWU7IHByZXNlbnQgd2l0aCBhIHZhbHVlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3BlcnRpZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHByb3BlcnR5IG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLCB1c2VkXG4gICAqIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBwcm9wZXJ0aWVzLiBBdmFpbGFibGUgb25seSBpbiBfX0RFVl9fLlxuICAgKlxuICAgKiBhdXRvZm9jdXMgaXMgcHJlZGVmaW5lZCwgYmVjYXVzZSBhZGRpbmcgaXQgdG8gdGhlIHByb3BlcnR5IHdoaXRlbGlzdFxuICAgKiBjYXVzZXMgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHsgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyB9IDogbnVsbCxcblxuICAvKipcbiAgICogQWxsIG9mIHRoZSBpc0N1c3RvbUF0dHJpYnV0ZSgpIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmplY3RlZC5cbiAgICovXG4gIF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczogW10sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgbmFtZSBpcyBhIGN1c3RvbSBhdHRyaWJ1dGUuXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNDdXN0b21BdHRyaWJ1dGVGbiA9IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpc0N1c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBET01Qcm9wZXJ0eUluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHkuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBTdGF0aWMgcG9vbGVycy4gU2V2ZXJhbCBjdXN0b20gdmVyc2lvbnMgZm9yIGVhY2ggcG90ZW50aWFsIG51bWJlciBvZlxuICogYXJndW1lbnRzLiBBIGNvbXBsZXRlbHkgZ2VuZXJpYyBwb29sZXIgaXMgZWFzeSB0byBpbXBsZW1lbnQsIGJ1dCB3b3VsZFxuICogcmVxdWlyZSBhY2Nlc3NpbmcgdGhlIGBhcmd1bWVudHNgIG9iamVjdC4gSW4gZWFjaCBvZiB0aGVzZSwgYHRoaXNgIHJlZmVycyB0b1xuICogdGhlIENsYXNzIGl0c2VsZiwgbm90IGFuIGluc3RhbmNlLiBJZiBhbnkgb3RoZXJzIGFyZSBuZWVkZWQsIHNpbXBseSBhZGQgdGhlbVxuICogaGVyZSwgb3IgaW4gdGhlaXIgb3duIGZpbGVzLlxuICovXG52YXIgb25lQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoY29weUZpZWxkc0Zyb20pIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgY29weUZpZWxkc0Zyb20pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGNvcHlGaWVsZHNGcm9tKTtcbiAgfVxufTtcblxudmFyIHR3b0FyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMikge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMik7XG4gIH1cbn07XG5cbnZhciB0aHJlZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMyk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMyk7XG4gIH1cbn07XG5cbnZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMywgYTQpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMywgYTQpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0KTtcbiAgfVxufTtcblxudmFyIHN0YW5kYXJkUmVsZWFzZXIgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgIShpbnN0YW5jZSBpbnN0YW5jZW9mIEtsYXNzKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBhIGRpZmZlcmVudCB0eXBlLicpIDogX3Byb2RJbnZhcmlhbnQoJzI1JykgOiB2b2lkIDA7XG4gIGluc3RhbmNlLmRlc3RydWN0b3IoKTtcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBLbGFzcy5wb29sU2l6ZSkge1xuICAgIEtsYXNzLmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTtcbiAgfVxufTtcblxudmFyIERFRkFVTFRfUE9PTF9TSVpFID0gMTA7XG52YXIgREVGQVVMVF9QT09MRVIgPSBvbmVBcmd1bWVudFBvb2xlcjtcblxuLyoqXG4gKiBBdWdtZW50cyBgQ29weUNvbnN0cnVjdG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNzLCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzXG4gKiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBhZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMuIEFueSBDb3B5Q29uc3RydWN0b3JcbiAqIHlvdSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNpemVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29rIGZvciBhXG4gKiBwcm90b3R5cGljYWwgYGRlc3RydWN0b3JgIG9uIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDb3B5Q29uc3RydWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZXNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFibGUgcG9vbGVyLlxuICovXG52YXIgYWRkUG9vbGluZ1RvID0gZnVuY3Rpb24gKENvcHlDb25zdHJ1Y3RvciwgcG9vbGVyKSB7XG4gIC8vIENhc3RpbmcgYXMgYW55IHNvIHRoYXQgZmxvdyBpZ25vcmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5kIHRydXN0c1xuICAvLyBpdCB0byBtYXRjaCB0aGUgdHlwZSB3ZSBkZWNsYXJlZFxuICB2YXIgTmV3S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7XG4gIE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdO1xuICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29sZXIgfHwgREVGQVVMVF9QT09MRVI7XG4gIGlmICghTmV3S2xhc3MucG9vbFNpemUpIHtcbiAgICBOZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9PTF9TSVpFO1xuICB9XG4gIE5ld0tsYXNzLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyO1xuICByZXR1cm4gTmV3S2xhc3M7XG59O1xuXG52YXIgUG9vbGVkQ2xhc3MgPSB7XG4gIGFkZFBvb2xpbmdUbzogYWRkUG9vbGluZ1RvLFxuICBvbmVBcmd1bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIsXG4gIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29Bcmd1bWVudFBvb2xlcixcbiAgdGhyZWVBcmd1bWVudFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xlcixcbiAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3VyQXJndW1lbnRQb29sZXJcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3M7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1Bvb2xlZENsYXNzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTtcblxudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcblxudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjtcblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBubyBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcblxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcblxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307XG5cbiAgICAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG4gICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZWxmXG4gICAgICB9KTtcbiAgICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHNvdXJjZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgICAgZWxlbWVudC5fc2VsZiA9IHNlbGY7XG4gICAgICBlbGVtZW50Ll9zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy4kJHR5cGVvZiA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcHMuJCR0eXBlb2YgIT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIFJlYWN0RWxlbWVudHMgb2YgYSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWZhY3RvcnlcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3RvcnkgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgZmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7XG4gIC8vIEV4cG9zZSB0aGUgdHlwZSBvbiB0aGUgZmFjdG9yeSBhbmQgdGhlIHByb3RvdHlwZSBzbyB0aGF0IGl0IGNhbiBiZVxuICAvLyBlYXNpbHkgYWNjZXNzZWQgb24gZWxlbWVudHMuIEUuZy4gYDxGb28gLz4udHlwZSA9PT0gRm9vYC5cbiAgLy8gVGhpcyBzaG91bGQgbm90IGJlIG5hbWVkIGBjb25zdHJ1Y3RvcmAgc2luY2UgdGhpcyBtYXkgbm90IGJlIHRoZSBmdW5jdGlvblxuICAvLyB0aGF0IGNyZWF0ZWQgdGhlIGVsZW1lbnQsIGFuZCBpdCBtYXkgbm90IGV2ZW4gYmUgYSBjb25zdHJ1Y3Rvci5cbiAgLy8gTGVnYWN5IGhvb2sgVE9ETzogV2FybiBpZiB0aGlzIGlzIGFjY2Vzc2VkXG4gIGZhY3RvcnkudHlwZSA9IHR5cGU7XG4gIHJldHVybiBmYWN0b3J5O1xufTtcblxuUmVhY3RFbGVtZW50LmNsb25lQW5kUmVwbGFjZUtleSA9IGZ1bmN0aW9uIChvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcblxuICByZXR1cm4gbmV3RWxlbWVudDtcbn07XG5cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2xvbmVlbGVtZW50XG4gKi9cblJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTtcblxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuICAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLlxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7XG4gIC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlO1xuXG4gIC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgY29tcG9uZW50LlxuICogQGZpbmFsXG4gKi9cblJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVtZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0RWxlbWVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi93YXJuaW5nL2Jyb3dzZXIuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFtZXNwYWNlcycpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uJyk7XG52YXIgc2V0VGV4dENvbnRlbnQgPSByZXF1aXJlKCcuL3NldFRleHRDb250ZW50Jyk7XG5cbnZhciBFTEVNRU5UX05PREVfVFlQRSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFID0gMTE7XG5cbi8qKlxuICogSW4gSUUgKDgtMTEpIGFuZCBFZGdlLCBhcHBlbmRpbmcgbm9kZXMgd2l0aCBubyBjaGlsZHJlbiBpcyBkcmFtYXRpY2FsbHlcbiAqIGZhc3RlciB0aGFuIGFwcGVuZGluZyBhIGZ1bGwgc3VidHJlZSwgc28gd2UgZXNzZW50aWFsbHkgcXVldWUgdXAgdGhlXG4gKiAuYXBwZW5kQ2hpbGQgY2FsbHMgaGVyZSBhbmQgYXBwbHkgdGhlbSBzbyBlYWNoIG5vZGUgaXMgYWRkZWQgdG8gaXRzIHBhcmVudFxuICogYmVmb3JlIGFueSBjaGlsZHJlbiBhcmUgYWRkZWQuXG4gKlxuICogSW4gb3RoZXIgYnJvd3NlcnMsIGRvaW5nIHNvIGlzIHNsb3dlciBvciBuZXV0cmFsIGNvbXBhcmVkIHRvIHRoZSBvdGhlciBvcmRlclxuICogKGluIEZpcmVmb3gsIHR3aWNlIGFzIHNsb3cpIHNvIHdlIG9ubHkgZG8gdGhpcyBpbnZlcnNpb24gaW4gSUUuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGljeWovaW5uZXJodG1sLXZzLWNyZWF0ZWVsZW1lbnQtdnMtY2xvbmVub2RlLlxuICovXG52YXIgZW5hYmxlTGF6eSA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvci51c2VyQWdlbnQgPT09ICdzdHJpbmcnICYmIC9cXGJFZGdlXFwvXFxkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG5mdW5jdGlvbiBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSkge1xuICBpZiAoIWVuYWJsZUxhenkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vZGUgPSB0cmVlLm5vZGU7XG4gIHZhciBjaGlsZHJlbiA9IHRyZWUuY2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbnNlcnRUcmVlQmVmb3JlKG5vZGUsIGNoaWxkcmVuW2ldLCBudWxsKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHJlZS5odG1sICE9IG51bGwpIHtcbiAgICBzZXRJbm5lckhUTUwobm9kZSwgdHJlZS5odG1sKTtcbiAgfSBlbHNlIGlmICh0cmVlLnRleHQgIT0gbnVsbCkge1xuICAgIHNldFRleHRDb250ZW50KG5vZGUsIHRyZWUudGV4dCk7XG4gIH1cbn1cblxudmFyIGluc2VydFRyZWVCZWZvcmUgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChwYXJlbnROb2RlLCB0cmVlLCByZWZlcmVuY2VOb2RlKSB7XG4gIC8vIERvY3VtZW50RnJhZ21lbnRzIGFyZW4ndCBhY3R1YWxseSBwYXJ0IG9mIHRoZSBET00gYWZ0ZXIgaW5zZXJ0aW9uIHNvXG4gIC8vIGFwcGVuZGluZyBjaGlsZHJlbiB3b24ndCB1cGRhdGUgdGhlIERPTS4gV2UgbmVlZCB0byBlbnN1cmUgdGhlIGZyYWdtZW50XG4gIC8vIGlzIHByb3Blcmx5IHBvcHVsYXRlZCBmaXJzdCwgYnJlYWtpbmcgb3V0IG9mIG91ciBsYXp5IGFwcHJvYWNoIGZvciBqdXN0XG4gIC8vIHRoaXMgbGV2ZWwuIEFsc28sIHNvbWUgPG9iamVjdD4gcGx1Z2lucyAobGlrZSBGbGFzaCBQbGF5ZXIpIHdpbGwgcmVhZFxuICAvLyA8cGFyYW0+IG5vZGVzIGltbWVkaWF0ZWx5IHVwb24gaW5zZXJ0aW9uIGludG8gdGhlIERPTSwgc28gPG9iamVjdD5cbiAgLy8gbXVzdCBhbHNvIGJlIHBvcHVsYXRlZCBwcmlvciB0byBpbnNlcnRpb24gaW50byB0aGUgRE9NLlxuICBpZiAodHJlZS5ub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgfHwgdHJlZS5ub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSAmJiB0cmVlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgJiYgKHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCB0cmVlLm5vZGUubmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpKSB7XG4gICAgaW5zZXJ0VHJlZUNoaWxkcmVuKHRyZWUpO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyZWUubm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiByZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGROb2RlLCBuZXdUcmVlKSB7XG4gIG9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3VHJlZS5ub2RlLCBvbGROb2RlKTtcbiAgaW5zZXJ0VHJlZUNoaWxkcmVuKG5ld1RyZWUpO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUNoaWxkKHBhcmVudFRyZWUsIGNoaWxkVHJlZSkge1xuICBpZiAoZW5hYmxlTGF6eSkge1xuICAgIHBhcmVudFRyZWUuY2hpbGRyZW4ucHVzaChjaGlsZFRyZWUpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudFRyZWUubm9kZS5hcHBlbmRDaGlsZChjaGlsZFRyZWUubm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVIVE1MKHRyZWUsIGh0bWwpIHtcbiAgaWYgKGVuYWJsZUxhenkpIHtcbiAgICB0cmVlLmh0bWwgPSBodG1sO1xuICB9IGVsc2Uge1xuICAgIHNldElubmVySFRNTCh0cmVlLm5vZGUsIGh0bWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXVlVGV4dCh0cmVlLCB0ZXh0KSB7XG4gIGlmIChlbmFibGVMYXp5KSB7XG4gICAgdHJlZS50ZXh0ID0gdGV4dDtcbiAgfSBlbHNlIHtcbiAgICBzZXRUZXh0Q29udGVudCh0cmVlLm5vZGUsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdGhpcy5ub2RlLm5vZGVOYW1lO1xufVxuXG5mdW5jdGlvbiBET01MYXp5VHJlZShub2RlKSB7XG4gIHJldHVybiB7XG4gICAgbm9kZTogbm9kZSxcbiAgICBjaGlsZHJlbjogW10sXG4gICAgaHRtbDogbnVsbCxcbiAgICB0ZXh0OiBudWxsLFxuICAgIHRvU3RyaW5nOiB0b1N0cmluZ1xuICB9O1xufVxuXG5ET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlID0gaW5zZXJ0VHJlZUJlZm9yZTtcbkRPTUxhenlUcmVlLnJlcGxhY2VDaGlsZFdpdGhUcmVlID0gcmVwbGFjZUNoaWxkV2l0aFRyZWU7XG5ET01MYXp5VHJlZS5xdWV1ZUNoaWxkID0gcXVldWVDaGlsZDtcbkRPTUxhenlUcmVlLnF1ZXVlSFRNTCA9IHF1ZXVlSFRNTDtcbkRPTUxhenlUcmVlLnF1ZXVlVGV4dCA9IHF1ZXVlVGV4dDtcblxubW9kdWxlLmV4cG9ydHMgPSBET01MYXp5VHJlZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRE9NTGF6eVRyZWUuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RSZWYgPSByZXF1aXJlKCcuL1JlYWN0UmVmJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQsIHNwbGl0IG91dFxuICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRyYW5zYWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLlxuICovXG5mdW5jdGlvbiBhdHRhY2hSZWZzKCkge1xuICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTtcbn1cblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSB0aGUgY29udGFpbmluZyBob3N0IGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyXG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFJlbmRlcmVkIG1hcmt1cCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKSAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290c1xuICB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1hcmt1cCA9IGludGVybmFsSW5zdGFuY2UubW91bnRDb21wb25lbnQodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Nb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhIHZhbHVlIHRoYXQgY2FuIGJlIHBhc3NlZCB0b1xuICAgKiBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cC5cbiAgICovXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnRlcm5hbEluc3RhbmNlLmdldEhvc3ROb2RlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGBtb3VudENvbXBvbmVudGAuXG4gICAqXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBzYWZlbHkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7XG4gICAgaW50ZXJuYWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBjb21wb25lbnQgdXNpbmcgYSBuZXcgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcblxuICAgIGlmIChuZXh0RWxlbWVudCA9PT0gcHJldkVsZW1lbnQgJiYgY29udGV4dCA9PT0gaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCkge1xuICAgICAgLy8gU2luY2UgZWxlbWVudHMgYXJlIGltbXV0YWJsZSBhZnRlciB0aGUgb3duZXIgaXMgcmVuZGVyZWQsXG4gICAgICAvLyB3ZSBjYW4gZG8gYSBjaGVhcCBpZGVudGl0eSBjb21wYXJlIGhlcmUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gc3VwZXJmbHVvdXMgcmVjb25jaWxlLiBJdCdzIHBvc3NpYmxlIGZvciBzdGF0ZSB0byBiZSBtdXRhYmxlIGJ1dCBzdWNoXG4gICAgICAvLyBjaGFuZ2Ugc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSBvd25lciB3aGljaCB3b3VsZCByZWNyZWF0ZVxuICAgICAgLy8gdGhlIGVsZW1lbnQuIFdlIGV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gb3duZXIgc2luY2VcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIGFuIGVsZW1lbnQgY3JlYXRlZCBvdXRzaWRlIGEgY29tcG9zaXRlIHRvIGJlXG4gICAgICAvLyBkZWVwbHkgbXV0YXRlZCBhbmQgcmV1c2VkLlxuXG4gICAgICAvLyBUT0RPOiBCYWlsaW5nIG91dCBlYXJseSBpcyBqdXN0IGEgcGVyZiBvcHRpbWl6YXRpb24gcmlnaHQ/XG4gICAgICAvLyBUT0RPOiBSZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBzaG91bGQgYWZmZWN0IGNvcnJlY3RuZXNzP1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgbmV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWZzQ2hhbmdlZCA9IFJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgIGlmIChyZWZzQ2hhbmdlZCkge1xuICAgICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBwcmV2RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50KG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBpZiAocmVmc0NoYW5nZWQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVtYmVyKSB7XG4gICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNob3VsZCBhbHdheXMgYmUgdGhlIGN1cnJlbnRcbiAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dpbmcgb25lLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0gbnVsbCB8fCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PT0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxLCAncGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBVbmV4cGVjdGVkIGJhdGNoIG51bWJlciAoY3VycmVudCAlcywgJyArICdwZW5kaW5nICVzKScsIHVwZGF0ZUJhdGNoTnVtYmVyLCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlcikgOiB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlcm5hbEluc3RhbmNlLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0cmFuc2FjdGlvbik7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZXIuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0QmFzZUNsYXNzZXMgPSByZXF1aXJlKCcuL1JlYWN0QmFzZUNsYXNzZXMnKTtcbnZhciBSZWFjdENoaWxkcmVuID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkcmVuJyk7XG52YXIgUmVhY3RET01GYWN0b3JpZXMgPSByZXF1aXJlKCcuL1JlYWN0RE9NRmFjdG9yaWVzJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXMnKTtcbnZhciBSZWFjdFZlcnNpb24gPSByZXF1aXJlKCcuL1JlYWN0VmVyc2lvbicpO1xuXG52YXIgY3JlYXRlUmVhY3RDbGFzcyA9IHJlcXVpcmUoJy4vY3JlYXRlQ2xhc3MnKTtcbnZhciBvbmx5Q2hpbGQgPSByZXF1aXJlKCcuL29ubHlDaGlsZCcpO1xuXG52YXIgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50O1xudmFyIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbnZhciBjbG9uZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gcmVxdWlyZSgnLi9sb3dQcmlvcml0eVdhcm5pbmcnKTtcbiAgdmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xuICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRWYWxpZGF0b3InKTtcbiAgdmFyIGRpZFdhcm5Qcm9wVHlwZXNEZXByZWNhdGVkID0gZmFsc2U7XG4gIGNyZWF0ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRWxlbWVudDtcbiAgY3JlYXRlRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVGYWN0b3J5O1xuICBjbG9uZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY2xvbmVFbGVtZW50O1xufVxuXG52YXIgX19zcHJlYWQgPSBfYXNzaWduO1xudmFyIGNyZWF0ZU1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gIHJldHVybiBtaXhpbjtcbn07XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuZWRGb3JTcHJlYWQgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckNyZWF0ZU1peGluID0gZmFsc2U7XG4gIF9fc3ByZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGxvd1ByaW9yaXR5V2FybmluZyh3YXJuZWRGb3JTcHJlYWQsICdSZWFjdC5fX3NwcmVhZCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFVzZSAnICsgJ09iamVjdC5hc3NpZ24gZGlyZWN0bHkgb3IgYW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gd2l0aCBzaW1pbGFyICcgKyAnc2VtYW50aWNzLiBZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIHlvdXIgY29tcGlsZXIuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtc3ByZWFkLWRlcHJlY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgd2FybmVkRm9yU3ByZWFkID0gdHJ1ZTtcbiAgICByZXR1cm4gX2Fzc2lnbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIGNyZWF0ZU1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgbG93UHJpb3JpdHlXYXJuaW5nKHdhcm5lZEZvckNyZWF0ZU1peGluLCAnUmVhY3QuY3JlYXRlTWl4aW4gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAnICsgJ0luIFJlYWN0IHYxNi4wLCBpdCB3aWxsIGJlIHJlbW92ZWQuICcgKyAnWW91IGNhbiB1c2UgdGhpcyBtaXhpbiBkaXJlY3RseSBpbnN0ZWFkLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL2NyZWF0ZW1peGluLXdhcy1uZXZlci1pbXBsZW1lbnRlZCBmb3IgbW9yZSBpbmZvLicpO1xuICAgIHdhcm5lZEZvckNyZWF0ZU1peGluID0gdHJ1ZTtcbiAgICByZXR1cm4gbWl4aW47XG4gIH07XG59XG5cbnZhciBSZWFjdCA9IHtcbiAgLy8gTW9kZXJuXG5cbiAgQ2hpbGRyZW46IHtcbiAgICBtYXA6IFJlYWN0Q2hpbGRyZW4ubWFwLFxuICAgIGZvckVhY2g6IFJlYWN0Q2hpbGRyZW4uZm9yRWFjaCxcbiAgICBjb3VudDogUmVhY3RDaGlsZHJlbi5jb3VudCxcbiAgICB0b0FycmF5OiBSZWFjdENoaWxkcmVuLnRvQXJyYXksXG4gICAgb25seTogb25seUNoaWxkXG4gIH0sXG5cbiAgQ29tcG9uZW50OiBSZWFjdEJhc2VDbGFzc2VzLkNvbXBvbmVudCxcbiAgUHVyZUNvbXBvbmVudDogUmVhY3RCYXNlQ2xhc3Nlcy5QdXJlQ29tcG9uZW50LFxuXG4gIGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQsXG4gIGNsb25lRWxlbWVudDogY2xvbmVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudDogUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50LFxuXG4gIC8vIENsYXNzaWNcblxuICBQcm9wVHlwZXM6IFJlYWN0UHJvcFR5cGVzLFxuICBjcmVhdGVDbGFzczogY3JlYXRlUmVhY3RDbGFzcyxcbiAgY3JlYXRlRmFjdG9yeTogY3JlYXRlRmFjdG9yeSxcbiAgY3JlYXRlTWl4aW46IGNyZWF0ZU1peGluLFxuXG4gIC8vIFRoaXMgbG9va3MgRE9NIHNwZWNpZmljIGJ1dCB0aGVzZSBhcmUgYWN0dWFsbHkgaXNvbW9ycGhpYyBoZWxwZXJzXG4gIC8vIHNpbmNlIHRoZXkgYXJlIGp1c3QgZ2VuZXJhdGluZyBET00gc3RyaW5ncy5cbiAgRE9NOiBSZWFjdERPTUZhY3RvcmllcyxcblxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG5cbiAgLy8gRGVwcmVjYXRlZCBob29rIGZvciBKU1ggc3ByZWFkLCBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcuXG4gIF9fc3ByZWFkOiBfX3NwcmVhZFxufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHdhcm5lZEZvckNyZWF0ZUNsYXNzID0gZmFsc2U7XG4gIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdCwgJ1Byb3BUeXBlcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmcoZGlkV2FyblByb3BUeXBlc0RlcHJlY2F0ZWQsICdBY2Nlc3NpbmcgUHJvcFR5cGVzIHZpYSB0aGUgbWFpbiBSZWFjdCBwYWNrYWdlIGlzIGRlcHJlY2F0ZWQsJyArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAgUmVhY3QgdjE2LjAuJyArICcgVXNlIHRoZSBsYXRlc3QgYXZhaWxhYmxlIHYxNS4qIHByb3AtdHlwZXMgcGFja2FnZSBmcm9tIG5wbSBpbnN0ZWFkLicgKyAnIEZvciBpbmZvIG9uIHVzYWdlLCBjb21wYXRpYmlsaXR5LCBtaWdyYXRpb24gYW5kIG1vcmUsIHNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcHJvcC10eXBlcy1kb2NzJyk7XG4gICAgICAgIGRpZFdhcm5Qcm9wVHlwZXNEZXByZWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0LCAnY3JlYXRlQ2xhc3MnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG93UHJpb3JpdHlXYXJuaW5nKHdhcm5lZEZvckNyZWF0ZUNsYXNzLCAnQWNjZXNzaW5nIGNyZWF0ZUNsYXNzIHZpYSB0aGUgbWFpbiBSZWFjdCBwYWNrYWdlIGlzIGRlcHJlY2F0ZWQsJyArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCB2MTYuMC4nICsgXCIgVXNlIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcyBpbnN0ZWFkLiBJZiB5b3UncmUgbm90IHlldCBcIiArICdyZWFkeSB0byBtaWdyYXRlLCBjcmVhdGUtcmVhY3QtY2xhc3MgdjE1LiogaXMgYXZhaWxhYmxlICcgKyAnb24gbnBtIGFzIGEgdGVtcG9yYXJ5LCBkcm9wLWluIHJlcGxhY2VtZW50LiAnICsgJ0ZvciBtb3JlIGluZm8gc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtY3JlYXRlLWNsYXNzJyk7XG4gICAgICAgIHdhcm5lZEZvckNyZWF0ZUNsYXNzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlYWN0Q2xhc3M7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFjdC5ET00gZmFjdG9yaWVzIGFyZSBkZXByZWNhdGVkLiBXcmFwIHRoZXNlIG1ldGhvZHMgc28gdGhhdFxuICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgUmVhY3QuRE9NIG5hbWVzcGFjZSBhbmQgYWxlcnQgdXNlcnMgdG8gc3dpdGNoXG4gIC8vIHRvIHRoZSBgcmVhY3QtZG9tLWZhY3Rvcmllc2AgcGFja2FnZS5cbiAgUmVhY3QuRE9NID0ge307XG4gIHZhciB3YXJuZWRGb3JGYWN0b3JpZXMgPSBmYWxzZTtcbiAgT2JqZWN0LmtleXMoUmVhY3RET01GYWN0b3JpZXMpLmZvckVhY2goZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBSZWFjdC5ET01bZmFjdG9yeV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXdhcm5lZEZvckZhY3Rvcmllcykge1xuICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmcoZmFsc2UsICdBY2Nlc3NpbmcgZmFjdG9yaWVzIGxpa2UgUmVhY3QuRE9NLiVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIHYxNi4wKy4gVXNlIHRoZSAnICsgJ3JlYWN0LWRvbS1mYWN0b3JpZXMgcGFja2FnZSBpbnN0ZWFkLiAnICsgJyBWZXJzaW9uIDEuMCBwcm92aWRlcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuJyArICcgRm9yIG1vcmUgaW5mbywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZG9tLWZhY3RvcmllcycsIGZhY3RvcnkpO1xuICAgICAgICB3YXJuZWRGb3JGYWN0b3JpZXMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlYWN0RE9NRmFjdG9yaWVzW2ZhY3RvcnldLmFwcGx5KFJlYWN0RE9NRmFjdG9yaWVzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogV0FSTklORzogRE8gTk9UIG1hbnVhbGx5IHJlcXVpcmUgdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGBpbnZhcmlhbnQoLi4uKWAgdXNlZCBieSB0aGUgZXJyb3IgY29kZSBzeXN0ZW1cbiAqIGFuZCB3aWxsIF9vbmx5XyBiZSByZXF1aXJlZCBieSB0aGUgY29ycmVzcG9uZGluZyBiYWJlbCBwYXNzLlxuICogSXQgYWx3YXlzIHRocm93cy5cbiAqL1xuXG5mdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSkge1xuICB2YXIgYXJnQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICB2YXIgbWVzc2FnZSA9ICdNaW5pZmllZCBSZWFjdCBlcnJvciAjJyArIGNvZGUgKyAnOyB2aXNpdCAnICsgJ2h0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PScgKyBjb2RlO1xuXG4gIGZvciAodmFyIGFyZ0lkeCA9IDA7IGFyZ0lkeCA8IGFyZ0NvdW50OyBhcmdJZHgrKykge1xuICAgIG1lc3NhZ2UgKz0gJyZhcmdzW109JyArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4ICsgMV0pO1xuICB9XG5cbiAgbWVzc2FnZSArPSAnIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCcgKyAnIGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLic7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhY3RQcm9kSW52YXJpYW50J3Mgb3duIGZyYW1lXG5cbiAgdGhyb3cgZXJyb3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3RQcm9kSW52YXJpYW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBhZGRMZWFkaW5nU2xhc2ggPSBleHBvcnRzLmFkZExlYWRpbmdTbGFzaCA9IGZ1bmN0aW9uIGFkZExlYWRpbmdTbGFzaChwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7XG59O1xuXG52YXIgc3RyaXBMZWFkaW5nU2xhc2ggPSBleHBvcnRzLnN0cmlwTGVhZGluZ1NsYXNoID0gZnVuY3Rpb24gc3RyaXBMZWFkaW5nU2xhc2gocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJyA/IHBhdGguc3Vic3RyKDEpIDogcGF0aDtcbn07XG5cbnZhciBoYXNCYXNlbmFtZSA9IGV4cG9ydHMuaGFzQmFzZW5hbWUgPSBmdW5jdGlvbiBoYXNCYXNlbmFtZShwYXRoLCBwcmVmaXgpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgcHJlZml4ICsgJyhcXFxcL3xcXFxcP3wjfCQpJywgJ2knKS50ZXN0KHBhdGgpO1xufTtcblxudmFyIHN0cmlwQmFzZW5hbWUgPSBleHBvcnRzLnN0cmlwQmFzZW5hbWUgPSBmdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGgsIHByZWZpeCkge1xuICByZXR1cm4gaGFzQmFzZW5hbWUocGF0aCwgcHJlZml4KSA/IHBhdGguc3Vic3RyKHByZWZpeC5sZW5ndGgpIDogcGF0aDtcbn07XG5cbnZhciBzdHJpcFRyYWlsaW5nU2xhc2ggPSBleHBvcnRzLnN0cmlwVHJhaWxpbmdTbGFzaCA9IGZ1bmN0aW9uIHN0cmlwVHJhaWxpbmdTbGFzaChwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCAtIDEpID09PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGg7XG59O1xuXG52YXIgcGFyc2VQYXRoID0gZXhwb3J0cy5wYXJzZVBhdGggPSBmdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICB2YXIgcGF0aG5hbWUgPSBwYXRoIHx8ICcvJztcbiAgdmFyIHNlYXJjaCA9ICcnO1xuICB2YXIgaGFzaCA9ICcnO1xuXG4gIHZhciBoYXNoSW5kZXggPSBwYXRobmFtZS5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgaGFzaCA9IHBhdGhuYW1lLnN1YnN0cihoYXNoSW5kZXgpO1xuICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyKDAsIGhhc2hJbmRleCk7XG4gIH1cblxuICB2YXIgc2VhcmNoSW5kZXggPSBwYXRobmFtZS5pbmRleE9mKCc/Jyk7XG4gIGlmIChzZWFyY2hJbmRleCAhPT0gLTEpIHtcbiAgICBzZWFyY2ggPSBwYXRobmFtZS5zdWJzdHIoc2VhcmNoSW5kZXgpO1xuICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyKDAsIHNlYXJjaEluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgIHNlYXJjaDogc2VhcmNoID09PSAnPycgPyAnJyA6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoID09PSAnIycgPyAnJyA6IGhhc2hcbiAgfTtcbn07XG5cbnZhciBjcmVhdGVQYXRoID0gZXhwb3J0cy5jcmVhdGVQYXRoID0gZnVuY3Rpb24gY3JlYXRlUGF0aChsb2NhdGlvbikge1xuICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuXG5cbiAgdmFyIHBhdGggPSBwYXRobmFtZSB8fCAnLyc7XG5cbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2ggIT09ICc/JykgcGF0aCArPSBzZWFyY2guY2hhckF0KDApID09PSAnPycgPyBzZWFyY2ggOiAnPycgKyBzZWFyY2g7XG5cbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gJyMnKSBwYXRoICs9IGhhc2guY2hhckF0KDApID09PSAnIycgPyBoYXNoIDogJyMnICsgaGFzaDtcblxuICByZXR1cm4gcGF0aDtcbn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9oaXN0b3J5L1BhdGhVdGlscy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ludmFyaWFudC9icm93c2VyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luUmVnaXN0cnknKTtcbnZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7XG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcblxudmFyIGFjY3VtdWxhdGVJbnRvID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlSW50bycpO1xudmFyIGZvckVhY2hBY2N1bXVsYXRlZCA9IHJlcXVpcmUoJy4vZm9yRWFjaEFjY3VtdWxhdGVkJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogSW50ZXJuYWwgc3RvcmUgZm9yIGV2ZW50IGxpc3RlbmVyc1xuICovXG52YXIgbGlzdGVuZXJCYW5rID0ge307XG5cbi8qKlxuICogSW50ZXJuYWwgcXVldWUgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCB0aGVpciBkaXNwYXRjaGVzIGFuZCBhcmVcbiAqIHdhaXRpbmcgdG8gaGF2ZSB0aGVpciBkaXNwYXRjaGVzIGV4ZWN1dGVkLlxuICovXG52YXIgZXZlbnRRdWV1ZSA9IG51bGw7XG5cbi8qKlxuICogRGlzcGF0Y2hlcyBhbiBldmVudCBhbmQgcmVsZWFzZXMgaXQgYmFjayBpbnRvIHRoZSBwb29sLCB1bmxlc3MgcGVyc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGV2ZW50IFN5bnRoZXRpYyBldmVudCB0byBiZSBkaXNwYXRjaGVkLlxuICogQHBhcmFtIHtib29sZWFufSBzaW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAoY2hhbmdlcyBleG4gYmVoYXZpb3IpXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlID0gZnVuY3Rpb24gKGV2ZW50LCBzaW11bGF0ZWQpIHtcbiAgaWYgKGV2ZW50KSB7XG4gICAgRXZlbnRQbHVnaW5VdGlscy5leGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZXZlbnQsIHNpbXVsYXRlZCk7XG5cbiAgICBpZiAoIWV2ZW50LmlzUGVyc2lzdGVudCgpKSB7XG4gICAgICBldmVudC5jb25zdHJ1Y3Rvci5yZWxlYXNlKGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZShlLCB0cnVlKTtcbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUsIGZhbHNlKTtcbn07XG5cbnZhciBnZXREaWN0aW9uYXJ5S2V5ID0gZnVuY3Rpb24gKGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59O1xuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICAgIHJldHVybiAhIShwcm9wcy5kaXNhYmxlZCAmJiBpc0ludGVyYWN0aXZlKHR5cGUpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBldmVudCBwbHVnaW5zIHRvIGJlIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZC5cbiAqXG4gKiBFdmVudCBwbHVnaW5zIGNhbiBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgYGV4dHJhY3RFdmVudHNgIHtmdW5jdGlvbihzdHJpbmcsIERPTUV2ZW50VGFyZ2V0LCBzdHJpbmcsIG9iamVjdCk6ICp9XG4gKiAgICAgUmVxdWlyZWQuIFdoZW4gYSB0b3AtbGV2ZWwgZXZlbnQgaXMgZmlyZWQsIHRoaXMgbWV0aG9kIGlzIGV4cGVjdGVkIHRvXG4gKiAgICAgZXh0cmFjdCBzeW50aGV0aWMgZXZlbnRzIHRoYXQgd2lsbCBpbiB0dXJuIGJlIHF1ZXVlZCBhbmQgZGlzcGF0Y2hlZC5cbiAqXG4gKiAgIGBldmVudFR5cGVzYCB7b2JqZWN0fVxuICogICAgIE9wdGlvbmFsLCBwbHVnaW5zIHRoYXQgZmlyZSBldmVudHMgbXVzdCBwdWJsaXNoIGEgbWFwcGluZyBvZiByZWdpc3RyYXRpb25cbiAqICAgICBuYW1lcyB0aGF0IGFyZSB1c2VkIHRvIHJlZ2lzdGVyIGxpc3RlbmVycy4gVmFsdWVzIG9mIHRoaXMgbWFwcGluZyBtdXN0XG4gKiAgICAgYmUgb2JqZWN0cyB0aGF0IGNvbnRhaW4gYHJlZ2lzdHJhdGlvbk5hbWVgIG9yIGBwaGFzZWRSZWdpc3RyYXRpb25OYW1lc2AuXG4gKlxuICogICBgZXhlY3V0ZURpc3BhdGNoYCB7ZnVuY3Rpb24ob2JqZWN0LCBmdW5jdGlvbiwgc3RyaW5nKX1cbiAqICAgICBPcHRpb25hbCwgYWxsb3dzIHBsdWdpbnMgdG8gb3ZlcnJpZGUgaG93IGFuIGV2ZW50IGdldHMgZGlzcGF0Y2hlZC4gQnlcbiAqICAgICBkZWZhdWx0LCB0aGUgbGlzdGVuZXIgaXMgc2ltcGx5IGludm9rZWQuXG4gKlxuICogRWFjaCBwbHVnaW4gdGhhdCBpcyBpbmplY3RlZCBpbnRvIGBFdmVudHNQbHVnaW5IdWJgIGlzIGltbWVkaWF0ZWx5IG9wZXJhYmxlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIEV2ZW50UGx1Z2luSHViID0ge1xuICAvKipcbiAgICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIGluamVjdGlvbjoge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7YXJyYXl9IEluamVjdGVkRXZlbnRQbHVnaW5PcmRlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBpbmplY3RFdmVudFBsdWdpbk9yZGVyOiBFdmVudFBsdWdpblJlZ2lzdHJ5LmluamVjdEV2ZW50UGx1Z2luT3JkZXIsXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucyBNYXAgZnJvbSBuYW1lcyB0byBwbHVnaW4gbW9kdWxlcy5cbiAgICAgKi9cbiAgICBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lXG4gIH0sXG5cbiAgLyoqXG4gICAqIFN0b3JlcyBgbGlzdGVuZXJgIGF0IGBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XWAuIElzIGlkZW1wb3RlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIHN0b3JlLlxuICAgKi9cbiAgcHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgICEodHlwZW9mIGxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCAlcyBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCB0eXBlICVzJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6IF9wcm9kSW52YXJpYW50KCc5NCcsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiB2b2lkIDA7XG5cbiAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV0gfHwgKGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSA9IHt9KTtcbiAgICBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldID0gbGlzdGVuZXI7XG5cbiAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0ZW5lcikge1xuICAgICAgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICAgKi9cbiAgZ2V0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNwZWNpZmljIGFuZCBkZWZpbml0ZWx5IHNob3VsZCBub3RcbiAgICAvLyBsaXZlIGhlcmU7IG5lZWRzIHRvIGJlIG1vdmVkIHRvIGEgYmV0dGVyIHBsYWNlIHNvb25cbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnR5cGUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIHJldHVybiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSAmJiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGJhbmsuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICovXG4gIGRlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikge1xuICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAtLSB3aGVuIGlzIGl0P1xuICAgIGlmIChiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgICBkZWxldGUgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGxpc3RlbmVycyBmb3IgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIElELlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKi9cbiAgZGVsZXRlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIGZvciAodmFyIHJlZ2lzdHJhdGlvbk5hbWUgaW4gbGlzdGVuZXJCYW5rKSB7XG4gICAgICBpZiAoIWxpc3RlbmVyQmFuay5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpIHtcbiAgICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQWxsb3dzIHJlZ2lzdGVyZWQgcGx1Z2lucyBhbiBvcHBvcnR1bml0eSB0byBleHRyYWN0IGV2ZW50cyBmcm9tIHRvcC1sZXZlbFxuICAgKiBuYXRpdmUgYnJvd3NlciBldmVudHMuXG4gICAqXG4gICAqIEByZXR1cm4geyp9IEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBldmVudHM7XG4gICAgdmFyIHBsdWdpbnMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBOb3QgZXZlcnkgcGx1Z2luIGluIHRoZSBvcmRlcmluZyBtYXkgYmUgbG9hZGVkIGF0IHJ1bnRpbWUuXG4gICAgICB2YXIgcG9zc2libGVQbHVnaW4gPSBwbHVnaW5zW2ldO1xuICAgICAgaWYgKHBvc3NpYmxlUGx1Z2luKSB7XG4gICAgICAgIHZhciBleHRyYWN0ZWRFdmVudHMgPSBwb3NzaWJsZVBsdWdpbi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgICAgaWYgKGV4dHJhY3RlZEV2ZW50cykge1xuICAgICAgICAgIGV2ZW50cyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHN5bnRoZXRpYyBldmVudCB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIHdoZW5cbiAgICogYHByb2Nlc3NFdmVudFF1ZXVlYCBpcyBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGV2ZW50cyBBbiBhY2N1bXVsYXRpb24gb2Ygc3ludGhldGljIGV2ZW50cy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgZXZlbnRRdWV1ZSA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50UXVldWUsIGV2ZW50cyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFsbCBzeW50aGV0aWMgZXZlbnRzIG9uIHRoZSBldmVudCBxdWV1ZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm9jZXNzRXZlbnRRdWV1ZTogZnVuY3Rpb24gKHNpbXVsYXRlZCkge1xuICAgIC8vIFNldCBgZXZlbnRRdWV1ZWAgdG8gbnVsbCBiZWZvcmUgcHJvY2Vzc2luZyBpdCBzbyB0aGF0IHdlIGNhbiB0ZWxsIGlmIG1vcmVcbiAgICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcuXG4gICAgdmFyIHByb2Nlc3NpbmdFdmVudFF1ZXVlID0gZXZlbnRRdWV1ZTtcbiAgICBldmVudFF1ZXVlID0gbnVsbDtcbiAgICBpZiAoc2ltdWxhdGVkKSB7XG4gICAgICBmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwpO1xuICAgIH1cbiAgICAhIWV2ZW50UXVldWUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncHJvY2Vzc0V2ZW50UXVldWUoKTogQWRkaXRpb25hbCBldmVudHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGV2ZW50IHF1ZXVlLiBTdXBwb3J0IGZvciB0aGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuJykgOiBfcHJvZEludmFyaWFudCgnOTUnKSA6IHZvaWQgMDtcbiAgICAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cbiAgICBSZWFjdEVycm9yVXRpbHMucmV0aHJvd0NhdWdodEVycm9yKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZXNlIGFyZSBuZWVkZWQgZm9yIHRlc3RzIG9ubHkuIERvIG5vdCB1c2UhXG4gICAqL1xuICBfX3B1cmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgbGlzdGVuZXJCYW5rID0ge307XG4gIH0sXG5cbiAgX19nZXRMaXN0ZW5lckJhbms6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbGlzdGVuZXJCYW5rO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luSHViO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpbkh1Yi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7XG5cbnZhciBhY2N1bXVsYXRlSW50byA9IHJlcXVpcmUoJy4vYWNjdW11bGF0ZUludG8nKTtcbnZhciBmb3JFYWNoQWNjdW11bGF0ZWQgPSByZXF1aXJlKCcuL2ZvckVhY2hBY2N1bXVsYXRlZCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBnZXRMaXN0ZW5lciA9IEV2ZW50UGx1Z2luSHViLmdldExpc3RlbmVyO1xuXG4vKipcbiAqIFNvbWUgZXZlbnQgdHlwZXMgaGF2ZSBhIG5vdGlvbiBvZiBkaWZmZXJlbnQgcmVnaXN0cmF0aW9uIG5hbWVzIGZvciBkaWZmZXJlbnRcbiAqIFwicGhhc2VzXCIgb2YgcHJvcGFnYXRpb24uIFRoaXMgZmluZHMgbGlzdGVuZXJzIGJ5IGEgZ2l2ZW4gcGhhc2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcHJvcGFnYXRpb25QaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0aW9uUGhhc2VdO1xuICByZXR1cm4gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG59XG5cbi8qKlxuICogVGFncyBhIGBTeW50aGV0aWNFdmVudGAgd2l0aCBkaXNwYXRjaGVkIGxpc3RlbmVycy4gQ3JlYXRpbmcgdGhpcyBmdW5jdGlvblxuICogaGVyZSwgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGJpbmQgb3IgY3JlYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudC5cbiAqIE11dGF0aW5nIHRoZSBldmVudCdzIG1lbWJlcnMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGNyZWF0ZSBhIHdyYXBwaW5nXG4gKiBcImRpc3BhdGNoXCIgb2JqZWN0IHRoYXQgcGFpcnMgdGhlIGV2ZW50IHdpdGggdGhlIGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzKGluc3QsIHBoYXNlLCBldmVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3QsICdEaXNwYXRjaGluZyBpbnN0IG11c3Qgbm90IGJlIG51bGwnKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lckF0UGhhc2UoaW5zdCwgZXZlbnQsIHBoYXNlKTtcbiAgaWYgKGxpc3RlbmVyKSB7XG4gICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLCBpbnN0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgZGlzcGF0Y2hlcyAobXVzdCBiZSBlbnRpcmVseSBjb2xsZWN0ZWQgYmVmb3JlIGRpc3BhdGNoaW5nIC0gc2VlIHVuaXRcbiAqIHRlc3RzKS4gTGF6aWx5IGFsbG9jYXRlIHRoZSBhcnJheSB0byBjb25zZXJ2ZSBtZW1vcnkuICBXZSBtdXN0IGxvb3AgdGhyb3VnaFxuICogZWFjaCBldmVudCBhbmQgcGVyZm9ybSB0aGUgdHJhdmVyc2FsIGZvciBlYWNoIG9uZS4gV2UgY2Fubm90IHBlcmZvcm0gYVxuICogc2luZ2xlIHRyYXZlcnNhbCBmb3IgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGV2ZW50cyBiZWNhdXNlIGVhY2ggZXZlbnQgbWF5XG4gKiBoYXZlIGEgZGlmZmVyZW50IHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZShldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlVHdvUGhhc2UoZXZlbnQuX3RhcmdldEluc3QsIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNhbWUgYXMgYGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVgLCBidXQgc2tpcHMgb3ZlciB0aGUgdGFyZ2V0SUQuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVTa2lwVGFyZ2V0KGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIHZhciB0YXJnZXRJbnN0ID0gZXZlbnQuX3RhcmdldEluc3Q7XG4gICAgdmFyIHBhcmVudEluc3QgPSB0YXJnZXRJbnN0ID8gRXZlbnRQbHVnaW5VdGlscy5nZXRQYXJlbnRJbnN0YW5jZSh0YXJnZXRJbnN0KSA6IG51bGw7XG4gICAgRXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZVR3b1BoYXNlKHBhcmVudEluc3QsIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIHdpdGhvdXQgcmVnYXJkIHRvIGRpcmVjdGlvbiwgZG9lcyBub3QgbG9vayBmb3IgcGhhc2VkXG4gKiByZWdpc3RyYXRpb24gbmFtZXMuIFNhbWUgYXMgYGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlYCBidXQgd2l0aG91dFxuICogcmVxdWlyaW5nIHRoYXQgdGhlIGBkaXNwYXRjaE1hcmtlcmAgYmUgdGhlIHNhbWUgYXMgdGhlIGRpc3BhdGNoZWQgSUQuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXNwYXRjaGVzKGluc3QsIGlnbm9yZWREaXJlY3Rpb24sIGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lO1xuICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGRpc3BhdGNoZXMgb24gYW4gYFN5bnRoZXRpY0V2ZW50YCwgYnV0IG9ubHkgZm9yIHRoZVxuICogYGRpc3BhdGNoTWFya2VyYC5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgYWNjdW11bGF0ZURpc3BhdGNoZXMoZXZlbnQuX3RhcmdldEluc3QsIG51bGwsIGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQoZXZlbnRzKSB7XG4gIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVTa2lwVGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pIHtcbiAgRXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGFjY3VtdWxhdGVEaXNwYXRjaGVzLCBsZWF2ZSwgZW50ZXIpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyhldmVudHMpIHtcbiAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUpO1xufVxuXG4vKipcbiAqIEEgc21hbGwgc2V0IG9mIHByb3BhZ2F0aW9uIHBhdHRlcm5zLCBlYWNoIG9mIHdoaWNoIHdpbGwgYWNjZXB0IGEgc21hbGwgYW1vdW50XG4gKiBvZiBpbmZvcm1hdGlvbiwgYW5kIGdlbmVyYXRlIGEgc2V0IG9mIFwiZGlzcGF0Y2ggcmVhZHkgZXZlbnQgb2JqZWN0c1wiIC0gd2hpY2hcbiAqIGFyZSBzZXRzIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFubm90YXRlZCB3aXRoIGEgc2V0IG9mIGRpc3BhdGNoZWRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9ucy9pZHMuIFRoZSBBUEkgaXMgZGVzaWduZWQgdGhpcyB3YXkgdG8gZGlzY291cmFnZSB0aGVzZVxuICogcHJvcGFnYXRpb24gc3RyYXRlZ2llcyBmcm9tIGFjdHVhbGx5IGV4ZWN1dGluZyB0aGUgZGlzcGF0Y2hlcywgc2luY2Ugd2VcbiAqIGFsd2F5cyB3YW50IHRvIGNvbGxlY3QgdGhlIGVudGlyZSBzZXQgb2YgZGlzcGF0Y2hlcyBiZWZvcmUgZXhlY3V0aW5nIGV2ZW50IGFcbiAqIHNpbmdsZSBvbmUuXG4gKlxuICogQGNvbnN0cnVjdG9yIEV2ZW50UHJvcGFnYXRvcnNcbiAqL1xudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSB7XG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMsXG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCxcbiAgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6IGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzLFxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFByb3BhZ2F0b3JzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9FdmVudFByb3BhZ2F0b3JzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqL1xuXG4vLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBFUzY6IHZhciBSZWFjdEluc3RhbmNlTWFwID0gbmV3IE1hcCgpO1xuXG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHtcbiAgLyoqXG4gICAqIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgYGRlbGV0ZWAgYnV0IHdlJ2QgaGF2ZSB0byBtYWtlIHN1cmUgdG8gYWx3YXlzXG4gICAqIHRyYW5zZm9ybSB0aGVzZSB0byBzdHJpbmdzIGZvciBJRSBzdXBwb3J0LiBXaGVuIHRoaXMgdHJhbnNmb3JtIGlzIGZ1bGx5XG4gICAqIHN1cHBvcnRlZCB3ZSBjYW4gcmVuYW1lIGl0LlxuICAgKi9cbiAgcmVtb3ZlOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlO1xuICB9LFxuXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSAhPT0gdW5kZWZpbmVkO1xuICB9LFxuXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IHZhbHVlO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5zdGFuY2VNYXA7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SW5zdGFuY2VNYXAuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbnZhciBnZXRFdmVudFRhcmdldCA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRUYXJnZXQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFVJRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgVUlFdmVudEludGVyZmFjZSA9IHtcbiAgdmlldzogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnZpZXcpIHtcbiAgICAgIHJldHVybiBldmVudC52aWV3O1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSBnZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgaWYgKHRhcmdldC53aW5kb3cgPT09IHRhcmdldCkge1xuICAgICAgLy8gdGFyZ2V0IGlzIGEgd2luZG93IG9iamVjdFxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIGlmIChkb2MpIHtcbiAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gIH0sXG4gIGRldGFpbDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmRldGFpbCB8fCAwO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljVUlFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNVSUV2ZW50LCBVSUV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNVSUV2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNVSUV2ZW50LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJdGVtIGZyb20gJy4vaXRlbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEl0ZW1MaXN0KHtpdGVtcywgdGl0bGUsIGhlYWRlckV4dHJhcywgaGFuZGxlSXRlbUNsaWNrfSkge1xuICBjb25zdCBlbGVtZW50cyA9IGl0ZW1zLm1hcCgoaXRlbSwgaWR4KSA9PiA8SXRlbSBpdGVtPXtpdGVtfSBrZXk9e2lkeH0gc2VsZWN0TW9kZT17ZmFsc2V9IGhhbmRsZUNsaWNrPXtoYW5kbGVJdGVtQ2xpY2sgfHwgKCgpPT57fSl9IC8+KTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXt0aXRsZS50b0xvd2VyQ2FzZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHt0aXRsZS50b0xvd2VyQ2FzZSgpfS1pbnRyb2AgfT5cbiAgICAgICAgPHNwYW4+e3RpdGxlfTwvc3Bhbj5cbiAgICAgICAge2hlYWRlckV4dHJhcyB8fCAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250ZW50XCI+XG4gICAgICAgIHtlbGVtZW50c31cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbXBvbmVudHMvY29udGVudC9pdGVtLWxpc3QuanN4IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbXB0eU9iamVjdDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2VtcHR5T2JqZWN0LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBvcmRlcmluZyBvZiBldmVudCBwbHVnaW5zLlxuICovXG52YXIgZXZlbnRQbHVnaW5PcmRlciA9IG51bGw7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXZlbnQgcGx1Z2luIG1vZHVsZXMuXG4gKi9cbnZhciBuYW1lc1RvUGx1Z2lucyA9IHt9O1xuXG4vKipcbiAqIFJlY29tcHV0ZXMgdGhlIHBsdWdpbiBsaXN0IHVzaW5nIHRoZSBpbmplY3RlZCBwbHVnaW5zIGFuZCBwbHVnaW4gb3JkZXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKSB7XG4gIGlmICghZXZlbnRQbHVnaW5PcmRlcikge1xuICAgIC8vIFdhaXQgdW50aWwgYW4gYGV2ZW50UGx1Z2luT3JkZXJgIGlzIGluamVjdGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7XG4gICAgdmFyIHBsdWdpbk1vZHVsZSA9IG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIHZhciBwbHVnaW5JbmRleCA9IGV2ZW50UGx1Z2luT3JkZXIuaW5kZXhPZihwbHVnaW5OYW1lKTtcbiAgICAhKHBsdWdpbkluZGV4ID4gLTEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2lucyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgcGx1Z2luIG9yZGVyaW5nLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk2JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgaWYgKEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAhcGx1Z2luTW9kdWxlLmV4dHJhY3RFdmVudHMgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogRXZlbnQgcGx1Z2lucyBtdXN0IGltcGxlbWVudCBhbiBgZXh0cmFjdEV2ZW50c2AgbWV0aG9kLCBidXQgYCVzYCBkb2VzIG5vdC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5NycsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7XG4gICAgdmFyIHB1Ymxpc2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHtcbiAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4ocHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBGYWlsZWQgdG8gcHVibGlzaCBldmVudCBgJXNgIGZvciBwbHVnaW4gYCVzYC4nLCBldmVudE5hbWUsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk4JywgZXZlbnROYW1lLCBwbHVnaW5OYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYW4gZXZlbnQgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGF0Y2hlZCBieSB0aGUgc3VwcGxpZWQgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBEaXNwYXRjaCBjb25maWd1cmF0aW9uIGZvciB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgcHVibGlzaGVkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaEV2ZW50Rm9yUGx1Z2luKGRpc3BhdGNoQ29uZmlnLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSkge1xuICAhIUV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5IdWI6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IG5hbWUsIGAlc2AuJywgZXZlbnROYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5OScsIGV2ZW50TmFtZSkgOiB2b2lkIDA7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW2V2ZW50TmFtZV0gPSBkaXNwYXRjaENvbmZpZztcblxuICB2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMgPSBkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztcbiAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgZm9yICh2YXIgcGhhc2VOYW1lIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICBpZiAocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2VOYW1lKSkge1xuICAgICAgICB2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZSA9IHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlTmFtZV07XG4gICAgICAgIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgcmVnaXN0cmF0aW9uIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IGRpc3BhdGNoZWQgZXZlbnRzIGFuZFxuICogY2FuIGJlIHVzZWQgd2l0aCBgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXJgIHRvIHJlZ2lzdGVyIGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBSZWdpc3RyYXRpb24gbmFtZSB0byBhZGQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7XG4gICEhRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAwJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBwbHVnaW5Nb2R1bGU7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzW2V2ZW50TmFtZV0uZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwbHVnaW5zIHNvIHRoYXQgdGhleSBjYW4gZXh0cmFjdCBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICpcbiAqIEBzZWUge0V2ZW50UGx1Z2luSHVifVxuICovXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHtcbiAgLyoqXG4gICAqIE9yZGVyZWQgbGlzdCBvZiBpbmplY3RlZCBwbHVnaW5zLlxuICAgKi9cbiAgcGx1Z2luczogW10sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBldmVudCBuYW1lIHRvIGRpc3BhdGNoIGNvbmZpZ1xuICAgKi9cbiAgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOiB7fSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIHBsdWdpbiBtb2R1bGVcbiAgICovXG4gIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOiB7fSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAgICovXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAgICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICAgKiBvbmx5IGluIF9fREVWX18uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8ge30gOiBudWxsLFxuICAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gX19ERVZfX1xuXG4gIC8qKlxuICAgKiBJbmplY3RzIGFuIG9yZGVyaW5nIG9mIHBsdWdpbnMgKGJ5IHBsdWdpbiBuYW1lKS4gVGhpcyBhbGxvd3MgdGhlIG9yZGVyaW5nXG4gICAqIHRvIGJlIGRlY291cGxlZCBmcm9tIGluamVjdGlvbiBvZiB0aGUgYWN0dWFsIHBsdWdpbnMgc28gdGhhdCBvcmRlcmluZyBpc1xuICAgKiBhbHdheXMgZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHBhY2thZ2luZywgb24tdGhlLWZseSBpbmplY3Rpb24sIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5PcmRlcn1cbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IGZ1bmN0aW9uIChpbmplY3RlZEV2ZW50UGx1Z2luT3JkZXIpIHtcbiAgICAhIWV2ZW50UGx1Z2luT3JkZXIgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVjdCBldmVudCBwbHVnaW4gb3JkZXJpbmcgbW9yZSB0aGFuIG9uY2UuIFlvdSBhcmUgbGlrZWx5IHRyeWluZyB0byBsb2FkIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMDEnKSA6IHZvaWQgMDtcbiAgICAvLyBDbG9uZSB0aGUgb3JkZXJpbmcgc28gaXQgY2Fubm90IGJlIGR5bmFtaWNhbGx5IG11dGF0ZWQuXG4gICAgZXZlbnRQbHVnaW5PcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcik7XG4gICAgcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKTtcbiAgfSxcblxuICAvKipcbiAgICogSW5qZWN0cyBwbHVnaW5zIHRvIGJlIHVzZWQgYnkgYEV2ZW50UGx1Z2luSHViYC4gVGhlIHBsdWdpbiBuYW1lcyBtdXN0IGJlXG4gICAqIGluIHRoZSBvcmRlcmluZyBpbmplY3RlZCBieSBgaW5qZWN0RXZlbnRQbHVnaW5PcmRlcmAuXG4gICAqXG4gICAqIFBsdWdpbnMgY2FuIGJlIGluamVjdGVkIGFzIHBhcnQgb2YgcGFnZSBpbml0aWFsaXphdGlvbiBvciBvbi10aGUtZmx5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucyBNYXAgZnJvbSBuYW1lcyB0byBwbHVnaW4gbW9kdWxlcy5cbiAgICogQGludGVybmFsXG4gICAqIEBzZWUge0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWV9XG4gICAqL1xuICBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6IGZ1bmN0aW9uIChpbmplY3RlZE5hbWVzVG9QbHVnaW5zKSB7XG4gICAgdmFyIGlzT3JkZXJpbmdEaXJ0eSA9IGZhbHNlO1xuICAgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICAgICAgaWYgKCFpbmplY3RlZE5hbWVzVG9QbHVnaW5zLmhhc093blByb3BlcnR5KHBsdWdpbk5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHBsdWdpbk1vZHVsZSA9IGluamVjdGVkTmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgICBpZiAoIW5hbWVzVG9QbHVnaW5zLmhhc093blByb3BlcnR5KHBsdWdpbk5hbWUpIHx8IG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdICE9PSBwbHVnaW5Nb2R1bGUpIHtcbiAgICAgICAgISFuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IHR3byBkaWZmZXJlbnQgZXZlbnQgcGx1Z2lucyB1c2luZyB0aGUgc2FtZSBuYW1lLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzEwMicsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgICAgICBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgICAgICAgaXNPcmRlcmluZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzT3JkZXJpbmdEaXJ0eSkge1xuICAgICAgcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIExvb2tzIHVwIHRoZSBwbHVnaW4gZm9yIHRoZSBzdXBwbGllZCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEEgc3ludGhldGljIGV2ZW50LlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBUaGUgcGx1Z2luIHRoYXQgY3JlYXRlZCB0aGUgc3VwcGxpZWQgZXZlbnQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UGx1Z2luTW9kdWxlRm9yRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnO1xuICAgIGlmIChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgICByZXR1cm4gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lXSB8fCBudWxsO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcHVsbGluZyBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyBvdXQgb2YgZGlzcGF0Y2hDb25maWcgaGVscHMgRmxvdyBzZWVcbiAgICAgIC8vIHRoYXQgaXQgaXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBmb3IgKHZhciBwaGFzZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgICBpZiAoIXBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlXV07XG4gICAgICAgIGlmIChwbHVnaW5Nb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luTW9kdWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFeHBvc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzZXRFdmVudFBsdWdpbnM6IGZ1bmN0aW9uICgpIHtcbiAgICBldmVudFBsdWdpbk9yZGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7XG4gICAgICBpZiAobmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnMubGVuZ3RoID0gMDtcblxuICAgIHZhciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncztcbiAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzKSB7XG4gICAgICBpZiAoZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxlcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7XG4gICAgZm9yICh2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiByZWdpc3RyYXRpb25OYW1lTW9kdWxlcykge1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGRlbGV0ZSByZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG4gICAgICBmb3IgKHZhciBsb3dlckNhc2VkTmFtZSBpbiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICAgIGlmIChwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblJlZ2lzdHJ5LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IHJlcXVpcmUoJy4vUmVhY3RFdmVudEVtaXR0ZXJNaXhpbicpO1xudmFyIFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNzJyk7XG5cbnZhciBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSA9IHJlcXVpcmUoJy4vZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG5cbi8qKlxuICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBldmVudCBoYW5kbGluZzpcbiAqXG4gKiAgLSBUb3AtbGV2ZWwgZGVsZWdhdGlvbiBpcyB1c2VkIHRvIHRyYXAgbW9zdCBuYXRpdmUgYnJvd3NlciBldmVudHMuIFRoaXNcbiAqICAgIG1heSBvbmx5IG9jY3VyIGluIHRoZSBtYWluIHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mXG4gKiAgICBSZWFjdEV2ZW50TGlzdGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFuZCBjYW4gdGhlcmVmb3JlIHN1cHBvcnQgcGx1Z2dhYmxlXG4gKiAgICBldmVudCBzb3VyY2VzLiBUaGlzIGlzIHRoZSBvbmx5IHdvcmsgdGhhdCBvY2N1cnMgaW4gdGhlIG1haW4gdGhyZWFkLlxuICpcbiAqICAtIFdlIG5vcm1hbGl6ZSBhbmQgZGUtZHVwbGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZvciBicm93c2VyIHF1aXJrcy4gVGhpc1xuICogICAgbWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKlxuICogIC0gRm9yd2FyZCB0aGVzZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBhc3NvY2lhdGVkIHRvcC1sZXZlbCB0eXBlIHVzZWQgdG9cbiAqICAgIHRyYXAgaXQpIHRvIGBFdmVudFBsdWdpbkh1YmAsIHdoaWNoIGluIHR1cm4gd2lsbCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnRcbiAqICAgIHRvIGV4dHJhY3QgYW55IHN5bnRoZXRpYyBldmVudHMuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgd2lsbCB0aGVuIHByb2Nlc3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5nIHRoZW0gd2l0aFxuICogICAgXCJkaXNwYXRjaGVzXCIsIGEgc2VxdWVuY2Ugb2YgbGlzdGVuZXJzIGFuZCBJRHMgdGhhdCBjYXJlIGFib3V0IHRoYXQgZXZlbnQuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgdGhlbiBkaXNwYXRjaGVzIHRoZSBldmVudHMuXG4gKlxuICogT3ZlcnZpZXcgb2YgUmVhY3QgYW5kIHRoZSBldmVudCBzeXN0ZW06XG4gKlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCAgICBET00gICAgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogICAgICAgfCAgICAgICAgICAgLlxuICogICAgICAgdiAgICAgICAgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCBSZWFjdEV2ZW50IHwgICAgLlxuICogfCAgTGlzdGVuZXIgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgKy0tLS0tLS0tK3xTaW1wbGVFdmVudHxcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICB8ICAgICAgICAgfFBsdWdpbiAgICAgfFxuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgIHYgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnxFdmVudFBsdWdpbkh1YnwgICAgICAgICAgICAgICAgICAgIHwgICAgRXZlbnQgICB8XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgUHJvcGFnYXRvcnN8XG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgIHxUYXBFdmVudCAgIHwgIHwtLS0tLS0tLS0tLS18XG4gKiB8ICBFbWl0dGVyICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHw8LS0tK3xQbHVnaW4gICAgIHwgIHxvdGhlciBwbHVnaW58XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgIHV0aWxpdGllcyB8XG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLStcbiAqICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICAgXiAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgICB8ICAgICAgICB8RW50ZXIvTGVhdmV8XG4gKiAgICAgICArICAgICAgICAgICAuICAgICAgICAgICAgICAgICstLS0tLS0tK3xQbHVnaW4gICAgIHxcbiAqICstLS0tLS0tLS0tLS0tKyAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogfCBhcHBsaWNhdGlvbiB8ICAgLlxuICogfC0tLS0tLS0tLS0tLS18ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogKy0tLS0tLS0tLS0tLS0rICAgLlxuICogICAgICAgICAgICAgICAgICAgLlxuICogICAgUmVhY3QgQ29yZSAgICAgLiAgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IFBsdWdpbiBTeXN0ZW1cbiAqL1xuXG52YXIgaGFzRXZlbnRQYWdlWFk7XG52YXIgYWxyZWFkeUxpc3RlbmluZ1RvID0ge307XG52YXIgaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUgPSBmYWxzZTtcbnZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIgPSAwO1xuXG4vLyBGb3IgZXZlbnRzIGxpa2UgJ3N1Ym1pdCcgd2hpY2ggZG9uJ3QgY29uc2lzdGVudGx5IGJ1YmJsZSAod2hpY2ggd2UgdHJhcCBhdCBhXG4vLyBsb3dlciBub2RlIHRoYW4gYGRvY3VtZW50YCksIGJpbmRpbmcgYXQgYGRvY3VtZW50YCB3b3VsZCBjYXVzZSBkdXBsaWNhdGVcbi8vIGV2ZW50cyBzbyB3ZSBkb24ndCBpbmNsdWRlIHRoZW0gaGVyZVxudmFyIHRvcEV2ZW50TWFwcGluZyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcEFuaW1hdGlvbkVuZDogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpIHx8ICdhbmltYXRpb25lbmQnLFxuICB0b3BBbmltYXRpb25JdGVyYXRpb246IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKSB8fCAnYW5pbWF0aW9uaXRlcmF0aW9uJyxcbiAgdG9wQW5pbWF0aW9uU3RhcnQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpIHx8ICdhbmltYXRpb25zdGFydCcsXG4gIHRvcEJsdXI6ICdibHVyJyxcbiAgdG9wQ2FuUGxheTogJ2NhbnBsYXknLFxuICB0b3BDYW5QbGF5VGhyb3VnaDogJ2NhbnBsYXl0aHJvdWdoJyxcbiAgdG9wQ2hhbmdlOiAnY2hhbmdlJyxcbiAgdG9wQ2xpY2s6ICdjbGljaycsXG4gIHRvcENvbXBvc2l0aW9uRW5kOiAnY29tcG9zaXRpb25lbmQnLFxuICB0b3BDb21wb3NpdGlvblN0YXJ0OiAnY29tcG9zaXRpb25zdGFydCcsXG4gIHRvcENvbXBvc2l0aW9uVXBkYXRlOiAnY29tcG9zaXRpb251cGRhdGUnLFxuICB0b3BDb250ZXh0TWVudTogJ2NvbnRleHRtZW51JyxcbiAgdG9wQ29weTogJ2NvcHknLFxuICB0b3BDdXQ6ICdjdXQnLFxuICB0b3BEb3VibGVDbGljazogJ2RibGNsaWNrJyxcbiAgdG9wRHJhZzogJ2RyYWcnLFxuICB0b3BEcmFnRW5kOiAnZHJhZ2VuZCcsXG4gIHRvcERyYWdFbnRlcjogJ2RyYWdlbnRlcicsXG4gIHRvcERyYWdFeGl0OiAnZHJhZ2V4aXQnLFxuICB0b3BEcmFnTGVhdmU6ICdkcmFnbGVhdmUnLFxuICB0b3BEcmFnT3ZlcjogJ2RyYWdvdmVyJyxcbiAgdG9wRHJhZ1N0YXJ0OiAnZHJhZ3N0YXJ0JyxcbiAgdG9wRHJvcDogJ2Ryb3AnLFxuICB0b3BEdXJhdGlvbkNoYW5nZTogJ2R1cmF0aW9uY2hhbmdlJyxcbiAgdG9wRW1wdGllZDogJ2VtcHRpZWQnLFxuICB0b3BFbmNyeXB0ZWQ6ICdlbmNyeXB0ZWQnLFxuICB0b3BFbmRlZDogJ2VuZGVkJyxcbiAgdG9wRXJyb3I6ICdlcnJvcicsXG4gIHRvcEZvY3VzOiAnZm9jdXMnLFxuICB0b3BJbnB1dDogJ2lucHV0JyxcbiAgdG9wS2V5RG93bjogJ2tleWRvd24nLFxuICB0b3BLZXlQcmVzczogJ2tleXByZXNzJyxcbiAgdG9wS2V5VXA6ICdrZXl1cCcsXG4gIHRvcExvYWRlZERhdGE6ICdsb2FkZWRkYXRhJyxcbiAgdG9wTG9hZGVkTWV0YWRhdGE6ICdsb2FkZWRtZXRhZGF0YScsXG4gIHRvcExvYWRTdGFydDogJ2xvYWRzdGFydCcsXG4gIHRvcE1vdXNlRG93bjogJ21vdXNlZG93bicsXG4gIHRvcE1vdXNlTW92ZTogJ21vdXNlbW92ZScsXG4gIHRvcE1vdXNlT3V0OiAnbW91c2VvdXQnLFxuICB0b3BNb3VzZU92ZXI6ICdtb3VzZW92ZXInLFxuICB0b3BNb3VzZVVwOiAnbW91c2V1cCcsXG4gIHRvcFBhc3RlOiAncGFzdGUnLFxuICB0b3BQYXVzZTogJ3BhdXNlJyxcbiAgdG9wUGxheTogJ3BsYXknLFxuICB0b3BQbGF5aW5nOiAncGxheWluZycsXG4gIHRvcFByb2dyZXNzOiAncHJvZ3Jlc3MnLFxuICB0b3BSYXRlQ2hhbmdlOiAncmF0ZWNoYW5nZScsXG4gIHRvcFNjcm9sbDogJ3Njcm9sbCcsXG4gIHRvcFNlZWtlZDogJ3NlZWtlZCcsXG4gIHRvcFNlZWtpbmc6ICdzZWVraW5nJyxcbiAgdG9wU2VsZWN0aW9uQ2hhbmdlOiAnc2VsZWN0aW9uY2hhbmdlJyxcbiAgdG9wU3RhbGxlZDogJ3N0YWxsZWQnLFxuICB0b3BTdXNwZW5kOiAnc3VzcGVuZCcsXG4gIHRvcFRleHRJbnB1dDogJ3RleHRJbnB1dCcsXG4gIHRvcFRpbWVVcGRhdGU6ICd0aW1ldXBkYXRlJyxcbiAgdG9wVG91Y2hDYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gIHRvcFRvdWNoRW5kOiAndG91Y2hlbmQnLFxuICB0b3BUb3VjaE1vdmU6ICd0b3VjaG1vdmUnLFxuICB0b3BUb3VjaFN0YXJ0OiAndG91Y2hzdGFydCcsXG4gIHRvcFRyYW5zaXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJykgfHwgJ3RyYW5zaXRpb25lbmQnLFxuICB0b3BWb2x1bWVDaGFuZ2U6ICd2b2x1bWVjaGFuZ2UnLFxuICB0b3BXYWl0aW5nOiAnd2FpdGluZycsXG4gIHRvcFdoZWVsOiAnd2hlZWwnXG59O1xuXG4vKipcbiAqIFRvIGVuc3VyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBwb3RlbnRpYWwgUmVhY3QgaW5zdGFuY2VzIG9uIHRoZSBwYWdlXG4gKi9cbnZhciB0b3BMaXN0ZW5lcnNJREtleSA9ICdfcmVhY3RMaXN0ZW5lcnNJRCcgKyBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMik7XG5cbmZ1bmN0aW9uIGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpIHtcbiAgLy8gSW4gSUU4LCBgbW91bnRBdGAgaXMgYSBob3N0IG9iamVjdCBhbmQgZG9lc24ndCBoYXZlIGBoYXNPd25Qcm9wZXJ0eWBcbiAgLy8gZGlyZWN0bHkuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vdW50QXQsIHRvcExpc3RlbmVyc0lES2V5KSkge1xuICAgIG1vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldID0gcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyKys7XG4gICAgYWxyZWFkeUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldXSA9IHt9O1xuICB9XG4gIHJldHVybiBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dO1xufVxuXG4vKipcbiAqIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGlzIHVzZWQgdG8gYXR0YWNoIHRvcC1sZXZlbCBldmVudCBsaXN0ZW5lcnMuIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiAgIEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKCdteUlEJywgJ29uQ2xpY2snLCBteUZ1bmN0aW9uKTtcbiAqXG4gKiBUaGlzIHdvdWxkIGFsbG9jYXRlIGEgXCJyZWdpc3RyYXRpb25cIiBvZiBgKCdvbkNsaWNrJywgbXlGdW5jdGlvbilgIG9uICdteUlEJy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IF9hc3NpZ24oe30sIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4sIHtcbiAgLyoqXG4gICAqIEluamVjdGFibGUgZXZlbnQgYmFja2VuZFxuICAgKi9cbiAgUmVhY3RFdmVudExpc3RlbmVyOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBSZWFjdEV2ZW50TGlzdGVuZXJcbiAgICAgKi9cbiAgICBpbmplY3RSZWFjdEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChSZWFjdEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5zZXRIYW5kbGVUb3BMZXZlbChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaGFuZGxlVG9wTGV2ZWwpO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lciA9IFJlYWN0RXZlbnRMaXN0ZW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciBvciBub3QgYW55IGNyZWF0ZWQgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgVHJ1ZSBpZiBjYWxsYmFja3Mgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAqL1xuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIGlmIChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyKSB7XG4gICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGNhbGxiYWNrcyBhcmUgZW5hYmxlZC5cbiAgICovXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIShSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyICYmIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXZSBsaXN0ZW4gZm9yIGJ1YmJsZWQgdG91Y2ggZXZlbnRzIG9uIHRoZSBkb2N1bWVudCBvYmplY3QuXG4gICAqXG4gICAqIEZpcmVmb3ggdjguMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGV4aGliaXRlZCBzdHJhbmdlIGJlaGF2aW9yIHdoZW5cbiAgICogbW91bnRpbmcgYG9ubW91c2Vtb3ZlYCBldmVudHMgYXQgc29tZSBub2RlIHRoYXQgd2FzIG5vdCB0aGUgZG9jdW1lbnRcbiAgICogZWxlbWVudC4gVGhlIHN5bXB0b21zIHdlcmUgdGhhdCBpZiB5b3VyIG1vdXNlIGlzIG5vdCBtb3Zpbmcgb3ZlciBzb21ldGhpbmdcbiAgICogY29udGFpbmVkIHdpdGhpbiB0aGF0IG1vdW50IHBvaW50IChmb3IgZXhhbXBsZSBvbiB0aGUgYmFja2dyb3VuZCkgdGhlXG4gICAqIHRvcC1sZXZlbCBsaXN0ZW5lcnMgZm9yIGBvbm1vdXNlbW92ZWAgd29uJ3QgYmUgY2FsbGVkLiBIb3dldmVyLCBpZiB5b3VcbiAgICogcmVnaXN0ZXIgdGhlIGBtb3VzZW1vdmVgIG9uIHRoZSBkb2N1bWVudCBvYmplY3QsIHRoZW4gaXQgd2lsbCBvZiBjb3Vyc2VcbiAgICogY2F0Y2ggYWxsIGBtb3VzZW1vdmVgcy4gVGhpcyBhbG9uZyB3aXRoIGlPUyBxdWlya3MsIGp1c3RpZmllcyByZXN0cmljdGluZ1xuICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIHRvIHRoZSBkb2N1bWVudCBvYmplY3Qgb25seSwgYXQgbGVhc3QgZm9yIHRoZXNlXG4gICAqIG1vdmVtZW50IHR5cGVzIG9mIGV2ZW50cyBhbmQgcG9zc2libHkgYWxsIGV2ZW50cy5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAgKlxuICAgKiBBbHNvLCBga2V5dXBgL2BrZXlwcmVzc2AvYGtleWRvd25gIGRvIG5vdCBidWJibGUgdG8gdGhlIHdpbmRvdyBvbiBJRSwgYnV0XG4gICAqIHRoZXkgYnViYmxlIHRvIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZW50RG9jdW1lbnRIYW5kbGUgRG9jdW1lbnQgd2hpY2ggb3ducyB0aGUgY29udGFpbmVyXG4gICAqL1xuICBsaXN0ZW5UbzogZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGNvbnRlbnREb2N1bWVudEhhbmRsZSkge1xuICAgIHZhciBtb3VudEF0ID0gY29udGVudERvY3VtZW50SGFuZGxlO1xuICAgIHZhciBpc0xpc3RlbmluZyA9IGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpO1xuICAgIHZhciBkZXBlbmRlbmNpZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07XG4gICAgICBpZiAoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSAmJiBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSkpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BXaGVlbCcpIHtcbiAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnd2hlZWwnKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICd3aGVlbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnbW91c2V3aGVlbCcpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ21vdXNld2hlZWwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBuZWVkcyB0byBjYXB0dXJlIGEgZGlmZmVyZW50IG1vdXNlIHNjcm9sbCBldmVudC5cbiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9kb20vZXZlbnRzL3Rlc3RzL3Njcm9sbC5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BTY3JvbGwnKSB7XG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BGb2N1cycgfHwgZGVwZW5kZW5jeSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzJywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzJywgbW91bnRBdCk7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BCbHVyJywgJ2JsdXInLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzaW4nKSkge1xuICAgICAgICAgICAgLy8gSUUgaGFzIGBmb2N1c2luYCBhbmQgYGZvY3Vzb3V0YCBldmVudHMgd2hpY2ggYnViYmxlLlxuICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAwOC8wNC9kZWxlZ2F0aW5nX3RoZS5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzaW4nLCBtb3VudEF0KTtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wQmx1cicsICdmb2N1c291dCcsIG1vdW50QXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBibHVyIGFuZCBmb2N1cyBldmVudCBsaXN0ZW5lcnMgYXJlIG9ubHkgYXR0YWNoZWQgb25jZVxuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEJsdXIgPSB0cnVlO1xuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3BFdmVudE1hcHBpbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZGVwZW5kZW5jeSwgdG9wRXZlbnRNYXBwaW5nW2RlcGVuZGVuY3ldLCBtb3VudEF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJhcEJ1YmJsZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpIHtcbiAgICByZXR1cm4gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkge1xuICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQcm90ZWN0IGFnYWluc3QgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKSByZXR1cm5pbmcgbnVsbFxuICAgKiBTb21lIHBvcHVwIGJsb2NrZXIgZXh0ZW5zaW9ucyBhcHBlYXIgdG8gZG8gdGhpczpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82ODg3XG4gICAqL1xuICBzdXBwb3J0c0V2ZW50UGFnZVhZOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZXYgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIHJldHVybiBldiAhPSBudWxsICYmICdwYWdlWCcgaW4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3RlbnMgdG8gd2luZG93IHNjcm9sbCBhbmQgcmVzaXplIGV2ZW50cy4gV2UgY2FjaGUgc2Nyb2xsIHZhbHVlcyBzbyB0aGF0XG4gICAqIGFwcGxpY2F0aW9uIGNvZGUgY2FuIGFjY2VzcyB0aGVtIHdpdGhvdXQgdHJpZ2dlcmluZyByZWZsb3dzLlxuICAgKlxuICAgKiBWaWV3cG9ydE1ldHJpY3MgaXMgb25seSB1c2VkIGJ5IFN5bnRoZXRpY01vdXNlL1RvdWNoRXZlbnQgYW5kIG9ubHkgd2hlblxuICAgKiBwYWdlWC9wYWdlWSBpc24ndCBzdXBwb3J0ZWQgKGxlZ2FjeSBicm93c2VycykuXG4gICAqXG4gICAqIE5PVEU6IFNjcm9sbCBldmVudHMgZG8gbm90IGJ1YmJsZS5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2RvbS9ldmVudHMvc2Nyb2xsLmh0bWxcbiAgICovXG4gIGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzogZnVuY3Rpb24gKCkge1xuICAgIGlmIChoYXNFdmVudFBhZ2VYWSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNFdmVudFBhZ2VYWSA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zdXBwb3J0c0V2ZW50UGFnZVhZKCk7XG4gICAgfVxuICAgIGlmICghaGFzRXZlbnRQYWdlWFkgJiYgIWlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlKSB7XG4gICAgICB2YXIgcmVmcmVzaCA9IFZpZXdwb3J0TWV0cmljcy5yZWZyZXNoU2Nyb2xsVmFsdWVzO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUocmVmcmVzaCk7XG4gICAgICBpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG52YXIgVmlld3BvcnRNZXRyaWNzID0gcmVxdWlyZSgnLi9WaWV3cG9ydE1ldHJpY3MnKTtcblxudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHNjcmVlblg6IG51bGwsXG4gIHNjcmVlblk6IG51bGwsXG4gIGNsaWVudFg6IG51bGwsXG4gIGNsaWVudFk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBXZWJraXQsIEZpcmVmb3gsIElFOStcbiAgICAvLyB3aGljaDogIDEgMiAzXG4gICAgLy8gYnV0dG9uOiAwIDEgMiAoc3RhbmRhcmQpXG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcbiAgICBpZiAoJ3doaWNoJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG4gICAgLy8gSUU8OVxuICAgIC8vIHdoaWNoOiAgdW5kZWZpbmVkXG4gICAgLy8gYnV0dG9uOiAwIDAgMFxuICAgIC8vIGJ1dHRvbjogMSA0IDIgKG9ubW91c2V1cClcbiAgICByZXR1cm4gYnV0dG9uID09PSAyID8gMiA6IGJ1dHRvbiA9PT0gNCA/IDEgOiAwO1xuICB9LFxuICBidXR0b25zOiBudWxsLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudCk7XG4gIH0sXG4gIC8vIFwiUHJvcHJpZXRhcnlcIiBJbnRlcmZhY2UuXG4gIHBhZ2VYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ3BhZ2VYJyBpbiBldmVudCA/IGV2ZW50LnBhZ2VYIDogZXZlbnQuY2xpZW50WCArIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsTGVmdDtcbiAgfSxcbiAgcGFnZVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAncGFnZVknIGluIGV2ZW50ID8gZXZlbnQucGFnZVkgOiBldmVudC5jbGllbnRZICsgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxUb3A7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY01vdXNlRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY01vdXNlRXZlbnQsIE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY01vdXNlRXZlbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIE9CU0VSVkVEX0VSUk9SID0ge307XG5cbi8qKlxuICogYFRyYW5zYWN0aW9uYCBjcmVhdGVzIGEgYmxhY2sgYm94IHRoYXQgaXMgYWJsZSB0byB3cmFwIGFueSBtZXRob2Qgc3VjaCB0aGF0XG4gKiBjZXJ0YWluIGludmFyaWFudHMgYXJlIG1haW50YWluZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWV0aG9kIGlzIGludm9rZWRcbiAqIChFdmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgaW52b2tpbmcgdGhlIHdyYXBwZWQgbWV0aG9kKS4gV2hvZXZlclxuICogaW5zdGFudGlhdGVzIGEgdHJhbnNhY3Rpb24gY2FuIHByb3ZpZGUgZW5mb3JjZXJzIG9mIHRoZSBpbnZhcmlhbnRzIGF0XG4gKiBjcmVhdGlvbiB0aW1lLiBUaGUgYFRyYW5zYWN0aW9uYCBjbGFzcyBpdHNlbGYgd2lsbCBzdXBwbHkgb25lIGFkZGl0aW9uYWxcbiAqIGF1dG9tYXRpYyBpbnZhcmlhbnQgZm9yIHlvdSAtIHRoZSBpbnZhcmlhbnQgdGhhdCBhbnkgdHJhbnNhY3Rpb24gaW5zdGFuY2VcbiAqIHNob3VsZCBub3QgYmUgcnVuIHdoaWxlIGl0IGlzIGFscmVhZHkgYmVpbmcgcnVuLiBZb3Ugd291bGQgdHlwaWNhbGx5IGNyZWF0ZSBhXG4gKiBzaW5nbGUgaW5zdGFuY2Ugb2YgYSBgVHJhbnNhY3Rpb25gIGZvciByZXVzZSBtdWx0aXBsZSB0aW1lcywgdGhhdCBwb3RlbnRpYWxseVxuICogaXMgdXNlZCB0byB3cmFwIHNldmVyYWwgZGlmZmVyZW50IG1ldGhvZHMuIFdyYXBwZXJzIGFyZSBleHRyZW1lbHkgc2ltcGxlIC1cbiAqIHRoZXkgb25seSByZXF1aXJlIGltcGxlbWVudGluZyB0d28gbWV0aG9kcy5cbiAqXG4gKiA8cHJlPlxuICogICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJzIChpbmplY3RlZCBhdCBjcmVhdGlvbiB0aW1lKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICAgICAgICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tK1xuICogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHYgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICB8ICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgICstLXwgICAgd3JhcHBlcjEgICB8LS0tfC0tLS0rICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICArLS0tLS0tLS0tLS0tLS0tKyAgIHYgICAgfCAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICArLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICstLS0tfCAgIHdyYXBwZXIyICB8LS0tLS0tLS0rICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgfCAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHYgICAgIHYgICAgICAgICAgICAgICAgICAgICB2ICAgICB2ICAgfCB3cmFwcGVyXG4gKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfCBpbnZhcmlhbnRzXG4gKiBwZXJmb3JtKGFueU1ldGhvZCkgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfCBtYWludGFpbmVkXG4gKiArLS0tLS0tLS0tLS0tLS0tLS0+fC18LS0tfC18LS0tfC0tPnxhbnlNZXRob2R8LS0tfC0tLXwtfC0tLXwtfC0tLS0tLS0tPlxuICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHxcbiAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfFxuICogICAgICAgICAgICAgICAgICAgIHwgKy0tLSsgKy0tLSsgICArLS0tLS0tLS0tKyAgICstLS0rICstLS0rIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICBpbml0aWFsaXplICAgICAgICAgICAgICAgICAgICBjbG9zZSAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICogPC9wcmU+XG4gKlxuICogVXNlIGNhc2VzOlxuICogLSBQcmVzZXJ2aW5nIHRoZSBpbnB1dCBzZWxlY3Rpb24gcmFuZ2VzIGJlZm9yZS9hZnRlciByZWNvbmNpbGlhdGlvbi5cbiAqICAgUmVzdG9yaW5nIHNlbGVjdGlvbiBldmVuIGluIHRoZSBldmVudCBvZiBhbiB1bmV4cGVjdGVkIGVycm9yLlxuICogLSBEZWFjdGl2YXRpbmcgZXZlbnRzIHdoaWxlIHJlYXJyYW5naW5nIHRoZSBET00sIHByZXZlbnRpbmcgYmx1cnMvZm9jdXNlcyxcbiAqICAgd2hpbGUgZ3VhcmFudGVlaW5nIHRoYXQgYWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHN5c3RlbSBpcyByZWFjdGl2YXRlZC5cbiAqIC0gRmx1c2hpbmcgYSBxdWV1ZSBvZiBjb2xsZWN0ZWQgRE9NIG11dGF0aW9ucyB0byB0aGUgbWFpbiBVSSB0aHJlYWQgYWZ0ZXIgYVxuICogICByZWNvbmNpbGlhdGlvbiB0YWtlcyBwbGFjZSBpbiBhIHdvcmtlciB0aHJlYWQuXG4gKiAtIEludm9raW5nIGFueSBjb2xsZWN0ZWQgYGNvbXBvbmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGFmdGVyIHJlbmRlcmluZyBuZXdcbiAqICAgY29udGVudC5cbiAqIC0gKEZ1dHVyZSB1c2UgY2FzZSk6IFdyYXBwaW5nIHBhcnRpY3VsYXIgZmx1c2hlcyBvZiB0aGUgYFJlYWN0V29ya2VyYCBxdWV1ZVxuICogICB0byBwcmVzZXJ2ZSB0aGUgYHNjcm9sbFRvcGAgKGFuIGF1dG9tYXRpYyBzY3JvbGwgYXdhcmUgRE9NKS5cbiAqIC0gKEZ1dHVyZSB1c2UgY2FzZSk6IExheW91dCBjYWxjdWxhdGlvbnMgYmVmb3JlIGFuZCBhZnRlciBET00gdXBkYXRlcy5cbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHBsdWdpbiBBUEk6XG4gKiAtIEEgbW9kdWxlIHRoYXQgaGFzIGFuIGBpbml0aWFsaXplYCBtZXRob2QgdGhhdCByZXR1cm5zIGFueSBwcmVjb21wdXRhdGlvbi5cbiAqIC0gYW5kIGEgYGNsb3NlYCBtZXRob2QgdGhhdCBhY2NlcHRzIHRoZSBwcmVjb21wdXRhdGlvbi4gYGNsb3NlYCBpcyBpbnZva2VkXG4gKiAgIHdoZW4gdGhlIHdyYXBwZWQgcHJvY2VzcyBpcyBjb21wbGV0ZWQsIG9yIGhhcyBmYWlsZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxUcmFuc2FjdGlvbmFsV3JhcHBlcj59IHRyYW5zYWN0aW9uV3JhcHBlciBXcmFwcGVyIG1vZHVsZXNcbiAqIHRoYXQgaW1wbGVtZW50IGBpbml0aWFsaXplYCBhbmQgYGNsb3NlYC5cbiAqIEByZXR1cm4ge1RyYW5zYWN0aW9ufSBTaW5nbGUgdHJhbnNhY3Rpb24gZm9yIHJldXNlIGluIHRocmVhZC5cbiAqXG4gKiBAY2xhc3MgVHJhbnNhY3Rpb25cbiAqL1xudmFyIFRyYW5zYWN0aW9uSW1wbCA9IHtcbiAgLyoqXG4gICAqIFNldHMgdXAgdGhpcyBpbnN0YW5jZSBzbyB0aGF0IGl0IGlzIHByZXBhcmVkIGZvciBjb2xsZWN0aW5nIG1ldHJpY3MuIERvZXNcbiAgICogc28gc3VjaCB0aGF0IHRoaXMgc2V0dXAgbWV0aG9kIG1heSBiZSB1c2VkIG9uIGFuIGluc3RhbmNlIHRoYXQgaXMgYWxyZWFkeVxuICAgKiBpbml0aWFsaXplZCwgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBjb25zdW1lIGFkZGl0aW9uYWwgbWVtb3J5IHVwb24gcmV1c2UuXG4gICAqIFRoYXQgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgZGVjaWRlIHRvIG1ha2UgeW91ciBzdWJjbGFzcyBvZiB0aGlzIG1peGluIGFcbiAgICogXCJQb29sZWRDbGFzc1wiLlxuICAgKi9cbiAgcmVpbml0aWFsaXplVHJhbnNhY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKTtcbiAgICBpZiAodGhpcy53cmFwcGVySW5pdERhdGEpIHtcbiAgICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud3JhcHBlckluaXREYXRhID0gW107XG4gICAgfVxuICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9LFxuXG4gIF9pc0luVHJhbnNhY3Rpb246IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybiB7QXJyYXk8VHJhbnNhY3Rpb25XcmFwcGVyPn0gQXJyYXkgb2YgdHJhbnNhY3Rpb24gd3JhcHBlcnMuXG4gICAqL1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBudWxsLFxuXG4gIGlzSW5UcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2lzSW5UcmFuc2FjdGlvbjtcbiAgfSxcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS1iZWZvcmUtZnVuY3Rpb24tcGFyZW4gKi9cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIHdpdGhpbiBhIHNhZmV0eSB3aW5kb3cuIFVzZSB0aGlzIGZvciB0aGUgdG9wIGxldmVsXG4gICAqIG1ldGhvZHMgdGhhdCByZXN1bHQgaW4gbGFyZ2UgYW1vdW50cyBvZiBjb21wdXRhdGlvbi9tdXRhdGlvbnMgdGhhdCB3b3VsZFxuICAgKiBuZWVkIHRvIGJlIHNhZmV0eSBjaGVja2VkLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGhlbHBzIHByZXZlbnQgdGhlIG5lZWRcbiAgICogdG8gYmluZCBpbiBtYW55IGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWVtYmVyIG9mIHNjb3BlIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBTY29wZSB0byBpbnZva2UgZnJvbS5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gYSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGIgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBjIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gZCBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGUgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBmIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICpcbiAgICogQHJldHVybiB7Kn0gUmV0dXJuIHZhbHVlIGZyb20gYG1ldGhvZGAuXG4gICAqL1xuICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgIC8qIGVzbGludC1lbmFibGUgc3BhY2UtYmVmb3JlLWZ1bmN0aW9uLXBhcmVuICovXG4gICAgISF0aGlzLmlzSW5UcmFuc2FjdGlvbigpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyYW5zYWN0aW9uLnBlcmZvcm0oLi4uKTogQ2Fubm90IGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbiB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYW4gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uJykgOiBfcHJvZEludmFyaWFudCgnMjcnKSA6IHZvaWQgMDtcbiAgICB2YXIgZXJyb3JUaHJvd247XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGhcbiAgICAgIC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxpbmdcbiAgICAgIC8vIGNsb3NlIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIHRydWUgaW4gdGhlIGZpbmFsbHkgYmxvY2ssIGl0IG1lYW5zXG4gICAgICAvLyBvbmUgb2YgdGhlc2UgY2FsbHMgdGhyZXcuXG4gICAgICBlcnJvclRocm93biA9IHRydWU7XG4gICAgICB0aGlzLmluaXRpYWxpemVBbGwoMCk7XG4gICAgICByZXQgPSBtZXRob2QuY2FsbChzY29wZSwgYSwgYiwgYywgZCwgZSwgZik7XG4gICAgICBlcnJvclRocm93biA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAvLyBJZiBgbWV0aG9kYCB0aHJvd3MsIHByZWZlciB0byBzaG93IHRoYXQgc3RhY2sgdHJhY2Ugb3ZlciBhbnkgdGhyb3duXG4gICAgICAgICAgLy8gYnkgaW52b2tpbmcgYGNsb3NlQWxsYC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2luY2UgYG1ldGhvZGAgZGlkbid0IHRocm93LCB3ZSBkb24ndCB3YW50IHRvIHNpbGVuY2UgdGhlIGV4Y2VwdGlvblxuICAgICAgICAgIC8vIGhlcmUuXG4gICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZUFsbDogZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgdHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycztcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRyYW5zYWN0aW9uV3JhcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3cmFwcGVyID0gdHJhbnNhY3Rpb25XcmFwcGVyc1tpXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGggdGhlXG4gICAgICAgIC8vIE9CU0VSVkVEX0VSUk9SIHN0YXRlIGJlZm9yZSBvdmVyd3JpdGluZyBpdCB3aXRoIHRoZSByZWFsIHJldHVybiB2YWx1ZVxuICAgICAgICAvLyBvZiBpbml0aWFsaXplIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIE9CU0VSVkVEX0VSUk9SIGluIHRoZSBmaW5hbGx5XG4gICAgICAgIC8vIGJsb2NrLCBpdCBtZWFucyB3cmFwcGVyLmluaXRpYWxpemUgdGhyZXcuXG4gICAgICAgIHRoaXMud3JhcHBlckluaXREYXRhW2ldID0gT0JTRVJWRURfRVJST1I7XG4gICAgICAgIHRoaXMud3JhcHBlckluaXREYXRhW2ldID0gd3JhcHBlci5pbml0aWFsaXplID8gd3JhcHBlci5pbml0aWFsaXplLmNhbGwodGhpcykgOiBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRoaXMud3JhcHBlckluaXREYXRhW2ldID09PSBPQlNFUlZFRF9FUlJPUikge1xuICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXplciBmb3Igd3JhcHBlciBpIHRocmV3IGFuIGVycm9yOyBpbml0aWFsaXplIHRoZVxuICAgICAgICAgIC8vIHJlbWFpbmluZyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRoZW0gdG8gZW5zdXJlXG4gICAgICAgICAgLy8gdGhhdCB0aGUgZmlyc3QgZXJyb3IgaXMgdGhlIG9uZSB0byBidWJibGUgdXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFsbChpICsgMSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGVhY2ggb2YgYHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycy5jbG9zZVtpXWAgZnVuY3Rpb25zLCBwYXNzaW5nIGludG9cbiAgICogdGhlbSB0aGUgcmVzcGVjdGl2ZSByZXR1cm4gdmFsdWVzIG9mIGB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMuaW5pdFtpXWBcbiAgICogKGBjbG9zZWBycyB0aGF0IGNvcnJlc3BvbmQgdG8gaW5pdGlhbGl6ZXJzIHRoYXQgZmFpbGVkIHdpbGwgbm90IGJlXG4gICAqIGludm9rZWQpLlxuICAgKi9cbiAgY2xvc2VBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7XG4gICAgIXRoaXMuaXNJblRyYW5zYWN0aW9uKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJhbnNhY3Rpb24uY2xvc2VBbGwoKTogQ2Fubm90IGNsb3NlIHRyYW5zYWN0aW9uIHdoZW4gbm9uZSBhcmUgb3Blbi4nKSA6IF9wcm9kSW52YXJpYW50KCcyOCcpIDogdm9pZCAwO1xuICAgIHZhciB0cmFuc2FjdGlvbldyYXBwZXJzID0gdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdyYXBwZXIgPSB0cmFuc2FjdGlvbldyYXBwZXJzW2ldO1xuICAgICAgdmFyIGluaXREYXRhID0gdGhpcy53cmFwcGVySW5pdERhdGFbaV07XG4gICAgICB2YXIgZXJyb3JUaHJvd247XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUgZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoXG4gICAgICAgIC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxpbmdcbiAgICAgICAgLy8gY2xvc2UgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gdHJ1ZSBpbiB0aGUgZmluYWxseSBibG9jaywgaXQgbWVhbnNcbiAgICAgICAgLy8gd3JhcHBlci5jbG9zZSB0aHJldy5cbiAgICAgICAgZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgICBpZiAoaW5pdERhdGEgIT09IE9CU0VSVkVEX0VSUk9SICYmIHdyYXBwZXIuY2xvc2UpIHtcbiAgICAgICAgICB3cmFwcGVyLmNsb3NlLmNhbGwodGhpcywgaW5pdERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yVGhyb3duID0gZmFsc2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAvLyBUaGUgY2xvc2VyIGZvciB3cmFwcGVyIGkgdGhyZXcgYW4gZXJyb3I7IGNsb3NlIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAvLyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRoZW0gdG8gZW5zdXJlIHRoYXQgdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZXJyb3IgaXMgdGhlIG9uZSB0byBidWJibGUgdXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGwoaSArIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkltcGw7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1RyYW5zYWN0aW9uLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQmFzZWQgb24gdGhlIGVzY2FwZS1odG1sIGxpYnJhcnksIHdoaWNoIGlzIHVzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIGJlbG93OlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRpYW5jaGVuZyBcIlRpbW90aHlcIiBHdVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcbiAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVxuICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWxcbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1hdGNoSHRtbFJlZ0V4cCA9IC9bXCInJjw+XS87XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OlxuICAgICAgICAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTpcbiAgICAgICAgLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiN4Mjc7JzsgLy8gbW9kaWZpZWQgZnJvbSBlc2NhcGUtaHRtbDsgdXNlZCB0byBiZSAnJiMzOSdcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOlxuICAgICAgICAvLyA8XG4gICAgICAgIGVzY2FwZSA9ICcmbHQ7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYyOlxuICAgICAgICAvLyA+XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobGFzdEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgaHRtbCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICBodG1sICs9IGVzY2FwZTtcbiAgfVxuXG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4ID8gaHRtbCArIHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCkgOiBodG1sO1xufVxuLy8gZW5kIGNvZGUgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sXG5cbi8qKlxuICogRXNjYXBlcyB0ZXh0IHRvIHByZXZlbnQgc2NyaXB0aW5nIGF0dGFja3MuXG4gKlxuICogQHBhcmFtIHsqfSB0ZXh0IFRleHQgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybiB7c3RyaW5nfSBBbiBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRleHQpIHtcbiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgLy8gdGhpcyBzaG9ydGNpcmN1aXQgaGVscHMgcGVyZiBmb3IgdHlwZXMgdGhhdCB3ZSBrbm93IHdpbGwgbmV2ZXIgaGF2ZVxuICAgIC8vIHNwZWNpYWwgY2hhcmFjdGVycywgZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvZnRlblxuICAgIC8vIGZvciBudW1lcmljIGRvbSBpZHMuXG4gICAgcmV0dXJuICcnICsgdGV4dDtcbiAgfVxuICByZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFtZXNwYWNlcycpO1xuXG52YXIgV0hJVEVTUEFDRV9URVNUID0gL15bIFxcclxcblxcdFxcZl0vO1xudmFyIE5PTlZJU0lCTEVfVEVTVCA9IC88KCEtLXxsaW5rfG5vc2NyaXB0fG1ldGF8c2NyaXB0fHN0eWxlKVsgXFxyXFxuXFx0XFxmXFwvPl0vO1xuXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IHJlcXVpcmUoJy4vY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbicpO1xuXG4vLyBTVkcgdGVtcCBjb250YWluZXIgZm9yIElFIGxhY2tpbmcgaW5uZXJIVE1MXG52YXIgcmV1c2FibGVTVkdDb250YWluZXI7XG5cbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkXG4gKiBldmVuIGluIElFOC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgLy8gdGhlIHRhcmdldCBub2RlXG4gIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5zdmcgJiYgISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwgKyAnPC9zdmc+JztcbiAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cbn0pO1xuXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIC8vIElFODogV2hlbiB1cGRhdGluZyBhIGp1c3QgY3JlYXRlZCBub2RlIHdpdGggaW5uZXJIVE1MIG9ubHkgbGVhZGluZ1xuICAvLyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQuIFdoZW4gdXBkYXRpbmcgYW4gZXhpc3Rpbmcgbm9kZSB3aXRoIGlubmVySFRNTFxuICAvLyB3aGl0ZXNwYWNlIGluIHJvb3QgVGV4dE5vZGVzIGlzIGFsc28gY29sbGFwc2VkLlxuICAvLyBAc2VlIHF1aXJrc21vZGUub3JnL2J1Z3JlcG9ydHMvYXJjaGl2ZXMvMjAwNC8xMS9pbm5lcmh0bWxfYW5kX3QuaHRtbFxuXG4gIC8vIEZlYXR1cmUgZGV0ZWN0aW9uOyBvbmx5IElFOCBpcyBrbm93biB0byBiZWhhdmUgaW1wcm9wZXJseSBsaWtlIHRoaXMuXG4gIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnICc7XG4gIGlmICh0ZXN0RWxlbWVudC5pbm5lckhUTUwgPT09ICcnKSB7XG4gICAgc2V0SW5uZXJIVE1MID0gZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgICAgIC8vIE1hZ2ljIHRoZW9yeTogSUU4IHN1cHBvc2VkbHkgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhZGRlZCBhbmQgdXBkYXRlZFxuICAgICAgLy8gbm9kZXMgd2hlbiBwcm9jZXNzaW5nIGlubmVySFRNTCwgaW5uZXJIVE1MIG9uIHVwZGF0ZWQgbm9kZXMgc3VmZmVyc1xuICAgICAgLy8gZnJvbSB3b3JzZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLiBSZS1hZGRpbmcgYSBub2RlIGxpa2UgdGhpcyB0cmlnZ2Vyc1xuICAgICAgLy8gdGhlIGluaXRpYWwgYW5kIG1vcmUgZmF2b3JhYmxlIHdoaXRlc3BhY2UgYmVoYXZpb3IuXG4gICAgICAvLyBUT0RPOiBXaGF0IHRvIGRvIG9uIGEgZGV0YWNoZWQgbm9kZT9cbiAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChub2RlLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgYWxzbyBpbXBsZW1lbnQgYSB3b3JrYXJvdW5kIGZvciBub24tdmlzaWJsZSB0YWdzIGRpc2FwcGVhcmluZyBpbnRvXG4gICAgICAvLyB0aGluIGFpciBvbiBJRTgsIHRoaXMgb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHZpc2libGUgdGV4dFxuICAgICAgLy8gaW4tZnJvbnQgb2YgdGhlIG5vbi12aXNpYmxlIHRhZ3MuIFBpZ2d5YmFjayBvbiB0aGUgd2hpdGVzcGFjZSBmaXhcbiAgICAgIC8vIGFuZCBzaW1wbHkgY2hlY2sgaWYgYW55IG5vbi12aXNpYmxlIHRhZ3MgYXBwZWFyIGluIHRoZSBzb3VyY2UuXG4gICAgICBpZiAoV0hJVEVTUEFDRV9URVNULnRlc3QoaHRtbCkgfHwgaHRtbFswXSA9PT0gJzwnICYmIE5PTlZJU0lCTEVfVEVTVC50ZXN0KGh0bWwpKSB7XG4gICAgICAgIC8vIFJlY292ZXIgbGVhZGluZyB3aGl0ZXNwYWNlIGJ5IHRlbXBvcmFyaWx5IHByZXBlbmRpbmcgYW55IGNoYXJhY3Rlci5cbiAgICAgICAgLy8gXFx1RkVGRiBoYXMgdGhlIHBvdGVudGlhbCBhZHZhbnRhZ2Ugb2YgYmVpbmcgemVyby13aWR0aC9pbnZpc2libGUuXG4gICAgICAgIC8vIFVnbGlmeUpTIGRyb3BzIFUrRkVGRiBjaGFycyB3aGVuIHBhcnNpbmcsIHNvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlXG4gICAgICAgIC8vIGluIGhvcGVzIHRoYXQgdGhpcyBpcyBwcmVzZXJ2ZWQgZXZlbiBpZiBcIlxcdUZFRkZcIiBpcyB0cmFuc2Zvcm1lZCB0b1xuICAgICAgICAvLyB0aGUgYWN0dWFsIFVuaWNvZGUgY2hhcmFjdGVyIChieSBCYWJlbCwgZm9yIGV4YW1wbGUpLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWlzaG9vL1VnbGlmeUpTMi9ibG9iL3YyLjQuMjAvbGliL3BhcnNlLmpzI0wyMTZcbiAgICAgICAgbm9kZS5pbm5lckhUTUwgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZmVmZikgKyBodG1sO1xuXG4gICAgICAgIC8vIGRlbGV0ZURhdGEgbGVhdmVzIGFuIGVtcHR5IGBUZXh0Tm9kZWAgd2hpY2ggb2Zmc2V0cyB0aGUgaW5kZXggb2YgYWxsXG4gICAgICAgIC8vIGNoaWxkcmVuLiBEZWZpbml0ZWx5IHdhbnQgdG8gYXZvaWQgdGhpcy5cbiAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGV4dE5vZGUuZGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKHRleHROb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0Tm9kZS5kZWxldGVEYXRhKDAsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICB0ZXN0RWxlbWVudCA9IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0SW5uZXJIVE1MO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9zZXRJbm5lckhUTUwuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdHJ5IHtcbiAgICAvLyAkRmxvd0ZpeE1lIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4JywgeyBnZXQ6IGZ1bmN0aW9uICgpIHt9IH0pO1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gdHJ1ZTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIC8vIElFIHdpbGwgZmFpbCBvbiBkZWZpbmVQcm9wZXJ0eVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FuRGVmaW5lUHJvcGVydHk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC9saWIvY2FuRGVmaW5lUHJvcGVydHkuanMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqIFxuICovXG5cbi8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAvLyBBZGRlZCB0aGUgbm9uemVybyB5IGNoZWNrIHRvIG1ha2UgRmxvdyBoYXBweSwgYnV0IGl0IGlzIHJlZHVuZGFudFxuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vZmJqcy9saWIvc2hhbGxvd0VxdWFsLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5sb2NhdGlvbnNBcmVFcXVhbCA9IGV4cG9ydHMuY3JlYXRlTG9jYXRpb24gPSB1bmRlZmluZWQ7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfcmVzb2x2ZVBhdGhuYW1lID0gcmVxdWlyZSgncmVzb2x2ZS1wYXRobmFtZScpO1xuXG52YXIgX3Jlc29sdmVQYXRobmFtZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZXNvbHZlUGF0aG5hbWUpO1xuXG52YXIgX3ZhbHVlRXF1YWwgPSByZXF1aXJlKCd2YWx1ZS1lcXVhbCcpO1xuXG52YXIgX3ZhbHVlRXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVFcXVhbCk7XG5cbnZhciBfUGF0aFV0aWxzID0gcmVxdWlyZSgnLi9QYXRoVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGNyZWF0ZUxvY2F0aW9uID0gZXhwb3J0cy5jcmVhdGVMb2NhdGlvbiA9IGZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHN0YXRlLCBrZXksIGN1cnJlbnRMb2NhdGlvbikge1xuICB2YXIgbG9jYXRpb24gPSB2b2lkIDA7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBUd28tYXJnIGZvcm06IHB1c2gocGF0aCwgc3RhdGUpXG4gICAgbG9jYXRpb24gPSAoMCwgX1BhdGhVdGlscy5wYXJzZVBhdGgpKHBhdGgpO1xuICAgIGxvY2F0aW9uLnN0YXRlID0gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gT25lLWFyZyBmb3JtOiBwdXNoKGxvY2F0aW9uKVxuICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIHBhdGgpO1xuXG4gICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lID09PSB1bmRlZmluZWQpIGxvY2F0aW9uLnBhdGhuYW1lID0gJyc7XG5cbiAgICBpZiAobG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBpZiAobG9jYXRpb24uc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBsb2NhdGlvbi5zZWFyY2ggPSAnPycgKyBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9ICcnO1xuICAgIH1cblxuICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7XG4gICAgICBpZiAobG9jYXRpb24uaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgbG9jYXRpb24uaGFzaCA9ICcjJyArIGxvY2F0aW9uLmhhc2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBsb2NhdGlvbi5zdGF0ZSA9PT0gdW5kZWZpbmVkKSBsb2NhdGlvbi5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsb2NhdGlvbi5wYXRobmFtZSA9IGRlY29kZVVSSShsb2NhdGlvbi5wYXRobmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFVSSUVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgVVJJRXJyb3IoJ1BhdGhuYW1lIFwiJyArIGxvY2F0aW9uLnBhdGhuYW1lICsgJ1wiIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBhbiBpbnZhbGlkIHBlcmNlbnQtZW5jb2RpbmcuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGtleSkgbG9jYXRpb24ua2V5ID0ga2V5O1xuXG4gIGlmIChjdXJyZW50TG9jYXRpb24pIHtcbiAgICAvLyBSZXNvbHZlIGluY29tcGxldGUvcmVsYXRpdmUgcGF0aG5hbWUgcmVsYXRpdmUgdG8gY3VycmVudCBsb2NhdGlvbi5cbiAgICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICBsb2NhdGlvbi5wYXRobmFtZSA9IGN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgICBsb2NhdGlvbi5wYXRobmFtZSA9ICgwLCBfcmVzb2x2ZVBhdGhuYW1lMi5kZWZhdWx0KShsb2NhdGlvbi5wYXRobmFtZSwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBwcmlvciBsb2NhdGlvbiBhbmQgcGF0aG5hbWUgaXMgZW1wdHksIHNldCBpdCB0byAvXG4gICAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxudmFyIGxvY2F0aW9uc0FyZUVxdWFsID0gZXhwb3J0cy5sb2NhdGlvbnNBcmVFcXVhbCA9IGZ1bmN0aW9uIGxvY2F0aW9uc0FyZUVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEucGF0aG5hbWUgPT09IGIucGF0aG5hbWUgJiYgYS5zZWFyY2ggPT09IGIuc2VhcmNoICYmIGEuaGFzaCA9PT0gYi5oYXNoICYmIGEua2V5ID09PSBiLmtleSAmJiAoMCwgX3ZhbHVlRXF1YWwyLmRlZmF1bHQpKGEuc3RhdGUsIGIuc3RhdGUpO1xufTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2hpc3RvcnkvTG9jYXRpb25VdGlscy5qcyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBjcmVhdGVUcmFuc2l0aW9uTWFuYWdlciA9IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyKCkge1xuICB2YXIgcHJvbXB0ID0gbnVsbDtcblxuICB2YXIgc2V0UHJvbXB0ID0gZnVuY3Rpb24gc2V0UHJvbXB0KG5leHRQcm9tcHQpIHtcbiAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKHByb21wdCA9PSBudWxsLCAnQSBoaXN0b3J5IHN1cHBvcnRzIG9ubHkgb25lIHByb21wdCBhdCBhIHRpbWUnKTtcblxuICAgIHByb21wdCA9IG5leHRQcm9tcHQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHByb21wdCA9PT0gbmV4dFByb21wdCkgcHJvbXB0ID0gbnVsbDtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBjb25maXJtVHJhbnNpdGlvblRvID0gZnVuY3Rpb24gY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBjYWxsYmFjaykge1xuICAgIC8vIFRPRE86IElmIGFub3RoZXIgdHJhbnNpdGlvbiBzdGFydHMgd2hpbGUgd2UncmUgc3RpbGwgY29uZmlybWluZ1xuICAgIC8vIHRoZSBwcmV2aW91cyBvbmUsIHdlIG1heSBlbmQgdXAgaW4gYSB3ZWlyZCBzdGF0ZS4gRmlndXJlIG91dCB0aGVcbiAgICAvLyBiZXN0IHdheSB0byBoYW5kbGUgdGhpcy5cbiAgICBpZiAocHJvbXB0ICE9IG51bGwpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0eXBlb2YgcHJvbXB0ID09PSAnZnVuY3Rpb24nID8gcHJvbXB0KGxvY2F0aW9uLCBhY3Rpb24pIDogcHJvbXB0O1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRVc2VyQ29uZmlybWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0VXNlckNvbmZpcm1hdGlvbihyZXN1bHQsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKGZhbHNlLCAnQSBoaXN0b3J5IG5lZWRzIGEgZ2V0VXNlckNvbmZpcm1hdGlvbiBmdW5jdGlvbiBpbiBvcmRlciB0byB1c2UgYSBwcm9tcHQgbWVzc2FnZScpO1xuXG4gICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiBmYWxzZSBmcm9tIGEgdHJhbnNpdGlvbiBob29rIHRvIGNhbmNlbCB0aGUgdHJhbnNpdGlvbi5cbiAgICAgICAgY2FsbGJhY2socmVzdWx0ICE9PSBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgbGlzdGVuZXJzID0gW107XG5cbiAgdmFyIGFwcGVuZExpc3RlbmVyID0gZnVuY3Rpb24gYXBwZW5kTGlzdGVuZXIoZm4pIHtcbiAgICB2YXIgaXNBY3RpdmUgPSB0cnVlO1xuXG4gICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gbGlzdGVuZXIoKSB7XG4gICAgICBpZiAoaXNBY3RpdmUpIGZuLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzQWN0aXZlID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtICE9PSBsaXN0ZW5lcjtcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIG5vdGlmeUxpc3RlbmVycyA9IGZ1bmN0aW9uIG5vdGlmeUxpc3RlbmVycygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2V0UHJvbXB0OiBzZXRQcm9tcHQsXG4gICAgY29uZmlybVRyYW5zaXRpb25UbzogY29uZmlybVRyYW5zaXRpb25UbyxcbiAgICBhcHBlbmRMaXN0ZW5lcjogYXBwZW5kTGlzdGVuZXIsXG4gICAgbm90aWZ5TGlzdGVuZXJzOiBub3RpZnlMaXN0ZW5lcnNcbiAgfTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vaGlzdG9yeS9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlci5qcyIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQbGFpbk9iamVjdDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vbG9kYXNoLWVzL2lzUGxhaW5PYmplY3QuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIERhbmdlciA9IHJlcXVpcmUoJy4vRGFuZ2VyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xudmFyIHNldFRleHRDb250ZW50ID0gcmVxdWlyZSgnLi9zZXRUZXh0Q29udGVudCcpO1xuXG5mdW5jdGlvbiBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgbm9kZSkge1xuICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRleHQgY29tcG9uZW50cywgd2hpY2ggcmV0dXJuIFtvcGVuLCBjbG9zZV0gY29tbWVudHNcbiAgLy8gZnJvbSBnZXRIb3N0Tm9kZS5cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBub2RlID0gbm9kZVsxXTtcbiAgfVxuICByZXR1cm4gbm9kZSA/IG5vZGUubmV4dFNpYmxpbmcgOiBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBgY2hpbGROb2RlYCBhcyBhIGNoaWxkIG9mIGBwYXJlbnROb2RlYCBhdCB0aGUgYGluZGV4YC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudE5vZGUgUGFyZW50IG5vZGUgaW4gd2hpY2ggdG8gaW5zZXJ0LlxuICogQHBhcmFtIHtET01FbGVtZW50fSBjaGlsZE5vZGUgQ2hpbGQgbm9kZSB0byBpbnNlcnQuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjaGlsZC5cbiAqIEBpbnRlcm5hbFxuICovXG52YXIgaW5zZXJ0Q2hpbGRBdCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSkge1xuICAvLyBXZSByZWx5IGV4Y2x1c2l2ZWx5IG9uIGBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbClgIGluc3RlYWQgb2YgYWxzbyB1c2luZ1xuICAvLyBgYXBwZW5kQ2hpbGQobm9kZSlgLiAoVXNpbmcgYHVuZGVmaW5lZGAgaXMgbm90IGFsbG93ZWQgYnkgYWxsIGJyb3dzZXJzIHNvXG4gIC8vIHdlIGFyZSBjYXJlZnVsIHRvIHVzZSBgbnVsbGAuKVxuICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpO1xufSk7XG5cbmZ1bmN0aW9uIGluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZFRyZWUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShwYXJlbnROb2RlLCBjaGlsZFRyZWUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5mdW5jdGlvbiBtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHtcbiAgICBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBjaGlsZE5vZGVbMF0sIGNoaWxkTm9kZVsxXSwgcmVmZXJlbmNlTm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZE5vZGUpKSB7XG4gICAgdmFyIGNsb3NpbmdDb21tZW50ID0gY2hpbGROb2RlWzFdO1xuICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZVswXTtcbiAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvc2luZ0NvbW1lbnQpO1xuICB9XG4gIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTtcbn1cblxuZnVuY3Rpb24gbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgb3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCByZWZlcmVuY2VOb2RlKSB7XG4gIHZhciBub2RlID0gb3BlbmluZ0NvbW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIG5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgIGlmIChub2RlID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIHN0YXJ0Tm9kZSwgY2xvc2luZ0NvbW1lbnQpIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZS5uZXh0U2libGluZztcbiAgICBpZiAobm9kZSA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAgIC8vIFRoZSBjbG9zaW5nIGNvbW1lbnQgaXMgcmVtb3ZlZCBieSBSZWFjdE11bHRpQ2hpbGQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZURlbGltaXRlZFRleHQob3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCBzdHJpbmdUZXh0KSB7XG4gIHZhciBwYXJlbnROb2RlID0gb3BlbmluZ0NvbW1lbnQucGFyZW50Tm9kZTtcbiAgdmFyIG5vZGVBZnRlckNvbW1lbnQgPSBvcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztcbiAgaWYgKG5vZGVBZnRlckNvbW1lbnQgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgLy8gVGhlcmUgYXJlIG5vIHRleHQgbm9kZXMgYmV0d2VlbiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjb21tZW50czsgaW5zZXJ0XG4gICAgLy8gYSBuZXcgb25lIGlmIHN0cmluZ1RleHQgaXNuJ3QgZW1wdHkuXG4gICAgaWYgKHN0cmluZ1RleHQpIHtcbiAgICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3RyaW5nVGV4dCksIG5vZGVBZnRlckNvbW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RyaW5nVGV4dCkge1xuICAgICAgLy8gU2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW5pbmcgY29tbWVudCwgYW5kXG4gICAgICAvLyByZW1vdmUgYWxsIGZvbGxvd2luZyBub2RlcyB1cCB1bnRpbCB0aGUgY2xvc2luZyBjb21tZW50LlxuICAgICAgc2V0VGV4dENvbnRlbnQobm9kZUFmdGVyQ29tbWVudCwgc3RyaW5nVGV4dCk7XG4gICAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG5vZGVBZnRlckNvbW1lbnQsIGNsb3NpbmdDb21tZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvcGVuaW5nQ29tbWVudCkuX2RlYnVnSUQsXG4gICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgIHBheWxvYWQ6IHN0cmluZ1RleHRcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwLCBwcmV2SW5zdGFuY2UpIHtcbiAgICBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkQ2hpbGQsIG1hcmt1cCk7XG4gICAgaWYgKHByZXZJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IHByZXZJbnN0YW5jZS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlcGxhY2Ugd2l0aCcsXG4gICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTtcbiAgICAgIGlmIChuZXh0SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgaW5zdGFuY2VJRDogbmV4dEluc3RhbmNlLl9kZWJ1Z0lELFxuICAgICAgICAgIHR5cGU6ICdtb3VudCcsXG4gICAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIHVwZGF0aW5nIHdpdGggRE9NIGNoaWxkcmVuLlxuICovXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0ge1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDogZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsXG5cbiAgcmVwbGFjZURlbGltaXRlZFRleHQ6IHJlcGxhY2VEZWxpbWl0ZWRUZXh0LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiB1cGRhdGVzLiBUaGVcbiAgICogdXBkYXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBlYWNoIGV4cGVjdGVkIHRvIGhhdmUgYSBgcGFyZW50Tm9kZWAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm9jZXNzVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudE5vZGUsIHVwZGF0ZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudE5vZGVEZWJ1Z0lEID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocGFyZW50Tm9kZSkuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCB1cGRhdGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgdXBkYXRlID0gdXBkYXRlc1trXTtcbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSU5TRVJUX01BUktVUCc6XG4gICAgICAgICAgaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50LCBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgdXBkYXRlLmFmdGVyTm9kZSkpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbnNlcnQgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgdG9JbmRleDogdXBkYXRlLnRvSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01PVkVfRVhJU1RJTkcnOlxuICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ21vdmUgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCwgdG9JbmRleDogdXBkYXRlLnRvSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTRVRfTUFSS1VQJzpcbiAgICAgICAgICBzZXRJbm5lckhUTUwocGFyZW50Tm9kZSwgdXBkYXRlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIGNoaWxkcmVuJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdURVhUX0NPTlRFTlQnOlxuICAgICAgICAgIHNldFRleHRDb250ZW50KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSRU1PVkVfTk9ERSc6XG4gICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVtb3ZlIGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01DaGlsZHJlbk9wZXJhdGlvbnM7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0RPTUNoaWxkcmVuT3BlcmF0aW9ucy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01OYW1lc3BhY2VzID0ge1xuICBodG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsXG4gIG1hdGhtbDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnLFxuICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zydcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NTmFtZXNwYWNlcztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRE9NTmFtZXNwYWNlcy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLyoqXG4gKiBJbmplY3RlZCBkZXBlbmRlbmNpZXM6XG4gKi9cblxuLyoqXG4gKiAtIGBDb21wb25lbnRUcmVlYDogW3JlcXVpcmVkXSBNb2R1bGUgdGhhdCBjYW4gY29udmVydCBiZXR3ZWVuIFJlYWN0IGluc3RhbmNlc1xuICogICBhbmQgYWN0dWFsIG5vZGUgcmVmZXJlbmNlcy5cbiAqL1xudmFyIENvbXBvbmVudFRyZWU7XG52YXIgVHJlZVRyYXZlcnNhbDtcbnZhciBpbmplY3Rpb24gPSB7XG4gIGluamVjdENvbXBvbmVudFRyZWU6IGZ1bmN0aW9uIChJbmplY3RlZCkge1xuICAgIENvbXBvbmVudFRyZWUgPSBJbmplY3RlZDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0ZWQuZ2V0Tm9kZUZyb21JbnN0YW5jZSAmJiBJbmplY3RlZC5nZXRJbnN0YW5jZUZyb21Ob2RlLCAnRXZlbnRQbHVnaW5VdGlscy5pbmplY3Rpb24uaW5qZWN0Q29tcG9uZW50VHJlZSguLi4pOiBJbmplY3RlZCAnICsgJ21vZHVsZSBpcyBtaXNzaW5nIGdldE5vZGVGcm9tSW5zdGFuY2Ugb3IgZ2V0SW5zdGFuY2VGcm9tTm9kZS4nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH0sXG4gIGluamVjdFRyZWVUcmF2ZXJzYWw6IGZ1bmN0aW9uIChJbmplY3RlZCkge1xuICAgIFRyZWVUcmF2ZXJzYWwgPSBJbmplY3RlZDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0ZWQuaXNBbmNlc3RvciAmJiBJbmplY3RlZC5nZXRMb3dlc3RDb21tb25BbmNlc3RvciwgJ0V2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLmluamVjdFRyZWVUcmF2ZXJzYWwoLi4uKTogSW5qZWN0ZWQgJyArICdtb2R1bGUgaXMgbWlzc2luZyBpc0FuY2VzdG9yIG9yIGdldExvd2VzdENvbW1vbkFuY2VzdG9yLicpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaXNFbmRpc2godG9wTGV2ZWxUeXBlKSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZVVwJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaEVuZCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hDYW5jZWwnO1xufVxuXG5mdW5jdGlvbiBpc01vdmVpc2godG9wTGV2ZWxUeXBlKSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU1vdmUnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoTW92ZSc7XG59XG5mdW5jdGlvbiBpc1N0YXJ0aXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VEb3duJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaFN0YXJ0Jztcbn1cblxudmFyIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gICAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuXG4gICAgdmFyIGxpc3RlbmVyc0lzQXJyID0gQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycyk7XG4gICAgdmFyIGxpc3RlbmVyc0xlbiA9IGxpc3RlbmVyc0lzQXJyID8gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIDogZGlzcGF0Y2hMaXN0ZW5lcnMgPyAxIDogMDtcblxuICAgIHZhciBpbnN0YW5jZXNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hJbnN0YW5jZXMpO1xuICAgIHZhciBpbnN0YW5jZXNMZW4gPSBpbnN0YW5jZXNJc0FyciA/IGRpc3BhdGNoSW5zdGFuY2VzLmxlbmd0aCA6IGRpc3BhdGNoSW5zdGFuY2VzID8gMSA6IDA7XG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0YW5jZXNJc0FyciA9PT0gbGlzdGVuZXJzSXNBcnIgJiYgaW5zdGFuY2VzTGVuID09PSBsaXN0ZW5lcnNMZW4sICdFdmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZVxuICogQHBhcmFtIHtib29sZWFufSBzaW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAoY2hhbmdlcyBleG4gYmVoYXZpb3IpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBBcHBsaWNhdGlvbi1sZXZlbCBjYWxsYmFja1xuICogQHBhcmFtIHsqfSBpbnN0IEludGVybmFsIGNvbXBvbmVudCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgbGlzdGVuZXIsIGluc3QpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IEV2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgaWYgKHNpbXVsYXRlZCkge1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2godHlwZSwgbGlzdGVuZXIsIGV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKHR5cGUsIGxpc3RlbmVyLCBldmVudCk7XG4gIH1cbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMuXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCwgc2ltdWxhdGVkKSB7XG4gIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBzaW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzW2ldLCBkaXNwYXRjaEluc3RhbmNlc1tpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7XG4gICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBzaW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzLCBkaXNwYXRjaEluc3RhbmNlcyk7XG4gIH1cbiAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDtcbiAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZC9zaW1wbGUgaXRlcmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBjb2xsZWN0ZWQgZGlzcGF0Y2hlcywgYnV0IHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0aW9uIHJldHVybmluZyB0cnVlLCBhbmQgcmV0dXJucyB0aGF0IGlkLlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IGlkIG9mIHRoZSBmaXJzdCBkaXNwYXRjaCBleGVjdXRpb24gd2hvJ3MgbGlzdGVuZXIgcmV0dXJuc1xuICogdHJ1ZSwgb3IgbnVsbCBpZiBubyBsaXN0ZW5lciByZXR1cm5lZCB0cnVlLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCkge1xuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBMaXN0ZW5lcnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVsIGFycmF5cyB0aGF0IGFyZSBhbHdheXMgaW4gc3luYy5cbiAgICAgIGlmIChkaXNwYXRjaExpc3RlbmVyc1tpXShldmVudCwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEluc3RhbmNlc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnMpIHtcbiAgICBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnMoZXZlbnQsIGRpc3BhdGNoSW5zdGFuY2VzKSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoSW5zdGFuY2VzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAc2VlIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUoZXZlbnQpIHtcbiAgdmFyIHJldCA9IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsKGV2ZW50KTtcbiAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDtcbiAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDtcbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBFeGVjdXRpb24gb2YgYSBcImRpcmVjdFwiIGRpc3BhdGNoIC0gdGhlcmUgbXVzdCBiZSBhdCBtb3N0IG9uZSBkaXNwYXRjaFxuICogYWNjdW11bGF0ZWQgb24gdGhlIGV2ZW50IG9yIGl0IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IuIEl0IGRvZXNuJ3QgcmVhbGx5IG1ha2VcbiAqIHNlbnNlIGZvciBhbiBldmVudCB3aXRoIG11bHRpcGxlIGRpc3BhdGNoZXMgKGJ1YmJsZWQpIHRvIGtlZXAgdHJhY2sgb2YgdGhlXG4gKiByZXR1cm4gdmFsdWVzIGF0IGVhY2ggZGlzcGF0Y2ggZXhlY3V0aW9uLCBidXQgaXQgZG9lcyB0ZW5kIHRvIG1ha2Ugc2Vuc2Ugd2hlblxuICogZGVhbGluZyB3aXRoIFwiZGlyZWN0XCIgZGlzcGF0Y2hlcy5cbiAqXG4gKiBAcmV0dXJuIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWN1dGluZyB0aGUgc2luZ2xlIGRpc3BhdGNoLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlyZWN0RGlzcGF0Y2goZXZlbnQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7XG4gIH1cbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXIgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuICAhIUFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZXhlY3V0ZURpcmVjdERpc3BhdGNoKC4uLik6IEludmFsaWQgYGV2ZW50YC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMDMnKSA6IHZvaWQgMDtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGRpc3BhdGNoTGlzdGVuZXIgPyBFdmVudFBsdWdpblV0aWxzLmdldE5vZGVGcm9tSW5zdGFuY2UoZGlzcGF0Y2hJbnN0YW5jZSkgOiBudWxsO1xuICB2YXIgcmVzID0gZGlzcGF0Y2hMaXN0ZW5lciA/IGRpc3BhdGNoTGlzdGVuZXIoZXZlbnQpIDogbnVsbDtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWZmIG51bWJlciBvZiBkaXNwYXRjaGVzIGFjY3VtdWxhdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLlxuICovXG5mdW5jdGlvbiBoYXNEaXNwYXRjaGVzKGV2ZW50KSB7XG4gIHJldHVybiAhIWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbn1cblxuLyoqXG4gKiBHZW5lcmFsIHV0aWxpdGllcyB0aGF0IGFyZSB1c2VmdWwgaW4gY3JlYXRpbmcgY3VzdG9tIEV2ZW50IFBsdWdpbnMuXG4gKi9cbnZhciBFdmVudFBsdWdpblV0aWxzID0ge1xuICBpc0VuZGlzaDogaXNFbmRpc2gsXG4gIGlzTW92ZWlzaDogaXNNb3ZlaXNoLFxuICBpc1N0YXJ0aXNoOiBpc1N0YXJ0aXNoLFxuXG4gIGV4ZWN1dGVEaXJlY3REaXNwYXRjaDogZXhlY3V0ZURpcmVjdERpc3BhdGNoLFxuICBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXI6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcixcbiAgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTogZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZSxcbiAgaGFzRGlzcGF0Y2hlczogaGFzRGlzcGF0Y2hlcyxcblxuICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBDb21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSk7XG4gIH0sXG4gIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShub2RlKTtcbiAgfSxcbiAgaXNBbmNlc3RvcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5pc0FuY2VzdG9yKGEsIGIpO1xuICB9LFxuICBnZXRMb3dlc3RDb21tb25BbmNlc3RvcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihhLCBiKTtcbiAgfSxcbiAgZ2V0UGFyZW50SW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuZ2V0UGFyZW50SW5zdGFuY2UoaW5zdCk7XG4gIH0sXG4gIHRyYXZlcnNlVHdvUGhhc2U6IGZ1bmN0aW9uICh0YXJnZXQsIGZuLCBhcmcpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZVR3b1BoYXNlKHRhcmdldCwgZm4sIGFyZyk7XG4gIH0sXG4gIHRyYXZlcnNlRW50ZXJMZWF2ZTogZnVuY3Rpb24gKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbyk7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBpbmplY3Rpb25cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQbHVnaW5VdGlscztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRXZlbnRQbHVnaW5VdGlscy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyArIGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcblxuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cblxuLyoqXG4gKiBVbmVzY2FwZSBhbmQgdW53cmFwIGtleSBmb3IgaHVtYW4tcmVhZGFibGUgZGlzcGxheVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gdW5lc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSB1bmVzY2FwZWQga2V5LlxuICovXG5mdW5jdGlvbiB1bmVzY2FwZShrZXkpIHtcbiAgdmFyIHVuZXNjYXBlUmVnZXggPSAvKD0wfD0yKS9nO1xuICB2YXIgdW5lc2NhcGVyTG9va3VwID0ge1xuICAgICc9MCc6ICc9JyxcbiAgICAnPTInOiAnOidcbiAgfTtcbiAgdmFyIGtleVN1YnN0cmluZyA9IGtleVswXSA9PT0gJy4nICYmIGtleVsxXSA9PT0gJyQnID8ga2V5LnN1YnN0cmluZygyKSA6IGtleS5zdWJzdHJpbmcoMSk7XG5cbiAgcmV0dXJuICgnJyArIGtleVN1YnN0cmluZykucmVwbGFjZSh1bmVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gdW5lc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG59XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHtcbiAgZXNjYXBlOiBlc2NhcGUsXG4gIHVuZXNjYXBlOiB1bmVzY2FwZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlFc2NhcGVVdGlscztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvS2V5RXNjYXBlVXRpbHMuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgcHJvcFR5cGVzRmFjdG9yeSA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvZmFjdG9yeScpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBQcm9wVHlwZXMgPSBwcm9wVHlwZXNGYWN0b3J5KFJlYWN0LmlzVmFsaWRFbGVtZW50KTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcykge1xuICAhKGlucHV0UHJvcHMuY2hlY2tlZExpbmsgPT0gbnVsbCB8fCBpbnB1dFByb3BzLnZhbHVlTGluayA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIHZhbHVlTGluay4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykge1xuICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTtcbiAgIShpbnB1dFByb3BzLnZhbHVlID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIHZhbHVlTGluayBhbmQgYSB2YWx1ZSBvciBvbkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIHZhbHVlIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsuJykgOiBfcHJvZEludmFyaWFudCgnODgnKSA6IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpIHtcbiAgX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyk7XG4gICEoaW5wdXRQcm9wcy5jaGVja2VkID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIGNoZWNrZWQgcHJvcGVydHkgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSBjaGVja2VkTGluaycpIDogX3Byb2RJbnZhcmlhbnQoJzg5JykgOiB2b2lkIDA7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgaWYgKCFwcm9wc1twcm9wTmFtZV0gfHwgaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gIH0sXG4gIGNoZWNrZWQ6IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICB9LFxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgYSBsaW5rZWQgYHZhbHVlYCBhdHRyaWJ1dGUgZm9yIGNvbnRyb2xsZWQgZm9ybXMuIFlvdSBzaG91bGQgbm90IHVzZVxuICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAqL1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSB7XG4gIGNoZWNrUHJvcFR5cGVzOiBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIG93bmVyKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKSB7XG4gICAgICBpZiAocHJvcFR5cGVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBwcm9wVHlwZXNbcHJvcE5hbWVdKHByb3BzLCBwcm9wTmFtZSwgdGFnTmFtZSwgJ3Byb3AnLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpO1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCBmb3JtIHByb3BUeXBlOiAlcyVzJywgZXJyb3IubWVzc2FnZSwgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9yIGZvcm0gY29tcG9uZW50XG4gICAqIEByZXR1cm4geyp9IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGVpdGhlciBmcm9tIHZhbHVlIHByb3Agb3IgbGluay5cbiAgICovXG4gIGdldFZhbHVlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcykge1xuICAgIGlmIChpbnB1dFByb3BzLnZhbHVlTGluaykge1xuICAgICAgX2Fzc2VydFZhbHVlTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0UHJvcHMudmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50IGNoZWNrZWQgc3RhdHVzIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSBjaGVja2VkIHByb3BcbiAgICogICAgICAgICAgICAgb3IgbGluay5cbiAgICovXG4gIGdldENoZWNrZWQ6IGZ1bmN0aW9uIChpbnB1dFByb3BzKSB7XG4gICAgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHtcbiAgICAgIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgY2hhbmdlIGV2ZW50IHRvIGhhbmRsZVxuICAgKi9cbiAgZXhlY3V0ZU9uQ2hhbmdlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcywgZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRQcm9wcy52YWx1ZUxpbmspIHtcbiAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5jaGVja2VkTGluaykge1xuICAgICAgX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpO1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5rZWRWYWx1ZVV0aWxzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9MaW5rZWRWYWx1ZVV0aWxzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBpbmplY3RlZCA9IGZhbHNlO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBzd2FwcGluZyBvdXQgbW91bnQgaW1hZ2VzIGluIHRoZSBtaWRkbGUgb2ZcbiAgICogdGhlIHRyZWUuXG4gICAqL1xuICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IG51bGwsXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBwcm9jZXNzaW5nIGEgcXVldWUgb2YgY2hpbGQgdXBkYXRlcy4gV2lsbFxuICAgKiBsYXRlciBtb3ZlIGludG8gTXVsdGlDaGlsZENvbXBvbmVudHMuXG4gICAqL1xuICBwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIGluamVjdEVudmlyb25tZW50OiBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcbiAgICAgICEhaW5qZWN0ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQ6IGluamVjdEVudmlyb25tZW50KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuJykgOiBfcHJvZEludmFyaWFudCgnMTA0JykgOiB2b2lkIDA7XG4gICAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbiAgICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyA9IGVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM7XG4gICAgICBpbmplY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBhIEZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0geyp9IGIgU2Vjb25kIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBhKSB7XG4gIHRyeSB7XG4gICAgZnVuYyhhKTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIGlmIChjYXVnaHRFcnJvciA9PT0gbnVsbCkge1xuICAgICAgY2F1Z2h0RXJyb3IgPSB4O1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RFcnJvclV0aWxzID0ge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2s6IGludm9rZUd1YXJkZWRDYWxsYmFjayxcblxuICAvKipcbiAgICogSW52b2tlZCBieSBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZSBzbyB0aGF0IGFueSBlcnJvcnMgdGhyb3duIGJ5IHRoZSBldmVudFxuICAgKiBoYW5kbGVyIGFyZSBzdXJlIHRvIGJlIHJldGhyb3duIGJ5IHJldGhyb3dDYXVnaHRFcnJvci5cbiAgICovXG4gIGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDogaW52b2tlR3VhcmRlZENhbGxiYWNrLFxuXG4gIC8qKlxuICAgKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAgICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICAgKi9cbiAgcmV0aHJvd0NhdWdodEVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhdWdodEVycm9yKSB7XG4gICAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLyoqXG4gICAqIFRvIGhlbHAgZGV2ZWxvcG1lbnQgd2UgY2FuIGdldCBiZXR0ZXIgZGV2dG9vbHMgaW50ZWdyYXRpb24gYnkgc2ltdWxhdGluZyBhXG4gICAqIHJlYWwgYnJvd3NlciBldmVudC5cbiAgICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywgYSkge1xuICAgICAgdmFyIGJvdW5kRnVuYyA9IGZ1bmMuYmluZChudWxsLCBhKTtcbiAgICAgIHZhciBldnRUeXBlID0gJ3JlYWN0LScgKyBuYW1lO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBib3VuZEZ1bmMsIGZhbHNlKTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgYm91bmRGdW5jLCBmYWxzZSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXJyb3JVdGlscztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFcnJvclV0aWxzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpIHtcbiAgUmVhY3RVcGRhdGVzLmVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChhcmcpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgYXJnO1xuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICB2YXIgZGlzcGxheU5hbWUgPSBhcmcuY29uc3RydWN0b3IgJiYgYXJnLmNvbnN0cnVjdG9yLm5hbWUgfHwgdHlwZTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhcmcpO1xuICBpZiAoa2V5cy5sZW5ndGggPiAwICYmIGtleXMubGVuZ3RoIDwgMjApIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWUgKyAnIChrZXlzOiAnICsga2V5cy5qb2luKCcsICcpICsgJyknO1xuICB9XG4gIHJldHVybiBkaXNwbGF5TmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO1xuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICAgIC8vIE9ubHkgd2FybiB3aGVuIHdlIGhhdmUgYSBjYWxsZXJOYW1lLiBPdGhlcndpc2Ugd2Ugc2hvdWxkIGJlIHNpbGVudC5cbiAgICAgIC8vIFdlJ3JlIHByb2JhYmx5IGNhbGxpbmcgZnJvbSBlbnF1ZXVlQ2FsbGJhY2suIFdlIGRvbid0IHdhbnQgdG8gd2FyblxuICAgICAgLy8gdGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjYWxsZXJOYW1lLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRlZCBvciBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5hbWUsIGN0b3IgJiYgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9PSBudWxsLCAnJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgXCJ3aXRoaW4gYHJlbmRlcmAgb3IgYW5vdGhlciBjb21wb25lbnQncyBjb25zdHJ1Y3RvcikuIFJlbmRlciBtZXRob2RzIFwiICsgJ3Nob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyBjb25zdHJ1Y3RvciAnICsgJ3NpZGUtZWZmZWN0cyBhcmUgYW4gYW50aS1wYXR0ZXJuLCBidXQgY2FuIGJlIG1vdmVkIHRvICcgKyAnYGNvbXBvbmVudFdpbGxNb3VudGAuJywgY2FsbGVyTmFtZSkgOiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBSZWFjdFVwZGF0ZVF1ZXVlIGFsbG93cyBmb3Igc3RhdGUgdXBkYXRlcyB0byBiZSBzY2hlZHVsZWQgaW50byBhIGxhdGVyXG4gKiByZWNvbmNpbGlhdGlvbiBzdGVwLlxuICovXG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgICBpZiAob3duZXIgIT09IG51bGwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcob3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyLCAnJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgICBvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHB1YmxpY0luc3RhbmNlKTtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgLy8gRHVyaW5nIGNvbXBvbmVudFdpbGxNb3VudCBhbmQgcmVuZGVyIHRoaXMgd2lsbCBzdGlsbCBiZSBudWxsIGJ1dCBhZnRlclxuICAgICAgLy8gdGhhdCB3aWxsIGFsd2F5cyByZW5kZXIgdG8gc29tZXRoaW5nLiBBdCBsZWFzdCBmb3Igbm93LiBTbyB3ZSBjYW4gdXNlXG4gICAgICAvLyB0aGlzIGhhY2suXG4gICAgICByZXR1cm4gISFpbnRlcm5hbEluc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsZXJOYW1lIE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgUmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBjYWxsZXJOYW1lKTtcbiAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSk7XG5cbiAgICAvLyBQcmV2aW91c2x5IHdlIHdvdWxkIHRocm93IGFuIGVycm9yIGlmIHdlIGRpZG4ndCBoYXZlIGFuIGludGVybmFsXG4gICAgLy8gaW5zdGFuY2UuIFNpbmNlIHdlIHdhbnQgdG8gbWFrZSBpdCBhIG5vLW9wIGluc3RlYWQsIHdlIG1pcnJvciB0aGUgc2FtZVxuICAgIC8vIGJlaGF2aW9yIHdlIGhhdmUgaW4gb3RoZXIgZW5xdWV1ZSogbWV0aG9kcy5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gaWdub3JlIGNhbGxiYWNrcyBpbiBjb21wb25lbnRXaWxsTW91bnQuIFNlZVxuICAgIC8vIGVucXVldWVVcGRhdGVzLlxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MpIHtcbiAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIH1cbiAgICAvLyBUT0RPOiBUaGUgY2FsbGJhY2sgaGVyZSBpcyBpZ25vcmVkIHdoZW4gc2V0U3RhdGUgaXMgY2FsbGVkIGZyb21cbiAgICAvLyBjb21wb25lbnRXaWxsTW91bnQuIEVpdGhlciBmaXggaXQgb3IgZGlzYWxsb3cgZG9pbmcgc28gY29tcGxldGVseSBpblxuICAgIC8vIGZhdm9yIG9mIGdldEluaXRpYWxTdGF0ZS4gQWx0ZXJuYXRpdmVseSwgd2UgY2FuIGRpc2FsbG93XG4gICAgLy8gY29tcG9uZW50V2lsbE1vdW50IGR1cmluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuXG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICBlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MpIHtcbiAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIH1cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gdHJ1ZTtcblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gW2NvbXBsZXRlU3RhdGVdO1xuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSB0cnVlO1xuXG4gICAgLy8gRnV0dXJlLXByb29mIDE1LjVcbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0U3RhdGUoKTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHBhcnRpYWxTdGF0ZSAhPSBudWxsLCAnc2V0U3RhdGUoLi4uKTogWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgb3IgbnVsbCBzdGF0ZSBvYmplY3Q7ICcgKyAnaW5zdGVhZCwgdXNlIGZvcmNlVXBkYXRlKCkuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWUgfHwgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gW10pO1xuICAgIHF1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTtcblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCkge1xuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgLy8gVE9ETzogaW50cm9kdWNlIF9wZW5kaW5nQ29udGV4dCBpbnN0ZWFkIG9mIHNldHRpbmcgaXQgZGlyZWN0bHkuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCA9IG5leHRDb250ZXh0O1xuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgdmFsaWRhdGVDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgISghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChjYWxsYmFjaykpIDogX3Byb2RJbnZhcmlhbnQoJzEyMicsIGNhbGxlck5hbWUsIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChjYWxsYmFjaykpIDogdm9pZCAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0VXBkYXRlUXVldWU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlUXVldWUuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7XG5cbiAgICAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfVxuXG4gIC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRDaGFyQ29kZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRDaGFyQ29kZS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07XG5cbi8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgZ2V0TW9kaWZpZXJTdGF0ZSBzbyB3ZSBzaW1wbHkgbWFwIGl0IHRvIHRoZSBvbmx5XG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50IGl0c2VsZiwgZG9lcyBub3Qgc3VwcG9ydCBMb2NrLWtleXMuXG4vLyBDdXJyZW50bHksIGFsbCBtYWpvciBicm93c2VycyBleGNlcHQgQ2hyb21lIHNlZW1zIHRvIHN1cHBvcnQgTG9jay1rZXlzLlxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRNb2RpZmllclN0YXRlO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9nZXRFdmVudE1vZGlmaWVyU3RhdGUuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7XG5cbiAgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9XG5cbiAgLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gMyA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50VGFyZ2V0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9nZXRFdmVudFRhcmdldC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciB1c2VIYXNGZWF0dXJlO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICB1c2VIYXNGZWF0dXJlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gJiYgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSAmJlxuICAvLyBhbHdheXMgcmV0dXJucyB0cnVlIGluIG5ld2VyIGJyb3dzZXJzIGFzIHBlciB0aGUgc3RhbmRhcmQuXG4gIC8vIEBzZWUgaHR0cDovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1kb21pbXBsZW1lbnRhdGlvbi1oYXNmZWF0dXJlXG4gIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoJycsICcnKSAhPT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGNhcHR1cmUgQ2hlY2sgaWYgdGhlIGNhcHR1cmUgcGhhc2UgaXMgc3VwcG9ydGVkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgsIGNhcHR1cmUpIHtcbiAgaWYgKCFFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gfHwgY2FwdHVyZSAmJiAhKCdhZGRFdmVudExpc3RlbmVyJyBpbiBkb2N1bWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnROYW1lIGluIGRvY3VtZW50O1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBpZiAoIWlzU3VwcG9ydGVkICYmIHVzZUhhc0ZlYXR1cmUgJiYgZXZlbnROYW1lU3VmZml4ID09PSAnd2hlZWwnKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gdGVzdCBzdXBwb3J0IGZvciB0aGUgYHdoZWVsYCBldmVudCBpbiBJRTkrLlxuICAgIGlzU3VwcG9ydGVkID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnRXZlbnRzLndoZWVsJywgJzMuMCcpO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXZlbnRTdXBwb3J0ZWQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdpdmVuIGEgYHByZXZFbGVtZW50YCBhbmQgYG5leHRFbGVtZW50YCwgZGV0ZXJtaW5lcyBpZiB0aGUgZXhpc3RpbmdcbiAqIGluc3RhbmNlIHNob3VsZCBiZSB1cGRhdGVkIGFzIG9wcG9zZWQgdG8gYmVpbmcgZGVzdHJveWVkIG9yIHJlcGxhY2VkIGJ5IGEgbmV3XG4gKiBpbnN0YW5jZS4gQm90aCBhcmd1bWVudHMgYXJlIGVsZW1lbnRzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGlzIGxvZ2ljIGNhblxuICogb3BlcmF0ZSBvbiBzdGF0ZWxlc3MgdHJlZXMgd2l0aG91dCBhbnkgYmFja2luZyBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IHByZXZFbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG5leHRFbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBleGlzdGluZyBpbnN0YW5jZSBzaG91bGQgYmUgdXBkYXRlZC5cbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpIHtcbiAgdmFyIHByZXZFbXB0eSA9IHByZXZFbGVtZW50ID09PSBudWxsIHx8IHByZXZFbGVtZW50ID09PSBmYWxzZTtcbiAgdmFyIG5leHRFbXB0eSA9IG5leHRFbGVtZW50ID09PSBudWxsIHx8IG5leHRFbGVtZW50ID09PSBmYWxzZTtcbiAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHtcbiAgICByZXR1cm4gcHJldkVtcHR5ID09PSBuZXh0RW1wdHk7XG4gIH1cblxuICB2YXIgcHJldlR5cGUgPSB0eXBlb2YgcHJldkVsZW1lbnQ7XG4gIHZhciBuZXh0VHlwZSA9IHR5cGVvZiBuZXh0RWxlbWVudDtcbiAgaWYgKHByZXZUeXBlID09PSAnc3RyaW5nJyB8fCBwcmV2VHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdzdHJpbmcnIHx8IG5leHRUeXBlID09PSAnbnVtYmVyJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIHByZXZFbGVtZW50LnR5cGUgPT09IG5leHRFbGVtZW50LnR5cGUgJiYgcHJldkVsZW1lbnQua2V5ID09PSBuZXh0RWxlbWVudC5rZXk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJyxcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcblxuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcblxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcblxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB2YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcsIGluc3RhbmNlKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IF9hc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuICAgIHZhciBpbmZvID0geyB0YWc6IHRhZywgaW5zdGFuY2U6IGluc3RhbmNlIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JztcbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9XG5cbiAgICAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogR2l2ZW4gYSBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCBpbnN0YW5jZSwgcmV0dXJuIGEgbGlzdCBvZiBpdHMgcmVjdXJzaXZlXG4gICAqIG93bmVycywgc3RhcnRpbmcgYXQgdGhlIHJvb3QgYW5kIGVuZGluZyB3aXRoIHRoZSBpbnN0YW5jZSBpdHNlbGYuXG4gICAqL1xuICB2YXIgZmluZE93bmVyU3RhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgZG8ge1xuICAgICAgc3RhY2sucHVzaChpbnN0YW5jZSk7XG4gICAgfSB3aGlsZSAoaW5zdGFuY2UgPSBpbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyKTtcbiAgICBzdGFjay5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGNoaWxkSW5zdGFuY2UsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjaGlsZFRhZyA9PSBudWxsLCAndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJykgOiB2b2lkIDA7XG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIHByb2JsZW1hdGljID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAocHJvYmxlbWF0aWMpIHtcbiAgICAgIHZhciBhbmNlc3RvclRhZyA9IHByb2JsZW1hdGljLnRhZztcbiAgICAgIHZhciBhbmNlc3Rvckluc3RhbmNlID0gcHJvYmxlbWF0aWMuaW5zdGFuY2U7XG5cbiAgICAgIHZhciBjaGlsZE93bmVyID0gY2hpbGRJbnN0YW5jZSAmJiBjaGlsZEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgYW5jZXN0b3JPd25lciA9IGFuY2VzdG9ySW5zdGFuY2UgJiYgYW5jZXN0b3JJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICB2YXIgY2hpbGRPd25lcnMgPSBmaW5kT3duZXJTdGFjayhjaGlsZE93bmVyKTtcbiAgICAgIHZhciBhbmNlc3Rvck93bmVycyA9IGZpbmRPd25lclN0YWNrKGFuY2VzdG9yT3duZXIpO1xuXG4gICAgICB2YXIgbWluU3RhY2tMZW4gPSBNYXRoLm1pbihjaGlsZE93bmVycy5sZW5ndGgsIGFuY2VzdG9yT3duZXJzLmxlbmd0aCk7XG4gICAgICB2YXIgaTtcblxuICAgICAgdmFyIGRlZXBlc3RDb21tb24gPSAtMTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtaW5TdGFja0xlbjsgaSsrKSB7XG4gICAgICAgIGlmIChjaGlsZE93bmVyc1tpXSA9PT0gYW5jZXN0b3JPd25lcnNbaV0pIHtcbiAgICAgICAgICBkZWVwZXN0Q29tbW9uID0gaTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgVU5LTk9XTiA9ICcodW5rbm93biknO1xuICAgICAgdmFyIGNoaWxkT3duZXJOYW1lcyA9IGNoaWxkT3duZXJzLnNsaWNlKGRlZXBlc3RDb21tb24gKyAxKS5tYXAoZnVuY3Rpb24gKGluc3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3QuZ2V0TmFtZSgpIHx8IFVOS05PV047XG4gICAgICB9KTtcbiAgICAgIHZhciBhbmNlc3Rvck93bmVyTmFtZXMgPSBhbmNlc3Rvck93bmVycy5zbGljZShkZWVwZXN0Q29tbW9uICsgMSkubWFwKGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIHJldHVybiBpbnN0LmdldE5hbWUoKSB8fCBVTktOT1dOO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3duZXJJbmZvID0gW10uY29uY2F0KFxuICAgICAgLy8gSWYgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5zdGFuY2VzIGhhdmUgYSBjb21tb24gb3duZXIgYW5jZXN0b3IsIHN0YXJ0XG4gICAgICAvLyB3aXRoIHRoYXQgLS0gb3RoZXJ3aXNlIHdlIGp1c3Qgc3RhcnQgd2l0aCB0aGUgcGFyZW50J3Mgb3duZXJzLlxuICAgICAgZGVlcGVzdENvbW1vbiAhPT0gLTEgPyBjaGlsZE93bmVyc1tkZWVwZXN0Q29tbW9uXS5nZXROYW1lKCkgfHwgVU5LTk9XTiA6IFtdLCBhbmNlc3Rvck93bmVyTmFtZXMsIGFuY2VzdG9yVGFnLFxuICAgICAgLy8gSWYgd2UncmUgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIChub24tcGFyZW50KSBhbmNlc3RyeSwgYWRkICcuLi4nXG4gICAgICBpbnZhbGlkQW5jZXN0b3IgPyBbJy4uLiddIDogW10sIGNoaWxkT3duZXJOYW1lcywgY2hpbGRUYWcpLmpvaW4oJyA+ICcpO1xuXG4gICAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWcgKyAnfCcgKyBvd25lckluZm87XG4gICAgICBpZiAoZGlkV2Fyblt3YXJuS2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaWRXYXJuW3dhcm5LZXldID0gdHJ1ZTtcblxuICAgICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcbiAgICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICAgIH1cblxuICAgICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzICcgKyAnU2VlICVzLiVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgb3duZXJJbmZvLCBpbmZvKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4gU2VlICVzLicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgb3duZXJJbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvO1xuXG4gIC8vIEZvciB0ZXN0aW5nXG4gIHZhbGlkYXRlRE9NTmVzdGluZy5pc1RhZ1ZhbGlkSW5Db250ZXh0ID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG4gICAgcmV0dXJuIGlzVGFnVmFsaWRXaXRoUGFyZW50KHRhZywgcGFyZW50VGFnKSAmJiAhZmluZEludmFsaWRBbmNlc3RvckZvclRhZyh0YWcsIGFuY2VzdG9ySW5mbyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRhdGVET01OZXN0aW5nO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi92YWxpZGF0ZURPTU5lc3RpbmcuanMiLCIvKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsInZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcHV0dGluZyBoaXN0b3J5IG9uIGNvbnRleHQuXG4gKi9cblxudmFyIFJvdXRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlcigpIHtcbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvdXRlcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBtYXRjaDogX3RoaXMuY29tcHV0ZU1hdGNoKF90aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBSb3V0ZXIucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyOiBfZXh0ZW5kcyh7fSwgdGhpcy5jb250ZXh0LnJvdXRlciwge1xuICAgICAgICBoaXN0b3J5OiB0aGlzLnByb3BzLmhpc3RvcnksXG4gICAgICAgIHJvdXRlOiB7XG4gICAgICAgICAgbG9jYXRpb246IHRoaXMucHJvcHMuaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgICBtYXRjaDogdGhpcy5zdGF0ZS5tYXRjaFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wdXRlTWF0Y2ggPSBmdW5jdGlvbiBjb21wdXRlTWF0Y2gocGF0aG5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogJy8nLFxuICAgICAgdXJsOiAnLycsXG4gICAgICBwYXJhbXM6IHt9LFxuICAgICAgaXNFeGFjdDogcGF0aG5hbWUgPT09ICcvJ1xuICAgIH07XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGhpc3RvcnkgPSBfcHJvcHMuaGlzdG9yeTtcblxuXG4gICAgaW52YXJpYW50KGNoaWxkcmVuID09IG51bGwgfHwgUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxLCAnQSA8Um91dGVyPiBtYXkgaGF2ZSBvbmx5IG9uZSBjaGlsZCBlbGVtZW50Jyk7XG5cbiAgICAvLyBEbyB0aGlzIGhlcmUgc28gd2UgY2FuIHNldFN0YXRlIHdoZW4gYSA8UmVkaXJlY3Q+IGNoYW5nZXMgdGhlXG4gICAgLy8gbG9jYXRpb24gaW4gY29tcG9uZW50V2lsbE1vdW50LiBUaGlzIGhhcHBlbnMgZS5nLiB3aGVuIGRvaW5nXG4gICAgLy8gc2VydmVyIHJlbmRlcmluZyB1c2luZyBhIDxTdGF0aWNSb3V0ZXI+LlxuICAgIHRoaXMudW5saXN0ZW4gPSBoaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICBtYXRjaDogX3RoaXMyLmNvbXB1dGVNYXRjaChoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB3YXJuaW5nKHRoaXMucHJvcHMuaGlzdG9yeSA9PT0gbmV4dFByb3BzLmhpc3RvcnksICdZb3UgY2Fubm90IGNoYW5nZSA8Um91dGVyIGhpc3Rvcnk+Jyk7XG4gIH07XG5cbiAgUm91dGVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMudW5saXN0ZW4oKTtcbiAgfTtcblxuICBSb3V0ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuXG4gICAgcmV0dXJuIGNoaWxkcmVuID8gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbikgOiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblJvdXRlci5wcm9wVHlwZXMgPSB7XG4gIGhpc3Rvcnk6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG59O1xuUm91dGVyLmNvbnRleHRUeXBlcyA9IHtcbiAgcm91dGVyOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuUm91dGVyLmNoaWxkQ29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXIvZXMvUm91dGVyLmpzIiwiaW1wb3J0IHBhdGhUb1JlZ2V4cCBmcm9tICdwYXRoLXRvLXJlZ2V4cCc7XG5cbnZhciBwYXR0ZXJuQ2FjaGUgPSB7fTtcbnZhciBjYWNoZUxpbWl0ID0gMTAwMDA7XG52YXIgY2FjaGVDb3VudCA9IDA7XG5cbnZhciBjb21waWxlUGF0aCA9IGZ1bmN0aW9uIGNvbXBpbGVQYXRoKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlS2V5ID0gJycgKyBvcHRpb25zLmVuZCArIG9wdGlvbnMuc3RyaWN0O1xuICB2YXIgY2FjaGUgPSBwYXR0ZXJuQ2FjaGVbY2FjaGVLZXldIHx8IChwYXR0ZXJuQ2FjaGVbY2FjaGVLZXldID0ge30pO1xuXG4gIGlmIChjYWNoZVtwYXR0ZXJuXSkgcmV0dXJuIGNhY2hlW3BhdHRlcm5dO1xuXG4gIHZhciBrZXlzID0gW107XG4gIHZhciByZSA9IHBhdGhUb1JlZ2V4cChwYXR0ZXJuLCBrZXlzLCBvcHRpb25zKTtcbiAgdmFyIGNvbXBpbGVkUGF0dGVybiA9IHsgcmU6IHJlLCBrZXlzOiBrZXlzIH07XG5cbiAgaWYgKGNhY2hlQ291bnQgPCBjYWNoZUxpbWl0KSB7XG4gICAgY2FjaGVbcGF0dGVybl0gPSBjb21waWxlZFBhdHRlcm47XG4gICAgY2FjaGVDb3VudCsrO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVkUGF0dGVybjtcbn07XG5cbi8qKlxuICogUHVibGljIEFQSSBmb3IgbWF0Y2hpbmcgYSBVUkwgcGF0aG5hbWUgdG8gYSBwYXRoIHBhdHRlcm4uXG4gKi9cbnZhciBtYXRjaFBhdGggPSBmdW5jdGlvbiBtYXRjaFBhdGgocGF0aG5hbWUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIG9wdGlvbnMgPSB7IHBhdGg6IG9wdGlvbnMgfTtcblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGF0aCA9IF9vcHRpb25zLnBhdGgsXG4gICAgICBwYXRoID0gX29wdGlvbnMkcGF0aCA9PT0gdW5kZWZpbmVkID8gJy8nIDogX29wdGlvbnMkcGF0aCxcbiAgICAgIF9vcHRpb25zJGV4YWN0ID0gX29wdGlvbnMuZXhhY3QsXG4gICAgICBleGFjdCA9IF9vcHRpb25zJGV4YWN0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9vcHRpb25zJGV4YWN0LFxuICAgICAgX29wdGlvbnMkc3RyaWN0ID0gX29wdGlvbnMuc3RyaWN0LFxuICAgICAgc3RyaWN0ID0gX29wdGlvbnMkc3RyaWN0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9vcHRpb25zJHN0cmljdDtcblxuICB2YXIgX2NvbXBpbGVQYXRoID0gY29tcGlsZVBhdGgocGF0aCwgeyBlbmQ6IGV4YWN0LCBzdHJpY3Q6IHN0cmljdCB9KSxcbiAgICAgIHJlID0gX2NvbXBpbGVQYXRoLnJlLFxuICAgICAga2V5cyA9IF9jb21waWxlUGF0aC5rZXlzO1xuXG4gIHZhciBtYXRjaCA9IHJlLmV4ZWMocGF0aG5hbWUpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciB1cmwgPSBtYXRjaFswXSxcbiAgICAgIHZhbHVlcyA9IG1hdGNoLnNsaWNlKDEpO1xuXG4gIHZhciBpc0V4YWN0ID0gcGF0aG5hbWUgPT09IHVybDtcblxuICBpZiAoZXhhY3QgJiYgIWlzRXhhY3QpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcGF0aCwgLy8gdGhlIHBhdGggcGF0dGVybiB1c2VkIHRvIG1hdGNoXG4gICAgdXJsOiBwYXRoID09PSAnLycgJiYgdXJsID09PSAnJyA/ICcvJyA6IHVybCwgLy8gdGhlIG1hdGNoZWQgcG9ydGlvbiBvZiB0aGUgVVJMXG4gICAgaXNFeGFjdDogaXNFeGFjdCwgLy8gd2hldGhlciBvciBub3Qgd2UgbWF0Y2hlZCBleGFjdGx5XG4gICAgcGFyYW1zOiBrZXlzLnJlZHVjZShmdW5jdGlvbiAobWVtbywga2V5LCBpbmRleCkge1xuICAgICAgbWVtb1trZXkubmFtZV0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwge30pXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtYXRjaFBhdGg7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXIvZXMvbWF0Y2hQYXRoLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBGb3JrZWQgZnJvbSBmYmpzL3dhcm5pbmc6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmJqcy9ibG9iL2U2NmJhMjBhZDViZTQzM2ViNTQ0MjNmMmIwOTdkODI5MzI0ZDlkZTYvcGFja2FnZXMvZmJqcy9zcmMvX19mb3Jrc19fL3dhcm5pbmcuanNcbiAqXG4gKiBPbmx5IGNoYW5nZSBpcyB3ZSB1c2UgY29uc29sZS53YXJuIGluc3RlYWQgb2YgY29uc29sZS5lcnJvcixcbiAqIGFuZCBkbyBub3RoaW5nIHdoZW4gJ2NvbnNvbGUnIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKiBUaGlzIHJlYWxseSBzaW1wbGlmaWVzIHRoZSBjb2RlLlxuICogLS0tXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIGxvd1ByaW9yaXR5V2FybmluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcblxuICBsb3dQcmlvcml0eVdhcm5pbmcgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvd1ByaW9yaXR5V2FybmluZztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9sb3dQcmlvcml0eVdhcm5pbmcuanMiLCJpbXBvcnQgY3JlYXRlU3RvcmUgZnJvbSAnLi9jcmVhdGVTdG9yZSc7XG5pbXBvcnQgY29tYmluZVJlZHVjZXJzIGZyb20gJy4vY29tYmluZVJlZHVjZXJzJztcbmltcG9ydCBiaW5kQWN0aW9uQ3JlYXRvcnMgZnJvbSAnLi9iaW5kQWN0aW9uQ3JlYXRvcnMnO1xuaW1wb3J0IGFwcGx5TWlkZGxld2FyZSBmcm9tICcuL2FwcGx5TWlkZGxld2FyZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi91dGlscy93YXJuaW5nJztcblxuLypcbiogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuKiBJZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gbWluaWZpZWQgYW5kIE5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsIHdhcm4gdGhlIHVzZXIuXG4qL1xuZnVuY3Rpb24gaXNDcnVzaGVkKCkge31cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGlzQ3J1c2hlZC5uYW1lID09PSAnc3RyaW5nJyAmJiBpc0NydXNoZWQubmFtZSAhPT0gJ2lzQ3J1c2hlZCcpIHtcbiAgd2FybmluZygnWW91IGFyZSBjdXJyZW50bHkgdXNpbmcgbWluaWZpZWQgY29kZSBvdXRzaWRlIG9mIE5PREVfRU5WID09PSBcXCdwcm9kdWN0aW9uXFwnLiAnICsgJ1RoaXMgbWVhbnMgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgYSBzbG93ZXIgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgUmVkdXguICcgKyAnWW91IGNhbiB1c2UgbG9vc2UtZW52aWZ5IChodHRwczovL2dpdGh1Yi5jb20vemVydG9zaC9sb29zZS1lbnZpZnkpIGZvciBicm93c2VyaWZ5ICcgKyAnb3IgRGVmaW5lUGx1Z2luIGZvciB3ZWJwYWNrIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMDMwMDMxKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGJpbmRBY3Rpb25DcmVhdG9ycywgYXBwbHlNaWRkbGV3YXJlLCBjb21wb3NlIH07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWR1eC9lcy9pbmRleC5qcyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogVXBzdHJlYW0gdmVyc2lvbiBvZiBldmVudCBsaXN0ZW5lci4gRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgc3BlY2lmaWNcbiAqIG5hdHVyZSBvZiBwbGF0Zm9ybS5cbiAqL1xudmFyIEV2ZW50TGlzdGVuZXIgPSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGJ1YmJsZSBwaGFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNrJyBvciAnbW91c2VvdmVyJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3ZlYCBtZXRob2QuXG4gICAqL1xuICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgICAgdGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHRhcmdldCBET00gZWxlbWVudCB0byByZWdpc3RlciBsaXN0ZW5lciBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBFdmVudCB0eXBlLCBlLmcuICdjbGljaycgb3IgJ21vdXNlb3ZlcicuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIGEgYHJlbW92ZWAgbWV0aG9kLlxuICAgKi9cbiAgY2FwdHVyZTogZnVuY3Rpb24gY2FwdHVyZSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBhICcgKyAnYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhcHR1cmUgcGhhc2UuIFlvdXIgYXBwbGljYXRpb24gJyArICd3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBlbXB0eUZ1bmN0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZWdpc3RlckRlZmF1bHQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdCgpIHt9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50TGlzdGVuZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9FdmVudExpc3RlbmVyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIGlucHV0L3RleHRhcmVhIHRvIGZvY3VzXG4gKi9cblxuZnVuY3Rpb24gZm9jdXNOb2RlKG5vZGUpIHtcbiAgLy8gSUU4IGNhbiB0aHJvdyBcIkNhbid0IG1vdmUgZm9jdXMgdG8gdGhlIGNvbnRyb2wgYmVjYXVzZSBpdCBpcyBpbnZpc2libGUsXG4gIC8vIG5vdCBlbmFibGVkLCBvciBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhY2NlcHQgdGhlIGZvY3VzLlwiIGZvciBhbGwga2luZHMgb2ZcbiAgLy8gcmVhc29ucyB0aGF0IGFyZSB0b28gZXhwZW5zaXZlIGFuZCBmcmFnaWxlIHRvIHRlc3QuXG4gIHRyeSB7XG4gICAgbm9kZS5mb2N1cygpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvY3VzTm9kZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2ZvY3VzTm9kZS5qcyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgZmItd3d3L3R5cGVvZi11bmRlZmluZWQgKi9cblxuLyoqXG4gKiBTYW1lIGFzIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYnV0IHdyYXBzIGluIGEgdHJ5LWNhdGNoIGJsb2NrLiBJbiBJRSBpdCBpc1xuICogbm90IHNhZmUgdG8gY2FsbCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGlmIHRoZXJlIGlzIG5vdGhpbmcgZm9jdXNlZC5cbiAqXG4gKiBUaGUgYWN0aXZlRWxlbWVudCB3aWxsIGJlIG51bGwgb25seSBpZiB0aGUgZG9jdW1lbnQgb3IgZG9jdW1lbnQgYm9keSBpcyBub3RcbiAqIHlldCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7P0RPTURvY3VtZW50fSBkb2MgRGVmYXVsdHMgdG8gY3VycmVudCBkb2N1bWVudC5cbiAqIEByZXR1cm4gez9ET01FbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykgLyo/RE9NRWxlbWVudCove1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWN0aXZlRWxlbWVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgY2FuVXNlRE9NID0gZXhwb3J0cy5jYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG52YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGV4cG9ydHMuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIgPyBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSkgOiBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xufTtcblxudmFyIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSBleHBvcnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50LCBsaXN0ZW5lcikge1xuICByZXR1cm4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyID8gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpIDogbm9kZS5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcbn07XG5cbnZhciBnZXRDb25maXJtYXRpb24gPSBleHBvcnRzLmdldENvbmZpcm1hdGlvbiA9IGZ1bmN0aW9uIGdldENvbmZpcm1hdGlvbihtZXNzYWdlLCBjYWxsYmFjaykge1xuICByZXR1cm4gY2FsbGJhY2sod2luZG93LmNvbmZpcm0obWVzc2FnZSkpO1xufTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hbGVydFxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgaXMgc3VwcG9ydGVkLiBUYWtlbiBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvaGlzdG9yeS5qc1xuICogY2hhbmdlZCB0byBhdm9pZCBmYWxzZSBuZWdhdGl2ZXMgZm9yIFdpbmRvd3MgUGhvbmVzOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1yb3V0ZXIvaXNzdWVzLzU4NlxuICovXG52YXIgc3VwcG9ydHNIaXN0b3J5ID0gZXhwb3J0cy5zdXBwb3J0c0hpc3RvcnkgPSBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKSB7XG4gIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuXG4gIGlmICgodWEuaW5kZXhPZignQW5kcm9pZCAyLicpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdBbmRyb2lkIDQuMCcpICE9PSAtMSkgJiYgdWEuaW5kZXhPZignTW9iaWxlIFNhZmFyaScpICE9PSAtMSAmJiB1YS5pbmRleE9mKCdDaHJvbWUnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignV2luZG93cyBQaG9uZScpID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB3aW5kb3cuaGlzdG9yeSAmJiAncHVzaFN0YXRlJyBpbiB3aW5kb3cuaGlzdG9yeTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGJyb3dzZXIgZmlyZXMgcG9wc3RhdGUgb24gaGFzaCBjaGFuZ2UuXG4gKiBJRTEwIGFuZCBJRTExIGRvIG5vdC5cbiAqL1xudmFyIHN1cHBvcnRzUG9wU3RhdGVPbkhhc2hDaGFuZ2UgPSBleHBvcnRzLnN1cHBvcnRzUG9wU3RhdGVPbkhhc2hDaGFuZ2UgPSBmdW5jdGlvbiBzdXBwb3J0c1BvcFN0YXRlT25IYXNoQ2hhbmdlKCkge1xuICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID09PSAtMTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBmYWxzZSBpZiB1c2luZyBnbyhuKSB3aXRoIGhhc2ggaGlzdG9yeSBjYXVzZXMgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICovXG52YXIgc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2ggPSBleHBvcnRzLnN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoID0gZnVuY3Rpb24gc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2goKSB7XG4gIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPT09IC0xO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBwb3BzdGF0ZSBldmVudCBpcyBhbiBleHRyYW5lb3VzIFdlYktpdCBldmVudC5cbiAqIEFjY291bnRzIGZvciB0aGUgZmFjdCB0aGF0IENocm9tZSBvbiBpT1MgZmlyZXMgcmVhbCBwb3BzdGF0ZSBldmVudHNcbiAqIGNvbnRhaW5pbmcgdW5kZWZpbmVkIHN0YXRlIHdoZW4gcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uLlxuICovXG52YXIgaXNFeHRyYW5lb3VzUG9wc3RhdGVFdmVudCA9IGV4cG9ydHMuaXNFeHRyYW5lb3VzUG9wc3RhdGVFdmVudCA9IGZ1bmN0aW9uIGlzRXh0cmFuZW91c1BvcHN0YXRlRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50LnN0YXRlID09PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDcmlPUycpID09PSAtMTtcbn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9oaXN0b3J5L0RPTVV0aWxzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgICBjb250ZXh0VHlwZXM6IHRydWUsXG4gICAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICAgIGRpc3BsYXlOYW1lOiB0cnVlLFxuICAgIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgICBtaXhpbnM6IHRydWUsXG4gICAgcHJvcFR5cGVzOiB0cnVlLFxuICAgIHR5cGU6IHRydWVcbn07XG5cbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICAgIG5hbWU6IHRydWUsXG4gICAgbGVuZ3RoOiB0cnVlLFxuICAgIHByb3RvdHlwZTogdHJ1ZSxcbiAgICBjYWxsZXI6IHRydWUsXG4gICAgYXJndW1lbnRzOiB0cnVlLFxuICAgIGFyaXR5OiB0cnVlXG59O1xuXG52YXIgaXNHZXRPd25Qcm9wZXJ0eVN5bWJvbHNBdmFpbGFibGUgPSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgY3VzdG9tU3RhdGljcykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykgeyAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGlzR2V0T3duUHJvcGVydHlTeW1ib2xzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFSRUFDVF9TVEFUSUNTW2tleXNbaV1dICYmICFLTk9XTl9TVEFUSUNTW2tleXNbaV1dICYmICghY3VzdG9tU3RhdGljcyB8fCAhY3VzdG9tU3RhdGljc1trZXlzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnRba2V5c1tpXV0gPSBzb3VyY2VDb21wb25lbnRba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9pbmRleC5qcyIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9sb2Rhc2gtZXMvX1N5bWJvbC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gUmVhY3QgMTUuNSByZWZlcmVuY2VzIHRoaXMgbW9kdWxlLCBhbmQgYXNzdW1lcyBQcm9wVHlwZXMgYXJlIHN0aWxsIGNhbGxhYmxlIGluIHByb2R1Y3Rpb24uXG4vLyBUaGVyZWZvcmUgd2UgcmUtZXhwb3J0IGRldmVsb3BtZW50LW9ubHkgdmVyc2lvbiB3aXRoIGFsbCB0aGUgUHJvcFR5cGVzIGNoZWNrcyBoZXJlLlxuLy8gSG93ZXZlciBpZiBvbmUgaXMgbWlncmF0aW5nIHRvIHRoZSBgcHJvcC10eXBlc2AgbnBtIGxpYnJhcnksIHRoZXkgd2lsbCBnbyB0aHJvdWdoIHRoZVxuLy8gYGluZGV4LmpzYCBlbnRyeSBwb2ludCwgYW5kIGl0IHdpbGwgYnJhbmNoIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQuXG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQpIHtcbiAgLy8gSXQgaXMgc3RpbGwgYWxsb3dlZCBpbiAxNS41LlxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IGZhbHNlO1xuICByZXR1cm4gZmFjdG9yeShpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9wcm9wLXR5cGVzL2ZhY3RvcnkuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXJcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCVzYCBwcm9wIG9uIGAlc2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nLFxuICAgICAgICAgICAgICBwcm9wRnVsbE5hbWUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGlkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICVzIGF0IGluZGV4ICVzLicsXG4gICAgICAgICAgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpLFxuICAgICAgICAgIGlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG5cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107XG5cbi8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogTW9zdCBzdHlsZSBwcm9wZXJ0aWVzIGNhbiBiZSB1bnNldCBieSBkb2luZyAuc3R5bGVbcHJvcF0gPSAnJyBidXQgSUU4XG4gKiBkb2Vzbid0IGxpa2UgZG9pbmcgdGhhdCB3aXRoIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHNvIGZvciB0aGUgcHJvcGVydGllcyB0aGF0XG4gKiBJRTggYnJlYWtzIG9uLCB3aGljaCBhcmUgbGlzdGVkIGhlcmUsIHdlIGluc3RlYWQgdW5zZXQgZWFjaCBvZiB0aGVcbiAqIGluZGl2aWR1YWwgcHJvcGVydGllcy4gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzg1LlxuICogVGhlIDQtdmFsdWUgJ2Nsb2NrJyBwcm9wZXJ0aWVzIGxpa2UgbWFyZ2luLCBwYWRkaW5nLCBib3JkZXItd2lkdGggc2VlbSB0b1xuICogYmVoYXZlIHdpdGhvdXQgYW55IHByb2JsZW1zLiBDdXJpb3VzbHksIGxpc3Qtc3R5bGUgd29ya3MgdG9vIHdpdGhvdXQgYW55XG4gKiBzcGVjaWFsIHByb2RkaW5nLlxuICovXG52YXIgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zID0ge1xuICBiYWNrZ3JvdW5kOiB7XG4gICAgYmFja2dyb3VuZEF0dGFjaG1lbnQ6IHRydWUsXG4gICAgYmFja2dyb3VuZENvbG9yOiB0cnVlLFxuICAgIGJhY2tncm91bmRJbWFnZTogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWUsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogdHJ1ZVxuICB9LFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IHtcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWVcbiAgfSxcbiAgYm9yZGVyOiB7XG4gICAgYm9yZGVyV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyQm90dG9tOiB7XG4gICAgYm9yZGVyQm90dG9tV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyTGVmdDoge1xuICAgIGJvcmRlckxlZnRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJMZWZ0U3R5bGU6IHRydWUsXG4gICAgYm9yZGVyTGVmdENvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlclJpZ2h0OiB7XG4gICAgYm9yZGVyUmlnaHRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJSaWdodFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlclJpZ2h0Q29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyVG9wOiB7XG4gICAgYm9yZGVyVG9wV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyVG9wU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyVG9wQ29sb3I6IHRydWVcbiAgfSxcbiAgZm9udDoge1xuICAgIGZvbnRTdHlsZTogdHJ1ZSxcbiAgICBmb250VmFyaWFudDogdHJ1ZSxcbiAgICBmb250V2VpZ2h0OiB0cnVlLFxuICAgIGZvbnRTaXplOiB0cnVlLFxuICAgIGxpbmVIZWlnaHQ6IHRydWUsXG4gICAgZm9udEZhbWlseTogdHJ1ZVxuICB9LFxuICBvdXRsaW5lOiB7XG4gICAgb3V0bGluZVdpZHRoOiB0cnVlLFxuICAgIG91dGxpbmVTdHlsZTogdHJ1ZSxcbiAgICBvdXRsaW5lQ29sb3I6IHRydWVcbiAgfVxufTtcblxudmFyIENTU1Byb3BlcnR5ID0ge1xuICBpc1VuaXRsZXNzTnVtYmVyOiBpc1VuaXRsZXNzTnVtYmVyLFxuICBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6IHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHkuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgcHNldWRvLWV2ZW50IG1vZHVsZSB0byBoZWxwIGtlZXAgdHJhY2sgb2YgY29tcG9uZW50cyB3YWl0aW5nIHRvXG4gKiBiZSBub3RpZmllZCB3aGVuIHRoZWlyIERPTSByZXByZXNlbnRhdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50cyBgUG9vbGVkQ2xhc3NgLCBzbyB5b3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEluc3RlYWQsIHVzZSBgQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKWAuXG4gKlxuICogQGNsYXNzIFJlYWN0TW91bnRSZWFkeVxuICogQGltcGxlbWVudHMgUG9vbGVkQ2xhc3NcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBDYWxsYmFja1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYWxsYmFja1F1ZXVlKGFyZykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYWxsYmFja1F1ZXVlKTtcblxuICAgIHRoaXMuX2NhbGxiYWNrcyA9IG51bGw7XG4gICAgdGhpcy5fY29udGV4dHMgPSBudWxsO1xuICAgIHRoaXMuX2FyZyA9IGFyZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBgbm90aWZ5QWxsYCBpcyBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBJbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBjb250ZXh0IENvbnRleHQgdG8gY2FsbCBgY2FsbGJhY2tgIHdpdGguXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IFtdO1xuICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB0aGlzLl9jb250ZXh0cyA9IHRoaXMuX2NvbnRleHRzIHx8IFtdO1xuICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEludm9rZXMgYWxsIGVucXVldWVkIGNhbGxiYWNrcyBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBpcyBpbnZva2VkIGFmdGVyXG4gICAqIHRoZSBET00gcmVwcmVzZW50YXRpb24gb2YgYSBjb21wb25lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciB1cGRhdGVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5ub3RpZnlBbGwgPSBmdW5jdGlvbiBub3RpZnlBbGwoKSB7XG4gICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcztcbiAgICB2YXIgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cztcbiAgICB2YXIgYXJnID0gdGhpcy5fYXJnO1xuICAgIGlmIChjYWxsYmFja3MgJiYgY29udGV4dHMpIHtcbiAgICAgICEoY2FsbGJhY2tzLmxlbmd0aCA9PT0gY29udGV4dHMubGVuZ3RoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNtYXRjaGVkIGxpc3Qgb2YgY29udGV4dHMgaW4gY2FsbGJhY2sgcXVldWUnKSA6IF9wcm9kSW52YXJpYW50KCcyNCcpIDogdm9pZCAwO1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldLCBhcmcpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICBjb250ZXh0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfTtcblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5jaGVja3BvaW50ID0gZnVuY3Rpb24gY2hlY2twb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzID8gdGhpcy5fY2FsbGJhY2tzLmxlbmd0aCA6IDA7XG4gIH07XG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucm9sbGJhY2sgPSBmdW5jdGlvbiByb2xsYmFjayhsZW4pIHtcbiAgICBpZiAodGhpcy5fY2FsbGJhY2tzICYmIHRoaXMuX2NvbnRleHRzKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MubGVuZ3RoID0gbGVuO1xuICAgICAgdGhpcy5fY29udGV4dHMubGVuZ3RoID0gbGVuO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBxdWV1ZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcy5cbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rpb24gZGVzdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH07XG5cbiAgcmV0dXJuIENhbGxiYWNrUXVldWU7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENhbGxiYWNrUXVldWUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9DYWxsYmFja1F1ZXVlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXInKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSkgOiB2b2lkIDA7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCBwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICYmICF2YWx1ZSB8fCBwcm9wZXJ0eUluZm8uaGFzTnVtZXJpY1ZhbHVlICYmIGlzTmFOKHZhbHVlKSB8fCBwcm9wZXJ0eUluZm8uaGFzUG9zaXRpdmVOdW1lcmljVmFsdWUgJiYgdmFsdWUgPCAxIHx8IHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggRE9NIHByb3BlcnRpZXMuXG4gKi9cbnZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhlIElEIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVW5lc2NhcGVkIElELlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcuXG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIoaWQpO1xuICB9LFxuXG4gIHNldEF0dHJpYnV0ZUZvcklEOiBmdW5jdGlvbiAobm9kZSwgaWQpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSwgaWQpO1xuICB9LFxuXG4gIGNyZWF0ZU1hcmt1cEZvclJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSArICc9XCJcIic7XG4gIH0sXG5cbiAgc2V0QXR0cmlidXRlRm9yUm9vdDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShET01Qcm9wZXJ0eS5ST09UX0FUVFJJQlVURV9OQU1FLCAnJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4gez9zdHJpbmd9IE1hcmt1cCBzdHJpbmcsIG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IHdhcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgaWYgKHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICBpZiAocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSB8fCBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlTmFtZSArICc9XCJcIic7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXR0cmlidXRlTmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciBhIGN1c3RvbSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcsIG9yIGVtcHR5IHN0cmluZyBpZiB0aGUgcHJvcGVydHkgd2FzIGludmFsaWQuXG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBuYW1lICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICBzZXRWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIHZhciBtdXRhdGlvbk1ldGhvZCA9IHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZDtcbiAgICAgIGlmIChtdXRhdGlvbk1ldGhvZCkge1xuICAgICAgICBtdXRhdGlvbk1ldGhvZChub2RlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7XG4gICAgICAgIC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJvcGVybHlcbiAgICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgICBub2RlW3Byb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgICB2YXIgbmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSB8fCBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAnJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXlsb2FkID0ge307XG4gICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNldFZhbHVlRm9yQXR0cmlidXRlOiBmdW5jdGlvbiAobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCAnJyArIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBheWxvYWQgPSB7fTtcbiAgICAgIHBheWxvYWRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3VwZGF0ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gYXR0cmlidXRlcyBmcm9tIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvckF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAncmVtb3ZlIGF0dHJpYnV0ZScsXG4gICAgICAgIHBheWxvYWQ6IG5hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGRlbGV0ZVZhbHVlRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChub2RlLCBuYW1lKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q7XG4gICAgICBpZiAobXV0YXRpb25NZXRob2QpIHtcbiAgICAgICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgICBpZiAocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSkge1xuICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICdyZW1vdmUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogbmFtZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVByb3BlcnR5T3BlcmF0aW9ucztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHlPcGVyYXRpb25zLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSB7XG4gIGhhc0NhY2hlZENoaWxkTm9kZXM6IDEgPDwgMFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudEZsYWdzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9uc0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQoKSB7XG4gIGlmICh0aGlzLl9yb290Tm9kZUlEICYmIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlKSB7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSBmYWxzZTtcblxuICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnModGhpcywgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSB7XG4gIGlmIChvd25lcikge1xuICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG5cbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhpbnN0LCBwcm9wcykge1xuICB2YXIgb3duZXIgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gIExpbmtlZFZhbHVlVXRpbHMuY2hlY2tQcm9wVHlwZXMoJ3NlbGVjdCcsIHByb3BzLCBvd25lcik7XG5cbiAgaWYgKHByb3BzLnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBzZWxlY3RgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBpc0FycmF5KSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gaW5zdFxuICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBsZVxuICogQHBhcmFtIHsqfSBwcm9wVmFsdWUgQSBzdHJpbmdhYmxlICh3aXRoIGBtdWx0aXBsZWAsIGEgbGlzdCBvZiBzdHJpbmdhYmxlcykuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKGluc3QsIG11bHRpcGxlLCBwcm9wVmFsdWUpIHtcbiAgdmFyIHNlbGVjdGVkVmFsdWUsIGk7XG4gIHZhciBvcHRpb25zID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICBzZWxlY3RlZFZhbHVlID0ge307XG4gICAgZm9yIChpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJyArIHByb3BWYWx1ZVtpXV0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zW2ldLnZhbHVlKTtcbiAgICAgIGlmIChvcHRpb25zW2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICBzZWxlY3RlZFZhbHVlID0gJycgKyBwcm9wVmFsdWU7XG4gICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvcHRpb25zW2ldLnZhbHVlID09PSBzZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgb3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG52YXIgUmVhY3RET01TZWxlY3QgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7XG4gICAgICBwZW5kaW5nVXBkYXRlOiBmYWxzZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KSxcbiAgICAgIHdhc011bHRpcGxlOiBCb29sZWFuKHByb3BzLm11bHRpcGxlKVxuICAgIH07XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7XG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBnZXRTZWxlY3RWYWx1ZUNvbnRleHQ6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgLy8gUmVhY3RET01PcHRpb24gbG9va3MgYXQgdGhpcyBpbml0aWFsIHZhbHVlIHNvIHRoZSBpbml0aWFsIGdlbmVyYXRlZFxuICAgIC8vIG1hcmt1cCBoYXMgY29ycmVjdCBgc2VsZWN0ZWRgIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTtcbiAgfSxcblxuICBwb3N0VXBkYXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIEFmdGVyIHRoZSBpbml0aWFsIG1vdW50LCB3ZSBjb250cm9sIHNlbGVjdGVkLW5lc3MgbWFudWFsbHkgc28gZG9uJ3QgcGFzc1xuICAgIC8vIHRoaXMgdmFsdWUgZG93blxuICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICB2YXIgd2FzTXVsdGlwbGUgPSBpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gICAgaW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gQm9vbGVhbihwcm9wcy5tdWx0aXBsZSk7XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSBCb29sZWFuKHByb3BzLm11bHRpcGxlKSkge1xuICAgICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLm11bHRpcGxlID8gW10gOiAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpO1xuXG4gIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSB0cnVlO1xuICB9XG4gIFJlYWN0VXBkYXRlcy5hc2FwKHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkLCB0aGlzKTtcbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NU2VsZWN0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUNvbXBvbmVudEZhY3Rvcnk7XG5cbnZhciBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uID0ge1xuICBpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6IGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZW1wdHlDb21wb25lbnRGYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxufTtcblxudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSB7XG4gIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIGVtcHR5Q29tcG9uZW50RmFjdG9yeShpbnN0YW50aWF0ZSk7XG4gIH1cbn07XG5cblJlYWN0RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uID0gUmVhY3RFbXB0eUNvbXBvbmVudEluamVjdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVtcHR5Q29tcG9uZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEVtcHR5Q29tcG9uZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSB7XG4gIC8vIFdoZW4gdHJ1ZSwgY2FsbCBjb25zb2xlLnRpbWUoKSBiZWZvcmUgYW5kIC50aW1lRW5kKCkgYWZ0ZXIgZWFjaCB0b3AtbGV2ZWxcbiAgLy8gcmVuZGVyIChib3RoIGluaXRpYWwgcmVuZGVycyBhbmQgdXBkYXRlcykuIFVzZWZ1bCB3aGVuIGxvb2tpbmcgYXQgcHJvZC1tb2RlXG4gIC8vIHRpbWVsaW5lIHByb2ZpbGVzIGluIENocm9tZSwgZm9yIGV4YW1wbGUuXG4gIGxvZ1RvcExldmVsUmVuZGVyczogZmFsc2Vcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RGZWF0dXJlRmxhZ3M7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RmVhdHVyZUZsYWdzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gbnVsbDtcbnZhciB0ZXh0Q29tcG9uZW50Q2xhc3MgPSBudWxsO1xuXG52YXIgUmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9uID0ge1xuICAvLyBUaGlzIGFjY2VwdHMgYSBjbGFzcyB0aGF0IHJlY2VpdmVzIHRoZSB0YWcgc3RyaW5nLiBUaGlzIGlzIGEgY2F0Y2ggYWxsXG4gIC8vIHRoYXQgY2FuIHJlbmRlciBhbnkga2luZCBvZiB0YWcuXG4gIGluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNzKSB7XG4gICAgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7XG4gIH0sXG4gIC8vIFRoaXMgYWNjZXB0cyBhIHRleHQgY29tcG9uZW50IGNsYXNzIHRoYXQgdGFrZXMgdGhlIHRleHQgc3RyaW5nIHRvIGJlXG4gIC8vIHJlbmRlcmVkIGFzIHByb3BzLlxuICBpbmplY3RUZXh0Q29tcG9uZW50Q2xhc3M6IGZ1bmN0aW9uIChjb21wb25lbnRDbGFzcykge1xuICAgIHRleHRDb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudENsYXNzO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCBhIGhvc3QgaW50ZXJuYWwgY29tcG9uZW50IGNsYXNzIGZvciBhIHNwZWNpZmljIHRhZy5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjcmVhdGUuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGludGVybmFsIGNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KSB7XG4gICFnZW5lcmljQ29tcG9uZW50Q2xhc3MgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBjb21wb25lbnQgZm9yIHRoZSB0YWcgJXMnLCBlbGVtZW50LnR5cGUpIDogX3Byb2RJbnZhcmlhbnQoJzExMScsIGVsZW1lbnQudHlwZSkgOiB2b2lkIDA7XG4gIHJldHVybiBuZXcgZ2VuZXJpY0NvbXBvbmVudENsYXNzKGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhY3RUZXh0fSB0ZXh0XG4gKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3JUZXh0KHRleHQpIHtcbiAgcmV0dXJuIG5ldyB0ZXh0Q29tcG9uZW50Q2xhc3ModGV4dCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1RleHRDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBjb21wb25lbnQgaW5zdGFuY2VvZiB0ZXh0Q29tcG9uZW50Q2xhc3M7XG59XG5cbnZhciBSZWFjdEhvc3RDb21wb25lbnQgPSB7XG4gIGNyZWF0ZUludGVybmFsQ29tcG9uZW50OiBjcmVhdGVJbnRlcm5hbENvbXBvbmVudCxcbiAgY3JlYXRlSW5zdGFuY2VGb3JUZXh0OiBjcmVhdGVJbnN0YW5jZUZvclRleHQsXG4gIGlzVGV4dENvbXBvbmVudDogaXNUZXh0Q29tcG9uZW50LFxuICBpbmplY3Rpb246IFJlYWN0SG9zdENvbXBvbmVudEluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEhvc3RDb21wb25lbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SG9zdENvbXBvbmVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTVNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RET01TZWxlY3Rpb24nKTtcblxudmFyIGNvbnRhaW5zTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NvbnRhaW5zTm9kZScpO1xudmFyIGZvY3VzTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2ZvY3VzTm9kZScpO1xudmFyIGdldEFjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50Jyk7XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBjb250YWluc05vZGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0ge1xuICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xuICB9LFxuXG4gIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgICBzZWxlY3Rpb25SYW5nZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICAgKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAgICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gICAqL1xuICByZXN0b3JlU2VsZWN0aW9uOiBmdW5jdGlvbiAocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICAgIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gICAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuICAgIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIGlmIChSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgICBSZWFjdElucHV0U2VsZWN0aW9uLnNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICAgIH1cbiAgICAgIGZvY3VzTm9kZShwcmlvckZvY3VzZWRFbGVtKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICAgKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAgICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAgICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gICAqL1xuICBnZXRTZWxlY3Rpb246IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciBzZWxlY3Rpb247XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICAvLyBJRTggaW5wdXQuXG4gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICAgIC8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBzZWxlY3Rpb24gcGVyIGRvY3VtZW50IGluIElFLCBzbyBpdCBtdXN0XG4gICAgICAvLyBiZSBpbiBvdXIgZWxlbWVudC5cbiAgICAgIGlmIChyYW5nZS5wYXJlbnRFbGVtZW50KCkgPT09IGlucHV0KSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgICBzdGFydDogLXJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aCksXG4gICAgICAgICAgZW5kOiAtcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgICBzZWxlY3Rpb24gPSBSZWFjdERPTVNlbGVjdGlvbi5nZXRPZmZzZXRzKGlucHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uIHx8IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAgICogdGhlIGlucHV0LlxuICAgKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gICAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAgICovXG4gIHNldFNlbGVjdGlvbjogZnVuY3Rpb24gKGlucHV0LCBvZmZzZXRzKSB7XG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICB9XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICB2YXIgcmFuZ2UgPSBpbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydCk7XG4gICAgICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQgLSBzdGFydCk7XG4gICAgICByYW5nZS5zZWxlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RET01TZWxlY3Rpb24uc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5wdXRTZWxlY3Rpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SW5wdXRTZWxlY3Rpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCcuL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlcicpO1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERPTUNvbnRhaW5lckluZm8gPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29udGFpbmVySW5mbycpO1xudmFyIFJlYWN0RE9NRmVhdHVyZUZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdERPTUZlYXR1cmVGbGFncycpO1xudmFyIFJlYWN0RmVhdHVyZUZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdEZlYXR1cmVGbGFncycpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdE1hcmt1cENoZWNrc3VtID0gcmVxdWlyZSgnLi9SZWFjdE1hcmt1cENoZWNrc3VtJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZVF1ZXVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcbnZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUU7XG52YXIgUk9PVF9BVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5ST09UX0FUVFJJQlVURV9OQU1FO1xuXG52YXIgRUxFTUVOVF9OT0RFX1RZUEUgPSAxO1xudmFyIERPQ19OT0RFX1RZUEUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSA9IDExO1xuXG52YXIgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRCA9IHt9O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiB0aGF0J3Mgbm90IGNvbW1vbiBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gc3RyaW5ncy5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHdoZXJlIHRoZSBzdHJpbmdzIGRpdmVyZ2VcbiAqL1xuZnVuY3Rpb24gZmlyc3REaWZmZXJlbmNlSW5kZXgoc3RyaW5nMSwgc3RyaW5nMikge1xuICB2YXIgbWluTGVuID0gTWF0aC5taW4oc3RyaW5nMS5sZW5ndGgsIHN0cmluZzIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW5MZW47IGkrKykge1xuICAgIGlmIChzdHJpbmcxLmNoYXJBdChpKSAhPT0gc3RyaW5nMi5jaGFyQXQoaSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5nMS5sZW5ndGggPT09IHN0cmluZzIubGVuZ3RoID8gLTEgOiBtaW5MZW47XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTURvY3VtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdGhhdCBtYXkgY29udGFpblxuICogYSBSZWFjdCBjb21wb25lbnRcbiAqIEByZXR1cm4gez8qfSBET00gZWxlbWVudCB0aGF0IG1heSBoYXZlIHRoZSByZWFjdFJvb3QgSUQsIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxHZXRJRChub2RlKSB7XG4gIC8vIElmIG5vZGUgaXMgc29tZXRoaW5nIGxpa2UgYSB3aW5kb3csIGRvY3VtZW50LCBvciB0ZXh0IG5vZGUsIG5vbmUgb2ZcbiAgLy8gd2hpY2ggc3VwcG9ydCBhdHRyaWJ1dGVzIG9yIGEgLmdldEF0dHJpYnV0ZSBtZXRob2QsIGdyYWNlZnVsbHkgcmV0dXJuXG4gIC8vIHRoZSBlbXB0eSBzdHJpbmcsIGFzIGlmIHRoZSBhdHRyaWJ1dGUgd2VyZSBtaXNzaW5nLlxuICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKSB8fCAnJztcbn1cblxuLyoqXG4gKiBNb3VudHMgdGhpcyBjb21wb25lbnQgYW5kIGluc2VydHMgaXQgaW50byB0aGUgRE9NLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudEluc3RhbmNlIFRoZSBpbnN0YW5jZSB0byBtb3VudC5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIG1vdW50IGludG8uXG4gKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIElmIHRydWUsIGRvIG5vdCBpbnNlcnQgbWFya3VwXG4gKi9cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50SW50b05vZGUod3JhcHBlckluc3RhbmNlLCBjb250YWluZXIsIHRyYW5zYWN0aW9uLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICB2YXIgbWFya2VyTmFtZTtcbiAgaWYgKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1RvcExldmVsUmVuZGVycykge1xuICAgIHZhciB3cmFwcGVkRWxlbWVudCA9IHdyYXBwZXJJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucHJvcHMuY2hpbGQ7XG4gICAgdmFyIHR5cGUgPSB3cmFwcGVkRWxlbWVudC50eXBlO1xuICAgIG1hcmtlck5hbWUgPSAnUmVhY3QgbW91bnQ6ICcgKyAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZSA6IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lKTtcbiAgICBjb25zb2xlLnRpbWUobWFya2VyTmFtZSk7XG4gIH1cblxuICB2YXIgbWFya3VwID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KHdyYXBwZXJJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIG51bGwsIFJlYWN0RE9NQ29udGFpbmVySW5mbyh3cmFwcGVySW5zdGFuY2UsIGNvbnRhaW5lciksIGNvbnRleHQsIDAgLyogcGFyZW50RGVidWdJRCAqL1xuICApO1xuXG4gIGlmIChtYXJrZXJOYW1lKSB7XG4gICAgY29uc29sZS50aW1lRW5kKG1hcmtlck5hbWUpO1xuICB9XG5cbiAgd3JhcHBlckluc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudC5fdG9wTGV2ZWxXcmFwcGVyID0gd3JhcHBlckluc3RhbmNlO1xuICBSZWFjdE1vdW50Ll9tb3VudEltYWdlSW50b05vZGUobWFya3VwLCBjb250YWluZXIsIHdyYXBwZXJJbnN0YW5jZSwgc2hvdWxkUmV1c2VNYXJrdXAsIHRyYW5zYWN0aW9uKTtcbn1cblxuLyoqXG4gKiBCYXRjaGVkIG1vdW50LlxuICpcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudEluc3RhbmNlIFRoZSBpbnN0YW5jZSB0byBtb3VudC5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIG1vdW50IGludG8uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIElmIHRydWUsIGRvIG5vdCBpbnNlcnQgbWFya3VwXG4gKi9cbmZ1bmN0aW9uIGJhdGNoZWRNb3VudENvbXBvbmVudEludG9Ob2RlKGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7XG4gIHZhciB0cmFuc2FjdGlvbiA9IFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLmdldFBvb2xlZChcbiAgLyogdXNlQ3JlYXRlRWxlbWVudCAqL1xuICAhc2hvdWxkUmV1c2VNYXJrdXAgJiYgUmVhY3RET01GZWF0dXJlRmxhZ3MudXNlQ3JlYXRlRWxlbWVudCk7XG4gIHRyYW5zYWN0aW9uLnBlcmZvcm0obW91bnRDb21wb25lbnRJbnRvTm9kZSwgbnVsbCwgY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lciwgdHJhbnNhY3Rpb24sIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTtcbiAgUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7XG59XG5cbi8qKlxuICogVW5tb3VudHMgYSBjb21wb25lbnQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgRE9NLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGluc3RhbmNlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHVubW91bnQgZnJvbS5cbiAqIEBmaW5hbFxuICogQGludGVybmFsXG4gKiBAc2VlIHtSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGV9XG4gKi9cbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRGcm9tTm9kZShpbnN0YW5jZSwgY29udGFpbmVyLCBzYWZlbHkpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoKCk7XG4gIH1cbiAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQoaW5zdGFuY2UsIHNhZmVseSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2goKTtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUpIHtcbiAgICBjb250YWluZXIgPSBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gaHR0cDovL2pzcGVyZi5jb20vZW1wdHlpbmctYS1ub2RlXG4gIHdoaWxlIChjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaGFzIGEgZGlyZWN0IFJlYWN0LXJlbmRlcmVkIGNoaWxkIHRoYXQgaXNcbiAqIG5vdCBhIFJlYWN0IHJvb3QgZWxlbWVudC4gVXNlZnVsIGZvciB3YXJuaW5nIGluIGByZW5kZXJgLFxuICogYHVubW91bnRDb21wb25lbnRBdE5vZGVgLCBldGMuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGVsZW1lbnQgY29udGFpbnMgYSBkaXJlY3QgY2hpbGQgdGhhdCB3YXNcbiAqIHJlbmRlcmVkIGJ5IFJlYWN0IGJ1dCBpcyBub3QgYSByb290IGVsZW1lbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKSB7XG4gIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgaWYgKHJvb3RFbCkge1xuICAgIHZhciBpbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcbiAgICByZXR1cm4gISEoaW5zdCAmJiBpbnN0Ll9ob3N0UGFyZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgUmVhY3QgRE9NIGVsZW1lbnQgYW5kXG4gKiBpdCBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGhhcyBiZWVuIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdFxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIG5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWwgJiYgaXNSZWFjdE5vZGUocm9vdEVsKSAmJiAhUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaXMgYSB2YWxpZCBub2RlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGlzIGEgdmFsaWQgRE9NIG5vZGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgUmVhY3Qgbm9kZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIFJlYWN0IERPTSBub2RlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzUmVhY3ROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIGlzVmFsaWRDb250YWluZXIobm9kZSkgJiYgKG5vZGUuaGFzQXR0cmlidXRlKFJPT1RfQVRUUl9OQU1FKSB8fCBub2RlLmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFJvb3RJbnN0YW5jZUluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHZhciBwcmV2SG9zdEluc3RhbmNlID0gcm9vdEVsICYmIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG4gIHJldHVybiBwcmV2SG9zdEluc3RhbmNlICYmICFwcmV2SG9zdEluc3RhbmNlLl9ob3N0UGFyZW50ID8gcHJldkhvc3RJbnN0YW5jZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdCA9IGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICByZXR1cm4gcm9vdCA/IHJvb3QuX2hvc3RDb250YWluZXJJbmZvLl90b3BMZXZlbFdyYXBwZXIgOiBudWxsO1xufVxuXG4vKipcbiAqIFRlbXBvcmFyeSAoPykgaGFjayBzbyB0aGF0IHdlIGNhbiBzdG9yZSBhbGwgdG9wLWxldmVsIHBlbmRpbmcgdXBkYXRlcyBvblxuICogY29tcG9zaXRlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byB3b3JyeSBhYm91dCBkaWZmZXJlbnQgdHlwZXMgb2YgY29tcG9uZW50c1xuICogaGVyZS5cbiAqL1xudmFyIHRvcExldmVsUm9vdENvdW50ZXIgPSAxO1xudmFyIFRvcExldmVsV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yb290SUQgPSB0b3BMZXZlbFJvb3RDb3VudGVyKys7XG59O1xuVG9wTGV2ZWxXcmFwcGVyLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUb3BMZXZlbFdyYXBwZXIuZGlzcGxheU5hbWUgPSAnVG9wTGV2ZWxXcmFwcGVyJztcbn1cblRvcExldmVsV3JhcHBlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZDtcbn07XG5Ub3BMZXZlbFdyYXBwZXIuaXNSZWFjdFRvcExldmVsV3JhcHBlciA9IHRydWU7XG5cbi8qKlxuICogTW91bnRpbmcgaXMgdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbGl6aW5nIGEgUmVhY3QgY29tcG9uZW50IGJ5IGNyZWF0aW5nIGl0c1xuICogcmVwcmVzZW50YXRpdmUgRE9NIGVsZW1lbnRzIGFuZCBpbnNlcnRpbmcgdGhlbSBpbnRvIGEgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gKiBBbnkgcHJpb3IgY29udGVudCBpbnNpZGUgYGNvbnRhaW5lcmAgaXMgZGVzdHJveWVkIGluIHRoZSBwcm9jZXNzLlxuICpcbiAqICAgUmVhY3RNb3VudC5yZW5kZXIoXG4gKiAgICAgY29tcG9uZW50LFxuICogICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKVxuICogICApO1xuICpcbiAqICAgPGRpdiBpZD1cImNvbnRhaW5lclwiPiAgICAgICAgICAgICAgICAgICA8LS0gU3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gKiAgICAgPGRpdiBkYXRhLXJlYWN0aWQ9XCIuM1wiPiAgICAgICAgICAgICAgPC0tIFJlbmRlcmVkIHJlYWN0Um9vdCBvZiBSZWFjdFxuICogICAgICAgLy8gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LlxuICogICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqXG4gKiBJbnNpZGUgb2YgYGNvbnRhaW5lcmAsIHRoZSBmaXJzdCBlbGVtZW50IHJlbmRlcmVkIGlzIHRoZSBcInJlYWN0Um9vdFwiLlxuICovXG52YXIgUmVhY3RNb3VudCA9IHtcbiAgVG9wTGV2ZWxXcmFwcGVyOiBUb3BMZXZlbFdyYXBwZXIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZGV2dG9vbHMuIFRoZSBrZXlzIGFyZSBub3QgaW1wb3J0YW50LlxuICAgKi9cbiAgX2luc3RhbmNlc0J5UmVhY3RSb290SUQ6IGluc3RhbmNlc0J5UmVhY3RSb290SUQsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBob29rIHByb3ZpZGVkIHRvIHN1cHBvcnQgcmVuZGVyaW5nIFJlYWN0IGNvbXBvbmVudHMgd2hpbGVcbiAgICogZW5zdXJpbmcgdGhhdCB0aGUgYXBwYXJlbnQgc2Nyb2xsIHBvc2l0aW9uIG9mIGl0cyBgY29udGFpbmVyYCBkb2VzIG5vdFxuICAgKiBjaGFuZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIFRoZSBgY29udGFpbmVyYCBiZWluZyByZW5kZXJlZCBpbnRvLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZW5kZXJDYWxsYmFjayBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UgdG8gZG8gdGhlIHJlbmRlci5cbiAgICovXG4gIHNjcm9sbE1vbml0b3I6IGZ1bmN0aW9uIChjb250YWluZXIsIHJlbmRlckNhbGxiYWNrKSB7XG4gICAgcmVuZGVyQ2FsbGJhY2soKTtcbiAgfSxcblxuICAvKipcbiAgICogVGFrZSBhIGNvbXBvbmVudCB0aGF0J3MgYWxyZWFkeSBtb3VudGVkIGludG8gdGhlIERPTSBhbmQgcmVwbGFjZSBpdHMgcHJvcHNcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gcHJldkNvbXBvbmVudCBjb21wb25lbnQgaW5zdGFuY2UgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICovXG4gIF91cGRhdGVSb290Q29tcG9uZW50OiBmdW5jdGlvbiAocHJldkNvbXBvbmVudCwgbmV4dEVsZW1lbnQsIG5leHRDb250ZXh0LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RNb3VudC5zY3JvbGxNb25pdG9yKGNvbnRhaW5lciwgZnVuY3Rpb24gKCkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRWxlbWVudEludGVybmFsKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJldkNvbXBvbmVudDtcbiAgfSxcblxuICAvKipcbiAgICogUmVuZGVyIGEgbmV3IGNvbXBvbmVudCBpbnRvIHRoZSBET00uIEhvb2tlZCBieSBob29rcyFcbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IGVsZW1lbnQgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIGlmIHdlIHNob3VsZCBza2lwIHRoZSBtYXJrdXAgaW5zZXJ0aW9uXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSBuZXh0Q29tcG9uZW50XG4gICAqL1xuICBfcmVuZGVyTmV3Um9vdENvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7XG4gICAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzXG4gICAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLlxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwgJ19yZW5kZXJOZXdSb290Q29tcG9uZW50KCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gJyArICdyZW5kZXIgaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnX3JlZ2lzdGVyQ29tcG9uZW50KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzcnKSA6IHZvaWQgMDtcblxuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5lbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCBmYWxzZSk7XG5cbiAgICAvLyBUaGUgaW5pdGlhbCByZW5kZXIgaXMgc3luY2hyb25vdXMgYnV0IGFueSB1cGRhdGVzIHRoYXQgaGFwcGVuIGR1cmluZ1xuICAgIC8vIHJlbmRlcmluZywgaW4gY29tcG9uZW50V2lsbE1vdW50IG9yIGNvbXBvbmVudERpZE1vdW50LCB3aWxsIGJlIGJhdGNoZWRcbiAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYmF0Y2hpbmcgc3RyYXRlZ3kuXG5cbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoYmF0Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTtcblxuICAgIHZhciB3cmFwcGVySUQgPSBjb21wb25lbnRJbnN0YW5jZS5faW5zdGFuY2Uucm9vdElEO1xuICAgIGluc3RhbmNlc0J5UmVhY3RSb290SURbd3JhcHBlcklEXSA9IGNvbXBvbmVudEluc3RhbmNlO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqXG4gICAqIElmIHRoZSBSZWFjdCBjb21wb25lbnQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgaW50byBgY29udGFpbmVyYCwgdGhpcyB3aWxsXG4gICAqIHBlcmZvcm0gYW4gdXBkYXRlIG9uIGl0IGFuZCBvbmx5IG11dGF0ZSB0aGUgRE9NIGFzIG5lY2Vzc2FyeSB0byByZWZsZWN0IHRoZVxuICAgKiBsYXRlc3QgUmVhY3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBwYXJlbnRDb21wb25lbnQgVGhlIGNvbmNlcHR1YWwgcGFyZW50IG9mIHRoaXMgcmVuZGVyIHRyZWUuXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgUmVhY3RJbnN0YW5jZU1hcC5oYXMocGFyZW50Q29tcG9uZW50KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCczOCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBSZWFjdE1vdW50Ll9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICBfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IGZ1bmN0aW9uIChwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCAnUmVhY3RET00ucmVuZGVyJyk7XG4gICAgIVJlYWN0LmlzVmFsaWRFbGVtZW50KG5leHRFbGVtZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdERPTS5yZW5kZXIoKTogSW52YWxpZCBjb21wb25lbnQgZWxlbWVudC4lcycsIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ3N0cmluZycgPyBcIiBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSAnZGl2JywgcGFzcyBcIiArIFwiUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2Jykgb3IgPGRpdiAvPi5cIiA6IHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY2xhc3MgbGlrZSBGb28sIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KEZvbykgb3IgPEZvbyAvPi4nIDogLy8gQ2hlY2sgaWYgaXQgcXVhY2tzIGxpa2UgYW4gZWxlbWVudFxuICAgIG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCA/ICcgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHVuaW50ZW50aW9uYWxseSBsb2FkaW5nIHR3byBpbmRlcGVuZGVudCAnICsgJ2NvcGllcyBvZiBSZWFjdC4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzM5JywgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnc3RyaW5nJyA/IFwiIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlICdkaXYnLCBwYXNzIFwiICsgXCJSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnKSBvciA8ZGl2IC8+LlwiIDogdHlwZW9mIG5leHRFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBjbGFzcyBsaWtlIEZvbywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LicgOiBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgJyArICdjb3BpZXMgb2YgUmVhY3QuJyA6ICcnKSA6IHZvaWQgMDtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXIgfHwgIWNvbnRhaW5lci50YWdOYW1lIHx8IGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdCT0RZJywgJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJykgOiB2b2lkIDA7XG5cbiAgICB2YXIgbmV4dFdyYXBwZWRFbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChUb3BMZXZlbFdyYXBwZXIsIHtcbiAgICAgIGNoaWxkOiBuZXh0RWxlbWVudFxuICAgIH0pO1xuXG4gICAgdmFyIG5leHRDb250ZXh0O1xuICAgIGlmIChwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHZhciBwYXJlbnRJbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocGFyZW50Q29tcG9uZW50KTtcbiAgICAgIG5leHRDb250ZXh0ID0gcGFyZW50SW5zdC5fcHJvY2Vzc0NoaWxkQ29udGV4dChwYXJlbnRJbnN0Ll9jb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENvbnRleHQgPSBlbXB0eU9iamVjdDtcbiAgICB9XG5cbiAgICB2YXIgcHJldkNvbXBvbmVudCA9IGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICBpZiAocHJldkNvbXBvbmVudCkge1xuICAgICAgdmFyIHByZXZXcmFwcGVkRWxlbWVudCA9IHByZXZDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50O1xuICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJldldyYXBwZWRFbGVtZW50LnByb3BzLmNoaWxkO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkpIHtcbiAgICAgICAgdmFyIHB1YmxpY0luc3QgPSBwcmV2Q29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgICAgICB2YXIgdXBkYXRlZENhbGxiYWNrID0gY2FsbGJhY2sgJiYgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrLmNhbGwocHVibGljSW5zdCk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWN0TW91bnQuX3VwZGF0ZVJvb3RDb21wb25lbnQocHJldkNvbXBvbmVudCwgbmV4dFdyYXBwZWRFbGVtZW50LCBuZXh0Q29udGV4dCwgY29udGFpbmVyLCB1cGRhdGVkQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gcHVibGljSW5zdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFJlYWN0TW91bnQudW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWFjdFJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGNvbnRhaW5lckhhc1JlYWN0TWFya3VwID0gcmVhY3RSb290RWxlbWVudCAmJiAhIWludGVybmFsR2V0SUQocmVhY3RSb290RWxlbWVudCk7XG4gICAgdmFyIGNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkID0gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpIDogdm9pZCAwO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lckhhc1JlYWN0TWFya3VwIHx8IHJlYWN0Um9vdEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdmFyIHJvb3RFbGVtZW50U2libGluZyA9IHJlYWN0Um9vdEVsZW1lbnQ7XG4gICAgICAgIHdoaWxlIChyb290RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJuYWxHZXRJRChyb290RWxlbWVudFNpYmxpbmcpKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3JlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFya3VwIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgJyArICdhcmUgdW5yZWxhdGVkIG5vZGVzIGFzIHdlbGwuIFRoaXMgaXMgbW9zdCBjb21tb25seSBjYXVzZWQgYnkgJyArICd3aGl0ZS1zcGFjZSBpbnNlcnRlZCBhcm91bmQgc2VydmVyLXJlbmRlcmVkIG1hcmt1cC4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb290RWxlbWVudFNpYmxpbmcgPSByb290RWxlbWVudFNpYmxpbmcubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2hvdWxkUmV1c2VNYXJrdXAgPSBjb250YWluZXJIYXNSZWFjdE1hcmt1cCAmJiAhcHJldkNvbXBvbmVudCAmJiAhY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQ7XG4gICAgdmFyIGNvbXBvbmVudCA9IFJlYWN0TW91bnQuX3JlbmRlck5ld1Jvb3RDb21wb25lbnQobmV4dFdyYXBwZWRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBuZXh0Q29udGV4dCkuX3JlbmRlcmVkQ29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbXBvbmVudCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBSZWFjdCBjb21wb25lbnQgaW50byB0aGUgRE9NIGluIHRoZSBzdXBwbGllZCBgY29udGFpbmVyYC5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0ZG9tLnJlbmRlclxuICAgKlxuICAgKiBJZiB0aGUgUmVhY3QgY29tcG9uZW50IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGludG8gYGNvbnRhaW5lcmAsIHRoaXMgd2lsbFxuICAgKiBwZXJmb3JtIGFuIHVwZGF0ZSBvbiBpdCBhbmQgb25seSBtdXRhdGUgdGhlIERPTSBhcyBuZWNlc3NhcnkgdG8gcmVmbGVjdCB0aGVcbiAgICogbGF0ZXN0IFJlYWN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IENvbXBvbmVudCBlbGVtZW50IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0cmlnZ2VyZWQgb24gY29tcGxldGlvblxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gQ29tcG9uZW50IGluc3RhbmNlIHJlbmRlcmVkIGluIGBjb250YWluZXJgLlxuICAgKi9cbiAgcmVuZGVyOiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUmVhY3RNb3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVbm1vdW50cyBhbmQgZGVzdHJveXMgdGhlIFJlYWN0IGNvbXBvbmVudCByZW5kZXJlZCBpbiB0aGUgYGNvbnRhaW5lcmAuXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS51bm1vdW50Y29tcG9uZW50YXRub2RlXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IGNvbnRhaW5pbmcgYSBSZWFjdCBjb21wb25lbnQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSBjb21wb25lbnQgd2FzIGZvdW5kIGluIGFuZCB1bm1vdW50ZWQgZnJvbVxuICAgKiAgICAgICAgICAgICAgICAgICBgY29udGFpbmVyYFxuICAgKi9cbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZTogZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQnc1xuICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFN0cmljdGx5IHNwZWFraW5nLCB1bm1vdW50aW5nIHdvbid0IGNhdXNlIGFcbiAgICAvLyByZW5kZXIgYnV0IHdlIHN0aWxsIGRvbid0IGV4cGVjdCB0byBiZSBpbiBhIHJlbmRlciBjYWxsIGhlcmUuKVxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwgJ3VubW91bnRDb21wb25lbnRBdE5vZGUoKTogUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiAnICsgJ29mIHByb3BzIGFuZCBzdGF0ZTsgdHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgJyArICdpcyBub3QgYWxsb3dlZC4gSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuXG4gICAgIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDAnKSA6IHZvaWQgMDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghbm9kZUlzUmVuZGVyZWRCeU90aGVySW5zdGFuY2UoY29udGFpbmVyKSwgXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdC4nKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB2YXIgcHJldkNvbXBvbmVudCA9IGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgaWYgKCFwcmV2Q29tcG9uZW50KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBiZWluZyB1bm1vdW50ZWQgd2FzIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgaXNuJ3QgYVxuICAgICAgLy8gcm9vdCBub2RlLlxuICAgICAgdmFyIGNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkID0gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgYSBSZWFjdCByb290IG5vZGUuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbmVyLmhhc0F0dHJpYnV0ZShST09UX0FUVFJfTkFNRSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCwgXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkZWxldGUgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRFtwcmV2Q29tcG9uZW50Ll9pbnN0YW5jZS5yb290SURdO1xuICAgIFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyh1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUsIHByZXZDb21wb25lbnQsIGNvbnRhaW5lciwgZmFsc2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIF9tb3VudEltYWdlSW50b05vZGU6IGZ1bmN0aW9uIChtYXJrdXAsIGNvbnRhaW5lciwgaW5zdGFuY2UsIHNob3VsZFJldXNlTWFya3VwLCB0cmFuc2FjdGlvbikge1xuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnbW91bnRDb21wb25lbnRJbnRvTm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCB2YWxpZC4nKSA6IF9wcm9kSW52YXJpYW50KCc0MScpIDogdm9pZCAwO1xuXG4gICAgaWYgKHNob3VsZFJldXNlTWFya3VwKSB7XG4gICAgICB2YXIgcm9vdEVsZW1lbnQgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIGlmIChSZWFjdE1hcmt1cENoZWNrc3VtLmNhblJldXNlTWFya3VwKG1hcmt1cCwgcm9vdEVsZW1lbnQpKSB7XG4gICAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5zdGFuY2UsIHJvb3RFbGVtZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNoZWNrc3VtID0gcm9vdEVsZW1lbnQuZ2V0QXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FKTtcbiAgICAgICAgcm9vdEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FKTtcblxuICAgICAgICB2YXIgcm9vdE1hcmt1cCA9IHJvb3RFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FLCBjaGVja3N1bSk7XG5cbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRNYXJrdXAgPSBtYXJrdXA7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgLy8gYmVjYXVzZSByb290TWFya3VwIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBET00sIHZhcmlvdXMgbm9ybWFsaXphdGlvbnNcbiAgICAgICAgICAvLyB3aWxsIGhhdmUgb2NjdXJyZWQgd2hpY2ggd2lsbCBub3QgYmUgcHJlc2VudCBpbiBgbWFya3VwYC4gSGVyZSxcbiAgICAgICAgICAvLyBpbnNlcnQgbWFya3VwIGludG8gYSA8ZGl2PiBvciA8aWZyYW1lPiBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5lclxuICAgICAgICAgIC8vIHR5cGUgdG8gcGVyZm9ybSB0aGUgc2FtZSBub3JtYWxpemF0aW9ucyBiZWZvcmUgY29tcGFyaW5nLlxuICAgICAgICAgIHZhciBub3JtYWxpemVyO1xuICAgICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFKSB7XG4gICAgICAgICAgICBub3JtYWxpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBub3JtYWxpemVyLmlubmVySFRNTCA9IG1hcmt1cDtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXJrdXAgPSBub3JtYWxpemVyLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3JtYWxpemVyKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIuY29udGVudERvY3VtZW50LndyaXRlKG1hcmt1cCk7XG4gICAgICAgICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobm9ybWFsaXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZmZJbmRleCA9IGZpcnN0RGlmZmVyZW5jZUluZGV4KG5vcm1hbGl6ZWRNYXJrdXAsIHJvb3RNYXJrdXApO1xuICAgICAgICB2YXIgZGlmZmVyZW5jZSA9ICcgKGNsaWVudCkgJyArIG5vcm1hbGl6ZWRNYXJrdXAuc3Vic3RyaW5nKGRpZmZJbmRleCAtIDIwLCBkaWZmSW5kZXggKyAyMCkgKyAnXFxuIChzZXJ2ZXIpICcgKyByb290TWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZkluZGV4ICsgMjApO1xuXG4gICAgICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBET0NfTk9ERV9UWVBFKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdZb3VcXCdyZSB0cnlpbmcgdG8gcmVuZGVyIGEgY29tcG9uZW50IHRvIHRoZSBkb2N1bWVudCB1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGJ1dCB0aGUgY2hlY2tzdW0gd2FzIGludmFsaWQuIFRoaXMgdXN1YWxseSBtZWFucyB5b3UgcmVuZGVyZWQgYSBkaWZmZXJlbnQgY29tcG9uZW50IHR5cGUgb3IgcHJvcHMgb24gdGhlIGNsaWVudCBmcm9tIHRoZSBvbmUgb24gdGhlIHNlcnZlciwgb3IgeW91ciByZW5kZXIoKSBtZXRob2RzIGFyZSBpbXB1cmUuIFJlYWN0IGNhbm5vdCBoYW5kbGUgdGhpcyBjYXNlIGR1ZSB0byBjcm9zcy1icm93c2VyIHF1aXJrcyBieSByZW5kZXJpbmcgYXQgdGhlIGRvY3VtZW50IHJvb3QuIFlvdSBzaG91bGQgbG9vayBmb3IgZW52aXJvbm1lbnQgZGVwZW5kZW50IGNvZGUgaW4geW91ciBjb21wb25lbnRzIGFuZCBlbnN1cmUgdGhlIHByb3BzIGFyZSB0aGUgc2FtZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlOlxcbiVzJywgZGlmZmVyZW5jZSkgOiBfcHJvZEludmFyaWFudCgnNDInLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QgYXR0ZW1wdGVkIHRvIHJldXNlIG1hcmt1cCBpbiBhIGNvbnRhaW5lciBidXQgdGhlICcgKyAnY2hlY2tzdW0gd2FzIGludmFsaWQuIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgeW91IGFyZSAnICsgJ3VzaW5nIHNlcnZlciByZW5kZXJpbmcgYW5kIHRoZSBtYXJrdXAgZ2VuZXJhdGVkIG9uIHRoZSAnICsgJ3NlcnZlciB3YXMgbm90IHdoYXQgdGhlIGNsaWVudCB3YXMgZXhwZWN0aW5nLiBSZWFjdCBpbmplY3RlZCAnICsgJ25ldyBtYXJrdXAgdG8gY29tcGVuc2F0ZSB3aGljaCB3b3JrcyBidXQgeW91IGhhdmUgbG9zdCBtYW55ICcgKyAnb2YgdGhlIGJlbmVmaXRzIG9mIHNlcnZlciByZW5kZXJpbmcuIEluc3RlYWQsIGZpZ3VyZSBvdXQgJyArICd3aHkgdGhlIG1hcmt1cCBiZWluZyBnZW5lcmF0ZWQgaXMgZGlmZmVyZW50IG9uIHRoZSBjbGllbnQgJyArICdvciBzZXJ2ZXI6XFxuJXMnLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBET0NfTk9ERV9UWVBFKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdZb3VcXCdyZSB0cnlpbmcgdG8gcmVuZGVyIGEgY29tcG9uZW50IHRvIHRoZSBkb2N1bWVudCBidXQgeW91IGRpZG5cXCd0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBXZSBjYW5cXCd0IGRvIHRoaXMgd2l0aG91dCB1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGR1ZSB0byBjcm9zcy1icm93c2VyIHF1aXJrcy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNDMnKSA6IHZvaWQgMDtcblxuICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7XG4gICAgICB3aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlKGNvbnRhaW5lciwgbWFya3VwLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0SW5uZXJIVE1MKGNvbnRhaW5lciwgbWFya3VwKTtcbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGhvc3ROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgaWYgKGhvc3ROb2RlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgIGluc3RhbmNlSUQ6IGhvc3ROb2RlLl9kZWJ1Z0lELFxuICAgICAgICAgIHR5cGU6ICdtb3VudCcsXG4gICAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0TW91bnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0TW91bnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdE5vZGVUeXBlcyA9IHtcbiAgSE9TVDogMCxcbiAgQ09NUE9TSVRFOiAxLFxuICBFTVBUWTogMixcblxuICBnZXRUeXBlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuRU1QVFk7XG4gICAgfSBlbHNlIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgaWYgKHR5cGVvZiBub2RlLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkNPTVBPU0lURTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5IT1NUO1xuICAgICAgfVxuICAgIH1cbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5leHBlY3RlZCBub2RlOiAlcycsIG5vZGUpIDogX3Byb2RJbnZhcmlhbnQoJzI2Jywgbm9kZSkgOiB2b2lkIDA7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3ROb2RlVHlwZXM7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0Tm9kZVR5cGVzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBWaWV3cG9ydE1ldHJpY3MgPSB7XG4gIGN1cnJlbnRTY3JvbGxMZWZ0OiAwLFxuXG4gIGN1cnJlbnRTY3JvbGxUb3A6IDAsXG5cbiAgcmVmcmVzaFNjcm9sbFZhbHVlczogZnVuY3Rpb24gKHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb24ueDtcbiAgICBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVmlld3BvcnRNZXRyaWNzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBBY2N1bXVsYXRlcyBpdGVtcyB0aGF0IG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGludG8gdGhlIGZpcnN0IG9uZS4gVGhpc1xuICogaXMgdXNlZCB0byBjb25zZXJ2ZSBtZW1vcnkgYnkgYXZvaWRpbmcgYXJyYXkgYWxsb2NhdGlvbnMsIGFuZCB0aHVzIHNhY3JpZmljZXNcbiAqIEFQSSBjbGVhbm5lc3MuIFNpbmNlIGBjdXJyZW50YCBjYW4gYmUgbnVsbCBiZWZvcmUgYmVpbmcgcGFzc2VkIGluIGFuZCBub3RcbiAqIG51bGwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiwgbWFrZSBzdXJlIHRvIGFzc2lnbiBpdCBiYWNrIHRvIGBjdXJyZW50YDpcbiAqXG4gKiBgYSA9IGFjY3VtdWxhdGVJbnRvKGEsIGIpO2BcbiAqXG4gKiBUaGlzIEFQSSBzaG91bGQgYmUgc3BhcmluZ2x5IHVzZWQuIFRyeSBgYWNjdW11bGF0ZWAgZm9yIHNvbWV0aGluZyBjbGVhbmVyLlxuICpcbiAqIEByZXR1cm4geyp8YXJyYXk8Kj59IEFuIGFjY3VtdWxhdGlvbiBvZiBpdGVtcy5cbiAqL1xuXG5mdW5jdGlvbiBhY2N1bXVsYXRlSW50byhjdXJyZW50LCBuZXh0KSB7XG4gICEobmV4dCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdhY2N1bXVsYXRlSW50byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKSA6IF9wcm9kSW52YXJpYW50KCczMCcpIDogdm9pZCAwO1xuXG4gIGlmIChjdXJyZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8vIEJvdGggYXJlIG5vdCBlbXB0eS4gV2FybmluZzogTmV2ZXIgY2FsbCB4LmNvbmNhdCh5KSB3aGVuIHlvdSBhcmUgbm90XG4gIC8vIGNlcnRhaW4gdGhhdCB4IGlzIGFuIEFycmF5ICh4IGNvdWxkIGJlIGEgc3RyaW5nIHdpdGggY29uY2F0IG1ldGhvZCkuXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQucHVzaC5hcHBseShjdXJyZW50LCBuZXh0KTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgIC8vIEEgYml0IHRvbyBkYW5nZXJvdXMgdG8gbXV0YXRlIGBuZXh0YC5cbiAgICByZXR1cm4gW2N1cnJlbnRdLmNvbmNhdChuZXh0KTtcbiAgfVxuXG4gIHJldHVybiBbY3VycmVudCwgbmV4dF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYWNjdW11bGF0ZUludG87XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2FjY3VtdWxhdGVJbnRvLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciBhbiBcImFjY3VtdWxhdGlvblwiIG9mIGl0ZW1zIHdoaWNoIGlzIGVpdGhlciBhbiBBcnJheSBvclxuICogYSBzaW5nbGUgaXRlbS4gVXNlZnVsIHdoZW4gcGFpcmVkIHdpdGggdGhlIGBhY2N1bXVsYXRlYCBtb2R1bGUuIFRoaXMgaXMgYVxuICogc2ltcGxlIHV0aWxpdHkgdGhhdCBhbGxvd3MgdXMgdG8gcmVhc29uIGFib3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtcywgYnV0XG4gKiBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGl0ZW0gKGFuZCB3ZSBkbyBub3QgbmVlZCB0b1xuICogYWxsb2NhdGUgYW4gYXJyYXkpLlxuICovXG5cbmZ1bmN0aW9uIGZvckVhY2hBY2N1bXVsYXRlZChhcnIsIGNiLCBzY29wZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgYXJyLmZvckVhY2goY2IsIHNjb3BlKTtcbiAgfSBlbHNlIGlmIChhcnIpIHtcbiAgICBjYi5jYWxsKHNjb3BlLCBhcnIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaEFjY3VtdWxhdGVkO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9mb3JFYWNoQWNjdW11bGF0ZWQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3ROb2RlVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0Tm9kZVR5cGVzJyk7XG5cbmZ1bmN0aW9uIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpIHtcbiAgdmFyIHR5cGU7XG5cbiAgd2hpbGUgKCh0eXBlID0gaW5zdC5fcmVuZGVyZWROb2RlVHlwZSkgPT09IFJlYWN0Tm9kZVR5cGVzLkNPTVBPU0lURSkge1xuICAgIGluc3QgPSBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBlcy5IT1NUKSB7XG4gICAgcmV0dXJuIGluc3QuX3JlbmRlcmVkQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY29udGVudEtleSA9IG51bGw7XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IHVzZWQgdG8gYWNjZXNzIHRleHQgY29udGVudCBvbiBhIERPTSBub2RlLlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpIHtcbiAgaWYgKCFjb250ZW50S2V5ICYmIEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAgIC8vIFByZWZlciB0ZXh0Q29udGVudCB0byBpbm5lclRleHQgYmVjYXVzZSBtYW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBidXRcbiAgICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2ZW4gd2hlbiA8ZGl2PiBkb2VzLlxuICAgIGNvbnRlbnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0Q29udGVudCcgOiAnaW5uZXJUZXh0JztcbiAgfVxuICByZXR1cm4gY29udGVudEtleTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29udGVudEFjY2Vzc29yO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9nZXRUZXh0Q29udGVudEFjY2Vzc29yLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKGluc3QpIHtcbiAgcmV0dXJuIGluc3QuX3dyYXBwZXJTdGF0ZS52YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRyYWNrZXIoaW5zdCwgdHJhY2tlcikge1xuICBpbnN0Ll93cmFwcGVyU3RhdGUudmFsdWVUcmFja2VyID0gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihpbnN0KSB7XG4gIGRlbGV0ZSBpbnN0Ll93cmFwcGVyU3RhdGUudmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlO1xuICBpZiAobm9kZSkge1xuICAgIHZhbHVlID0gaXNDaGVja2FibGUobm9kZSkgPyAnJyArIG5vZGUuY2hlY2tlZCA6IG5vZGUudmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgaW5wdXRWYWx1ZVRyYWNraW5nID0ge1xuICAvLyBleHBvc2VkIGZvciB0ZXN0aW5nXG4gIF9nZXRUcmFja2VyRnJvbU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIGdldFRyYWNrZXIoUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkpO1xuICB9LFxuXG5cbiAgdHJhY2s6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgaWYgKGdldFRyYWNrZXIoaW5zdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAgICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdO1xuXG4gICAgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAgIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gICAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuICAgIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXR0YWNoVHJhY2tlcihpbnN0LCB7XG4gICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGV0YWNoVHJhY2tlcihpbnN0KTtcbiAgICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlVmFsdWVJZkNoYW5nZWQ6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgaWYgKCFpbnN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihpbnN0KTtcblxuICAgIGlmICghdHJhY2tlcikge1xuICAgICAgaW5wdXRWYWx1ZVRyYWNraW5nLnRyYWNrKGluc3QpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSk7XG5cbiAgICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihpbnN0KTtcbiAgICBpZiAodHJhY2tlcikge1xuICAgICAgdHJhY2tlci5zdG9wVHJhY2tpbmcoKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW5wdXRWYWx1ZVRyYWNraW5nO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9pbnB1dFZhbHVlVHJhY2tpbmcuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKTtcbnZhciBSZWFjdEVtcHR5Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVtcHR5Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEhvc3RDb21wb25lbnQnKTtcblxudmFyIGdldE5leHREZWJ1Z0lEID0gcmVxdWlyZSgncmVhY3QvbGliL2dldE5leHREZWJ1Z0lEJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLy8gVG8gYXZvaWQgYSBjeWNsaWMgZGVwZW5kZW5jeSwgd2UgY3JlYXRlIHRoZSBmaW5hbCBjbGFzcyBpbiB0aGlzIG1vZHVsZVxudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHRoaXMuY29uc3RydWN0KGVsZW1lbnQpO1xufTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSB7XG4gIGlmIChvd25lcikge1xuICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHR5cGUgcmVmZXJlbmNlIGlzIGEga25vd24gaW50ZXJuYWwgdHlwZS4gSS5lLiBub3QgYSB1c2VyXG4gKiBwcm92aWRlZCBjb21wb3NpdGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIGludGVybmFsIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZXJuYWxDb21wb25lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlLnByb3RvdHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLm1vdW50Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlLnByb3RvdHlwZS5yZWNlaXZlQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgUmVhY3ROb2RlLCBjcmVhdGUgYW4gaW5zdGFuY2UgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIG1vdW50ZWQuXG4gKlxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGF2ZURlYnVnSURcbiAqIEByZXR1cm4ge29iamVjdH0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGVsZW1lbnQncyBjb25zdHJ1Y3Rvci5cbiAqIEBwcm90ZWN0ZWRcbiAqL1xuZnVuY3Rpb24gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChub2RlLCBzaG91bGRIYXZlRGVidWdJRCkge1xuICB2YXIgaW5zdGFuY2U7XG5cbiAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gZmFsc2UpIHtcbiAgICBpbnN0YW5jZSA9IFJlYWN0RW1wdHlDb21wb25lbnQuY3JlYXRlKGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBlbGVtZW50ID0gbm9kZTtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShlbGVtZW50Ll9vd25lcik7XG4gICAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiBfcHJvZEludmFyaWFudCgnMTMwJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2Ugc3RyaW5nIHZhbHVlc1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFuY2UgPSBSZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW50ZXJuYWxDb21wb25lbnQoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ludGVybmFsQ29tcG9uZW50VHlwZShlbGVtZW50LnR5cGUpKSB7XG4gICAgICAvLyBUaGlzIGlzIHRlbXBvcmFyaWx5IGF2YWlsYWJsZSBmb3IgY3VzdG9tIGNvbXBvbmVudHMgdGhhdCBhcmUgbm90IHN0cmluZ1xuICAgICAgLy8gcmVwcmVzZW50YXRpb25zLiBJLmUuIEFSVC4gT25jZSB0aG9zZSBhcmUgdXBkYXRlZCB0byB1c2UgdGhlIHN0cmluZ1xuICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHdlIGNhbiBkcm9wIHRoaXMgY29kZSBwYXRoLlxuICAgICAgaW5zdGFuY2UgPSBuZXcgZWxlbWVudC50eXBlKGVsZW1lbnQpO1xuXG4gICAgICAvLyBXZSByZW5hbWVkIHRoaXMuIEFsbG93IHRoZSBvbGQgbmFtZSBmb3IgY29tcGF0LiA6KFxuICAgICAgaWYgKCFpbnN0YW5jZS5nZXRIb3N0Tm9kZSkge1xuICAgICAgICBpbnN0YW5jZS5nZXRIb3N0Tm9kZSA9IGluc3RhbmNlLmdldE5hdGl2ZU5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlID0gbmV3IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlcihlbGVtZW50KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBub2RlID09PSAnbnVtYmVyJykge1xuICAgIGluc3RhbmNlID0gUmVhY3RIb3N0Q29tcG9uZW50LmNyZWF0ZUluc3RhbmNlRm9yVGV4dChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRW5jb3VudGVyZWQgaW52YWxpZCBSZWFjdCBub2RlIG9mIHR5cGUgJXMnLCB0eXBlb2Ygbm9kZSkgOiBfcHJvZEludmFyaWFudCgnMTMxJywgdHlwZW9mIG5vZGUpIDogdm9pZCAwO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdGFuY2UubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLnJlY2VpdmVDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldEhvc3ROb2RlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS51bm1vdW50Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nLCAnT25seSBSZWFjdCBDb21wb25lbnRzIGNhbiBiZSBtb3VudGVkLicpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gVGhlc2UgdHdvIGZpZWxkcyBhcmUgdXNlZCBieSB0aGUgRE9NIGFuZCBBUlQgZGlmZmluZyBhbGdvcml0aG1zXG4gIC8vIHJlc3BlY3RpdmVseS4gSW5zdGVhZCBvZiB1c2luZyBleHBhbmRvcyBvbiBjb21wb25lbnRzLCB3ZSBzaG91bGQgYmVcbiAgLy8gc3RvcmluZyB0aGUgc3RhdGUgbmVlZGVkIGJ5IHRoZSBkaWZmaW5nIGFsZ29yaXRobXMgZWxzZXdoZXJlLlxuICBpbnN0YW5jZS5fbW91bnRJbmRleCA9IDA7XG4gIGluc3RhbmNlLl9tb3VudEltYWdlID0gbnVsbDtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGluc3RhbmNlLl9kZWJ1Z0lEID0gc2hvdWxkSGF2ZURlYnVnSUQgPyBnZXROZXh0RGVidWdJRCgpIDogMDtcbiAgfVxuXG4gIC8vIEludGVybmFsIGluc3RhbmNlcyBzaG91bGQgZnVsbHkgY29uc3RydWN0ZWQgYXQgdGhpcyBwb2ludCwgc28gdGhleSBzaG91bGRcbiAgLy8gbm90IGdldCBhbnkgbmV3IGZpZWxkcyBhZGRlZCB0byB0aGVtIGF0IHRoaXMgcG9pbnQuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbl9hc3NpZ24oUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyLnByb3RvdHlwZSwgUmVhY3RDb21wb3NpdGVDb21wb25lbnQsIHtcbiAgX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnRcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cblxudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1RleHRJbnB1dEVsZW1lbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2lzVGV4dElucHV0RWxlbWVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkXG4gKiBldmVuIGluIElFOC4gaW5uZXJUZXh0IGlzIGEgcG9vciBzdWJzdGl0dXRlIGZvciB0ZXh0Q29udGVudCBhbmQsIGFtb25nIG1hbnlcbiAqIGlzc3VlcywgaW5zZXJ0cyA8YnI+IGluc3RlYWQgb2YgdGhlIGxpdGVyYWwgbmV3bGluZSBjaGFycy4gaW5uZXJIVE1MIGJlaGF2ZXNcbiAqIGFzIGl0IHNob3VsZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIGlmICghKCd0ZXh0Q29udGVudCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkge1xuICAgIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIG5vZGUubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0SW5uZXJIVE1MKG5vZGUsIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRleHRDb250ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9zZXRUZXh0Q29udGVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7XG5cbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogVGhpcyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50IHNpbmNlIHRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlblxuICogaXNvbW9ycGhpYyBhbmQgcmVuZGVyZXJzLiBXZSBjb3VsZCBleHRyYWN0IHRoaXMgdG8gYVxuICpcbiAqL1xuXG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudEtleShjb21wb25lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIGNvbXBvbmVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBLZXlFc2NhcGVVdGlscy5lc2NhcGUoY29tcG9uZW50LmtleSk7XG4gIH1cbiAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZVNvRmFyIE5hbWUgb2YgdGhlIGtleSBwYXRoIHNvIGZhci5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBlYWNoIGNoaWxkIGZvdW5kLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoZSB0cmF2ZXJzYWxcbiAqIHByb2Nlc3MuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sIG5hbWVTb0ZhciwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8XG4gIC8vIFRoZSBmb2xsb3dpbmcgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudC4gVGhpcyBtZWFucyB3ZSBjYW4gb3B0aW1pemVcbiAgLy8gc29tZSBjaGVja3MuIFJlYWN0IEZpYmVyIGFsc28gaW5saW5lcyB0aGlzIGxvZ2ljIGZvciBzaW1pbGFyIHB1cnBvc2VzLlxuICB0eXBlID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbixcbiAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkgOiBuYW1lU29GYXIpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gY2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyc7XG4gICAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuQWJvdXRNYXBzLCAnVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4gSXQgaXMgYW4gJyArICdleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1pZ2h0IGJlIHJlbW92ZWQuIENvbnZlcnQgaXQgdG8gYSAnICsgJ3NlcXVlbmNlIC8gaXRlcmFibGUgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLiVzJywgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgY2hpbGQgPSBlbnRyeVsxXTtcbiAgICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBLZXlFc2NhcGVVdGlscy5lc2NhcGUoZW50cnlbMF0pICsgU1VCU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCAwKTtcbiAgICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgYWRkZW5kdW0gPSAnIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkIG9yIHdyYXAgdGhlIG9iamVjdCB1c2luZyBjcmVhdGVGcmFnbWVudChvYmplY3QpIGZyb20gdGhlICcgKyAnUmVhY3QgYWRkLW9ucy4nO1xuICAgICAgICBpZiAoY2hpbGRyZW4uX2lzUmVhY3RFbGVtZW50KSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSBcIiBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgXCIgKyAndmVyc2lvbiBvZiBSZWFjdC4gTWFrZSBzdXJlIHRvIHVzZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0Lic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBhZGRlbmR1bSArPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IGhvaXN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHN0b3JlU2hhcGUsIHN1YnNjcmlwdGlvblNoYXBlIH0gZnJvbSAnLi4vdXRpbHMvUHJvcFR5cGVzJztcblxudmFyIGhvdFJlbG9hZGluZ1ZlcnNpb24gPSAwO1xudmFyIGR1bW15U3RhdGUgPSB7fTtcbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gbWFrZVNlbGVjdG9yU3RhdGVmdWwoc291cmNlU2VsZWN0b3IsIHN0b3JlKSB7XG4gIC8vIHdyYXAgdGhlIHNlbGVjdG9yIGluIGFuIG9iamVjdCB0aGF0IHRyYWNrcyBpdHMgcmVzdWx0cyBiZXR3ZWVuIHJ1bnMuXG4gIHZhciBzZWxlY3RvciA9IHtcbiAgICBydW46IGZ1bmN0aW9uIHJ1bkNvbXBvbmVudFNlbGVjdG9yKHByb3BzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV4dFByb3BzID0gc291cmNlU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgcHJvcHMpO1xuICAgICAgICBpZiAobmV4dFByb3BzICE9PSBzZWxlY3Rvci5wcm9wcyB8fCBzZWxlY3Rvci5lcnJvcikge1xuICAgICAgICAgIHNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgc2VsZWN0b3IucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICAgICAgc2VsZWN0b3IuZXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSB0cnVlO1xuICAgICAgICBzZWxlY3Rvci5lcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZWN0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbm5lY3RBZHZhbmNlZChcbi8qXG4gIHNlbGVjdG9yRmFjdG9yeSBpcyBhIGZ1bmMgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB1c2VkIHRvXG4gIGNvbXB1dGUgbmV3IHByb3BzIGZyb20gc3RhdGUsIHByb3BzLCBhbmQgZGlzcGF0Y2guIEZvciBleGFtcGxlOlxuICAgICBleHBvcnQgZGVmYXVsdCBjb25uZWN0QWR2YW5jZWQoKGRpc3BhdGNoLCBvcHRpb25zKSA9PiAoc3RhdGUsIHByb3BzKSA9PiAoe1xuICAgICAgdGhpbmc6IHN0YXRlLnRoaW5nc1twcm9wcy50aGluZ0lkXSxcbiAgICAgIHNhdmVUaGluZzogZmllbGRzID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3JzLnNhdmVUaGluZyhwcm9wcy50aGluZ0lkLCBmaWVsZHMpKSxcbiAgICB9KSkoWW91ckNvbXBvbmVudClcbiAgIEFjY2VzcyB0byBkaXNwYXRjaCBpcyBwcm92aWRlZCB0byB0aGUgZmFjdG9yeSBzbyBzZWxlY3RvckZhY3RvcmllcyBjYW4gYmluZCBhY3Rpb25DcmVhdG9yc1xuICBvdXRzaWRlIG9mIHRoZWlyIHNlbGVjdG9yIGFzIGFuIG9wdGltaXphdGlvbi4gT3B0aW9ucyBwYXNzZWQgdG8gY29ubmVjdEFkdmFuY2VkIGFyZSBwYXNzZWQgdG9cbiAgdGhlIHNlbGVjdG9yRmFjdG9yeSwgYWxvbmcgd2l0aCBkaXNwbGF5TmFtZSBhbmQgV3JhcHBlZENvbXBvbmVudCwgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAgIE5vdGUgdGhhdCBzZWxlY3RvckZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGFsbCBjYWNoaW5nL21lbW9pemF0aW9uIG9mIGluYm91bmQgYW5kIG91dGJvdW5kXG4gIHByb3BzLiBEbyBub3QgdXNlIGNvbm5lY3RBZHZhbmNlZCBkaXJlY3RseSB3aXRob3V0IG1lbW9pemluZyByZXN1bHRzIGJldHdlZW4gY2FsbHMgdG8geW91clxuICBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZSBDb25uZWN0IGNvbXBvbmVudCB3aWxsIHJlLXJlbmRlciBvbiBldmVyeSBzdGF0ZSBvciBwcm9wcyBjaGFuZ2UuXG4qL1xuc2VsZWN0b3JGYWN0b3J5KSB7XG4gIHZhciBfY29udGV4dFR5cGVzLCBfY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgX3JlZiRnZXREaXNwbGF5TmFtZSA9IF9yZWYuZ2V0RGlzcGxheU5hbWUsXG4gICAgICBnZXREaXNwbGF5TmFtZSA9IF9yZWYkZ2V0RGlzcGxheU5hbWUgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuICdDb25uZWN0QWR2YW5jZWQoJyArIG5hbWUgKyAnKSc7XG4gIH0gOiBfcmVmJGdldERpc3BsYXlOYW1lLFxuICAgICAgX3JlZiRtZXRob2ROYW1lID0gX3JlZi5tZXRob2ROYW1lLFxuICAgICAgbWV0aG9kTmFtZSA9IF9yZWYkbWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkID8gJ2Nvbm5lY3RBZHZhbmNlZCcgOiBfcmVmJG1ldGhvZE5hbWUsXG4gICAgICBfcmVmJHJlbmRlckNvdW50UHJvcCA9IF9yZWYucmVuZGVyQ291bnRQcm9wLFxuICAgICAgcmVuZGVyQ291bnRQcm9wID0gX3JlZiRyZW5kZXJDb3VudFByb3AgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9yZWYkcmVuZGVyQ291bnRQcm9wLFxuICAgICAgX3JlZiRzaG91bGRIYW5kbGVTdGF0ID0gX3JlZi5zaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMgPSBfcmVmJHNob3VsZEhhbmRsZVN0YXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmJHNob3VsZEhhbmRsZVN0YXQsXG4gICAgICBfcmVmJHN0b3JlS2V5ID0gX3JlZi5zdG9yZUtleSxcbiAgICAgIHN0b3JlS2V5ID0gX3JlZiRzdG9yZUtleSA9PT0gdW5kZWZpbmVkID8gJ3N0b3JlJyA6IF9yZWYkc3RvcmVLZXksXG4gICAgICBfcmVmJHdpdGhSZWYgPSBfcmVmLndpdGhSZWYsXG4gICAgICB3aXRoUmVmID0gX3JlZiR3aXRoUmVmID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkd2l0aFJlZixcbiAgICAgIGNvbm5lY3RPcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIFsnZ2V0RGlzcGxheU5hbWUnLCAnbWV0aG9kTmFtZScsICdyZW5kZXJDb3VudFByb3AnLCAnc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzJywgJ3N0b3JlS2V5JywgJ3dpdGhSZWYnXSk7XG5cbiAgdmFyIHN1YnNjcmlwdGlvbktleSA9IHN0b3JlS2V5ICsgJ1N1YnNjcmlwdGlvbic7XG4gIHZhciB2ZXJzaW9uID0gaG90UmVsb2FkaW5nVmVyc2lvbisrO1xuXG4gIHZhciBjb250ZXh0VHlwZXMgPSAoX2NvbnRleHRUeXBlcyA9IHt9LCBfY29udGV4dFR5cGVzW3N0b3JlS2V5XSA9IHN0b3JlU2hhcGUsIF9jb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvblNoYXBlLCBfY29udGV4dFR5cGVzKTtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gKF9jaGlsZENvbnRleHRUeXBlcyA9IHt9LCBfY2hpbGRDb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvblNoYXBlLCBfY2hpbGRDb250ZXh0VHlwZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwV2l0aENvbm5lY3QoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCA9PSAnZnVuY3Rpb24nLCAnWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgJyArICgnY29ubmVjdC4gSW5zdGVhZCByZWNlaXZlZCAnICsgSlNPTi5zdHJpbmdpZnkoV3JhcHBlZENvbXBvbmVudCkpKTtcblxuICAgIHZhciB3cmFwcGVkQ29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuXG4gICAgdmFyIGRpc3BsYXlOYW1lID0gZ2V0RGlzcGxheU5hbWUod3JhcHBlZENvbXBvbmVudE5hbWUpO1xuXG4gICAgdmFyIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgY29ubmVjdE9wdGlvbnMsIHtcbiAgICAgIGdldERpc3BsYXlOYW1lOiBnZXREaXNwbGF5TmFtZSxcbiAgICAgIG1ldGhvZE5hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZW5kZXJDb3VudFByb3A6IHJlbmRlckNvdW50UHJvcCxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgc3RvcmVLZXk6IHN0b3JlS2V5LFxuICAgICAgd2l0aFJlZjogd2l0aFJlZixcbiAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIHdyYXBwZWRDb21wb25lbnROYW1lOiB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQ6IFdyYXBwZWRDb21wb25lbnRcbiAgICB9KTtcblxuICAgIHZhciBDb25uZWN0ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0cyhDb25uZWN0LCBfQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gQ29ubmVjdChwcm9wcywgY29udGV4dCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29ubmVjdCk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgX3RoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIF90aGlzLnN0YXRlID0ge307XG4gICAgICAgIF90aGlzLnJlbmRlckNvdW50ID0gMDtcbiAgICAgICAgX3RoaXMuc3RvcmUgPSBwcm9wc1tzdG9yZUtleV0gfHwgY29udGV4dFtzdG9yZUtleV07XG4gICAgICAgIF90aGlzLnByb3BzTW9kZSA9IEJvb2xlYW4ocHJvcHNbc3RvcmVLZXldKTtcbiAgICAgICAgX3RoaXMuc2V0V3JhcHBlZEluc3RhbmNlID0gX3RoaXMuc2V0V3JhcHBlZEluc3RhbmNlLmJpbmQoX3RoaXMpO1xuXG4gICAgICAgIGludmFyaWFudChfdGhpcy5zdG9yZSwgJ0NvdWxkIG5vdCBmaW5kIFwiJyArIHN0b3JlS2V5ICsgJ1wiIGluIGVpdGhlciB0aGUgY29udGV4dCBvciBwcm9wcyBvZiAnICsgKCdcIicgKyBkaXNwbGF5TmFtZSArICdcIi4gRWl0aGVyIHdyYXAgdGhlIHJvb3QgY29tcG9uZW50IGluIGEgPFByb3ZpZGVyPiwgJykgKyAoJ29yIGV4cGxpY2l0bHkgcGFzcyBcIicgKyBzdG9yZUtleSArICdcIiBhcyBhIHByb3AgdG8gXCInICsgZGlzcGxheU5hbWUgKyAnXCIuJykpO1xuXG4gICAgICAgIF90aGlzLmluaXRTZWxlY3RvcigpO1xuICAgICAgICBfdGhpcy5pbml0U3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgICAgICB2YXIgX3JlZjI7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBjb21wb25lbnQgcmVjZWl2ZWQgc3RvcmUgZnJvbSBwcm9wcywgaXRzIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdHJhbnNwYXJlbnRcbiAgICAgICAgLy8gdG8gYW55IGRlc2NlbmRhbnRzIHJlY2VpdmluZyBzdG9yZStzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0OyBpdCBwYXNzZXMgYWxvbmdcbiAgICAgICAgLy8gc3Vic2NyaXB0aW9uIHBhc3NlZCB0byBpdC4gT3RoZXJ3aXNlLCBpdCBzaGFkb3dzIHRoZSBwYXJlbnQgc3Vic2NyaXB0aW9uLCB3aGljaCBhbGxvd3NcbiAgICAgICAgLy8gQ29ubmVjdCB0byBjb250cm9sIG9yZGVyaW5nIG9mIG5vdGlmaWNhdGlvbnMgdG8gZmxvdyB0b3AtZG93bi5cbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMucHJvcHNNb2RlID8gbnVsbCA6IHRoaXMuc3Vic2NyaXB0aW9uO1xuICAgICAgICByZXR1cm4gX3JlZjIgPSB7fSwgX3JlZjJbc3Vic2NyaXB0aW9uS2V5XSA9IHN1YnNjcmlwdGlvbiB8fCB0aGlzLmNvbnRleHRbc3Vic2NyaXB0aW9uS2V5XSwgX3JlZjI7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBmaXJlcyBkdXJpbmcgc2VydmVyIHNpZGUgcmVuZGVyaW5nLCBidXQgY29tcG9uZW50RGlkTW91bnQgYW5kXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGRvIG5vdC4gQmVjYXVzZSBvZiB0aGlzLCB0cnlTdWJzY3JpYmUgaGFwcGVucyBkdXJpbmcgLi4uZGlkTW91bnQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdW5zdWJzY3JpcHRpb24gd291bGQgbmV2ZXIgdGFrZSBwbGFjZSBkdXJpbmcgU1NSLCBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuXG4gICAgICAgIC8vIFRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGNoaWxkIGNvbXBvbmVudCBtYXkgaGF2ZSB0cmlnZ2VyZWQgYSBzdGF0ZSBjaGFuZ2UgYnlcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgYW4gYWN0aW9uIGluIGl0cyBjb21wb25lbnRXaWxsTW91bnQsIHdlIGhhdmUgdG8gcmUtcnVuIHRoZSBzZWxlY3QgYW5kIG1heWJlXG4gICAgICAgIC8vIHJlLXJlbmRlci5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUpIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnJ1bihuZXh0UHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGU7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5ub3RpZnlOZXN0ZWRTdWJzID0gbm9vcDtcbiAgICAgICAgdGhpcy5zdG9yZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuID0gbm9vcDtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmdldFdyYXBwZWRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldFdyYXBwZWRJbnN0YW5jZSgpIHtcbiAgICAgICAgaW52YXJpYW50KHdpdGhSZWYsICdUbyBhY2Nlc3MgdGhlIHdyYXBwZWQgaW5zdGFuY2UsIHlvdSBuZWVkIHRvIHNwZWNpZnkgJyArICgneyB3aXRoUmVmOiB0cnVlIH0gaW4gdGhlIG9wdGlvbnMgYXJndW1lbnQgb2YgdGhlICcgKyBtZXRob2ROYW1lICsgJygpIGNhbGwuJykpO1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkSW5zdGFuY2U7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5zZXRXcmFwcGVkSW5zdGFuY2UgPSBmdW5jdGlvbiBzZXRXcmFwcGVkSW5zdGFuY2UocmVmKSB7XG4gICAgICAgIHRoaXMud3JhcHBlZEluc3RhbmNlID0gcmVmO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuaW5pdFNlbGVjdG9yID0gZnVuY3Rpb24gaW5pdFNlbGVjdG9yKCkge1xuICAgICAgICB2YXIgc291cmNlU2VsZWN0b3IgPSBzZWxlY3RvckZhY3RvcnkodGhpcy5zdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBtYWtlU2VsZWN0b3JTdGF0ZWZ1bChzb3VyY2VTZWxlY3RvciwgdGhpcy5zdG9yZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuaW5pdFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIGluaXRTdWJzY3JpcHRpb24oKSB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47XG5cbiAgICAgICAgLy8gcGFyZW50U3ViJ3Mgc291cmNlIHNob3VsZCBtYXRjaCB3aGVyZSBzdG9yZSBjYW1lIGZyb206IHByb3BzIHZzLiBjb250ZXh0LiBBIGNvbXBvbmVudFxuICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHN0b3JlIHZpYSBwcm9wcyBzaG91bGRuJ3QgdXNlIHN1YnNjcmlwdGlvbiBmcm9tIGNvbnRleHQsIG9yIHZpY2UgdmVyc2EuXG4gICAgICAgIHZhciBwYXJlbnRTdWIgPSAodGhpcy5wcm9wc01vZGUgPyB0aGlzLnByb3BzIDogdGhpcy5jb250ZXh0KVtzdWJzY3JpcHRpb25LZXldO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24odGhpcy5zdG9yZSwgcGFyZW50U3ViLCB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHRoaXMuc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gQW5cbiAgICAgICAgLy8gZXh0cmEgbnVsbCBjaGVjayBldmVyeSBjaGFuZ2UgY2FuIGJlIGF2b2lkZWQgYnkgY29weWluZyB0aGUgbWV0aG9kIG9udG8gYHRoaXNgIGFuZCB0aGVuXG4gICAgICAgIC8vIHJlcGxhY2luZyBpdCB3aXRoIGEgbm8tb3Agb24gdW5tb3VudC4gVGhpcyBjYW4gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24nc1xuICAgICAgICAvLyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZVxuICAgICAgICAvLyBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMgPSB0aGlzLnN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQodGhpcy5zdWJzY3JpcHRpb24pO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUub25TdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSA9IHRoaXMubm90aWZ5TmVzdGVkU3Vic09uQ29tcG9uZW50RGlkVXBkYXRlO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoZHVtbXlTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLm5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgLy8gYGNvbXBvbmVudERpZFVwZGF0ZWAgaXMgY29uZGl0aW9uYWxseSBpbXBsZW1lbnRlZCB3aGVuIGBvblN0YXRlQ2hhbmdlYCBkZXRlcm1pbmVzIGl0XG4gICAgICAgIC8vIG5lZWRzIHRvIG5vdGlmeSBuZXN0ZWQgc3Vicy4gT25jZSBjYWxsZWQsIGl0IHVuaW1wbGVtZW50cyBpdHNlbGYgdW50aWwgZnVydGhlciBzdGF0ZVxuICAgICAgICAvLyBjaGFuZ2VzIG9jY3VyLiBEb2luZyBpdCB0aGlzIHdheSB2cyBoYXZpbmcgYSBwZXJtYW5lbnQgYGNvbXBvbmVudERpZE1vdW50YCB0aGF0IGRvZXNcbiAgICAgICAgLy8gYSBib29sZWFuIGNoZWNrIGV2ZXJ5IHRpbWUgYXZvaWRzIGFuIGV4dHJhIG1ldGhvZCBjYWxsIG1vc3Qgb2YgdGhlIHRpbWUsIHJlc3VsdGluZ1xuICAgICAgICAvLyBpbiBzb21lIHBlcmYgYm9vc3QuXG4gICAgICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmlzU3Vic2NyaWJlZCA9IGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdWJzY3JpcHRpb24pICYmIHRoaXMuc3Vic2NyaXB0aW9uLmlzU3Vic2NyaWJlZCgpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuYWRkRXh0cmFQcm9wcyA9IGZ1bmN0aW9uIGFkZEV4dHJhUHJvcHMocHJvcHMpIHtcbiAgICAgICAgaWYgKCF3aXRoUmVmICYmICFyZW5kZXJDb3VudFByb3AgJiYgISh0aGlzLnByb3BzTW9kZSAmJiB0aGlzLnN1YnNjcmlwdGlvbikpIHJldHVybiBwcm9wcztcbiAgICAgICAgLy8gbWFrZSBhIHNoYWxsb3cgY29weSBzbyB0aGF0IGZpZWxkcyBhZGRlZCBkb24ndCBsZWFrIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3Rvci5cbiAgICAgICAgLy8gdGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgJ3JlZicgc2luY2UgdGhhdCdzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICAvLyBpbnN0YW5jZS4gYSBzaW5nbGV0b24gbWVtb2l6ZWQgc2VsZWN0b3Igd291bGQgdGhlbiBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZVxuICAgICAgICAvLyBpbnN0YW5jZSwgcHJldmVudGluZyB0aGUgaW5zdGFuY2UgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCwgYW5kIHRoYXQgd291bGQgYmUgYmFkXG4gICAgICAgIHZhciB3aXRoRXh0cmFzID0gX2V4dGVuZHMoe30sIHByb3BzKTtcbiAgICAgICAgaWYgKHdpdGhSZWYpIHdpdGhFeHRyYXMucmVmID0gdGhpcy5zZXRXcmFwcGVkSW5zdGFuY2U7XG4gICAgICAgIGlmIChyZW5kZXJDb3VudFByb3ApIHdpdGhFeHRyYXNbcmVuZGVyQ291bnRQcm9wXSA9IHRoaXMucmVuZGVyQ291bnQrKztcbiAgICAgICAgaWYgKHRoaXMucHJvcHNNb2RlICYmIHRoaXMuc3Vic2NyaXB0aW9uKSB3aXRoRXh0cmFzW3N1YnNjcmlwdGlvbktleV0gPSB0aGlzLnN1YnNjcmlwdGlvbjtcbiAgICAgICAgcmV0dXJuIHdpdGhFeHRyYXM7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3I7XG4gICAgICAgIHNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvci5lcnJvcikge1xuICAgICAgICAgIHRocm93IHNlbGVjdG9yLmVycm9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMuYWRkRXh0cmFQcm9wcyhzZWxlY3Rvci5wcm9wcykpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29ubmVjdDtcbiAgICB9KENvbXBvbmVudCk7XG5cbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBDb25uZWN0LmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgQ29ubmVjdC5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG4gICAgQ29ubmVjdC5wcm9wVHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVcGRhdGUoKSB7XG4gICAgICAgIC8vIFdlIGFyZSBob3QgcmVsb2FkaW5nIVxuICAgICAgICBpZiAodGhpcy52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICB0aGlzLmluaXRTZWxlY3RvcigpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB0aGlzLnN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuaW5pdFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHRoaXMuc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZC5qcyIsImltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGdldENvbnN0YW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0Q29uc3RhbnRTZWxlY3RvcihkaXNwYXRjaCwgb3B0aW9ucykge1xuICAgIHZhciBjb25zdGFudCA9IGdldENvbnN0YW50KGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn1cblxuLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vLyBcbi8vIEEgbGVuZ3RoIG9mIG9uZSBzaWduYWxzIHRoYXQgbWFwVG9Qcm9wcyBkb2VzIG5vdCBkZXBlbmQgb24gcHJvcHMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbi8vIEEgbGVuZ3RoIG9mIHplcm8gaXMgYXNzdW1lZCB0byBtZWFuIG1hcFRvUHJvcHMgaXMgZ2V0dGluZyBhcmdzIHZpYSBhcmd1bWVudHMgb3IgLi4uYXJncyBhbmRcbi8vIHRoZXJlZm9yZSBub3QgcmVwb3J0aW5nIGl0cyBsZW5ndGggYWNjdXJhdGVseS4uXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyAhPT0gbnVsbCAmJiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzICE9PSB1bmRlZmluZWQgPyBCb29sZWFuKG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIDogbWFwVG9Qcm9wcy5sZW5ndGggIT09IDE7XG59XG5cbi8vIFVzZWQgYnkgd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24gYW5kIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uLFxuLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBtYXBUb1Byb3BzIGluIGEgcHJveHkgZnVuY3Rpb24gd2hpY2ggZG9lcyBzZXZlcmFsIHRoaW5nczpcbi8vIFxuLy8gICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBkZXBlbmRzIG9uIHByb3BzLCB3aGljaFxuLy8gICAgaXMgdXNlZCBieSBzZWxlY3RvckZhY3RvcnkgdG8gZGVjaWRlIGlmIGl0IHNob3VsZCByZWludm9rZSBvbiBwcm9wcyBjaGFuZ2VzLlxuLy8gICAgXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy8gICAgXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCB2ZXJpZmllcyB0aGUgZmlyc3QgcmVzdWx0IGlzIGEgcGxhaW4gb2JqZWN0LCBpbiBvcmRlciB0byB3YXJuXG4vLyAgICB0aGUgZGV2ZWxvcGVyIHRoYXQgdGhlaXIgbWFwVG9Qcm9wcyBmdW5jdGlvbiBpcyBub3QgcmV0dXJuaW5nIGEgdmFsaWQgcmVzdWx0LlxuLy8gICAgXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZTtcblxuICAgIHZhciBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gpO1xuICAgIH07XG5cbiAgICAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIHZhciBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuXG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5leHBvcnQgdmFyIHN1YnNjcmlwdGlvblNoYXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgdHJ5U3Vic2NyaWJlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0cnlVbnN1YnNjcmliZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm90aWZ5TmVzdGVkU3ViczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNTdWJzY3JpYmVkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59KTtcblxuZXhwb3J0IHZhciBzdG9yZVNoYXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgc3Vic2NyaWJlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZ2V0U3RhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtcmVkdXgvZXMvdXRpbHMvUHJvcFR5cGVzLmpzIiwiaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnbG9kYXNoLWVzL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKG1ldGhvZE5hbWUgKyAnKCkgaW4gJyArIGRpc3BsYXlOYW1lICsgJyBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCAnICsgdmFsdWUgKyAnLicpO1xuICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsInZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxudmFyIGlzTW9kaWZpZWRFdmVudCA9IGZ1bmN0aW9uIGlzTW9kaWZpZWRFdmVudChldmVudCkge1xuICByZXR1cm4gISEoZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XG59O1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciByZW5kZXJpbmcgYSBoaXN0b3J5LWF3YXJlIDxhPi5cbiAqL1xuXG52YXIgTGluayA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMaW5rLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMaW5rKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluayk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkNsaWNrKSBfdGhpcy5wcm9wcy5vbkNsaWNrKGV2ZW50KTtcblxuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIC8vIG9uQ2xpY2sgcHJldmVudGVkIGRlZmF1bHRcbiAgICAgIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiAvLyBpZ25vcmUgcmlnaHQgY2xpY2tzXG4gICAgICAhX3RoaXMucHJvcHMudGFyZ2V0ICYmIC8vIGxldCBicm93c2VyIGhhbmRsZSBcInRhcmdldD1fYmxhbmtcIiBldGMuXG4gICAgICAhaXNNb2RpZmllZEV2ZW50KGV2ZW50KSAvLyBpZ25vcmUgY2xpY2tzIHdpdGggbW9kaWZpZXIga2V5c1xuICAgICAgKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIHZhciBoaXN0b3J5ID0gX3RoaXMuY29udGV4dC5yb3V0ZXIuaGlzdG9yeTtcbiAgICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgcmVwbGFjZSA9IF90aGlzJHByb3BzLnJlcGxhY2UsXG4gICAgICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG87XG5cblxuICAgICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgICBoaXN0b3J5LnJlcGxhY2UodG8pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaXN0b3J5LnB1c2godG8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgTGluay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICByZXBsYWNlID0gX3Byb3BzLnJlcGxhY2UsXG4gICAgICAgIHRvID0gX3Byb3BzLnRvLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsncmVwbGFjZScsICd0byddKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgdmFyIGhyZWYgPSB0aGlzLmNvbnRleHQucm91dGVyLmhpc3RvcnkuY3JlYXRlSHJlZih0eXBlb2YgdG8gPT09ICdzdHJpbmcnID8geyBwYXRobmFtZTogdG8gfSA6IHRvKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdhJywgX2V4dGVuZHMoe30sIHByb3BzLCB7IG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2ssIGhyZWY6IGhyZWYgfSkpO1xuICB9O1xuXG4gIHJldHVybiBMaW5rO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5MaW5rLnByb3BUeXBlcyA9IHtcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIHRhcmdldDogUHJvcFR5cGVzLnN0cmluZyxcbiAgcmVwbGFjZTogUHJvcFR5cGVzLmJvb2wsXG4gIHRvOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSkuaXNSZXF1aXJlZFxufTtcbkxpbmsuZGVmYXVsdFByb3BzID0ge1xuICByZXBsYWNlOiBmYWxzZVxufTtcbkxpbmsuY29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHB1c2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICByZXBsYWNlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgY3JlYXRlSHJlZjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0pLmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBMaW5rO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9MaW5rLmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG1hdGNoUGF0aCBmcm9tICcuL21hdGNoUGF0aCc7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIG1hdGNoaW5nIGEgc2luZ2xlIHBhdGggYW5kIHJlbmRlcmluZy5cbiAqL1xuXG52YXIgUm91dGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUm91dGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm91dGUpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLnN0YXRlID0ge1xuICAgICAgbWF0Y2g6IF90aGlzLmNvbXB1dGVNYXRjaChfdGhpcy5wcm9wcywgX3RoaXMuY29udGV4dC5yb3V0ZXIpXG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBSb3V0ZS5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXI6IF9leHRlbmRzKHt9LCB0aGlzLmNvbnRleHQucm91dGVyLCB7XG4gICAgICAgIHJvdXRlOiB7XG4gICAgICAgICAgbG9jYXRpb246IHRoaXMucHJvcHMubG9jYXRpb24gfHwgdGhpcy5jb250ZXh0LnJvdXRlci5yb3V0ZS5sb2NhdGlvbixcbiAgICAgICAgICBtYXRjaDogdGhpcy5zdGF0ZS5tYXRjaFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLmNvbXB1dGVNYXRjaCA9IGZ1bmN0aW9uIGNvbXB1dGVNYXRjaChfcmVmLCBfcmVmMikge1xuICAgIHZhciBjb21wdXRlZE1hdGNoID0gX3JlZi5jb21wdXRlZE1hdGNoLFxuICAgICAgICBsb2NhdGlvbiA9IF9yZWYubG9jYXRpb24sXG4gICAgICAgIHBhdGggPSBfcmVmLnBhdGgsXG4gICAgICAgIHN0cmljdCA9IF9yZWYuc3RyaWN0LFxuICAgICAgICBleGFjdCA9IF9yZWYuZXhhY3Q7XG4gICAgdmFyIHJvdXRlID0gX3JlZjIucm91dGU7XG5cbiAgICBpZiAoY29tcHV0ZWRNYXRjaCkgcmV0dXJuIGNvbXB1dGVkTWF0Y2g7IC8vIDxTd2l0Y2g+IGFscmVhZHkgY29tcHV0ZWQgdGhlIG1hdGNoIGZvciB1c1xuXG4gICAgdmFyIHBhdGhuYW1lID0gKGxvY2F0aW9uIHx8IHJvdXRlLmxvY2F0aW9uKS5wYXRobmFtZTtcblxuICAgIHJldHVybiBwYXRoID8gbWF0Y2hQYXRoKHBhdGhuYW1lLCB7IHBhdGg6IHBhdGgsIHN0cmljdDogc3RyaWN0LCBleGFjdDogZXhhY3QgfSkgOiByb3V0ZS5tYXRjaDtcbiAgfTtcblxuICBSb3V0ZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50LFxuICAgICAgICByZW5kZXIgPSBfcHJvcHMucmVuZGVyLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcblxuXG4gICAgd2FybmluZyghKGNvbXBvbmVudCAmJiByZW5kZXIpLCAnWW91IHNob3VsZCBub3QgdXNlIDxSb3V0ZSBjb21wb25lbnQ+IGFuZCA8Um91dGUgcmVuZGVyPiBpbiB0aGUgc2FtZSByb3V0ZTsgPFJvdXRlIHJlbmRlcj4gd2lsbCBiZSBpZ25vcmVkJyk7XG5cbiAgICB3YXJuaW5nKCEoY29tcG9uZW50ICYmIGNoaWxkcmVuKSwgJ1lvdSBzaG91bGQgbm90IHVzZSA8Um91dGUgY29tcG9uZW50PiBhbmQgPFJvdXRlIGNoaWxkcmVuPiBpbiB0aGUgc2FtZSByb3V0ZTsgPFJvdXRlIGNoaWxkcmVuPiB3aWxsIGJlIGlnbm9yZWQnKTtcblxuICAgIHdhcm5pbmcoIShyZW5kZXIgJiYgY2hpbGRyZW4pLCAnWW91IHNob3VsZCBub3QgdXNlIDxSb3V0ZSByZW5kZXI+IGFuZCA8Um91dGUgY2hpbGRyZW4+IGluIHRoZSBzYW1lIHJvdXRlOyA8Um91dGUgY2hpbGRyZW4+IHdpbGwgYmUgaWdub3JlZCcpO1xuICB9O1xuXG4gIFJvdXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAgd2FybmluZyghKG5leHRQcm9wcy5sb2NhdGlvbiAmJiAhdGhpcy5wcm9wcy5sb2NhdGlvbiksICc8Um91dGU+IGVsZW1lbnRzIHNob3VsZCBub3QgY2hhbmdlIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBZb3UgaW5pdGlhbGx5IHVzZWQgbm8gXCJsb2NhdGlvblwiIHByb3AgYW5kIHRoZW4gcHJvdmlkZWQgb25lIG9uIGEgc3Vic2VxdWVudCByZW5kZXIuJyk7XG5cbiAgICB3YXJuaW5nKCEoIW5leHRQcm9wcy5sb2NhdGlvbiAmJiB0aGlzLnByb3BzLmxvY2F0aW9uKSwgJzxSb3V0ZT4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBwcm92aWRlZCBhIFwibG9jYXRpb25cIiBwcm9wIGluaXRpYWxseSBidXQgb21pdHRlZCBpdCBvbiBhIHN1YnNlcXVlbnQgcmVuZGVyLicpO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtYXRjaDogdGhpcy5jb21wdXRlTWF0Y2gobmV4dFByb3BzLCBuZXh0Q29udGV4dC5yb3V0ZXIpXG4gICAgfSk7XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0YXRlLm1hdGNoO1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICBjb21wb25lbnQgPSBfcHJvcHMyLmNvbXBvbmVudCxcbiAgICAgICAgcmVuZGVyID0gX3Byb3BzMi5yZW5kZXI7XG4gICAgdmFyIF9jb250ZXh0JHJvdXRlciA9IHRoaXMuY29udGV4dC5yb3V0ZXIsXG4gICAgICAgIGhpc3RvcnkgPSBfY29udGV4dCRyb3V0ZXIuaGlzdG9yeSxcbiAgICAgICAgcm91dGUgPSBfY29udGV4dCRyb3V0ZXIucm91dGUsXG4gICAgICAgIHN0YXRpY0NvbnRleHQgPSBfY29udGV4dCRyb3V0ZXIuc3RhdGljQ29udGV4dDtcblxuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMucHJvcHMubG9jYXRpb24gfHwgcm91dGUubG9jYXRpb247XG4gICAgdmFyIHByb3BzID0geyBtYXRjaDogbWF0Y2gsIGxvY2F0aW9uOiBsb2NhdGlvbiwgaGlzdG9yeTogaGlzdG9yeSwgc3RhdGljQ29udGV4dDogc3RhdGljQ29udGV4dCB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCA/IC8vIGNvbXBvbmVudCBwcm9wIGdldHMgZmlyc3QgcHJpb3JpdHksIG9ubHkgY2FsbGVkIGlmIHRoZXJlJ3MgYSBtYXRjaFxuICAgIG1hdGNoID8gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIHByb3BzKSA6IG51bGwgOiByZW5kZXIgPyAvLyByZW5kZXIgcHJvcCBpcyBuZXh0LCBvbmx5IGNhbGxlZCBpZiB0aGVyZSdzIGEgbWF0Y2hcbiAgICBtYXRjaCA/IHJlbmRlcihwcm9wcykgOiBudWxsIDogY2hpbGRyZW4gPyAvLyBjaGlsZHJlbiBjb21lIGxhc3QsIGFsd2F5cyBjYWxsZWRcbiAgICB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbihwcm9wcykgOiAhQXJyYXkuaXNBcnJheShjaGlsZHJlbikgfHwgY2hpbGRyZW4ubGVuZ3RoID8gLy8gUHJlYWN0IGRlZmF1bHRzIHRvIGVtcHR5IGNoaWxkcmVuIGFycmF5XG4gICAgUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbikgOiBudWxsIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gUm91dGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblJvdXRlLnByb3BUeXBlcyA9IHtcbiAgY29tcHV0ZWRNYXRjaDogUHJvcFR5cGVzLm9iamVjdCwgLy8gcHJpdmF0ZSwgZnJvbSA8U3dpdGNoPlxuICBwYXRoOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBleGFjdDogUHJvcFR5cGVzLmJvb2wsXG4gIHN0cmljdDogUHJvcFR5cGVzLmJvb2wsXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzLmZ1bmMsXG4gIHJlbmRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm5vZGVdKSxcbiAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3Rcbn07XG5Sb3V0ZS5jb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgcm91dGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBzdGF0aWNDb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0XG4gIH0pXG59O1xuUm91dGUuY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyL2VzL1JvdXRlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gcmVxdWlyZSgnLi9sb3dQcmlvcml0eVdhcm5pbmcnKTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuZnVuY3Rpb24gUmVhY3RDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cblJlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG5cbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAhKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpIDogX3Byb2RJbnZhcmlhbnQoJzg1JykgOiB2b2lkIDA7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBSZWFjdFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgLy8gRHVwbGljYXRlZCBmcm9tIFJlYWN0Q29tcG9uZW50LlxuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gUmVhY3RDb21wb25lbnQucHJvdG90eXBlO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWN0UHVyZUNvbXBvbmVudDtcbi8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuX2Fzc2lnbihSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50LFxuICBQdXJlQ29tcG9uZW50OiBSZWFjdFB1cmVDb21wb25lbnRcbn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RCYXNlQ2xhc3Nlcy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRTeW1ib2wuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyoqXG4gKiBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBhIGVsZW1lbnQgZmFjdG9yeVxuICogd2hpY2ggdmFsaWRhdGVzIHRoZSBwcm9wcyBwYXNzZWQgdG8gdGhlIGVsZW1lbnQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgb25seSBpbiBERVYgYW5kIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgc3RhdGljIHR5cGUgY2hlY2tlciBmb3IgbGFuZ3VhZ2VzXG4gKiB0aGF0IHN1cHBvcnQgaXQuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBjaGVja1JlYWN0VHlwZVNwZWMgPSByZXF1aXJlKCcuL2NoZWNrUmVhY3RUeXBlU3BlYycpO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JGbiA9IHJlcXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gcmVxdWlyZSgnLi9sb3dQcmlvcml0eVdhcm5pbmcnKTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudFByb3BzLl9fc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgc291cmNlID0gZWxlbWVudFByb3BzLl9fc291cmNlO1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJyBDaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gJyBDaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDwnICsgcGFyZW50TmFtZSArICc+Lic7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmZvO1xufVxuXG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gIHZhciBtZW1vaXplciA9IG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgfHwgKG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgPSB7fSk7XG5cbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuICBpZiAobWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlO1xuXG4gIC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSAnIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tICcgKyBlbGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLic7XG4gIH1cblxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0VhY2ggY2hpbGQgaW4gYW4gYXJyYXkgb3IgaXRlcmF0b3Igc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJXMnLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpKSA6IHZvaWQgMDtcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcbiAgICAvLyBFbnRyeSBpdGVyYXRvcnMgcHJvdmlkZSBpbXBsaWNpdCBrZXlzLlxuICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHZhciBjb21wb25lbnRDbGFzcyA9IGVsZW1lbnQudHlwZTtcbiAgaWYgKHR5cGVvZiBjb21wb25lbnRDbGFzcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmFtZSA9IGNvbXBvbmVudENsYXNzLmRpc3BsYXlOYW1lIHx8IGNvbXBvbmVudENsYXNzLm5hbWU7XG4gIGlmIChjb21wb25lbnRDbGFzcy5wcm9wVHlwZXMpIHtcbiAgICBjaGVja1JlYWN0VHlwZVNwZWMoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQsIG51bGwpO1xuICB9XG4gIGlmICh0eXBlb2YgY29tcG9uZW50Q2xhc3MuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoY29tcG9uZW50Q2xhc3MuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkLCAnZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG59XG5cbnZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSB7XG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nO1xuICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4uXCI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHByb3BzKTtcbiAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZm8gKz0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgICAgIHZhciBjdXJyZW50U291cmNlID0gcHJvcHMgIT09IG51bGwgJiYgcHJvcHMgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5fX3NvdXJjZSAhPT0gdW5kZWZpbmVkID8gcHJvcHMuX19zb3VyY2UgOiBudWxsO1xuICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rLnB1c2hOb25TdGFuZGFyZFdhcm5pbmdTdGFjayh0cnVlLCBjdXJyZW50U291cmNlKTtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiB2b2lkIDA7XG4gICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sucG9wTm9uU3RhbmRhcmRXYXJuaW5nU3RhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9LFxuXG4gIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUpO1xuICAgIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZFxuICAgIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxvd1ByaW9yaXR5V2FybmluZyhmYWxzZSwgJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbiAgfSxcblxuICBjbG9uZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICAgIH1cbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3I7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RFbGVtZW50VmFsaWRhdG9yLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVDYWxsYmFjazogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaykge30sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdE5vb3BVcGRhdGVRdWV1ZS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuXG52YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gKlxuICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gKlxuICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICogICAgICAgLi4uXG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRJdGVyYXRvckZuO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL2dldEl0ZXJhdG9yRm4uanMiLCIvKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBmdW5jc1tmdW5jcy5sZW5ndGggLSAxXTtcbiAgdmFyIHJlc3QgPSBmdW5jcy5zbGljZSgwLCAtMSk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlc3QucmVkdWNlUmlnaHQoZnVuY3Rpb24gKGNvbXBvc2VkLCBmKSB7XG4gICAgICByZXR1cm4gZihjb21wb3NlZCk7XG4gICAgfSwgbGFzdC5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVkdXgvZXMvY29tcG9zZS5qcyIsImltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2xvZGFzaC1lcy9pc1BsYWluT2JqZWN0JztcbmltcG9ydCAkJG9ic2VydmFibGUgZnJvbSAnc3ltYm9sLW9ic2VydmFibGUnO1xuXG4vKipcbiAqIFRoZXNlIGFyZSBwcml2YXRlIGFjdGlvbiB0eXBlcyByZXNlcnZlZCBieSBSZWR1eC5cbiAqIEZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAqIERvIG5vdCByZWZlcmVuY2UgdGhlc2UgYWN0aW9uIHR5cGVzIGRpcmVjdGx5IGluIHlvdXIgY29kZS5cbiAqL1xuZXhwb3J0IHZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogJ0BAcmVkdXgvSU5JVCdcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIFJlZHV4IHN0b3JlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIHRyZWUuXG4gKiBUaGUgb25seSB3YXkgdG8gY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBzdG9yZSBpcyB0byBjYWxsIGBkaXNwYXRjaCgpYCBvbiBpdC5cbiAqXG4gKiBUaGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBzdG9yZSBpbiB5b3VyIGFwcC4gVG8gc3BlY2lmeSBob3cgZGlmZmVyZW50XG4gKiBwYXJ0cyBvZiB0aGUgc3RhdGUgdHJlZSByZXNwb25kIHRvIGFjdGlvbnMsIHlvdSBtYXkgY29tYmluZSBzZXZlcmFsIHJlZHVjZXJzXG4gKiBpbnRvIGEgc2luZ2xlIHJlZHVjZXIgZnVuY3Rpb24gYnkgdXNpbmcgYGNvbWJpbmVSZWR1Y2Vyc2AuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVkdWNlciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBzdGF0ZSB0cmVlLCBnaXZlblxuICogdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGFjdGlvbiB0byBoYW5kbGUuXG4gKlxuICogQHBhcmFtIHthbnl9IFtwcmVsb2FkZWRTdGF0ZV0gVGhlIGluaXRpYWwgc3RhdGUuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBoeWRyYXRlIHRoZSBzdGF0ZSBmcm9tIHRoZSBzZXJ2ZXIgaW4gdW5pdmVyc2FsIGFwcHMsIG9yIHRvIHJlc3RvcmUgYVxuICogcHJldmlvdXNseSBzZXJpYWxpemVkIHVzZXIgc2Vzc2lvbi5cbiAqIElmIHlvdSB1c2UgYGNvbWJpbmVSZWR1Y2Vyc2AgdG8gcHJvZHVjZSB0aGUgcm9vdCByZWR1Y2VyIGZ1bmN0aW9uLCB0aGlzIG11c3QgYmVcbiAqIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFzIGBjb21iaW5lUmVkdWNlcnNgIGtleXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5oYW5jZXIgVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIHZhciBjdXJyZW50TGlzdGVuZXJzID0gW107XG4gIHZhciBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgdmFyIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcblxuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiAnICsgJ1VzZSBjdXN0b20gbWlkZGxld2FyZSBmb3IgYXN5bmMgYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuICcgKyAnSGF2ZSB5b3UgbWlzc3BlbGxlZCBhIGNvbnN0YW50PycpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3RlbmVyc1tpXSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5JTklUIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7IHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZSB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH1cblxuICAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cbiAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5JTklUIH0pO1xuXG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMlskJG9ic2VydmFibGVdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWR1eC9lcy9jcmVhdGVTdG9yZS5qcyIsIi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWR1eC9lcy91dGlscy93YXJuaW5nLmpzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbiAgY29uc3QgZm9vdGVySXRlbXMgPSBbXCJGaWxlc1wiLFwiUGhvdG9zXCIsXCJTaGFyZWRcIixcIk11c2ljXCIsXCJNZW51XCJdO1xuICBjb25zdCBpY29uTWFwID0ge1xuICBmaWxlczogJ2ZhLWZvbGRlcicsXG4gIHBob3RvczogJ2ZhLXBpY3R1cmUtbycsXG4gIHNoYXJlZDogJ2ZhLXVzZXJzJyxcbiAgbXVzaWM6ICdmYS1tdXNpYycsXG4gIG1lbnU6ICdmYS1iYXJzJ1xuICB9O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCb3R0b21OYXYoe2xvY2F0aW9ufSkge1xuXG4gIGNvbnN0IGZvb3RlckVsZW1lbnRzID0gZm9vdGVySXRlbXMubWFwKCAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGxpXG4gICAgICAgIGNsYXNzTmFtZT17XCJmb290ZXItaXRlbSBcIiArIChsb2NhdGlvbiA9PT0gaXRlbS50b0xvd2VyQ2FzZSgpICYmIFwiZm9vdGVyLWxpLWFjdGl2ZVwiKX1cbiAgICAgICAga2V5PXtpbmRleH1cbiAgICAgID5cbiAgICAgIDxhIGhyZWY9e1wiLyMvXCIgKyBpdGVtLnRvTG93ZXJDYXNlKCl9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJ0ZXN0LWRpdiBcIiArIChpbmRleCA9PT0gMiAmJiBcIm1pZGRsZS1idXR0b25cIil9PlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT17YGZhICR7aWNvbk1hcFtpdGVtLnRvTG93ZXJDYXNlKCldfSBmYS0yeCBmb290ZXItZmFgfSBhcmlhLWhpZGRlbj1cInRydWVcIi8+XG4gICAgICAgICAgPHNwYW4+e2luZGV4IDwgNCA/IGl0ZW0gOiBcIlwifTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2E+XG4gICAgICA8L2xpPlxuICAgIClcbiAgfSApXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb3RlclwiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImZvb3Rlcm1lbnVcIj5cbiAgICAgICAge2Zvb3RlckVsZW1lbnRzfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vYm90dG9tLW5hdi5qc3giLCJmdW5jdGlvbiB0cmF2ZXJzZShvcmlnaW4sIHByb3BsaXN0KSB7XG4gIGlmIChwcm9wbGlzdC5sZW5ndGgpIHtcbiAgICBsZXQgcHJvcCA9IHByb3BsaXN0LnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRyYXZlcnNlKG9yaWdpbi5jb250ZW50cy5maW5kKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gcHJvcCksIHByb3BsaXN0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb3JpZ2luO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBhdGggKHN0YXRlKSB7XG4gIHJldHVybiAoc3RhdGUuY3VycmVudFBhdGggPyB0cmF2ZXJzZShzdGF0ZS5maWxlc3lzdGVtLCBzdGF0ZS5jdXJyZW50UGF0aC5zcGxpdCgnLycpLnNsaWNlKDEpKSA6IHN0YXRlLmZpbGVzeXN0ZW0pLmNvbnRlbnRzO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlsL2dldFBhdGguanMiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvUmVhY3RET00nKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2luZGV4LmpzIiwiaW1wb3J0IF9Ccm93c2VyUm91dGVyIGZyb20gJy4vQnJvd3NlclJvdXRlcic7XG5leHBvcnQgeyBfQnJvd3NlclJvdXRlciBhcyBCcm93c2VyUm91dGVyIH07XG5pbXBvcnQgX0hhc2hSb3V0ZXIgZnJvbSAnLi9IYXNoUm91dGVyJztcbmV4cG9ydCB7IF9IYXNoUm91dGVyIGFzIEhhc2hSb3V0ZXIgfTtcbmltcG9ydCBfTGluayBmcm9tICcuL0xpbmsnO1xuZXhwb3J0IHsgX0xpbmsgYXMgTGluayB9O1xuaW1wb3J0IF9NZW1vcnlSb3V0ZXIgZnJvbSAnLi9NZW1vcnlSb3V0ZXInO1xuZXhwb3J0IHsgX01lbW9yeVJvdXRlciBhcyBNZW1vcnlSb3V0ZXIgfTtcbmltcG9ydCBfTmF2TGluayBmcm9tICcuL05hdkxpbmsnO1xuZXhwb3J0IHsgX05hdkxpbmsgYXMgTmF2TGluayB9O1xuaW1wb3J0IF9Qcm9tcHQgZnJvbSAnLi9Qcm9tcHQnO1xuZXhwb3J0IHsgX1Byb21wdCBhcyBQcm9tcHQgfTtcbmltcG9ydCBfUmVkaXJlY3QgZnJvbSAnLi9SZWRpcmVjdCc7XG5leHBvcnQgeyBfUmVkaXJlY3QgYXMgUmVkaXJlY3QgfTtcbmltcG9ydCBfUm91dGUgZnJvbSAnLi9Sb3V0ZSc7XG5leHBvcnQgeyBfUm91dGUgYXMgUm91dGUgfTtcbmltcG9ydCBfUm91dGVyIGZyb20gJy4vUm91dGVyJztcbmV4cG9ydCB7IF9Sb3V0ZXIgYXMgUm91dGVyIH07XG5pbXBvcnQgX1N0YXRpY1JvdXRlciBmcm9tICcuL1N0YXRpY1JvdXRlcic7XG5leHBvcnQgeyBfU3RhdGljUm91dGVyIGFzIFN0YXRpY1JvdXRlciB9O1xuaW1wb3J0IF9Td2l0Y2ggZnJvbSAnLi9Td2l0Y2gnO1xuZXhwb3J0IHsgX1N3aXRjaCBhcyBTd2l0Y2ggfTtcbmltcG9ydCBfbWF0Y2hQYXRoIGZyb20gJy4vbWF0Y2hQYXRoJztcbmV4cG9ydCB7IF9tYXRjaFBhdGggYXMgbWF0Y2hQYXRoIH07XG5pbXBvcnQgX3dpdGhSb3V0ZXIgZnJvbSAnLi93aXRoUm91dGVyJztcbmV4cG9ydCB7IF93aXRoUm91dGVyIGFzIHdpdGhSb3V0ZXIgfTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBUb3BOYXYgZnJvbSAnLi9uYXZpZ2F0aW9uL3RvcC1uYXYnO1xuaW1wb3J0IEJvdHRvbU5hdiBmcm9tICcuL25hdmlnYXRpb24vYm90dG9tLW5hdic7XG5pbXBvcnQgQnJlYWRjcnVtYnMgZnJvbSAnLi9uYXZpZ2F0aW9uL2JyZWFkY3J1bWJzJztcbmltcG9ydCBEaXNwbGF5TWVudSBmcm9tICcuL25hdmlnYXRpb24vZGlzcGxheS1tZW51JztcblxuaW1wb3J0IEZvbGRlckxpc3QgZnJvbSAnLi9jb250ZW50L2ZvbGRlci1saXN0JztcbmltcG9ydCBGaWxlTGlzdCBmcm9tICcuL2NvbnRlbnQvZmlsZS1saXN0JztcbmltcG9ydCBQaG90b0xpc3QgZnJvbSAnLi9jb250ZW50L3Bob3RvLWxpc3QnO1xuaW1wb3J0IFNoYXJlZExpc3QgZnJvbSAnLi9jb250ZW50L3NoYXJlZC1saXN0JztcbmltcG9ydCBNdXNpY0xpc3QgZnJvbSAnLi9jb250ZW50L211c2ljLWxpc3QnO1xuXG5cbmNvbnN0IGl0ZW1MaXN0cyA9IHtcbiAgZmlsZXM6IEZpbGVMaXN0LFxuICBwaG90b3M6IFBob3RvTGlzdCxcbiAgc2hhcmVkOiBTaGFyZWRMaXN0LFxuICBtdXNpYzogTXVzaWNMaXN0XG59O1xuXG5jb25zdCBNYWluID0gZnVuY3Rpb24gKHtsb2NhdGlvbn0pIHtcbiAgY29uc3QgY3VycmVudExpc3QgPSBsb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpWzFdIHx8ICdmaWxlcyc7XG4gIHJldHVybiAoXG4gICAgPGRpdj5cbiAgICAgIDxUb3BOYXYgLz5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZXJcIi8+XG4gICAgICA8QnJlYWRjcnVtYnMvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZXN1bHRzXCI+XG4gICAgICAgIDxEaXNwbGF5TWVudSAvPlxuXG4gICAgICAgIDxGb2xkZXJMaXN0Lz5cbiAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoaXRlbUxpc3RzW2N1cnJlbnRMaXN0XSl9XG4gICAgICAgIDxCb3R0b21OYXYgbG9jYXRpb249e2N1cnJlbnRMaXN0fSAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KCgpID0+ICh7fSksICgpID0+ICh7fSkpKE1haW4pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL21haW4uanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IEJvdHRvbU5hdiBmcm9tICcuL2JvdHRvbS1uYXYnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lbnUoe2xvY2F0aW9ufSkge1xuICBjb25zdCBjdXJyZW50TGlzdCA9IGxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMV0gfHwgJ2ZpbGVzJztcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW51LWhlYWRlclwiPlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT1cIm1lbnUtaGVhZGVyLWxvZ29cIiBzcmM9XCIuL2xvZ29zL2RhcGxpZS1sb2dvLWdyYXkuc3ZnXCIvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVudS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW51LWl0ZW1cIj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cIm1lbnUtaW1nLXBsYWNlaG9sZGVyXCIgc3JjPVwiLi9pY29ucy9mb2xkZXIuc3ZnXCIvPlxuICAgICAgICAgICAgPGgzPkZpbGVzPC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVudS1pdGVtXCI+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJtZW51LWltZy1wbGFjZWhvbGRlclwiIHNyYz1cIi4vaWNvbnMvcHJvZmlsZS5wbmdcIi8+XG4gICAgICAgICAgICA8aDM+UHJvZmlsZTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbnUtaXRlbVwiPlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwibWVudS1pbWctcGxhY2Vob2xkZXJcIiBzcmM9XCIuL2ljb25zL25ldHdvcmsucG5nXCIvPlxuICAgICAgICAgICAgPGgzPk5ldHdvcms8L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW51LWl0ZW1cIj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cIm1lbnUtaW1nLXBsYWNlaG9sZGVyXCIgc3JjPVwiLi9pY29ucy9zdG9yYWdlLXVzYWdlLnBuZ1wiLz5cbiAgICAgICAgICAgIDxoMz5TdG9yYWdlIFVzYWdlPC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVudS1pdGVtXCI+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJtZW51LWltZy1wbGFjZWhvbGRlclwiIHNyYz1cIi4vaWNvbnMvbm90aWZpY2F0aW9ucy5wbmdcIi8+XG4gICAgICAgICAgICA8aDM+Tm90aWZpY2F0aW9uczwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbnUtaXRlbVwiPlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwibWVudS1pbWctcGxhY2Vob2xkZXJcIiBzcmM9XCIuL2ljb25zL3NldHRpbmdzLnBuZ1wiLz5cbiAgICAgICAgICAgIDxoMz5TZXR0aW5nczwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8Qm90dG9tTmF2IGxvY2F0aW9uPXtjdXJyZW50TGlzdH0gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vbWVudS5qc3giLCJpbXBvcnQgaW5pdGlhbFN0YXRlIGZyb20gJy4uLy4uL3N0YXRlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSwgYWN0aW9uKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIXN0YXRlKSB7XG4gICAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0TW9kZTogdG9nZ2xlU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGlvbk1vZGUsIGFjdGlvbiksXG4gICAgY3VycmVudFBhdGg6IG5hdmlnYXRlVG8oc3RhdGUuY3VycmVudFBhdGgsIGFjdGlvbiksXG4gICAgZmlsZXN5c3RlbTogc3RhdGUuZmlsZXN5c3RlbVxuICB9O1xufVxuXG5mdW5jdGlvbiB0b2dnbGVTZWxlY3Rpb24oc3RhdGUsIGFjdGlvbikge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnc3RhcnQtc2VsZWN0aW9uJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ2NhbmNlbC1zZWxlY3Rpb24nOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBuYXZpZ2F0ZVRvKHN0YXRlLCBhY3Rpb24pIHtcbiAgcmV0dXJuIGFjdGlvbi50eXBlID09PSAnbmF2aWdhdGUtdG8nID8gYWN0aW9uLnBheWxvYWQucGF0aCA6IHN0YXRlO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlZHVjZXJzL21haW4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xufVxuXG52YXIgTUlYSU5TX0tFWSA9ICdtaXhpbnMnO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGFub255bW91cyBmdW5jdGlvbnMgd2hpY2ggZG8gbm90XG4vLyBoYXZlIC5uYW1lIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgYXNzaWduZWQgdG8uXG5mdW5jdGlvbiBpZGVudGl0eShmbikge1xuICByZXR1cm4gZm47XG59XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcztcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge1xuICAgIHByb3A6ICdwcm9wJyxcbiAgICBjb250ZXh0OiAnY29udGV4dCcsXG4gICAgY2hpbGRDb250ZXh0OiAnY2hpbGQgY29udGV4dCdcbiAgfTtcbn0gZWxzZSB7XG4gIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge307XG59XG5cbmZ1bmN0aW9uIGZhY3RvcnkoUmVhY3RDb21wb25lbnQsIGlzVmFsaWRFbGVtZW50LCBSZWFjdE5vb3BVcGRhdGVRdWV1ZSkge1xuICAvKipcbiAgICogUG9saWNpZXMgdGhhdCBkZXNjcmliZSBtZXRob2RzIGluIGBSZWFjdENsYXNzSW50ZXJmYWNlYC5cbiAgICovXG5cbiAgdmFyIGluamVjdGVkTWl4aW5zID0gW107XG5cbiAgLyoqXG4gICAqIENvbXBvc2l0ZSBjb21wb25lbnRzIGFyZSBoaWdoZXItbGV2ZWwgY29tcG9uZW50cyB0aGF0IGNvbXBvc2Ugb3RoZXIgY29tcG9zaXRlXG4gICAqIG9yIGhvc3QgY29tcG9uZW50cy5cbiAgICpcbiAgICogVG8gY3JlYXRlIGEgbmV3IHR5cGUgb2YgYFJlYWN0Q2xhc3NgLCBwYXNzIGEgc3BlY2lmaWNhdGlvbiBvZlxuICAgKiB5b3VyIG5ldyBjbGFzcyB0byBgUmVhY3QuY3JlYXRlQ2xhc3NgLiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB5b3VyIGNsYXNzXG4gICAqIHNwZWNpZmljYXRpb24gaXMgdGhhdCB5b3UgaW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLlxuICAgKlxuICAgKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAqICAgICAgIHJldHVybiA8ZGl2PkhlbGxvIFdvcmxkPC9kaXY+O1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBUaGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBzdXBwb3J0cyBhIHNwZWNpZmljIHByb3RvY29sIG9mIG1ldGhvZHMgdGhhdCBoYXZlXG4gICAqIHNwZWNpYWwgbWVhbmluZyAoZS5nLiBgcmVuZGVyYCkuIFNlZSBgUmVhY3RDbGFzc0ludGVyZmFjZWAgZm9yXG4gICAqIG1vcmUgdGhlIGNvbXByZWhlbnNpdmUgcHJvdG9jb2wuIEFueSBvdGhlciBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGluIHRoZVxuICAgKiBjbGFzcyBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBwcm90b3R5cGUuXG4gICAqXG4gICAqIEBpbnRlcmZhY2UgUmVhY3RDbGFzc0ludGVyZmFjZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHZhciBSZWFjdENsYXNzSW50ZXJmYWNlID0ge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIE1peGluIG9iamVjdHMgdG8gaW5jbHVkZSB3aGVuIGRlZmluaW5nIHlvdXIgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge2FycmF5fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIG1peGluczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgZGVmaW5lZCBvblxuICAgICAqIHRoZSBjb21wb25lbnQncyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGl0cyBwcm90b3R5cGUgKHN0YXRpYyBtZXRob2RzKS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgc3RhdGljczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIERlZmluaXRpb24gb2YgcHJvcCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIHByb3BUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIERlZmluaXRpb24gb2YgY29udGV4dCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbnRleHRUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIERlZmluaXRpb24gb2YgY29udGV4dCB0eXBlcyB0aGlzIGNvbXBvbmVudCBzZXRzIGZvciBpdHMgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNoaWxkQ29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLy8gPT09PSBEZWZpbml0aW9uIG1ldGhvZHMgPT09PVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVmFsdWVzIGluIHRoZSBtYXBwaW5nIHdpbGwgYmUgc2V0IG9uXG4gICAgICogYHRoaXMucHJvcHNgIGlmIHRoYXQgcHJvcCBpcyBub3Qgc3BlY2lmaWVkIChpLmUuIHVzaW5nIGFuIGBpbmAgY2hlY2spLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBiZWZvcmUgYGdldEluaXRpYWxTdGF0ZWAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVseVxuICAgICAqIG9uIGB0aGlzLnN0YXRlYCBvciB1c2UgYHRoaXMuc2V0U3RhdGVgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGdldERlZmF1bHRQcm9wczogJ0RFRklORV9NQU5ZX01FUkdFRCcsXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIG9uY2UgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWRcbiAgICAgKiBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgdGhpcy5zdGF0ZWAuXG4gICAgICpcbiAgICAgKiAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIHJldHVybiB7XG4gICAgICogICAgICAgaXNPbjogZmFsc2UsXG4gICAgICogICAgICAgZm9vQmF6OiBuZXcgQmF6Rm9vKClcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGdldEluaXRpYWxTdGF0ZTogJ0RFRklORV9NQU5ZX01FUkdFRCcsXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0Q2hpbGRDb250ZXh0OiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIFVzZXMgcHJvcHMgZnJvbSBgdGhpcy5wcm9wc2AgYW5kIHN0YXRlIGZyb20gYHRoaXMuc3RhdGVgIHRvIHJlbmRlciB0aGVcbiAgICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgd2hlbiBvciBob3cgb2Z0ZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCwgc29cbiAgICAgKiBpdCBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAgICAgKlxuICAgICAqICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgdmFyIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICogICAgIHJldHVybiA8ZGl2PkhlbGxvLCB7bmFtZX0hPC9kaXY+O1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9XG4gICAgICogQHJlcXVpcmVkXG4gICAgICovXG4gICAgcmVuZGVyOiAnREVGSU5FX09OQ0UnLFxuXG4gICAgLy8gPT09PSBEZWxlZ2F0ZSBtZXRob2RzID09PT1cblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseSBjcmVhdGVkIGFuZCBhYm91dCB0byBiZSBtb3VudGVkLlxuICAgICAqIFRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzLCBidXQgYW55IGV4dGVybmFsIHN1YnNjcmlwdGlvbnMgb3IgZGF0YSBjcmVhdGVkXG4gICAgICogYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBjbGVhbmVkIHVwIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGAuXG4gICAgICpcbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnRXaWxsTW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBtb3VudGVkIGFuZCBoYXMgYSBET00gcmVwcmVzZW50YXRpb24uXG4gICAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIERPTSBub2RlIGlzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAgICogYmVlbiBtb3VudGVkIChpbml0aWFsaXplZCBhbmQgcmVuZGVyZWQpIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50RGlkTW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIGJlZm9yZSB0aGUgY29tcG9uZW50IHJlY2VpdmVzIG5ldyBwcm9wcy5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWN0IHRvIGEgcHJvcCB0cmFuc2l0aW9uIGJ5IHVwZGF0aW5nIHRoZVxuICAgICAqIHN0YXRlIHVzaW5nIGB0aGlzLnNldFN0YXRlYC4gQ3VycmVudCBwcm9wcyBhcmUgYWNjZXNzZWQgdmlhIGB0aGlzLnByb3BzYC5cbiAgICAgKlxuICAgICAqICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0Q29udGV4dCkge1xuICAgICAqICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgKiAgICAgICBsaWtlc0luY3JlYXNpbmc6IG5leHRQcm9wcy5saWtlQ291bnQgPiB0aGlzLnByb3BzLmxpa2VDb3VudFxuICAgICAqICAgICB9KTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgYGNvbXBvbmVudFdpbGxSZWNlaXZlU3RhdGVgLiBBbiBpbmNvbWluZyBwcm9wXG4gICAgICogdHJhbnNpdGlvbiBtYXkgY2F1c2UgYSBzdGF0ZSBjaGFuZ2UsIGJ1dCB0aGUgb3Bwb3NpdGUgaXMgbm90IHRydWUuIElmIHlvdVxuICAgICAqIG5lZWQgaXQsIHlvdSBhcmUgcHJvYmFibHkgbG9va2luZyBmb3IgYGNvbXBvbmVudFdpbGxVcGRhdGVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoaWxlIGRlY2lkaW5nIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgYSByZXN1bHQgb2ZcbiAgICAgKiByZWNlaXZpbmcgbmV3IHByb3BzLCBzdGF0ZSBhbmQvb3IgY29udGV4dC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGByZXR1cm4gZmFsc2VgIHdoZW4geW91J3JlIGNlcnRhaW4gdGhhdCB0aGVcbiAgICAgKiB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgcHJvcHMvc3RhdGUvY29udGV4dCB3aWxsIG5vdCByZXF1aXJlIGEgY29tcG9uZW50XG4gICAgICogdXBkYXRlLlxuICAgICAqXG4gICAgICogICBzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCkge1xuICAgICAqICAgICByZXR1cm4gIWVxdWFsKG5leHRQcm9wcywgdGhpcy5wcm9wcykgfHxcbiAgICAgKiAgICAgICAhZXF1YWwobmV4dFN0YXRlLCB0aGlzLnN0YXRlKSB8fFxuICAgICAqICAgICAgICFlcXVhbChuZXh0Q29udGV4dCwgdGhpcy5jb250ZXh0KTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZS5cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBzaG91bGRDb21wb25lbnRVcGRhdGU6ICdERUZJTkVfT05DRScsXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhYm91dCB0byB1cGRhdGUgZHVlIHRvIGEgdHJhbnNpdGlvbiBmcm9tXG4gICAgICogYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgIHRvIGBuZXh0UHJvcHNgLCBgbmV4dFN0YXRlYFxuICAgICAqIGFuZCBgbmV4dENvbnRleHRgLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBwcmVwYXJhdGlvbiBiZWZvcmUgYW4gdXBkYXRlIG9jY3Vycy5cbiAgICAgKlxuICAgICAqIE5PVEU6IFlvdSAqKmNhbm5vdCoqIHVzZSBgdGhpcy5zZXRTdGF0ZSgpYCBpbiB0aGlzIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHRcbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFVwZGF0ZTogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50J3MgRE9NIHJlcHJlc2VudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBvcGVyYXRlIG9uIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50IGhhc1xuICAgICAqIGJlZW4gdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcmV2UHJvcHNcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZTdGF0ZVxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNvbnRleHRcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3ROb2RlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50LlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudERpZFVwZGF0ZTogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGFuZCBoYXZlXG4gICAgICogaXRzIERPTSByZXByZXNlbnRhdGlvbiBkZXN0cm95ZWQuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBkZWFsbG9jYXRlIGFueSBleHRlcm5hbCByZXNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGVyZSBpcyBubyBgY29tcG9uZW50RGlkVW5tb3VudGAgc2luY2UgeW91ciBjb21wb25lbnQgd2lsbCBoYXZlIGJlZW5cbiAgICAgKiBkZXN0cm95ZWQgYnkgdGhhdCBwb2ludC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiAnREVGSU5FX01BTlknLFxuXG4gICAgLy8gPT09PSBBZHZhbmNlZCBtZXRob2RzID09PT1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGN1cnJlbnRseSBtb3VudGVkIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBvdmVycmlkYWJsZVxuICAgICAqL1xuICAgIHVwZGF0ZUNvbXBvbmVudDogJ09WRVJSSURFX0JBU0UnXG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBjbGFzcyBzcGVjaWZpY2F0aW9uIGtleXMgdG8gc3BlY2lhbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQWx0aG91Z2ggdGhlc2UgYXJlIGRlY2xhcmVkIGxpa2UgaW5zdGFuY2UgcHJvcGVydGllcyBpbiB0aGUgc3BlY2lmaWNhdGlvblxuICAgKiB3aGVuIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgYFJlYWN0LmNyZWF0ZUNsYXNzYCwgdGhleSBhcmUgYWN0dWFsbHkgc3RhdGljXG4gICAqIGFuZCBhcmUgYWNjZXNzaWJsZSBvbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgcHJvdG90eXBlLiBEZXNwaXRlXG4gICAqIGJlaW5nIHN0YXRpYywgdGhleSBtdXN0IGJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgXCJzdGF0aWNzXCIga2V5IHVuZGVyXG4gICAqIHdoaWNoIGFsbCBvdGhlciBzdGF0aWMgbWV0aG9kcyBhcmUgZGVmaW5lZC5cbiAgICovXG4gIHZhciBSRVNFUlZFRF9TUEVDX0tFWVMgPSB7XG4gICAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBkaXNwbGF5TmFtZSkge1xuICAgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICB9LFxuICAgIG1peGluczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIG1peGlucykge1xuICAgICAgaWYgKG1peGlucykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1peGlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBtaXhpbnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjaGlsZENvbnRleHRUeXBlczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzLCAnY2hpbGRDb250ZXh0Jyk7XG4gICAgICB9XG4gICAgICBDb25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcyA9IF9hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBDb25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcyxcbiAgICAgICAgY2hpbGRDb250ZXh0VHlwZXNcbiAgICAgICk7XG4gICAgfSxcbiAgICBjb250ZXh0VHlwZXM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzLCAnY29udGV4dCcpO1xuICAgICAgfVxuICAgICAgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzID0gX2Fzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIENvbnN0cnVjdG9yLmNvbnRleHRUeXBlcyxcbiAgICAgICAgY29udGV4dFR5cGVzXG4gICAgICApO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBjYXNlIGdldERlZmF1bHRQcm9wcyB3aGljaCBzaG91bGQgbW92ZSBpbnRvIHN0YXRpY3MgYnV0IHJlcXVpcmVzXG4gICAgICogYXV0b21hdGljIG1lcmdpbmcuXG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKFxuICAgICAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyxcbiAgICAgICAgICBnZXREZWZhdWx0UHJvcHNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wcztcbiAgICAgIH1cbiAgICB9LFxuICAgIHByb3BUeXBlczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIHByb3BUeXBlcykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMsICdwcm9wJyk7XG4gICAgICB9XG4gICAgICBDb25zdHJ1Y3Rvci5wcm9wVHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5wcm9wVHlwZXMsIHByb3BUeXBlcyk7XG4gICAgfSxcbiAgICBzdGF0aWNzOiBmdW5jdGlvbihDb25zdHJ1Y3Rvciwgc3RhdGljcykge1xuICAgICAgbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpO1xuICAgIH0sXG4gICAgYXV0b2JpbmQ6IGZ1bmN0aW9uKCkge31cbiAgfTtcblxuICBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHR5cGVEZWYsIGxvY2F0aW9uKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdHlwZURlZikge1xuICAgICAgaWYgKHR5cGVEZWYuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIC8vIHVzZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBfaW52YXJpYW50IHNvIGNvbXBvbmVudHNcbiAgICAgICAgLy8gZG9uJ3Qgc2hvdyB1cCBpbiBwcm9kIGJ1dCBvbmx5IGluIF9fREVWX19cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgdHlwZW9mIHR5cGVEZWZbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gJyArXG4gICAgICAgICAgICAgICdSZWFjdC5Qcm9wVHlwZXMuJyxcbiAgICAgICAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENsYXNzJyxcbiAgICAgICAgICAgIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSxcbiAgICAgICAgICAgIHByb3BOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSkge1xuICAgIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKVxuICAgICAgPyBSZWFjdENsYXNzSW50ZXJmYWNlW25hbWVdXG4gICAgICA6IG51bGw7XG5cbiAgICAvLyBEaXNhbGxvdyBvdmVycmlkaW5nIG9mIGJhc2UgY2xhc3MgbWV0aG9kcyB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgIGlmIChSZWFjdENsYXNzTWl4aW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIF9pbnZhcmlhbnQoXG4gICAgICAgIHNwZWNQb2xpY3kgPT09ICdPVkVSUklERV9CQVNFJyxcbiAgICAgICAgJ1JlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBvdmVycmlkZSAnICtcbiAgICAgICAgICAnYCVzYCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRob2QgbmFtZXMgJyArXG4gICAgICAgICAgJ2RvIG5vdCBvdmVybGFwIHdpdGggUmVhY3QgbWV0aG9kcy4nLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERpc2FsbG93IGRlZmluaW5nIG1ldGhvZHMgbW9yZSB0aGFuIG9uY2UgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJyB8fCBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJyxcbiAgICAgICAgJ1JlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgJyArXG4gICAgICAgICAgJ2Alc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSAnICtcbiAgICAgICAgICAndG8gYSBtaXhpbi4nLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNaXhpbiBoZWxwZXIgd2hpY2ggaGFuZGxlcyBwb2xpY3kgdmFsaWRhdGlvbiBhbmQgcmVzZXJ2ZWRcbiAgICogc3BlY2lmaWNhdGlvbiBrZXlzIHdoZW4gYnVpbGRpbmcgUmVhY3QgY2xhc3Nlcy5cbiAgICovXG4gIGZ1bmN0aW9uIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzcGVjKSB7XG4gICAgaWYgKCFzcGVjKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIgdHlwZW9mU3BlYyA9IHR5cGVvZiBzcGVjO1xuICAgICAgICB2YXIgaXNNaXhpblZhbGlkID0gdHlwZW9mU3BlYyA9PT0gJ29iamVjdCcgJiYgc3BlYyAhPT0gbnVsbDtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICBpc01peGluVmFsaWQsXG4gICAgICAgICAgICBcIiVzOiBZb3UncmUgYXR0ZW1wdGluZyB0byBpbmNsdWRlIGEgbWl4aW4gdGhhdCBpcyBlaXRoZXIgbnVsbCBcIiArXG4gICAgICAgICAgICAgICdvciBub3QgYW4gb2JqZWN0LiBDaGVjayB0aGUgbWl4aW5zIGluY2x1ZGVkIGJ5IHRoZSBjb21wb25lbnQsICcgK1xuICAgICAgICAgICAgICAnYXMgd2VsbCBhcyBhbnkgbWl4aW5zIHRoZXkgaW5jbHVkZSB0aGVtc2VsdmVzLiAnICtcbiAgICAgICAgICAgICAgJ0V4cGVjdGVkIG9iamVjdCBidXQgZ290ICVzLicsXG4gICAgICAgICAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsXG4gICAgICAgICAgICBzcGVjID09PSBudWxsID8gbnVsbCA6IHR5cGVvZlNwZWNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfaW52YXJpYW50KFxuICAgICAgdHlwZW9mIHNwZWMgIT09ICdmdW5jdGlvbicsXG4gICAgICBcIlJlYWN0Q2xhc3M6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIFwiICtcbiAgICAgICAgJ3VzZSBhIGNvbXBvbmVudCBjbGFzcyBvciBmdW5jdGlvbiBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhICcgK1xuICAgICAgICAncmVndWxhciBvYmplY3QuJ1xuICAgICk7XG4gICAgX2ludmFyaWFudChcbiAgICAgICFpc1ZhbGlkRWxlbWVudChzcGVjKSxcbiAgICAgIFwiUmVhY3RDbGFzczogWW91J3JlIGF0dGVtcHRpbmcgdG8gXCIgK1xuICAgICAgICAndXNlIGEgY29tcG9uZW50IGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJ1xuICAgICk7XG5cbiAgICB2YXIgcHJvdG8gPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgdmFyIGF1dG9CaW5kUGFpcnMgPSBwcm90by5fX3JlYWN0QXV0b0JpbmRQYWlycztcblxuICAgIC8vIEJ5IGhhbmRsaW5nIG1peGlucyBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMsIHdlIGVuc3VyZSB0aGUgc2FtZVxuICAgIC8vIGNoYWluaW5nIG9yZGVyIGlzIGFwcGxpZWQgdG8gbWV0aG9kcyB3aXRoIERFRklORV9NQU5ZIHBvbGljeSwgd2hldGhlclxuICAgIC8vIG1peGlucyBhcmUgbGlzdGVkIGJlZm9yZSBvciBhZnRlciB0aGVzZSBtZXRob2RzIGluIHRoZSBzcGVjLlxuICAgIGlmIChzcGVjLmhhc093blByb3BlcnR5KE1JWElOU19LRVkpKSB7XG4gICAgICBSRVNFUlZFRF9TUEVDX0tFWVMubWl4aW5zKENvbnN0cnVjdG9yLCBzcGVjLm1peGlucyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBzcGVjKSB7XG4gICAgICBpZiAoIXNwZWMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lID09PSBNSVhJTlNfS0VZKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIG1peGlucyBpbiBhIHNwZWNpYWwgY2FzZSBhYm92ZS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wZXJ0eSA9IHNwZWNbbmFtZV07XG4gICAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IHByb3RvLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgdmFsaWRhdGVNZXRob2RPdmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKTtcblxuICAgICAgaWYgKFJFU0VSVkVEX1NQRUNfS0VZUy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBSRVNFUlZFRF9TUEVDX0tFWVNbbmFtZV0oQ29uc3RydWN0b3IsIHByb3BlcnR5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldHVwIG1ldGhvZHMgb24gcHJvdG90eXBlOlxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciBtZXRob2RzIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBib3VuZDpcbiAgICAgICAgLy8gMS4gRXhwZWN0ZWQgUmVhY3RDbGFzcyBtZXRob2RzIChpbiB0aGUgXCJpbnRlcmZhY2VcIikuXG4gICAgICAgIC8vIDIuIE92ZXJyaWRkZW4gbWV0aG9kcyAodGhhdCB3ZXJlIG1peGVkIGluKS5cbiAgICAgICAgdmFyIGlzUmVhY3RDbGFzc01ldGhvZCA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nO1xuICAgICAgICB2YXIgc2hvdWxkQXV0b0JpbmQgPVxuICAgICAgICAgIGlzRnVuY3Rpb24gJiZcbiAgICAgICAgICAhaXNSZWFjdENsYXNzTWV0aG9kICYmXG4gICAgICAgICAgIWlzQWxyZWFkeURlZmluZWQgJiZcbiAgICAgICAgICBzcGVjLmF1dG9iaW5kICE9PSBmYWxzZTtcblxuICAgICAgICBpZiAoc2hvdWxkQXV0b0JpbmQpIHtcbiAgICAgICAgICBhdXRvQmluZFBhaXJzLnB1c2gobmFtZSwgcHJvcGVydHkpO1xuICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgc2hvdWxkIGFscmVhZHkgYmUgY2F1Z2h0IGJ5IHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUuXG4gICAgICAgICAgICBfaW52YXJpYW50KFxuICAgICAgICAgICAgICBpc1JlYWN0Q2xhc3NNZXRob2QgJiZcbiAgICAgICAgICAgICAgICAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcgfHxcbiAgICAgICAgICAgICAgICAgIHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpLFxuICAgICAgICAgICAgICAnUmVhY3RDbGFzczogVW5leHBlY3RlZCBzcGVjIHBvbGljeSAlcyBmb3Iga2V5ICVzICcgK1xuICAgICAgICAgICAgICAgICd3aGVuIG1peGluZyBpbiBjb21wb25lbnQgc3BlY3MuJyxcbiAgICAgICAgICAgICAgc3BlY1BvbGljeSxcbiAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gRm9yIG1ldGhvZHMgd2hpY2ggYXJlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UsIGNhbGwgdGhlIGV4aXN0aW5nXG4gICAgICAgICAgICAvLyBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZSBuZXcgcHJvcGVydHksIG1lcmdpbmcgaWYgYXBwcm9wcmlhdGUuXG4gICAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcpIHtcbiAgICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknKSB7XG4gICAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAvLyBBZGQgdmVyYm9zZSBkaXNwbGF5TmFtZSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIGhlbHBzIHdoZW4gbG9va2luZ1xuICAgICAgICAgICAgICAvLyBhdCBwcm9maWxpbmcgdG9vbHMuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgc3BlYy5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgICAgICAgIHByb3RvW25hbWVdLmRpc3BsYXlOYW1lID0gc3BlYy5kaXNwbGF5TmFtZSArICdfJyArIG5hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcykge1xuICAgIGlmICghc3RhdGljcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRpY3MpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgICBpZiAoIXN0YXRpY3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc1Jlc2VydmVkID0gbmFtZSBpbiBSRVNFUlZFRF9TUEVDX0tFWVM7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICAhaXNSZXNlcnZlZCxcbiAgICAgICAgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCAnICtcbiAgICAgICAgICAncHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblxcJ3QgYmUgb24gdGhlIFwic3RhdGljc1wiIGtleS4gRGVmaW5lIGl0ICcgK1xuICAgICAgICAgICdhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlICcgK1xuICAgICAgICAgICdjb25zdHJ1Y3Rvci4nLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuXG4gICAgICB2YXIgaXNJbmhlcml0ZWQgPSBuYW1lIGluIENvbnN0cnVjdG9yO1xuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgIWlzSW5oZXJpdGVkLFxuICAgICAgICAnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSAnICtcbiAgICAgICAgICAnYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgJyArXG4gICAgICAgICAgJ2R1ZSB0byBhIG1peGluLicsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB0d28gb2JqZWN0cywgYnV0IHRocm93IGlmIGJvdGggY29udGFpbiB0aGUgc2FtZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvbmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IHR3byBUaGUgc2Vjb25kIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKG9uZSwgdHdvKSB7XG4gICAgX2ludmFyaWFudChcbiAgICAgIG9uZSAmJiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVjdCcsXG4gICAgICAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBDYW5ub3QgbWVyZ2Ugbm9uLW9iamVjdHMuJ1xuICAgICk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdHdvKSB7XG4gICAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICBvbmVba2V5XSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6ICcgK1xuICAgICAgICAgICAgJ1RyaWVkIHRvIG1lcmdlIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUga2V5OiBgJXNgLiBUaGlzIGNvbmZsaWN0ICcgK1xuICAgICAgICAgICAgJ21heSBiZSBkdWUgdG8gYSBtaXhpbjsgaW4gcGFydGljdWxhciwgdGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHR3byAnICtcbiAgICAgICAgICAgICdnZXRJbml0aWFsU3RhdGUoKSBvciBnZXREZWZhdWx0UHJvcHMoKSBtZXRob2RzIHJldHVybmluZyBvYmplY3RzICcgK1xuICAgICAgICAgICAgJ3dpdGggY2xhc2hpbmcga2V5cy4nLFxuICAgICAgICAgIGtleVxuICAgICAgICApO1xuICAgICAgICBvbmVba2V5XSA9IHR3b1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ob25lLCB0d28pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkUmVzdWx0KCkge1xuICAgICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHZhciBiID0gdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSBlbHNlIGlmIChiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9XG4gICAgICB2YXIgYyA9IHt9O1xuICAgICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBhKTtcbiAgICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7XG4gICAgICByZXR1cm4gYztcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgaWdub3JlcyB0aGVpciByZXR1cm4gdmFsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICAgIG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIG1ldGhvZCB0byB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZXRob2QgdG8gYmUgYm91bmQuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgYm91bmQgbWV0aG9kLlxuICAgKi9cbiAgZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKSB7XG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQoY29tcG9uZW50KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTtcbiAgICAgIHZhciBfYmluZCA9IGJvdW5kTWV0aG9kLmJpbmQ7XG4gICAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24obmV3VGhpcykge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksXG4gICAgICAgICAgICBfa2V5ID0gMTtcbiAgICAgICAgICBfa2V5IDwgX2xlbjtcbiAgICAgICAgICBfa2V5KytcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1ldGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbFxuICAgICAgICAvLyBpZ25vcmUgdGhlIHZhbHVlIG9mIFwidGhpc1wiIHRoYXQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSwgc29cbiAgICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgICAgaWYgKG5ld1RoaXMgIT09IGNvbXBvbmVudCAmJiBuZXdUaGlzICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBSZWFjdCBjb21wb25lbnQgbWV0aG9kcyBtYXkgb25seSBiZSBib3VuZCB0byB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ2NvbXBvbmVudCBpbnN0YW5jZS4gU2VlICVzJyxcbiAgICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBZb3UgYXJlIGJpbmRpbmcgYSBjb21wb25lbnQgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuICcgK1xuICAgICAgICAgICAgICAgICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICtcbiAgICAgICAgICAgICAgICAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBTZWUgJXMnLFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYm91bmRNZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3VuZE1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICByZXR1cm4gcmVib3VuZE1ldGhvZDtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhbGwgYXV0by1ib3VuZCBtZXRob2RzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqL1xuICBmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkge1xuICAgIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3JlYWN0QXV0b0JpbmRQYWlycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tpXTtcbiAgICAgIHZhciBtZXRob2QgPSBwYWlyc1tpICsgMV07XG4gICAgICBjb21wb25lbnRbYXV0b0JpbmRLZXldID0gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKTtcbiAgICB9XG4gIH1cblxuICB2YXIgSXNNb3VudGVkUHJlTWl4aW4gPSB7XG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBJc01vdW50ZWRQb3N0TWl4aW4gPSB7XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kXG4gICAqIHRoZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RDb21wb25lbnQuXG4gICAqL1xuICB2YXIgUmVhY3RDbGFzc01peGluID0ge1xuICAgIC8qKlxuICAgICAqIFRPRE86IFRoaXMgd2lsbCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBrZWVwIGEgY29uc2lzdGVudFxuICAgICAqIHR5cGUgc2lnbmF0dXJlIGFuZCB0aGUgb25seSB1c2UgY2FzZSBmb3IgdGhpcywgaXMgdG8gYXZvaWQgdGhhdC5cbiAgICAgKi9cbiAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKG5ld1N0YXRlLCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUsIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAZmluYWxcbiAgICAgKi9cbiAgICBpc01vdW50ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzLl9fZGlkV2FybklzTW91bnRlZCxcbiAgICAgICAgICAnJXM6IGlzTW91bnRlZCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgJyArXG4gICAgICAgICAgICAnc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiBjb21wb25lbnRXaWxsVW5tb3VudCB0byAnICtcbiAgICAgICAgICAgICdwcmV2ZW50IG1lbW9yeSBsZWFrcy4nLFxuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yICYmIHRoaXMuY29uc3RydWN0b3IuZGlzcGxheU5hbWUpIHx8XG4gICAgICAgICAgICB0aGlzLm5hbWUgfHxcbiAgICAgICAgICAgICdDb21wb25lbnQnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX19kaWRXYXJuSXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXRoaXMuX19pc01vdW50ZWQ7XG4gICAgfVxuICB9O1xuXG4gIHZhciBSZWFjdENsYXNzQ29tcG9uZW50ID0gZnVuY3Rpb24oKSB7fTtcbiAgX2Fzc2lnbihcbiAgICBSZWFjdENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSxcbiAgICBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsXG4gICAgUmVhY3RDbGFzc01peGluXG4gICk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdpdmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNoIG11c3QgZGVmaW5lIGByZW5kZXJgKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2xhc3Moc3BlYykge1xuICAgIC8vIFRvIGtlZXAgb3VyIHdhcm5pbmdzIG1vcmUgdW5kZXJzdGFuZGFibGUsIHdlJ2xsIHVzZSBhIGxpdHRsZSBoYWNrIGhlcmUgdG9cbiAgICAvLyBlbnN1cmUgdGhhdCBDb25zdHJ1Y3Rvci5uYW1lICE9PSAnQ29uc3RydWN0b3InLiBUaGlzIG1ha2VzIHN1cmUgd2UgZG9uJ3RcbiAgICAvLyB1bm5lY2Vzc2FyaWx5IGlkZW50aWZ5IGEgY2xhc3Mgd2l0aG91dCBkaXNwbGF5TmFtZSBhcyAnQ29uc3RydWN0b3InLlxuICAgIHZhciBDb25zdHJ1Y3RvciA9IGlkZW50aXR5KGZ1bmN0aW9uKHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGdldHMgb3ZlcnJpZGRlbiBieSBtb2Nrcy4gVGhlIGFyZ3VtZW50IGlzIHVzZWRcbiAgICAgIC8vIGJ5IG1vY2tzIHRvIGFzc2VydCBvbiB3aGF0IGdldHMgbW91bnRlZC5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgQ29uc3RydWN0b3IsXG4gICAgICAgICAgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgK1xuICAgICAgICAgICAgJ0pTWCBpbnN0ZWFkLiBTZWU6IGh0dHBzOi8vZmIubWUvcmVhY3QtbGVnYWN5ZmFjdG9yeSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmdcbiAgICAgIGlmICh0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkge1xuICAgICAgICBiaW5kQXV0b0JpbmRNZXRob2RzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG4gICAgICB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNuJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZVxuICAgICAgLy8gZ2V0SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6YXRpb24uXG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgICAgaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgdHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSxcbiAgICAgICAgJyVzLmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsXG4gICAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTtcblxuICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBDb25zdHJ1Y3RvcikpO1xuXG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFByZU1peGluKTtcbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYyk7XG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFBvc3RNaXhpbik7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0UHJvcHMgcHJvcGVydHkgYWZ0ZXIgYWxsIG1peGlucyBoYXZlIGJlZW4gbWVyZ2VkLlxuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRlZmF1bHRQcm9wcyA9IENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcygpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssXG4gICAgICAvLyBzaW5jZSBpdCdzIHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYVxuICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9wZXJ0eSwgcHJvcGVydHlcbiAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3BlY3RpdmVseS5cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2ludmFyaWFudChcbiAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5yZW5kZXIsXG4gICAgICAnY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4nXG4gICAgKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgK1xuICAgICAgICAgICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArXG4gICAgICAgICAgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsXG4gICAgICAgIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50J1xuICAgICAgKTtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLFxuICAgICAgICBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVkdWNlIHRpbWUgc3BlbnQgZG9pbmcgbG9va3VwcyBieSBzZXR0aW5nIHRoZXNlIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBSZWFjdENsYXNzSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVDbGFzcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9jcmVhdGUtcmVhY3QtY2xhc3MvZmFjdG9yeS5qcyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG52YXIgX2h5cGhlblBhdHRlcm4gPSAvLSguKS9nO1xuXG4vKipcbiAqIENhbWVsY2FzZXMgYSBoeXBoZW5hdGVkIHN0cmluZywgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGNhbWVsaXplKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmRDb2xvclwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF9oeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2NhbWVsaXplLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FtZWxpemUgPSByZXF1aXJlKCcuL2NhbWVsaXplJyk7XG5cbnZhciBtc1BhdHRlcm4gPSAvXi1tcy0vO1xuXG4vKipcbiAqIENhbWVsY2FzZXMgYSBoeXBoZW5hdGVkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJ2JhY2tncm91bmQtY29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZENvbG9yXCJcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnLW1vei10cmFuc2l0aW9uJylcbiAqICAgPCBcIk1velRyYW5zaXRpb25cIlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCctbXMtdHJhbnNpdGlvbicpXG4gKiAgIDwgXCJtc1RyYW5zaXRpb25cIlxuICpcbiAqIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAqIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGNhbWVsaXplU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gY2FtZWxpemUoc3RyaW5nLnJlcGxhY2UobXNQYXR0ZXJuLCAnbXMtJykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplU3R5bGVOYW1lO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vZmJqcy9saWIvY2FtZWxpemVTdHlsZU5hbWUuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG52YXIgaXNUZXh0Tm9kZSA9IHJlcXVpcmUoJy4vaXNUZXh0Tm9kZScpO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBET00gbm9kZSBjb250YWlucyBvciBpcyBhbm90aGVyIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb250YWluc05vZGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9jb250YWluc05vZGUuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIENvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIGFycmF5cy5cbiAqXG4gKiBUaGlzIEFQSSBhc3N1bWVzIHRoZSBjYWxsZXIga25vd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIHR5cGUuIEZvciBsZXNzXG4gKiB3ZWxsIGRlZmluZWQgaW5wdXRzIHVzZSBjcmVhdGVBcnJheUZyb21NaXhlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbnxmaWxlbGlzdH0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cbiAgLy8gU29tZSBicm93c2VycyBidWlsdGluIG9iamVjdHMgY2FuIHJlcG9ydCB0eXBlb2YgJ2Z1bmN0aW9uJyAoZS5nLiBOb2RlTGlzdFxuICAvLyBpbiBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpKS5cbiAgISghQXJyYXkuaXNBcnJheShvYmopICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogQXJyYXktbGlrZSBvYmplY3QgZXhwZWN0ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgISh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogT2JqZWN0IG5lZWRzIGEgbGVuZ3RoIHByb3BlcnR5JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICEobGVuZ3RoID09PSAwIHx8IGxlbmd0aCAtIDEgaW4gb2JqKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3Qgc2hvdWxkIGhhdmUga2V5cyBmb3IgaW5kaWNlcycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAhKHR5cGVvZiBvYmouY2FsbGVlICE9PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3QgY2FuXFwndCBiZSBgYXJndW1lbnRzYC4gVXNlIHJlc3QgcGFyYW1zICcgKyAnKGZ1bmN0aW9uKC4uLmFyZ3MpIHt9KSBvciBBcnJheS5mcm9tKCkgaW5zdGVhZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gT2xkIElFIGRvZXNuJ3QgZ2l2ZSBjb2xsZWN0aW9ucyBhY2Nlc3MgdG8gaGFzT3duUHJvcGVydHkuIEFzc3VtZSBpbnB1dHNcbiAgLy8gd2l0aG91dCBtZXRob2Qgd2lsbCB0aHJvdyBkdXJpbmcgdGhlIHNsaWNlIGNhbGwgYW5kIHNraXAgc3RyYWlnaHQgdG8gdGhlXG4gIC8vIGZhbGxiYWNrLlxuICBpZiAob2JqLmhhc093blByb3BlcnR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElFIDwgOSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5I3NsaWNlIG9uIGNvbGxlY3Rpb25zIG9iamVjdHNcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29weWluZyBrZXkgYnkga2V5LiBUaGlzIGFzc3VtZXMgYWxsIGtleXMgaGF2ZSBhIHZhbHVlLFxuICAvLyBzbyB3aWxsIG5vdCBwcmVzZXJ2ZSBzcGFyc2VseSBwb3B1bGF0ZWQgaW5wdXRzLlxuICB2YXIgcmV0ID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbmd0aDsgaWkrKykge1xuICAgIHJldFtpaV0gPSBvYmpbaWldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGhldXJpc3RpYyB0ZXN0IHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgXCJhcnJheS1saWtlXCIuXG4gKlxuICogICBBIG1vbmsgYXNrZWQgSm9zaHUsIGEgWmVuIG1hc3RlciwgXCJIYXMgYSBkb2cgQnVkZGhhIG5hdHVyZT9cIlxuICogICBKb3NodSByZXBsaWVkOiBcIk11LlwiXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGl0cyBhcmd1bWVudCBoYXMgXCJhcnJheSBuYXR1cmVcIjogaXQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYWN0dWFsIGFycmF5LCBhbiBgYXJndW1lbnRzJyBvYmplY3QsIG9yIGFuXG4gKiBIVE1MQ29sbGVjdGlvbiAoZS5nLiBub2RlLmNoaWxkTm9kZXMgb3Igbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgpKS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgYXJyYXktbGlrZSBvYmplY3RzIGxpa2UgRmlsZWxpc3QuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0FycmF5TmF0dXJlKG9iaikge1xuICByZXR1cm4gKFxuICAgIC8vIG5vdCBudWxsL2ZhbHNlXG4gICAgISFvYmogJiYgKFxuICAgIC8vIGFycmF5cyBhcmUgb2JqZWN0cywgTm9kZUxpc3RzIGFyZSBmdW5jdGlvbnMgaW4gU2FmYXJpXG4gICAgdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpICYmXG4gICAgLy8gcXVhY2tzIGxpa2UgYW4gYXJyYXlcbiAgICAnbGVuZ3RoJyBpbiBvYmogJiZcbiAgICAvLyBub3Qgd2luZG93XG4gICAgISgnc2V0SW50ZXJ2YWwnIGluIG9iaikgJiZcbiAgICAvLyBubyBET00gbm9kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhcnJheS1saWtlXG4gICAgLy8gYSAnc2VsZWN0JyBlbGVtZW50IGhhcyAnbGVuZ3RoJyBhbmQgJ2l0ZW0nIHByb3BlcnRpZXMgb24gSUU4XG4gICAgdHlwZW9mIG9iai5ub2RlVHlwZSAhPSAnbnVtYmVyJyAmJiAoXG4gICAgLy8gYSByZWFsIGFycmF5XG4gICAgQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgLy8gYXJndW1lbnRzXG4gICAgJ2NhbGxlZScgaW4gb2JqIHx8XG4gICAgLy8gSFRNTENvbGxlY3Rpb24vTm9kZUxpc3RcbiAgICAnaXRlbScgaW4gb2JqKVxuICApO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSBieSB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSBpZiBpdCBpcyBub3QuXG4gKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhbiBhcnJheS5cbiAqXG4gKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgaWRpb21hdGljYWxseTpcbiAqXG4gKiAgIHZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJ2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7XG4gKlxuICogICBmdW5jdGlvbiB0YWtlc09uZU9yTW9yZVRoaW5ncyh0aGluZ3MpIHtcbiAqICAgICB0aGluZ3MgPSBjcmVhdGVBcnJheUZyb21NaXhlZCh0aGluZ3MpO1xuICogICAgIC4uLlxuICogICB9XG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHRyZWF0IGB0aGluZ3MnIGFzIGFuIGFycmF5LCBidXQgYWNjZXB0IHNjYWxhcnMgaW4gdGhlIEFQSS5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0LCBsaWtlIGBhcmd1bWVudHNgLCBpbnRvIGFuIGFycmF5XG4gKiB1c2UgdG9BcnJheSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWl4ZWQob2JqKSB7XG4gIGlmICghaGFzQXJyYXlOYXR1cmUob2JqKSkge1xuICAgIHJldHVybiBbb2JqXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvQXJyYXkob2JqKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vZmJqcy9saWIvY3JlYXRlQXJyYXlGcm9tTWl4ZWQuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbi8qZXNsaW50LWRpc2FibGUgZmItd3d3L3Vuc2FmZS1odG1sKi9cblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY3JlYXRlQXJyYXlGcm9tTWl4ZWQgPSByZXF1aXJlKCcuL2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7XG52YXIgZ2V0TWFya3VwV3JhcCA9IHJlcXVpcmUoJy4vZ2V0TWFya3VwV3JhcCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJy4vaW52YXJpYW50Jyk7XG5cbi8qKlxuICogRHVtbXkgY29udGFpbmVyIHVzZWQgdG8gcmVuZGVyIGFsbCBtYXJrdXAuXG4gKi9cbnZhciBkdW1teU5vZGUgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSA6IG51bGw7XG5cbi8qKlxuICogUGF0dGVybiB1c2VkIGJ5IGBnZXROb2RlTmFtZWAuXG4gKi9cbnZhciBub2RlTmFtZVBhdHRlcm4gPSAvXlxccyo8KFxcdyspLztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYG5vZGVOYW1lYCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyBvZiBtYXJrdXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBTdHJpbmcgb2YgbWFya3VwLlxuICogQHJldHVybiB7P3N0cmluZ30gTm9kZSBuYW1lIG9mIHRoZSBzdXBwbGllZCBtYXJrdXAuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVOYW1lKG1hcmt1cCkge1xuICB2YXIgbm9kZU5hbWVNYXRjaCA9IG1hcmt1cC5tYXRjaChub2RlTmFtZVBhdHRlcm4pO1xuICByZXR1cm4gbm9kZU5hbWVNYXRjaCAmJiBub2RlTmFtZU1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyByZW5kZXJlZCBmcm9tIHRoZSBzdXBwbGllZCBtYXJrdXAuIFRoZVxuICogb3B0aW9uYWxseSBzdXBwbGllZCBgaGFuZGxlU2NyaXB0YCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb25jZSBmb3IgZWFjaFxuICogPHNjcmlwdD4gZWxlbWVudCB0aGF0IGlzIHJlbmRlcmVkLiBJZiBubyBgaGFuZGxlU2NyaXB0YCBmdW5jdGlvbiBpcyBzdXBwbGllZCxcbiAqIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgYW55IDxzY3JpcHQ+IGVsZW1lbnRzIGFyZSByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIEEgc3RyaW5nIG9mIHZhbGlkIEhUTUwgbWFya3VwLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGhhbmRsZVNjcmlwdCBJbnZva2VkIG9uY2UgZm9yIGVhY2ggcmVuZGVyZWQgPHNjcmlwdD4uXG4gKiBAcmV0dXJuIHthcnJheTxET01FbGVtZW50fERPTVRleHROb2RlPn0gQW4gYXJyYXkgb2YgcmVuZGVyZWQgbm9kZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVzRnJvbU1hcmt1cChtYXJrdXAsIGhhbmRsZVNjcmlwdCkge1xuICB2YXIgbm9kZSA9IGR1bW15Tm9kZTtcbiAgISEhZHVtbXlOb2RlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZU5vZGVzRnJvbU1hcmt1cCBkdW1teSBub3QgaW5pdGlhbGl6ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHZhciBub2RlTmFtZSA9IGdldE5vZGVOYW1lKG1hcmt1cCk7XG5cbiAgdmFyIHdyYXAgPSBub2RlTmFtZSAmJiBnZXRNYXJrdXBXcmFwKG5vZGVOYW1lKTtcbiAgaWYgKHdyYXApIHtcbiAgICBub2RlLmlubmVySFRNTCA9IHdyYXBbMV0gKyBtYXJrdXAgKyB3cmFwWzJdO1xuXG4gICAgdmFyIHdyYXBEZXB0aCA9IHdyYXBbMF07XG4gICAgd2hpbGUgKHdyYXBEZXB0aC0tKSB7XG4gICAgICBub2RlID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gbWFya3VwO1xuICB9XG5cbiAgdmFyIHNjcmlwdHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgaWYgKHNjcmlwdHMubGVuZ3RoKSB7XG4gICAgIWhhbmRsZVNjcmlwdCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdjcmVhdGVOb2Rlc0Zyb21NYXJrdXAoLi4uKTogVW5leHBlY3RlZCA8c2NyaXB0PiBlbGVtZW50IHJlbmRlcmVkLicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjcmVhdGVBcnJheUZyb21NaXhlZChzY3JpcHRzKS5mb3JFYWNoKGhhbmRsZVNjcmlwdCk7XG4gIH1cblxuICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rlcyk7XG4gIHdoaWxlIChub2RlLmxhc3RDaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5sYXN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVOb2Rlc0Zyb21NYXJrdXA7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9jcmVhdGVOb2Rlc0Zyb21NYXJrdXAuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyplc2xpbnQtZGlzYWJsZSBmYi13d3cvdW5zYWZlLWh0bWwgKi9cblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnLi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBEdW1teSBjb250YWluZXIgdXNlZCB0byBkZXRlY3Qgd2hpY2ggd3JhcHMgYXJlIG5lY2Vzc2FyeS5cbiAqL1xudmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDtcblxuLyoqXG4gKiBTb21lIGJyb3dzZXJzIGNhbm5vdCB1c2UgYGlubmVySFRNTGAgdG8gcmVuZGVyIGNlcnRhaW4gZWxlbWVudHMgc3RhbmRhbG9uZSxcbiAqIHNvIHdlIHdyYXAgdGhlbSwgcmVuZGVyIHRoZSB3cmFwcGVkIG5vZGVzLCB0aGVuIGV4dHJhY3QgdGhlIGRlc2lyZWQgbm9kZS5cbiAqXG4gKiBJbiBJRTgsIGNlcnRhaW4gZWxlbWVudHMgY2Fubm90IHJlbmRlciBhbG9uZSwgc28gd3JhcCBhbGwgZWxlbWVudHMgKCcqJykuXG4gKi9cblxudmFyIHNob3VsZFdyYXAgPSB7fTtcblxudmFyIHNlbGVjdFdyYXAgPSBbMSwgJzxzZWxlY3QgbXVsdGlwbGU9XCJ0cnVlXCI+JywgJzwvc2VsZWN0PiddO1xudmFyIHRhYmxlV3JhcCA9IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPiddO1xudmFyIHRyV3JhcCA9IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddO1xuXG52YXIgc3ZnV3JhcCA9IFsxLCAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+JywgJzwvc3ZnPiddO1xuXG52YXIgbWFya3VwV3JhcCA9IHtcbiAgJyonOiBbMSwgJz88ZGl2PicsICc8L2Rpdj4nXSxcblxuICAnYXJlYSc6IFsxLCAnPG1hcD4nLCAnPC9tYXA+J10sXG4gICdjb2wnOiBbMiwgJzx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+JywgJzwvY29sZ3JvdXA+PC90YWJsZT4nXSxcbiAgJ2xlZ2VuZCc6IFsxLCAnPGZpZWxkc2V0PicsICc8L2ZpZWxkc2V0PiddLFxuICAncGFyYW0nOiBbMSwgJzxvYmplY3Q+JywgJzwvb2JqZWN0PiddLFxuICAndHInOiBbMiwgJzx0YWJsZT48dGJvZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSxcblxuICAnb3B0Z3JvdXAnOiBzZWxlY3RXcmFwLFxuICAnb3B0aW9uJzogc2VsZWN0V3JhcCxcblxuICAnY2FwdGlvbic6IHRhYmxlV3JhcCxcbiAgJ2NvbGdyb3VwJzogdGFibGVXcmFwLFxuICAndGJvZHknOiB0YWJsZVdyYXAsXG4gICd0Zm9vdCc6IHRhYmxlV3JhcCxcbiAgJ3RoZWFkJzogdGFibGVXcmFwLFxuXG4gICd0ZCc6IHRyV3JhcCxcbiAgJ3RoJzogdHJXcmFwXG59O1xuXG4vLyBJbml0aWFsaXplIHRoZSBTVkcgZWxlbWVudHMgc2luY2Ugd2Uga25vdyB0aGV5J2xsIGFsd2F5cyBuZWVkIHRvIGJlIHdyYXBwZWRcbi8vIGNvbnNpc3RlbnRseS4gSWYgdGhleSBhcmUgY3JlYXRlZCBpbnNpZGUgYSA8ZGl2PiB0aGV5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW5cbi8vIHRoZSB3cm9uZyBuYW1lc3BhY2UgKGFuZCB3aWxsIG5vdCBkaXNwbGF5KS5cbnZhciBzdmdFbGVtZW50cyA9IFsnY2lyY2xlJywgJ2NsaXBQYXRoJywgJ2RlZnMnLCAnZWxsaXBzZScsICdnJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyR3JhZGllbnQnLCAnbWFzaycsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxHcmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAndGV4dCcsICd0c3BhbiddO1xuc3ZnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgbWFya3VwV3JhcFtub2RlTmFtZV0gPSBzdmdXcmFwO1xuICBzaG91bGRXcmFwW25vZGVOYW1lXSA9IHRydWU7XG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXJrdXAgd3JhcCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3VwcGxpZWQgYG5vZGVOYW1lYC5cbiAqXG4gKiBOT1RFOiBUaGlzIGxhemlseSBkZXRlY3RzIHdoaWNoIHdyYXBzIGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBjdXJyZW50IGJyb3dzZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVOYW1lIExvd2VyY2FzZSBgbm9kZU5hbWVgLlxuICogQHJldHVybiB7P2FycmF5fSBNYXJrdXAgd3JhcCBjb25maWd1cmF0aW9uLCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBnZXRNYXJrdXBXcmFwKG5vZGVOYW1lKSB7XG4gICEhIWR1bW15Tm9kZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNYXJrdXAgd3JhcHBpbmcgbm9kZSBub3QgaW5pdGlhbGl6ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGlmICghbWFya3VwV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICBub2RlTmFtZSA9ICcqJztcbiAgfVxuICBpZiAoIXNob3VsZFdyYXAuaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKSB7XG4gICAgaWYgKG5vZGVOYW1lID09PSAnKicpIHtcbiAgICAgIGR1bW15Tm9kZS5pbm5lckhUTUwgPSAnPGxpbmsgLz4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdW1teU5vZGUuaW5uZXJIVE1MID0gJzwnICsgbm9kZU5hbWUgKyAnPjwvJyArIG5vZGVOYW1lICsgJz4nO1xuICAgIH1cbiAgICBzaG91bGRXcmFwW25vZGVOYW1lXSA9ICFkdW1teU5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuICByZXR1cm4gc2hvdWxkV3JhcFtub2RlTmFtZV0gPyBtYXJrdXBXcmFwW25vZGVOYW1lXSA6IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFya3VwV3JhcDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2dldE1hcmt1cFdyYXAuanMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBzdXBwbGllZCBlbGVtZW50IG9yIHdpbmRvdy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlcyBhcmUgdW5ib3VuZGVkLCB1bmxpa2UgYGdldFNjcm9sbFBvc2l0aW9uYC4gVGhpcyBtZWFucyB0aGV5XG4gKiBtYXkgYmUgbmVnYXRpdmUgb3IgZXhjZWVkIHRoZSBlbGVtZW50IGJvdW5kYXJpZXMgKHdoaWNoIGlzIHBvc3NpYmxlIHVzaW5nXG4gKiBpbmVydGlhbCBzY3JvbGxpbmcpLlxuICpcbiAqIEBwYXJhbSB7RE9NV2luZG93fERPTUVsZW1lbnR9IHNjcm9sbGFibGVcbiAqIEByZXR1cm4ge29iamVjdH0gTWFwIHdpdGggYHhgIGFuZCBgeWAga2V5cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbihzY3JvbGxhYmxlKSB7XG4gIGlmIChzY3JvbGxhYmxlLldpbmRvdyAmJiBzY3JvbGxhYmxlIGluc3RhbmNlb2Ygc2Nyb2xsYWJsZS5XaW5kb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogc2Nyb2xsYWJsZS5wYWdlWE9mZnNldCB8fCBzY3JvbGxhYmxlLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgICAgeTogc2Nyb2xsYWJsZS5wYWdlWU9mZnNldCB8fCBzY3JvbGxhYmxlLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogc2Nyb2xsYWJsZS5zY3JvbGxMZWZ0LFxuICAgIHk6IHNjcm9sbGFibGUuc2Nyb2xsVG9wXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9nZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbi5qcyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIF91cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcblxuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBzdHJpbmcsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqXG4gKiBGb3IgQ1NTIHN0eWxlIG5hbWVzLCB1c2UgYGh5cGhlbmF0ZVN0eWxlTmFtZWAgaW5zdGVhZCB3aGljaCB3b3JrcyBwcm9wZXJseVxuICogd2l0aCBhbGwgdmVuZG9yIHByZWZpeGVzLCBpbmNsdWRpbmcgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGh5cGhlbmF0ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF91cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoeXBoZW5hdGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9oeXBoZW5hdGUuanMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBoeXBoZW5hdGUgPSByZXF1aXJlKCcuL2h5cGhlbmF0ZScpO1xuXG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuXG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGh5cGhlbmF0ZShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh5cGhlbmF0ZVN0eWxlTmFtZTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZS5qcyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBhIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBpc05vZGUob2JqZWN0KSB7XG4gIHZhciBkb2MgPSBvYmplY3QgPyBvYmplY3Qub3duZXJEb2N1bWVudCB8fCBvYmplY3QgOiBkb2N1bWVudDtcbiAgdmFyIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgcmV0dXJuICEhKG9iamVjdCAmJiAodHlwZW9mIGRlZmF1bHRWaWV3Lk5vZGUgPT09ICdmdW5jdGlvbicgPyBvYmplY3QgaW5zdGFuY2VvZiBkZWZhdWx0Vmlldy5Ob2RlIDogdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc05vZGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9pc05vZGUuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL2lzTm9kZScpO1xuXG4vKipcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGEgRE9NIHRleHQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gaXNUZXh0Tm9kZShvYmplY3QpIHtcbiAgcmV0dXJuIGlzTm9kZShvYmplY3QpICYmIG9iamVjdC5ub2RlVHlwZSA9PSAzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVGV4dE5vZGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9pc1RleHROb2RlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICogQHR5cGVjaGVja3Mgc3RhdGljLW9ubHlcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTWVtb2l6ZXMgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgc3RyaW5nIGFyZ3VtZW50LlxuICovXG5cbmZ1bmN0aW9uIG1lbW9pemVTdHJpbmdPbmx5KGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIGlmICghY2FjaGUuaGFzT3duUHJvcGVydHkoc3RyaW5nKSkge1xuICAgICAgY2FjaGVbc3RyaW5nXSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW3N0cmluZ107XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZVN0cmluZ09ubHk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9tZW1vaXplU3RyaW5nT25seS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgcGVyZm9ybWFuY2U7XG5cbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2UgfHwgd2luZG93Lm1zUGVyZm9ybWFuY2UgfHwgd2luZG93LndlYmtpdFBlcmZvcm1hbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBlcmZvcm1hbmNlIHx8IHt9O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vZmJqcy9saWIvcGVyZm9ybWFuY2UuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBwZXJmb3JtYW5jZSA9IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKTtcblxudmFyIHBlcmZvcm1hbmNlTm93O1xuXG4vKipcbiAqIERldGVjdCBpZiB3ZSBjYW4gdXNlIGB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClgIGFuZCBncmFjZWZ1bGx5IGZhbGxiYWNrIHRvXG4gKiBgRGF0ZS5ub3coKWAgaWYgaXQgZG9lc24ndCBleGlzdC4gV2UgbmVlZCB0byBzdXBwb3J0IEZpcmVmb3ggPCAxNSBmb3Igbm93XG4gKiBiZWNhdXNlIG9mIEZhY2Vib29rJ3MgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuaWYgKHBlcmZvcm1hbmNlLm5vdykge1xuICBwZXJmb3JtYW5jZU5vdyA9IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkge1xuICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGVyZm9ybWFuY2VOb3c7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9wZXJmb3JtYW5jZU5vdy5qcyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9pbnZhcmlhbnQgPSByZXF1aXJlKCdpbnZhcmlhbnQnKTtcblxudmFyIF9pbnZhcmlhbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW52YXJpYW50KTtcblxudmFyIF9Mb2NhdGlvblV0aWxzID0gcmVxdWlyZSgnLi9Mb2NhdGlvblV0aWxzJyk7XG5cbnZhciBfUGF0aFV0aWxzID0gcmVxdWlyZSgnLi9QYXRoVXRpbHMnKTtcblxudmFyIF9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlciA9IHJlcXVpcmUoJy4vY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXInKTtcblxudmFyIF9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlcik7XG5cbnZhciBfRE9NVXRpbHMgPSByZXF1aXJlKCcuL0RPTVV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBQb3BTdGF0ZUV2ZW50ID0gJ3BvcHN0YXRlJztcbnZhciBIYXNoQ2hhbmdlRXZlbnQgPSAnaGFzaGNoYW5nZSc7XG5cbnZhciBnZXRIaXN0b3J5U3RhdGUgPSBmdW5jdGlvbiBnZXRIaXN0b3J5U3RhdGUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5LnN0YXRlIHx8IHt9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUgMTEgc29tZXRpbWVzIHRocm93cyB3aGVuIGFjY2Vzc2luZyB3aW5kb3cuaGlzdG9yeS5zdGF0ZVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L3B1bGwvMjg5XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoaXN0b3J5IG9iamVjdCB0aGF0IHVzZXMgdGhlIEhUTUw1IGhpc3RvcnkgQVBJIGluY2x1ZGluZ1xuICogcHVzaFN0YXRlLCByZXBsYWNlU3RhdGUsIGFuZCB0aGUgcG9wc3RhdGUgZXZlbnQuXG4gKi9cbnZhciBjcmVhdGVCcm93c2VySGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCkge1xuICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICgwLCBfaW52YXJpYW50Mi5kZWZhdWx0KShfRE9NVXRpbHMuY2FuVXNlRE9NLCAnQnJvd3NlciBoaXN0b3J5IG5lZWRzIGEgRE9NJyk7XG5cbiAgdmFyIGdsb2JhbEhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcbiAgdmFyIGNhblVzZUhpc3RvcnkgPSAoMCwgX0RPTVV0aWxzLnN1cHBvcnRzSGlzdG9yeSkoKTtcbiAgdmFyIG5lZWRzSGFzaENoYW5nZUxpc3RlbmVyID0gISgwLCBfRE9NVXRpbHMuc3VwcG9ydHNQb3BTdGF0ZU9uSGFzaENoYW5nZSkoKTtcblxuICB2YXIgX3Byb3BzJGZvcmNlUmVmcmVzaCA9IHByb3BzLmZvcmNlUmVmcmVzaCxcbiAgICAgIGZvcmNlUmVmcmVzaCA9IF9wcm9wcyRmb3JjZVJlZnJlc2ggPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3Byb3BzJGZvcmNlUmVmcmVzaCxcbiAgICAgIF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uID0gX3Byb3BzJGdldFVzZXJDb25maXJtID09PSB1bmRlZmluZWQgPyBfRE9NVXRpbHMuZ2V0Q29uZmlybWF0aW9uIDogX3Byb3BzJGdldFVzZXJDb25maXJtLFxuICAgICAgX3Byb3BzJGtleUxlbmd0aCA9IHByb3BzLmtleUxlbmd0aCxcbiAgICAgIGtleUxlbmd0aCA9IF9wcm9wcyRrZXlMZW5ndGggPT09IHVuZGVmaW5lZCA/IDYgOiBfcHJvcHMka2V5TGVuZ3RoO1xuXG4gIHZhciBiYXNlbmFtZSA9IHByb3BzLmJhc2VuYW1lID8gKDAsIF9QYXRoVXRpbHMuc3RyaXBUcmFpbGluZ1NsYXNoKSgoMCwgX1BhdGhVdGlscy5hZGRMZWFkaW5nU2xhc2gpKHByb3BzLmJhc2VuYW1lKSkgOiAnJztcblxuICB2YXIgZ2V0RE9NTG9jYXRpb24gPSBmdW5jdGlvbiBnZXRET01Mb2NhdGlvbihoaXN0b3J5U3RhdGUpIHtcbiAgICB2YXIgX3JlZiA9IGhpc3RvcnlTdGF0ZSB8fCB7fSxcbiAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTtcblxuICAgIHZhciBfd2luZG93JGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSA9IF93aW5kb3ckbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaCA9IF93aW5kb3ckbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBoYXNoID0gX3dpbmRvdyRsb2NhdGlvbi5oYXNoO1xuXG5cbiAgICB2YXIgcGF0aCA9IHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcblxuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoIWJhc2VuYW1lIHx8ICgwLCBfUGF0aFV0aWxzLmhhc0Jhc2VuYW1lKShwYXRoLCBiYXNlbmFtZSksICdZb3UgYXJlIGF0dGVtcHRpbmcgdG8gdXNlIGEgYmFzZW5hbWUgb24gYSBwYWdlIHdob3NlIFVSTCBwYXRoIGRvZXMgbm90IGJlZ2luICcgKyAnd2l0aCB0aGUgYmFzZW5hbWUuIEV4cGVjdGVkIHBhdGggXCInICsgcGF0aCArICdcIiB0byBiZWdpbiB3aXRoIFwiJyArIGJhc2VuYW1lICsgJ1wiLicpO1xuXG4gICAgaWYgKGJhc2VuYW1lKSBwYXRoID0gKDAsIF9QYXRoVXRpbHMuc3RyaXBCYXNlbmFtZSkocGF0aCwgYmFzZW5hbWUpO1xuXG4gICAgcmV0dXJuICgwLCBfTG9jYXRpb25VdGlscy5jcmVhdGVMb2NhdGlvbikocGF0aCwgc3RhdGUsIGtleSk7XG4gIH07XG5cbiAgdmFyIGNyZWF0ZUtleSA9IGZ1bmN0aW9uIGNyZWF0ZUtleSgpIHtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIGtleUxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHRyYW5zaXRpb25NYW5hZ2VyID0gKDAsIF9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlcjIuZGVmYXVsdCkoKTtcblxuICB2YXIgc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShuZXh0U3RhdGUpIHtcbiAgICBfZXh0ZW5kcyhoaXN0b3J5LCBuZXh0U3RhdGUpO1xuXG4gICAgaGlzdG9yeS5sZW5ndGggPSBnbG9iYWxIaXN0b3J5Lmxlbmd0aDtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLm5vdGlmeUxpc3RlbmVycyhoaXN0b3J5LmxvY2F0aW9uLCBoaXN0b3J5LmFjdGlvbik7XG4gIH07XG5cbiAgdmFyIGhhbmRsZVBvcFN0YXRlID0gZnVuY3Rpb24gaGFuZGxlUG9wU3RhdGUoZXZlbnQpIHtcbiAgICAvLyBJZ25vcmUgZXh0cmFuZW91cyBwb3BzdGF0ZSBldmVudHMgaW4gV2ViS2l0LlxuICAgIGlmICgoMCwgX0RPTVV0aWxzLmlzRXh0cmFuZW91c1BvcHN0YXRlRXZlbnQpKGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgaGFuZGxlUG9wKGdldERPTUxvY2F0aW9uKGV2ZW50LnN0YXRlKSk7XG4gIH07XG5cbiAgdmFyIGhhbmRsZUhhc2hDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVIYXNoQ2hhbmdlKCkge1xuICAgIGhhbmRsZVBvcChnZXRET01Mb2NhdGlvbihnZXRIaXN0b3J5U3RhdGUoKSkpO1xuICB9O1xuXG4gIHZhciBmb3JjZU5leHRQb3AgPSBmYWxzZTtcblxuICB2YXIgaGFuZGxlUG9wID0gZnVuY3Rpb24gaGFuZGxlUG9wKGxvY2F0aW9uKSB7XG4gICAgaWYgKGZvcmNlTmV4dFBvcCkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gZmFsc2U7XG4gICAgICBzZXRTdGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWN0aW9uID0gJ1BPUCc7XG5cbiAgICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXZlcnRQb3AobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJldmVydFBvcCA9IGZ1bmN0aW9uIHJldmVydFBvcChmcm9tTG9jYXRpb24pIHtcbiAgICB2YXIgdG9Mb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247XG5cbiAgICAvLyBUT0RPOiBXZSBjb3VsZCBwcm9iYWJseSBtYWtlIHRoaXMgbW9yZSByZWxpYWJsZSBieVxuICAgIC8vIGtlZXBpbmcgYSBsaXN0IG9mIGtleXMgd2UndmUgc2VlbiBpbiBzZXNzaW9uU3RvcmFnZS5cbiAgICAvLyBJbnN0ZWFkLCB3ZSBqdXN0IGRlZmF1bHQgdG8gMCBmb3Iga2V5cyB3ZSBkb24ndCBrbm93LlxuXG4gICAgdmFyIHRvSW5kZXggPSBhbGxLZXlzLmluZGV4T2YodG9Mb2NhdGlvbi5rZXkpO1xuXG4gICAgaWYgKHRvSW5kZXggPT09IC0xKSB0b0luZGV4ID0gMDtcblxuICAgIHZhciBmcm9tSW5kZXggPSBhbGxLZXlzLmluZGV4T2YoZnJvbUxvY2F0aW9uLmtleSk7XG5cbiAgICBpZiAoZnJvbUluZGV4ID09PSAtMSkgZnJvbUluZGV4ID0gMDtcblxuICAgIHZhciBkZWx0YSA9IHRvSW5kZXggLSBmcm9tSW5kZXg7XG5cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIGZvcmNlTmV4dFBvcCA9IHRydWU7XG4gICAgICBnbyhkZWx0YSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpbml0aWFsTG9jYXRpb24gPSBnZXRET01Mb2NhdGlvbihnZXRIaXN0b3J5U3RhdGUoKSk7XG4gIHZhciBhbGxLZXlzID0gW2luaXRpYWxMb2NhdGlvbi5rZXldO1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcblxuICB2YXIgY3JlYXRlSHJlZiA9IGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb24pIHtcbiAgICByZXR1cm4gYmFzZW5hbWUgKyAoMCwgX1BhdGhVdGlscy5jcmVhdGVQYXRoKShsb2NhdGlvbik7XG4gIH07XG5cbiAgdmFyIHB1c2ggPSBmdW5jdGlvbiBwdXNoKHBhdGgsIHN0YXRlKSB7XG4gICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KSghKCh0eXBlb2YgcGF0aCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGF0aCkpID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byBwdXNoIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdQVVNIJztcbiAgICB2YXIgbG9jYXRpb24gPSAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICB2YXIgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgICAgdmFyIGtleSA9IGxvY2F0aW9uLmtleSxcbiAgICAgICAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xuXG5cbiAgICAgIGlmIChjYW5Vc2VIaXN0b3J5KSB7XG4gICAgICAgIGdsb2JhbEhpc3RvcnkucHVzaFN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCBudWxsLCBocmVmKTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxLZXlzLmluZGV4T2YoaGlzdG9yeS5sb2NhdGlvbi5rZXkpO1xuICAgICAgICAgIHZhciBuZXh0S2V5cyA9IGFsbEtleXMuc2xpY2UoMCwgcHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXggKyAxKTtcblxuICAgICAgICAgIG5leHRLZXlzLnB1c2gobG9jYXRpb24ua2V5KTtcbiAgICAgICAgICBhbGxLZXlzID0gbmV4dEtleXM7XG5cbiAgICAgICAgICBzZXRTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoc3RhdGUgPT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHBhdGgsIHN0YXRlKSB7XG4gICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KSghKCh0eXBlb2YgcGF0aCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGF0aCkpID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byByZXBsYWNlIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdSRVBMQUNFJztcbiAgICB2YXIgbG9jYXRpb24gPSAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICB2YXIgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgICAgdmFyIGtleSA9IGxvY2F0aW9uLmtleSxcbiAgICAgICAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xuXG5cbiAgICAgIGlmIChjYW5Vc2VIaXN0b3J5KSB7XG4gICAgICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCBudWxsLCBocmVmKTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbEtleXMuaW5kZXhPZihoaXN0b3J5LmxvY2F0aW9uLmtleSk7XG5cbiAgICAgICAgICBpZiAocHJldkluZGV4ICE9PSAtMSkgYWxsS2V5c1twcmV2SW5kZXhdID0gbG9jYXRpb24ua2V5O1xuXG4gICAgICAgICAgc2V0U3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKHN0YXRlID09PSB1bmRlZmluZWQsICdCcm93c2VyIGhpc3RvcnkgY2Fubm90IHJlcGxhY2Ugc3RhdGUgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVE1MNSBoaXN0b3J5Jyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdvID0gZnVuY3Rpb24gZ28obikge1xuICAgIGdsb2JhbEhpc3RvcnkuZ28obik7XG4gIH07XG5cbiAgdmFyIGdvQmFjayA9IGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICByZXR1cm4gZ28oLTEpO1xuICB9O1xuXG4gIHZhciBnb0ZvcndhcmQgPSBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgcmV0dXJuIGdvKDEpO1xuICB9O1xuXG4gIHZhciBsaXN0ZW5lckNvdW50ID0gMDtcblxuICB2YXIgY2hlY2tET01MaXN0ZW5lcnMgPSBmdW5jdGlvbiBjaGVja0RPTUxpc3RlbmVycyhkZWx0YSkge1xuICAgIGxpc3RlbmVyQ291bnQgKz0gZGVsdGE7XG5cbiAgICBpZiAobGlzdGVuZXJDb3VudCA9PT0gMSkge1xuICAgICAgKDAsIF9ET01VdGlscy5hZGRFdmVudExpc3RlbmVyKSh3aW5kb3csIFBvcFN0YXRlRXZlbnQsIGhhbmRsZVBvcFN0YXRlKTtcblxuICAgICAgaWYgKG5lZWRzSGFzaENoYW5nZUxpc3RlbmVyKSAoMCwgX0RPTVV0aWxzLmFkZEV2ZW50TGlzdGVuZXIpKHdpbmRvdywgSGFzaENoYW5nZUV2ZW50LCBoYW5kbGVIYXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVyQ291bnQgPT09IDApIHtcbiAgICAgICgwLCBfRE9NVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcikod2luZG93LCBQb3BTdGF0ZUV2ZW50LCBoYW5kbGVQb3BTdGF0ZSk7XG5cbiAgICAgIGlmIChuZWVkc0hhc2hDaGFuZ2VMaXN0ZW5lcikgKDAsIF9ET01VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKSh3aW5kb3csIEhhc2hDaGFuZ2VFdmVudCwgaGFuZGxlSGFzaENoYW5nZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc0Jsb2NrZWQgPSBmYWxzZTtcblxuICB2YXIgYmxvY2sgPSBmdW5jdGlvbiBibG9jaygpIHtcbiAgICB2YXIgcHJvbXB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIHZhciB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XG5cbiAgICBpZiAoIWlzQmxvY2tlZCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNCbG9ja2VkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICBjaGVja0RPTUxpc3RlbmVycygtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmJsb2NrKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgbGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgdmFyIHVubGlzdGVuID0gdHJhbnNpdGlvbk1hbmFnZXIuYXBwZW5kTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGNoZWNrRE9NTGlzdGVuZXJzKDEpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKC0xKTtcbiAgICAgIHVubGlzdGVuKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGlzdG9yeSA9IHtcbiAgICBsZW5ndGg6IGdsb2JhbEhpc3RvcnkubGVuZ3RoLFxuICAgIGFjdGlvbjogJ1BPUCcsXG4gICAgbG9jYXRpb246IGluaXRpYWxMb2NhdGlvbixcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmLFxuICAgIHB1c2g6IHB1c2gsXG4gICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICBnbzogZ28sXG4gICAgZ29CYWNrOiBnb0JhY2ssXG4gICAgZ29Gb3J3YXJkOiBnb0ZvcndhcmQsXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIGxpc3RlbjogbGlzdGVuXG4gIH07XG5cbiAgcmV0dXJuIGhpc3Rvcnk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVCcm93c2VySGlzdG9yeTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2hpc3RvcnkvY3JlYXRlQnJvd3Nlckhpc3RvcnkuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX0xvY2F0aW9uVXRpbHMgPSByZXF1aXJlKCcuL0xvY2F0aW9uVXRpbHMnKTtcblxudmFyIF9QYXRoVXRpbHMgPSByZXF1aXJlKCcuL1BhdGhVdGlscycpO1xuXG52YXIgX2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyID0gcmVxdWlyZSgnLi9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlcicpO1xuXG52YXIgX2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyKTtcblxudmFyIF9ET01VdGlscyA9IHJlcXVpcmUoJy4vRE9NVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIEhhc2hDaGFuZ2VFdmVudCA9ICdoYXNoY2hhbmdlJztcblxudmFyIEhhc2hQYXRoQ29kZXJzID0ge1xuICBoYXNoYmFuZzoge1xuICAgIGVuY29kZVBhdGg6IGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnIScgPyBwYXRoIDogJyEvJyArICgwLCBfUGF0aFV0aWxzLnN0cmlwTGVhZGluZ1NsYXNoKShwYXRoKTtcbiAgICB9LFxuICAgIGRlY29kZVBhdGg6IGZ1bmN0aW9uIGRlY29kZVBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnIScgPyBwYXRoLnN1YnN0cigxKSA6IHBhdGg7XG4gICAgfVxuICB9LFxuICBub3NsYXNoOiB7XG4gICAgZW5jb2RlUGF0aDogX1BhdGhVdGlscy5zdHJpcExlYWRpbmdTbGFzaCxcbiAgICBkZWNvZGVQYXRoOiBfUGF0aFV0aWxzLmFkZExlYWRpbmdTbGFzaFxuICB9LFxuICBzbGFzaDoge1xuICAgIGVuY29kZVBhdGg6IF9QYXRoVXRpbHMuYWRkTGVhZGluZ1NsYXNoLFxuICAgIGRlY29kZVBhdGg6IF9QYXRoVXRpbHMuYWRkTGVhZGluZ1NsYXNoXG4gIH1cbn07XG5cbnZhciBnZXRIYXNoUGF0aCA9IGZ1bmN0aW9uIGdldEhhc2hQYXRoKCkge1xuICAvLyBXZSBjYW4ndCB1c2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggaGVyZSBiZWNhdXNlIGl0J3Mgbm90XG4gIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzIC0gRmlyZWZveCB3aWxsIHByZS1kZWNvZGUgaXQhXG4gIHZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHZhciBoYXNoSW5kZXggPSBocmVmLmluZGV4T2YoJyMnKTtcbiAgcmV0dXJuIGhhc2hJbmRleCA9PT0gLTEgPyAnJyA6IGhyZWYuc3Vic3RyaW5nKGhhc2hJbmRleCArIDEpO1xufTtcblxudmFyIHB1c2hIYXNoUGF0aCA9IGZ1bmN0aW9uIHB1c2hIYXNoUGF0aChwYXRoKSB7XG4gIHJldHVybiB3aW5kb3cubG9jYXRpb24uaGFzaCA9IHBhdGg7XG59O1xuXG52YXIgcmVwbGFjZUhhc2hQYXRoID0gZnVuY3Rpb24gcmVwbGFjZUhhc2hQYXRoKHBhdGgpIHtcbiAgdmFyIGhhc2hJbmRleCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJyMnKTtcblxuICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZi5zbGljZSgwLCBoYXNoSW5kZXggPj0gMCA/IGhhc2hJbmRleCA6IDApICsgJyMnICsgcGF0aCk7XG59O1xuXG52YXIgY3JlYXRlSGFzaEhpc3RvcnkgPSBmdW5jdGlvbiBjcmVhdGVIYXNoSGlzdG9yeSgpIHtcbiAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkoX0RPTVV0aWxzLmNhblVzZURPTSwgJ0hhc2ggaGlzdG9yeSBuZWVkcyBhIERPTScpO1xuXG4gIHZhciBnbG9iYWxIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gIHZhciBjYW5Hb1dpdGhvdXRSZWxvYWQgPSAoMCwgX0RPTVV0aWxzLnN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoKSgpO1xuXG4gIHZhciBfcHJvcHMkZ2V0VXNlckNvbmZpcm0gPSBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxuICAgICAgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9PT0gdW5kZWZpbmVkID8gX0RPTVV0aWxzLmdldENvbmZpcm1hdGlvbiA6IF9wcm9wcyRnZXRVc2VyQ29uZmlybSxcbiAgICAgIF9wcm9wcyRoYXNoVHlwZSA9IHByb3BzLmhhc2hUeXBlLFxuICAgICAgaGFzaFR5cGUgPSBfcHJvcHMkaGFzaFR5cGUgPT09IHVuZGVmaW5lZCA/ICdzbGFzaCcgOiBfcHJvcHMkaGFzaFR5cGU7XG5cbiAgdmFyIGJhc2VuYW1lID0gcHJvcHMuYmFzZW5hbWUgPyAoMCwgX1BhdGhVdGlscy5zdHJpcFRyYWlsaW5nU2xhc2gpKCgwLCBfUGF0aFV0aWxzLmFkZExlYWRpbmdTbGFzaCkocHJvcHMuYmFzZW5hbWUpKSA6ICcnO1xuXG4gIHZhciBfSGFzaFBhdGhDb2RlcnMkaGFzaFQgPSBIYXNoUGF0aENvZGVyc1toYXNoVHlwZV0sXG4gICAgICBlbmNvZGVQYXRoID0gX0hhc2hQYXRoQ29kZXJzJGhhc2hULmVuY29kZVBhdGgsXG4gICAgICBkZWNvZGVQYXRoID0gX0hhc2hQYXRoQ29kZXJzJGhhc2hULmRlY29kZVBhdGg7XG5cblxuICB2YXIgZ2V0RE9NTG9jYXRpb24gPSBmdW5jdGlvbiBnZXRET01Mb2NhdGlvbigpIHtcbiAgICB2YXIgcGF0aCA9IGRlY29kZVBhdGgoZ2V0SGFzaFBhdGgoKSk7XG5cbiAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKCFiYXNlbmFtZSB8fCAoMCwgX1BhdGhVdGlscy5oYXNCYXNlbmFtZSkocGF0aCwgYmFzZW5hbWUpLCAnWW91IGFyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGJhc2VuYW1lIG9uIGEgcGFnZSB3aG9zZSBVUkwgcGF0aCBkb2VzIG5vdCBiZWdpbiAnICsgJ3dpdGggdGhlIGJhc2VuYW1lLiBFeHBlY3RlZCBwYXRoIFwiJyArIHBhdGggKyAnXCIgdG8gYmVnaW4gd2l0aCBcIicgKyBiYXNlbmFtZSArICdcIi4nKTtcblxuICAgIGlmIChiYXNlbmFtZSkgcGF0aCA9ICgwLCBfUGF0aFV0aWxzLnN0cmlwQmFzZW5hbWUpKHBhdGgsIGJhc2VuYW1lKTtcblxuICAgIHJldHVybiAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgpO1xuICB9O1xuXG4gIHZhciB0cmFuc2l0aW9uTWFuYWdlciA9ICgwLCBfY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIyLmRlZmF1bHQpKCk7XG5cbiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24gc2V0U3RhdGUobmV4dFN0YXRlKSB7XG4gICAgX2V4dGVuZHMoaGlzdG9yeSwgbmV4dFN0YXRlKTtcblxuICAgIGhpc3RvcnkubGVuZ3RoID0gZ2xvYmFsSGlzdG9yeS5sZW5ndGg7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5ub3RpZnlMaXN0ZW5lcnMoaGlzdG9yeS5sb2NhdGlvbiwgaGlzdG9yeS5hY3Rpb24pO1xuICB9O1xuXG4gIHZhciBmb3JjZU5leHRQb3AgPSBmYWxzZTtcbiAgdmFyIGlnbm9yZVBhdGggPSBudWxsO1xuXG4gIHZhciBoYW5kbGVIYXNoQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlSGFzaENoYW5nZSgpIHtcbiAgICB2YXIgcGF0aCA9IGdldEhhc2hQYXRoKCk7XG4gICAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChwYXRoKTtcblxuICAgIGlmIChwYXRoICE9PSBlbmNvZGVkUGF0aCkge1xuICAgICAgLy8gRW5zdXJlIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVybHktZW5jb2RlZCBoYXNoLlxuICAgICAgcmVwbGFjZUhhc2hQYXRoKGVuY29kZWRQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxvY2F0aW9uID0gZ2V0RE9NTG9jYXRpb24oKTtcbiAgICAgIHZhciBwcmV2TG9jYXRpb24gPSBoaXN0b3J5LmxvY2F0aW9uO1xuXG4gICAgICBpZiAoIWZvcmNlTmV4dFBvcCAmJiAoMCwgX0xvY2F0aW9uVXRpbHMubG9jYXRpb25zQXJlRXF1YWwpKHByZXZMb2NhdGlvbiwgbG9jYXRpb24pKSByZXR1cm47IC8vIEEgaGFzaGNoYW5nZSBkb2Vzbid0IGFsd2F5cyA9PSBsb2NhdGlvbiBjaGFuZ2UuXG5cbiAgICAgIGlmIChpZ25vcmVQYXRoID09PSAoMCwgX1BhdGhVdGlscy5jcmVhdGVQYXRoKShsb2NhdGlvbikpIHJldHVybjsgLy8gSWdub3JlIHRoaXMgY2hhbmdlOyB3ZSBhbHJlYWR5IHNldFN0YXRlIGluIHB1c2gvcmVwbGFjZS5cblxuICAgICAgaWdub3JlUGF0aCA9IG51bGw7XG5cbiAgICAgIGhhbmRsZVBvcChsb2NhdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVQb3AgPSBmdW5jdGlvbiBoYW5kbGVQb3AobG9jYXRpb24pIHtcbiAgICBpZiAoZm9yY2VOZXh0UG9wKSB7XG4gICAgICBmb3JjZU5leHRQb3AgPSBmYWxzZTtcbiAgICAgIHNldFN0YXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhY3Rpb24gPSAnUE9QJztcblxuICAgICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgc2V0U3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldmVydFBvcChsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmV2ZXJ0UG9wID0gZnVuY3Rpb24gcmV2ZXJ0UG9wKGZyb21Mb2NhdGlvbikge1xuICAgIHZhciB0b0xvY2F0aW9uID0gaGlzdG9yeS5sb2NhdGlvbjtcblxuICAgIC8vIFRPRE86IFdlIGNvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyBtb3JlIHJlbGlhYmxlIGJ5XG4gICAgLy8ga2VlcGluZyBhIGxpc3Qgb2YgcGF0aHMgd2UndmUgc2VlbiBpbiBzZXNzaW9uU3RvcmFnZS5cbiAgICAvLyBJbnN0ZWFkLCB3ZSBqdXN0IGRlZmF1bHQgdG8gMCBmb3IgcGF0aHMgd2UgZG9uJ3Qga25vdy5cblxuICAgIHZhciB0b0luZGV4ID0gYWxsUGF0aHMubGFzdEluZGV4T2YoKDAsIF9QYXRoVXRpbHMuY3JlYXRlUGF0aCkodG9Mb2NhdGlvbikpO1xuXG4gICAgaWYgKHRvSW5kZXggPT09IC0xKSB0b0luZGV4ID0gMDtcblxuICAgIHZhciBmcm9tSW5kZXggPSBhbGxQYXRocy5sYXN0SW5kZXhPZigoMCwgX1BhdGhVdGlscy5jcmVhdGVQYXRoKShmcm9tTG9jYXRpb24pKTtcblxuICAgIGlmIChmcm9tSW5kZXggPT09IC0xKSBmcm9tSW5kZXggPSAwO1xuXG4gICAgdmFyIGRlbHRhID0gdG9JbmRleCAtIGZyb21JbmRleDtcblxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcbiAgICAgIGdvKGRlbHRhKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5zdXJlIHRoZSBoYXNoIGlzIGVuY29kZWQgcHJvcGVybHkgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuXG4gIHZhciBwYXRoID0gZ2V0SGFzaFBhdGgoKTtcbiAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChwYXRoKTtcblxuICBpZiAocGF0aCAhPT0gZW5jb2RlZFBhdGgpIHJlcGxhY2VIYXNoUGF0aChlbmNvZGVkUGF0aCk7XG5cbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IGdldERPTUxvY2F0aW9uKCk7XG4gIHZhciBhbGxQYXRocyA9IFsoMCwgX1BhdGhVdGlscy5jcmVhdGVQYXRoKShpbml0aWFsTG9jYXRpb24pXTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG5cbiAgdmFyIGNyZWF0ZUhyZWYgPSBmdW5jdGlvbiBjcmVhdGVIcmVmKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuICcjJyArIGVuY29kZVBhdGgoYmFzZW5hbWUgKyAoMCwgX1BhdGhVdGlscy5jcmVhdGVQYXRoKShsb2NhdGlvbikpO1xuICB9O1xuXG4gIHZhciBwdXNoID0gZnVuY3Rpb24gcHVzaChwYXRoLCBzdGF0ZSkge1xuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoc3RhdGUgPT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdQVVNIJztcbiAgICB2YXIgbG9jYXRpb24gPSAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBoaXN0b3J5LmxvY2F0aW9uKTtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG5cbiAgICAgIHZhciBwYXRoID0gKDAsIF9QYXRoVXRpbHMuY3JlYXRlUGF0aCkobG9jYXRpb24pO1xuICAgICAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChiYXNlbmFtZSArIHBhdGgpO1xuICAgICAgdmFyIGhhc2hDaGFuZ2VkID0gZ2V0SGFzaFBhdGgoKSAhPT0gZW5jb2RlZFBhdGg7XG5cbiAgICAgIGlmIChoYXNoQ2hhbmdlZCkge1xuICAgICAgICAvLyBXZSBjYW5ub3QgdGVsbCBpZiBhIGhhc2hjaGFuZ2Ugd2FzIGNhdXNlZCBieSBhIFBVU0gsIHNvIHdlJ2RcbiAgICAgICAgLy8gcmF0aGVyIHNldFN0YXRlIGhlcmUgYW5kIGlnbm9yZSB0aGUgaGFzaGNoYW5nZS4gVGhlIGNhdmVhdCBoZXJlXG4gICAgICAgIC8vIGlzIHRoYXQgb3RoZXIgaGFzaCBoaXN0b3JpZXMgaW4gdGhlIHBhZ2Ugd2lsbCBjb25zaWRlciBpdCBhIFBPUC5cbiAgICAgICAgaWdub3JlUGF0aCA9IHBhdGg7XG4gICAgICAgIHB1c2hIYXNoUGF0aChlbmNvZGVkUGF0aCk7XG5cbiAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbFBhdGhzLmxhc3RJbmRleE9mKCgwLCBfUGF0aFV0aWxzLmNyZWF0ZVBhdGgpKGhpc3RvcnkubG9jYXRpb24pKTtcbiAgICAgICAgdmFyIG5leHRQYXRocyA9IGFsbFBhdGhzLnNsaWNlKDAsIHByZXZJbmRleCA9PT0gLTEgPyAwIDogcHJldkluZGV4ICsgMSk7XG5cbiAgICAgICAgbmV4dFBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgIGFsbFBhdGhzID0gbmV4dFBhdGhzO1xuXG4gICAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoZmFsc2UsICdIYXNoIGhpc3RvcnkgY2Fubm90IFBVU0ggdGhlIHNhbWUgcGF0aDsgYSBuZXcgZW50cnkgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGhpc3Rvcnkgc3RhY2snKTtcblxuICAgICAgICBzZXRTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciByZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShwYXRoLCBzdGF0ZSkge1xuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoc3RhdGUgPT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBjYW5ub3QgcmVwbGFjZSBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdSRVBMQUNFJztcbiAgICB2YXIgbG9jYXRpb24gPSAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBoaXN0b3J5LmxvY2F0aW9uKTtcblxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG5cbiAgICAgIHZhciBwYXRoID0gKDAsIF9QYXRoVXRpbHMuY3JlYXRlUGF0aCkobG9jYXRpb24pO1xuICAgICAgdmFyIGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChiYXNlbmFtZSArIHBhdGgpO1xuICAgICAgdmFyIGhhc2hDaGFuZ2VkID0gZ2V0SGFzaFBhdGgoKSAhPT0gZW5jb2RlZFBhdGg7XG5cbiAgICAgIGlmIChoYXNoQ2hhbmdlZCkge1xuICAgICAgICAvLyBXZSBjYW5ub3QgdGVsbCBpZiBhIGhhc2hjaGFuZ2Ugd2FzIGNhdXNlZCBieSBhIFJFUExBQ0UsIHNvIHdlJ2RcbiAgICAgICAgLy8gcmF0aGVyIHNldFN0YXRlIGhlcmUgYW5kIGlnbm9yZSB0aGUgaGFzaGNoYW5nZS4gVGhlIGNhdmVhdCBoZXJlXG4gICAgICAgIC8vIGlzIHRoYXQgb3RoZXIgaGFzaCBoaXN0b3JpZXMgaW4gdGhlIHBhZ2Ugd2lsbCBjb25zaWRlciBpdCBhIFBPUC5cbiAgICAgICAgaWdub3JlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJlcGxhY2VIYXNoUGF0aChlbmNvZGVkUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxQYXRocy5pbmRleE9mKCgwLCBfUGF0aFV0aWxzLmNyZWF0ZVBhdGgpKGhpc3RvcnkubG9jYXRpb24pKTtcblxuICAgICAgaWYgKHByZXZJbmRleCAhPT0gLTEpIGFsbFBhdGhzW3ByZXZJbmRleF0gPSBwYXRoO1xuXG4gICAgICBzZXRTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdvID0gZnVuY3Rpb24gZ28obikge1xuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoY2FuR29XaXRob3V0UmVsb2FkLCAnSGFzaCBoaXN0b3J5IGdvKG4pIGNhdXNlcyBhIGZ1bGwgcGFnZSByZWxvYWQgaW4gdGhpcyBicm93c2VyJyk7XG5cbiAgICBnbG9iYWxIaXN0b3J5LmdvKG4pO1xuICB9O1xuXG4gIHZhciBnb0JhY2sgPSBmdW5jdGlvbiBnb0JhY2soKSB7XG4gICAgcmV0dXJuIGdvKC0xKTtcbiAgfTtcblxuICB2YXIgZ29Gb3J3YXJkID0gZnVuY3Rpb24gZ29Gb3J3YXJkKCkge1xuICAgIHJldHVybiBnbygxKTtcbiAgfTtcblxuICB2YXIgbGlzdGVuZXJDb3VudCA9IDA7XG5cbiAgdmFyIGNoZWNrRE9NTGlzdGVuZXJzID0gZnVuY3Rpb24gY2hlY2tET01MaXN0ZW5lcnMoZGVsdGEpIHtcbiAgICBsaXN0ZW5lckNvdW50ICs9IGRlbHRhO1xuXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEpIHtcbiAgICAgICgwLCBfRE9NVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcikod2luZG93LCBIYXNoQ2hhbmdlRXZlbnQsIGhhbmRsZUhhc2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAobGlzdGVuZXJDb3VudCA9PT0gMCkge1xuICAgICAgKDAsIF9ET01VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKSh3aW5kb3csIEhhc2hDaGFuZ2VFdmVudCwgaGFuZGxlSGFzaENoYW5nZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc0Jsb2NrZWQgPSBmYWxzZTtcblxuICB2YXIgYmxvY2sgPSBmdW5jdGlvbiBibG9jaygpIHtcbiAgICB2YXIgcHJvbXB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIHZhciB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XG5cbiAgICBpZiAoIWlzQmxvY2tlZCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNCbG9ja2VkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICBjaGVja0RPTUxpc3RlbmVycygtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmJsb2NrKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgbGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgdmFyIHVubGlzdGVuID0gdHJhbnNpdGlvbk1hbmFnZXIuYXBwZW5kTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGNoZWNrRE9NTGlzdGVuZXJzKDEpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKC0xKTtcbiAgICAgIHVubGlzdGVuKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGlzdG9yeSA9IHtcbiAgICBsZW5ndGg6IGdsb2JhbEhpc3RvcnkubGVuZ3RoLFxuICAgIGFjdGlvbjogJ1BPUCcsXG4gICAgbG9jYXRpb246IGluaXRpYWxMb2NhdGlvbixcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmLFxuICAgIHB1c2g6IHB1c2gsXG4gICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICBnbzogZ28sXG4gICAgZ29CYWNrOiBnb0JhY2ssXG4gICAgZ29Gb3J3YXJkOiBnb0ZvcndhcmQsXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIGxpc3RlbjogbGlzdGVuXG4gIH07XG5cbiAgcmV0dXJuIGhpc3Rvcnk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVIYXNoSGlzdG9yeTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2hpc3RvcnkvY3JlYXRlSGFzaEhpc3RvcnkuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfUGF0aFV0aWxzID0gcmVxdWlyZSgnLi9QYXRoVXRpbHMnKTtcblxudmFyIF9Mb2NhdGlvblV0aWxzID0gcmVxdWlyZSgnLi9Mb2NhdGlvblV0aWxzJyk7XG5cbnZhciBfY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIgPSByZXF1aXJlKCcuL2NyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyJyk7XG5cbnZhciBfY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlVHJhbnNpdGlvbk1hbmFnZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgY2xhbXAgPSBmdW5jdGlvbiBjbGFtcChuLCBsb3dlckJvdW5kLCB1cHBlckJvdW5kKSB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChuLCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoaXN0b3J5IG9iamVjdCB0aGF0IHN0b3JlcyBsb2NhdGlvbnMgaW4gbWVtb3J5LlxuICovXG52YXIgY3JlYXRlTWVtb3J5SGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBnZXRVc2VyQ29uZmlybWF0aW9uID0gcHJvcHMuZ2V0VXNlckNvbmZpcm1hdGlvbixcbiAgICAgIF9wcm9wcyRpbml0aWFsRW50cmllcyA9IHByb3BzLmluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEVudHJpZXMgPSBfcHJvcHMkaW5pdGlhbEVudHJpZXMgPT09IHVuZGVmaW5lZCA/IFsnLyddIDogX3Byb3BzJGluaXRpYWxFbnRyaWVzLFxuICAgICAgX3Byb3BzJGluaXRpYWxJbmRleCA9IHByb3BzLmluaXRpYWxJbmRleCxcbiAgICAgIGluaXRpYWxJbmRleCA9IF9wcm9wcyRpbml0aWFsSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiBfcHJvcHMkaW5pdGlhbEluZGV4LFxuICAgICAgX3Byb3BzJGtleUxlbmd0aCA9IHByb3BzLmtleUxlbmd0aCxcbiAgICAgIGtleUxlbmd0aCA9IF9wcm9wcyRrZXlMZW5ndGggPT09IHVuZGVmaW5lZCA/IDYgOiBfcHJvcHMka2V5TGVuZ3RoO1xuXG5cbiAgdmFyIHRyYW5zaXRpb25NYW5hZ2VyID0gKDAsIF9jcmVhdGVUcmFuc2l0aW9uTWFuYWdlcjIuZGVmYXVsdCkoKTtcblxuICB2YXIgc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShuZXh0U3RhdGUpIHtcbiAgICBfZXh0ZW5kcyhoaXN0b3J5LCBuZXh0U3RhdGUpO1xuXG4gICAgaGlzdG9yeS5sZW5ndGggPSBoaXN0b3J5LmVudHJpZXMubGVuZ3RoO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKGhpc3RvcnkubG9jYXRpb24sIGhpc3RvcnkuYWN0aW9uKTtcbiAgfTtcblxuICB2YXIgY3JlYXRlS2V5ID0gZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwga2V5TGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgaW5kZXggPSBjbGFtcChpbml0aWFsSW5kZXgsIDAsIGluaXRpYWxFbnRyaWVzLmxlbmd0aCAtIDEpO1xuICB2YXIgZW50cmllcyA9IGluaXRpYWxFbnRyaWVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/ICgwLCBfTG9jYXRpb25VdGlscy5jcmVhdGVMb2NhdGlvbikoZW50cnksIHVuZGVmaW5lZCwgY3JlYXRlS2V5KCkpIDogKDAsIF9Mb2NhdGlvblV0aWxzLmNyZWF0ZUxvY2F0aW9uKShlbnRyeSwgdW5kZWZpbmVkLCBlbnRyeS5rZXkgfHwgY3JlYXRlS2V5KCkpO1xuICB9KTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG5cbiAgdmFyIGNyZWF0ZUhyZWYgPSBfUGF0aFV0aWxzLmNyZWF0ZVBhdGg7XG5cbiAgdmFyIHB1c2ggPSBmdW5jdGlvbiBwdXNoKHBhdGgsIHN0YXRlKSB7XG4gICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KSghKCh0eXBlb2YgcGF0aCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGF0aCkpID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byBwdXNoIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpO1xuXG4gICAgdmFyIGFjdGlvbiA9ICdQVVNIJztcbiAgICB2YXIgbG9jYXRpb24gPSAoMCwgX0xvY2F0aW9uVXRpbHMuY3JlYXRlTG9jYXRpb24pKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuXG4gICAgICB2YXIgcHJldkluZGV4ID0gaGlzdG9yeS5pbmRleDtcbiAgICAgIHZhciBuZXh0SW5kZXggPSBwcmV2SW5kZXggKyAxO1xuXG4gICAgICB2YXIgbmV4dEVudHJpZXMgPSBoaXN0b3J5LmVudHJpZXMuc2xpY2UoMCk7XG4gICAgICBpZiAobmV4dEVudHJpZXMubGVuZ3RoID4gbmV4dEluZGV4KSB7XG4gICAgICAgIG5leHRFbnRyaWVzLnNwbGljZShuZXh0SW5kZXgsIG5leHRFbnRyaWVzLmxlbmd0aCAtIG5leHRJbmRleCwgbG9jYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEVudHJpZXMucHVzaChsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgaW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgZW50cmllczogbmV4dEVudHJpZXNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciByZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShwYXRoLCBzdGF0ZSkge1xuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoISgodHlwZW9mIHBhdGggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHBhdGgpKSA9PT0gJ29iamVjdCcgJiYgcGF0aC5zdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlICE9PSB1bmRlZmluZWQpLCAnWW91IHNob3VsZCBhdm9pZCBwcm92aWRpbmcgYSAybmQgc3RhdGUgYXJndW1lbnQgdG8gcmVwbGFjZSB3aGVuIHRoZSAxc3QgJyArICdhcmd1bWVudCBpcyBhIGxvY2F0aW9uLWxpa2Ugb2JqZWN0IHRoYXQgYWxyZWFkeSBoYXMgc3RhdGU7IGl0IGlzIGlnbm9yZWQnKTtcblxuICAgIHZhciBhY3Rpb24gPSAnUkVQTEFDRSc7XG4gICAgdmFyIGxvY2F0aW9uID0gKDAsIF9Mb2NhdGlvblV0aWxzLmNyZWF0ZUxvY2F0aW9uKShwYXRoLCBzdGF0ZSwgY3JlYXRlS2V5KCksIGhpc3RvcnkubG9jYXRpb24pO1xuXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmICghb2spIHJldHVybjtcblxuICAgICAgaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuaW5kZXhdID0gbG9jYXRpb247XG5cbiAgICAgIHNldFN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZ28gPSBmdW5jdGlvbiBnbyhuKSB7XG4gICAgdmFyIG5leHRJbmRleCA9IGNsYW1wKGhpc3RvcnkuaW5kZXggKyBuLCAwLCBoaXN0b3J5LmVudHJpZXMubGVuZ3RoIC0gMSk7XG5cbiAgICB2YXIgYWN0aW9uID0gJ1BPUCc7XG4gICAgdmFyIGxvY2F0aW9uID0gaGlzdG9yeS5lbnRyaWVzW25leHRJbmRleF07XG5cbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgaW5kZXg6IG5leHRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1pbWljIHRoZSBiZWhhdmlvciBvZiBET00gaGlzdG9yaWVzIGJ5XG4gICAgICAgIC8vIGNhdXNpbmcgYSByZW5kZXIgYWZ0ZXIgYSBjYW5jZWxsZWQgUE9QLlxuICAgICAgICBzZXRTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBnb0JhY2sgPSBmdW5jdGlvbiBnb0JhY2soKSB7XG4gICAgcmV0dXJuIGdvKC0xKTtcbiAgfTtcblxuICB2YXIgZ29Gb3J3YXJkID0gZnVuY3Rpb24gZ29Gb3J3YXJkKCkge1xuICAgIHJldHVybiBnbygxKTtcbiAgfTtcblxuICB2YXIgY2FuR28gPSBmdW5jdGlvbiBjYW5HbyhuKSB7XG4gICAgdmFyIG5leHRJbmRleCA9IGhpc3RvcnkuaW5kZXggKyBuO1xuICAgIHJldHVybiBuZXh0SW5kZXggPj0gMCAmJiBuZXh0SW5kZXggPCBoaXN0b3J5LmVudHJpZXMubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBibG9jayA9IGZ1bmN0aW9uIGJsb2NrKCkge1xuICAgIHZhciBwcm9tcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHJldHVybiB0cmFuc2l0aW9uTWFuYWdlci5zZXRQcm9tcHQocHJvbXB0KTtcbiAgfTtcblxuICB2YXIgbGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25NYW5hZ2VyLmFwcGVuZExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfTtcblxuICB2YXIgaGlzdG9yeSA9IHtcbiAgICBsZW5ndGg6IGVudHJpZXMubGVuZ3RoLFxuICAgIGFjdGlvbjogJ1BPUCcsXG4gICAgbG9jYXRpb246IGVudHJpZXNbaW5kZXhdLFxuICAgIGluZGV4OiBpbmRleCxcbiAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBjYW5HbzogY2FuR28sXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIGxpc3RlbjogbGlzdGVuXG4gIH07XG5cbiAgcmV0dXJuIGhpc3Rvcnk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVNZW1vcnlIaXN0b3J5O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vaGlzdG9yeS9jcmVhdGVNZW1vcnlIaXN0b3J5LmpzIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IGdldFJhd1RhZyBmcm9tICcuL19nZXRSYXdUYWcuanMnO1xuaW1wb3J0IG9iamVjdFRvU3RyaW5nIGZyb20gJy4vX29iamVjdFRvU3RyaW5nLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRUYWc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9fYmFzZUdldFRhZy5qcyIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbmV4cG9ydCBkZWZhdWx0IGZyZWVHbG9iYWw7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9fZnJlZUdsb2JhbC5qcyIsImltcG9ydCBvdmVyQXJnIGZyb20gJy4vX292ZXJBcmcuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0UHJvdG90eXBlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9sb2Rhc2gtZXMvX2dldFByb3RvdHlwZS5qcyIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRSYXdUYWc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9fZ2V0UmF3VGFnLmpzIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9iamVjdFRvU3RyaW5nO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9sb2Rhc2gtZXMvX29iamVjdFRvU3RyaW5nLmpzIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG92ZXJBcmc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9fb3ZlckFyZy5qcyIsImltcG9ydCBmcmVlR2xvYmFsIGZyb20gJy4vX2ZyZWVHbG9iYWwuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHJvb3Q7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9fcm9vdC5qcyIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc09iamVjdExpa2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2xvZGFzaC1lcy9pc09iamVjdExpa2UuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbiAgdmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaW52YXJpYW50KHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJywgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gJyArICdSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lKTtcbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyghZXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciwgJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgJXMgdHlwZTogJXMlcycsIGxvY2F0aW9uLCBlcnJvci5tZXNzYWdlLCBzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW52YXJpYW50KFxuICAgICAgZmFsc2UsXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYm9vbDogc2hpbSxcbiAgICBmdW5jOiBzaGltLFxuICAgIG51bWJlcjogc2hpbSxcbiAgICBvYmplY3Q6IHNoaW0sXG4gICAgc3RyaW5nOiBzaGltLFxuICAgIHN5bWJvbDogc2hpbSxcblxuICAgIGFueTogc2hpbSxcbiAgICBhcnJheU9mOiBnZXRTaGltLFxuICAgIGVsZW1lbnQ6IHNoaW0sXG4gICAgaW5zdGFuY2VPZjogZ2V0U2hpbSxcbiAgICBub2RlOiBzaGltLFxuICAgIG9iamVjdE9mOiBnZXRTaGltLFxuICAgIG9uZU9mOiBnZXRTaGltLFxuICAgIG9uZU9mVHlwZTogZ2V0U2hpbSxcbiAgICBzaGFwZTogZ2V0U2hpbVxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gZW1wdHlGdW5jdGlvbjtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0ge1xuICBQcm9wZXJ0aWVzOiB7XG4gICAgLy8gR2xvYmFsIFN0YXRlcyBhbmQgUHJvcGVydGllc1xuICAgICdhcmlhLWN1cnJlbnQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWRldGFpbHMnOiAwLFxuICAgICdhcmlhLWRpc2FibGVkJzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1oaWRkZW4nOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICAgJ2FyaWEtbGFiZWwnOiAwLFxuICAgICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gICAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAgICdhcmlhLWNoZWNrZWQnOiAwLFxuICAgICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAgICdhcmlhLW1vZGFsJzogMCxcbiAgICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAgICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAgICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgICAnYXJpYS1zb3J0JzogMCxcbiAgICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAgICdhcmlhLXZhbHVlbm93JzogMCxcbiAgICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAgIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdG9taWMnOiAwLFxuICAgICdhcmlhLWJ1c3knOiAwLFxuICAgICdhcmlhLWxpdmUnOiAwLFxuICAgICdhcmlhLXJlbGV2YW50JzogMCxcbiAgICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAgICdhcmlhLWNvbGNvdW50JzogMCxcbiAgICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAgICdhcmlhLWZsb3d0byc6IDAsXG4gICAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICAgJ2FyaWEtb3ducyc6IDAsXG4gICAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAgICdhcmlhLXJvd2NvdW50JzogMCxcbiAgICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICAgJ2FyaWEtc2V0c2l6ZSc6IDBcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHt9LFxuICBET01Qcm9wZXJ0eU5hbWVzOiB7fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBUklBRE9NUHJvcGVydHlDb25maWc7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0FSSUFET01Qcm9wZXJ0eUNvbmZpZy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7XG5cbnZhciBBdXRvRm9jdXNVdGlscyA9IHtcbiAgZm9jdXNET01Db21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBmb2N1c05vZGUoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF1dG9Gb2N1c1V0aWxzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9BdXRvRm9jdXNVdGlscy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlID0gcmVxdWlyZSgnLi9GYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUnKTtcbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljSW5wdXRFdmVudCcpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG5cbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG5cbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG5cbi8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUgJiYgIWlzUHJlc3RvKCk7XG5cbi8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG5cbi8qKlxuICogT3BlcmEgPD0gMTIgaW5jbHVkZXMgVGV4dEV2ZW50IGluIHdpbmRvdywgYnV0IGRvZXMgbm90IGZpcmVcbiAqIHRleHQgaW5wdXQgZXZlbnRzLiBSZWx5IG9uIGtleXByZXNzIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGlzUHJlc3RvKCkge1xuICB2YXIgb3BlcmEgPSB3aW5kb3cub3BlcmE7XG4gIHJldHVybiB0eXBlb2Ygb3BlcmEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcGVyYS52ZXJzaW9uID09PSAnZnVuY3Rpb24nICYmIHBhcnNlSW50KG9wZXJhLnZlcnNpb24oKSwgMTApIDw9IDEyO1xufVxuXG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG4vLyBFdmVudHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgbmFtZXMuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgYmVmb3JlSW5wdXQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQmVmb3JlSW5wdXQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkJlZm9yZUlucHV0Q2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlQcmVzcycsICd0b3BUZXh0SW5wdXQnLCAndG9wUGFzdGUnXVxuICB9LFxuICBjb21wb3NpdGlvbkVuZDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25Db21wb3NpdGlvbkVuZCcsXG4gICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25FbmRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25FbmQnLCAndG9wS2V5RG93bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nXVxuICB9LFxuICBjb21wb3NpdGlvblN0YXJ0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25TdGFydCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH0sXG4gIGNvbXBvc2l0aW9uVXBkYXRlOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblVwZGF0ZScsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH1cbn07XG5cbi8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiZcbiAgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUodG9wTGV2ZWxUeXBlKSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25TdGFydCc6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uVXBkYXRlJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uVXBkYXRlO1xuICB9XG59XG5cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlEb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuXG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcbiAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG4gICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gZmFsbGJhY2sgb2JqZWN0LCBpZiBhbnkuXG52YXIgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcblxuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5cGUpO1xuICB9IGVsc2UgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDtcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24gJiYgZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQpIHtcbiAgICAgIGN1cnJlbnRDb21wb3NpdGlvbiA9IEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5nZXRQb29sZWQobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgfVxuICB9XG5cbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RvcFRleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICAgIC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gYmxhY2tsaXN0IGl0LlxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmYWxsYmFjayBzdHJpbmcgZm9yIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENvbXBvc2l0aW9uRW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUucmVsZWFzZShjdXJyZW50Q29tcG9zaXRpb24pO1xuICAgICAgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcFBhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmIChuYXRpdmVFdmVudC53aGljaCAmJiAhaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH1cblxuICAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNJbnB1dEV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmJlZm9yZUlucHV0LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHJldHVybiBbZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpLCBleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCldO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJlZm9yZUlucHV0RXZlbnRQbHVnaW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ1NTUHJvcGVydHkgPSByZXF1aXJlKCcuL0NTU1Byb3BlcnR5Jyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY2FtZWxpemVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZScpO1xudmFyIGRhbmdlcm91c1N0eWxlVmFsdWUgPSByZXF1aXJlKCcuL2Rhbmdlcm91c1N0eWxlVmFsdWUnKTtcbnZhciBoeXBoZW5hdGVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9oeXBoZW5hdGVTdHlsZU5hbWUnKTtcbnZhciBtZW1vaXplU3RyaW5nT25seSA9IHJlcXVpcmUoJ2ZianMvbGliL21lbW9pemVTdHJpbmdPbmx5Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHByb2Nlc3NTdHlsZU5hbWUgPSBtZW1vaXplU3RyaW5nT25seShmdW5jdGlvbiAoc3R5bGVOYW1lKSB7XG4gIHJldHVybiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKTtcbn0pO1xuXG52YXIgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgPSBmYWxzZTtcbnZhciBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnY3NzRmxvYXQnO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICB2YXIgdGVtcFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG4gIHRyeSB7XG4gICAgLy8gSUU4IHRocm93cyBcIkludmFsaWQgYXJndW1lbnQuXCIgaWYgcmVzZXR0aW5nIHNob3J0aGFuZCBzdHlsZSBwcm9wZXJ0aWVzLlxuICAgIHRlbXBTdHlsZS5mb250ID0gJyc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IHRydWU7XG4gIH1cbiAgLy8gSUU4IG9ubHkgc3VwcG9ydHMgYWNjZXNzaW5nIGNzc0Zsb2F0IChzdGFuZGFyZCkgYXMgc3R5bGVGbG9hdFxuICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnc3R5bGVGbG9hdCc7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuXG4gIC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG5cbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBjYW1lbGl6ZVN0eWxlTmFtZShuYW1lKSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCBcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4lcyBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lciksIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4lcycsIG5hbWUsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciBjaGVja1JlbmRlck1lc3NhZ2UgPSBmdW5jdGlvbiAob3duZXIpIHtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICAgKi9cbiAgdmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjb21wb25lbnQpIHtcbiAgICB2YXIgb3duZXI7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgb3duZXIgPSBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICB9XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0ge1xuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyBmb3IgdXNlIGFzIGlubGluZSBzdHlsZXM6XG4gICAqXG4gICAqICAgPiBjcmVhdGVNYXJrdXBGb3JTdHlsZXMoe3dpZHRoOiAnMjAwcHgnLCBoZWlnaHQ6IDB9KVxuICAgKiAgIFwid2lkdGg6MjAwcHg7aGVpZ2h0OjA7XCJcbiAgICpcbiAgICogVW5kZWZpbmVkIHZhbHVlcyBhcmUgaWdub3JlZCBzbyB0aGF0IGRlY2xhcmF0aXZlIHByb2dyYW1taW5nIGlzIGVhc2llci5cbiAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgSFRNTC1lc2NhcGVkIGJlZm9yZSBpbnNlcnRpb24gaW50byB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yU3R5bGVzOiBmdW5jdGlvbiAoc3R5bGVzLCBjb21wb25lbnQpIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICAgIHdhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBzZXJpYWxpemVkICs9IHByb2Nlc3NTdHlsZU5hbWUoc3R5bGVOYW1lKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgY29tcG9uZW50LCBpc0N1c3RvbVByb3BlcnR5KSArICc7JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICAgKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqL1xuICBzZXRWYWx1ZUZvclN0eWxlczogZnVuY3Rpb24gKG5vZGUsIHN0eWxlcywgY29tcG9uZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBjb21wb25lbnQuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgc3R5bGVzJyxcbiAgICAgICAgcGF5bG9hZDogc3R5bGVzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGNvbXBvbmVudCwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnIHx8IHN0eWxlTmFtZSA9PT0gJ2Nzc0Zsb2F0Jykge1xuICAgICAgICBzdHlsZU5hbWUgPSBzdHlsZUZsb2F0QWNjZXNzb3I7XG4gICAgICB9XG4gICAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnICYmIENTU1Byb3BlcnR5LnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tzdHlsZU5hbWVdO1xuICAgICAgICBpZiAoZXhwYW5zaW9uKSB7XG4gICAgICAgICAgLy8gU2hvcnRoYW5kIHByb3BlcnR5IHRoYXQgSUU4IHdvbid0IGxpa2UgdW5zZXR0aW5nLCBzbyB1bnNldCBlYWNoXG4gICAgICAgICAgLy8gY29tcG9uZW50IHRvIHBsYWNhdGUgaXRcbiAgICAgICAgICBmb3IgKHZhciBpbmRpdmlkdWFsU3R5bGVOYW1lIGluIGV4cGFuc2lvbikge1xuICAgICAgICAgICAgc3R5bGVbaW5kaXZpZHVhbFN0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENTU1Byb3BlcnR5T3BlcmF0aW9ucztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHlPcGVyYXRpb25zLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgaW5wdXRWYWx1ZVRyYWNraW5nID0gcmVxdWlyZSgnLi9pbnB1dFZhbHVlVHJhY2tpbmcnKTtcbnZhciBnZXRFdmVudFRhcmdldCA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRUYXJnZXQnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG52YXIgaXNUZXh0SW5wdXRFbGVtZW50ID0gcmVxdWlyZSgnLi9pc1RleHRJbnB1dEVsZW1lbnQnKTtcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gIGNoYW5nZToge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25DaGFuZ2UnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNoYW5nZUNhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDaGFuZ2UnLCAndG9wQ2xpY2snLCAndG9wRm9jdXMnLCAndG9wSW5wdXQnLCAndG9wS2V5RG93bicsICd0b3BLZXlVcCcsICd0b3BTZWxlY3Rpb25DaGFuZ2UnXVxuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICBldmVudC50eXBlID0gJ2NoYW5nZSc7XG4gIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbnZhciBkb2VzQ2hhbmdlRXZlbnRCdWJibGUgPSBmYWxzZTtcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgLy8gU2VlIGBoYW5kbGVDaGFuZ2VgIGNvbW1lbnQgYmVsb3dcbiAgZG9lc0NoYW5nZUV2ZW50QnViYmxlID0gaXNFdmVudFN1cHBvcnRlZCgnY2hhbmdlJykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOCk7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTtcblxuICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cbiAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZXZlbnQpIHtcbiAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudCk7XG4gIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudCk7XG59XG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciB1cGRhdGVkID0gaW5wdXRWYWx1ZVRyYWNraW5nLnVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB2YXIgc2ltdWxhdGVkID0gbmF0aXZlRXZlbnQuc2ltdWxhdGVkID09PSB0cnVlICYmIENoYW5nZUV2ZW50UGx1Z2luLl9hbGxvd1NpbXVsYXRlZFBhc3NUaHJvdWdoO1xuXG4gIGlmICh1cGRhdGVkIHx8IHNpbXVsYXRlZCkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFOCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCEoJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG5cbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKHRvcExldmVsVHlwZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BGb2N1cycpIHtcbiAgICAvLyBJbiBJRTgsIHdlIGNhbiBjYXB0dXJlIGFsbW9zdCBhbGwgLnZhbHVlIGNoYW5nZXMgYnkgYWRkaW5nIGFcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBoYW5kbGVyIGFuZCBsb29raW5nIGZvciBldmVudHMgd2l0aCBwcm9wZXJ0eU5hbWVcbiAgICAvLyBlcXVhbCB0byAndmFsdWUnXG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufVxuXG4vLyBGb3IgSUU4IGFuZCBJRTkuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcFNlbGVjdGlvbkNoYW5nZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5VXAnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wSW5wdXQnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcENoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKGluc3QsIG5vZGUpIHtcbiAgLy8gVE9ETzogSW4gSUUsIGluc3QgaXMgb2NjYXNpb25hbGx5IG51bGwuIFdoeT9cbiAgaWYgKGluc3QgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZpYmVyIGFuZCBSZWFjdERPTSBrZWVwIHdyYXBwZXIgc3RhdGUgaW4gc2VwYXJhdGUgcGxhY2VzXG4gIHZhciBzdGF0ZSA9IGluc3QuX3dyYXBwZXJTdGF0ZSB8fCBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICB2YXIgdmFsdWUgPSAnJyArIG5vZGUudmFsdWU7XG4gIGlmIChub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSAhPT0gdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xudmFyIENoYW5nZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIF9hbGxvd1NpbXVsYXRlZFBhc3NUaHJvdWdoOiB0cnVlLFxuICBfaXNJbnB1dEV2ZW50U3VwcG9ydGVkOiBpc0lucHV0RXZlbnRTdXBwb3J0ZWQsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcbiAgICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGlmIChkb2VzQ2hhbmdlRXZlbnRCdWJibGUpIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFODtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpO1xuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgICBoYW5kbGVFdmVudEZ1bmModG9wTGV2ZWxUeXBlLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXRJbnN0LCB0YXJnZXROb2RlKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2hhbmdlRXZlbnRQbHVnaW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0NoYW5nZUV2ZW50UGx1Z2luLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNyZWF0ZU5vZGVzRnJvbU1hcmt1cCA9IHJlcXVpcmUoJ2ZianMvbGliL2NyZWF0ZU5vZGVzRnJvbU1hcmt1cCcpO1xudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBEYW5nZXIgPSB7XG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIG5vZGUgd2l0aCBhIHN0cmluZyBvZiBtYXJrdXAgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGl0c1xuICAgKiBwYXJlbnQuIFRoZSBtYXJrdXAgbXVzdCByZW5kZXIgaW50byBhIHNpbmdsZSByb290IG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb2xkQ2hpbGQgQ2hpbGQgbm9kZSB0byByZXBsYWNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCB0byByZW5kZXIgaW4gcGxhY2Ugb2YgdGhlIGNoaWxkIG5vZGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwKSB7XG4gICAgIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVuZGVyIG1hcmt1cCBpbiBhIHdvcmtlciB0aHJlYWQuIE1ha2Ugc3VyZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBhcmUgYXZhaWxhYmxlIGdsb2JhbGx5IGJlZm9yZSByZXF1aXJpbmcgUmVhY3Qgd2hlbiB1bml0IHRlc3Rpbmcgb3IgdXNlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNTYnKSA6IHZvaWQgMDtcbiAgICAhbWFya3VwID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IE1pc3NpbmcgbWFya3VwLicpIDogX3Byb2RJbnZhcmlhbnQoJzU3JykgOiB2b2lkIDA7XG4gICAgIShvbGRDaGlsZC5ub2RlTmFtZSAhPT0gJ0hUTUwnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVwbGFjZSBtYXJrdXAgb2YgdGhlIDxodG1sPiBub2RlLiBUaGlzIGlzIGJlY2F1c2UgYnJvd3NlciBxdWlya3MgbWFrZSB0aGlzIHVucmVsaWFibGUgYW5kL29yIHNsb3cuIElmIHlvdSB3YW50IHRvIHJlbmRlciB0byB0aGUgcm9vdCB5b3UgbXVzdCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkuJykgOiBfcHJvZEludmFyaWFudCgnNTgnKSA6IHZvaWQgMDtcblxuICAgIGlmICh0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG5ld0NoaWxkID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgZW1wdHlGdW5jdGlvbilbMF07XG4gICAgICBvbGRDaGlsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGRDaGlsZCwgbWFya3VwKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFuZ2VyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9EYW5nZXIuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSB0aGF0IGlzIGluamVjdGFibGUgaW50byBgRXZlbnRQbHVnaW5IdWJgLCB0aGF0IHNwZWNpZmllcyBhXG4gKiBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGBFdmVudFBsdWdpbmBzLiBBIGNvbnZlbmllbnQgd2F5IHRvIHJlYXNvbiBhYm91dFxuICogcGx1Z2lucywgd2l0aG91dCBoYXZpbmcgdG8gcGFja2FnZSBldmVyeSBvbmUgb2YgdGhlbS4gVGhpcyBpcyBiZXR0ZXIgdGhhblxuICogaGF2aW5nIHBsdWdpbnMgYmUgb3JkZXJlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXJlIGluamVjdGVkIGJlY2F1c2VcbiAqIHRoYXQgb3JkZXJpbmcgd291bGQgYmUgaW5mbHVlbmNlZCBieSB0aGUgcGFja2FnaW5nIG9yZGVyLlxuICogYFJlc3BvbmRlckV2ZW50UGx1Z2luYCBtdXN0IG9jY3VyIGJlZm9yZSBgU2ltcGxlRXZlbnRQbHVnaW5gIHNvIHRoYXRcbiAqIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBldmVudHMgaXMgY29udmVuaWVudCBpbiBgU2ltcGxlRXZlbnRQbHVnaW5gIGhhbmRsZXJzLlxuICovXG5cbnZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlciA9IFsnUmVzcG9uZGVyRXZlbnRQbHVnaW4nLCAnU2ltcGxlRXZlbnRQbHVnaW4nLCAnVGFwRXZlbnRQbHVnaW4nLCAnRW50ZXJMZWF2ZUV2ZW50UGx1Z2luJywgJ0NoYW5nZUV2ZW50UGx1Z2luJywgJ1NlbGVjdEV2ZW50UGx1Z2luJywgJ0JlZm9yZUlucHV0RXZlbnRQbHVnaW4nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgbW91c2VFbnRlcjoge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXVxuICB9LFxuICBtb3VzZUxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uTW91c2VMZWF2ZScsXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1vdXNlT3V0JywgJ3RvcE1vdXNlT3ZlciddXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgLyoqXG4gICAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gICAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAgICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICAgKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAgICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAgICovXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU92ZXInICYmIChuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU91dCcgJiYgdG9wTGV2ZWxUeXBlICE9PSAndG9wTW91c2VPdmVyJykge1xuICAgICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBpbiBvciBtb3VzZSBvdXQgLSBpZ25vcmluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB3aW47XG4gICAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuICAgICAgaWYgKGRvYykge1xuICAgICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbiA9IHdpbmRvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZnJvbTtcbiAgICB2YXIgdG87XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3V0Jykge1xuICAgICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuICAgICAgdG8gPSByZWxhdGVkID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICAgIGZyb20gPSBudWxsO1xuICAgICAgdG8gPSB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gICAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG5cbiAgICB2YXIgbGVhdmUgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlTGVhdmUsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgbGVhdmUudHlwZSA9ICdtb3VzZWxlYXZlJztcbiAgICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuXG4gICAgdmFyIGVudGVyID0gU3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5tb3VzZUVudGVyLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlci50eXBlID0gJ21vdXNlZW50ZXInO1xuICAgIGVudGVyLnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlci5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG5cbiAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcblxuICAgIHJldHVybiBbbGVhdmUsIGVudGVyXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbnRlckxlYXZlRXZlbnRQbHVnaW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0VudGVyTGVhdmVFdmVudFBsdWdpbi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yID0gcmVxdWlyZSgnLi9nZXRUZXh0Q29udGVudEFjY2Vzc29yJyk7XG5cbi8qKlxuICogVGhpcyBoZWxwZXIgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gcm9vdFxuICovXG5mdW5jdGlvbiBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUocm9vdCkge1xuICB0aGlzLl9yb290ID0gcm9vdDtcbiAgdGhpcy5fc3RhcnRUZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5cbl9hc3NpZ24oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLnByb3RvdHlwZSwge1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9mYWxsYmFja1RleHQgPSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB0ZXh0IG9mIGlucHV0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRUZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2YWx1ZScgaW4gdGhpcy5fcm9vdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb290W2dldFRleHRDb250ZW50QWNjZXNzb3IoKV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgZGlmZmVyaW5nIHN1YnN0cmluZyBiZXR3ZWVuIHRoZSBpbml0aWFsbHkgc3RvcmVkXG4gICAqIHRleHQgY29udGVudCBhbmQgdGhlIGN1cnJlbnQgY29udGVudC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RGF0YTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9mYWxsYmFja1RleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0O1xuICAgIHZhciBzdGFydFZhbHVlID0gdGhpcy5fc3RhcnRUZXh0O1xuICAgIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICAgIHZhciBlbmQ7XG4gICAgdmFyIGVuZFZhbHVlID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcbiAgICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcblxudmFyIE1VU1RfVVNFX1BST1BFUlRZID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZO1xudmFyIEhBU19CT09MRUFOX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFO1xudmFyIEhBU19OVU1FUklDX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFO1xudmFyIEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFO1xudmFyIEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTtcblxudmFyIEhUTUxET01Qcm9wZXJ0eUNvbmZpZyA9IHtcbiAgaXNDdXN0b21BdHRyaWJ1dGU6IFJlZ0V4cC5wcm90b3R5cGUudGVzdC5iaW5kKG5ldyBSZWdFeHAoJ14oZGF0YXxhcmlhKS1bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJykpLFxuICBQcm9wZXJ0aWVzOiB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgUHJvcGVydGllc1xuICAgICAqL1xuICAgIGFjY2VwdDogMCxcbiAgICBhY2NlcHRDaGFyc2V0OiAwLFxuICAgIGFjY2Vzc0tleTogMCxcbiAgICBhY3Rpb246IDAsXG4gICAgYWxsb3dGdWxsU2NyZWVuOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBhbGxvd1RyYW5zcGFyZW5jeTogMCxcbiAgICBhbHQ6IDAsXG4gICAgLy8gc3BlY2lmaWVzIHRhcmdldCBjb250ZXh0IGZvciBsaW5rcyB3aXRoIGBwcmVsb2FkYCB0eXBlXG4gICAgYXM6IDAsXG4gICAgYXN5bmM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGF1dG9Db21wbGV0ZTogMCxcbiAgICAvLyBhdXRvRm9jdXMgaXMgcG9seWZpbGxlZC9ub3JtYWxpemVkIGJ5IEF1dG9Gb2N1c1V0aWxzXG4gICAgLy8gYXV0b0ZvY3VzOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBhdXRvUGxheTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY2FwdHVyZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY2VsbFBhZGRpbmc6IDAsXG4gICAgY2VsbFNwYWNpbmc6IDAsXG4gICAgY2hhclNldDogMCxcbiAgICBjaGFsbGVuZ2U6IDAsXG4gICAgY2hlY2tlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjaXRlOiAwLFxuICAgIGNsYXNzSUQ6IDAsXG4gICAgY2xhc3NOYW1lOiAwLFxuICAgIGNvbHM6IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLFxuICAgIGNvbFNwYW46IDAsXG4gICAgY29udGVudDogMCxcbiAgICBjb250ZW50RWRpdGFibGU6IDAsXG4gICAgY29udGV4dE1lbnU6IDAsXG4gICAgY29udHJvbHM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNvb3JkczogMCxcbiAgICBjcm9zc09yaWdpbjogMCxcbiAgICBkYXRhOiAwLCAvLyBGb3IgYDxvYmplY3QgLz5gIGFjdHMgYXMgYHNyY2AuXG4gICAgZGF0ZVRpbWU6IDAsXG4gICAgJ2RlZmF1bHQnOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkZWZlcjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZGlyOiAwLFxuICAgIGRpc2FibGVkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkb3dubG9hZDogSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSxcbiAgICBkcmFnZ2FibGU6IDAsXG4gICAgZW5jVHlwZTogMCxcbiAgICBmb3JtOiAwLFxuICAgIGZvcm1BY3Rpb246IDAsXG4gICAgZm9ybUVuY1R5cGU6IDAsXG4gICAgZm9ybU1ldGhvZDogMCxcbiAgICBmb3JtTm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZm9ybVRhcmdldDogMCxcbiAgICBmcmFtZUJvcmRlcjogMCxcbiAgICBoZWFkZXJzOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBoaWRkZW46IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGhpZ2g6IDAsXG4gICAgaHJlZjogMCxcbiAgICBocmVmTGFuZzogMCxcbiAgICBodG1sRm9yOiAwLFxuICAgIGh0dHBFcXVpdjogMCxcbiAgICBpY29uOiAwLFxuICAgIGlkOiAwLFxuICAgIGlucHV0TW9kZTogMCxcbiAgICBpbnRlZ3JpdHk6IDAsXG4gICAgaXM6IDAsXG4gICAga2V5UGFyYW1zOiAwLFxuICAgIGtleVR5cGU6IDAsXG4gICAga2luZDogMCxcbiAgICBsYWJlbDogMCxcbiAgICBsYW5nOiAwLFxuICAgIGxpc3Q6IDAsXG4gICAgbG9vcDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbG93OiAwLFxuICAgIG1hbmlmZXN0OiAwLFxuICAgIG1hcmdpbkhlaWdodDogMCxcbiAgICBtYXJnaW5XaWR0aDogMCxcbiAgICBtYXg6IDAsXG4gICAgbWF4TGVuZ3RoOiAwLFxuICAgIG1lZGlhOiAwLFxuICAgIG1lZGlhR3JvdXA6IDAsXG4gICAgbWV0aG9kOiAwLFxuICAgIG1pbjogMCxcbiAgICBtaW5MZW5ndGg6IDAsXG4gICAgLy8gQ2F1dGlvbjsgYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbiAgICAvLyBkaXNhYmxlZCB3aXRoIGByZW1vdmVBdHRyaWJ1dGVgLlxuICAgIG11bHRpcGxlOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG11dGVkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG5hbWU6IDAsXG4gICAgbm9uY2U6IDAsXG4gICAgbm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgb3BlbjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgb3B0aW11bTogMCxcbiAgICBwYXR0ZXJuOiAwLFxuICAgIHBsYWNlaG9sZGVyOiAwLFxuICAgIHBsYXlzSW5saW5lOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBwb3N0ZXI6IDAsXG4gICAgcHJlbG9hZDogMCxcbiAgICBwcm9maWxlOiAwLFxuICAgIHJhZGlvR3JvdXA6IDAsXG4gICAgcmVhZE9ubHk6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHJlZmVycmVyUG9saWN5OiAwLFxuICAgIHJlbDogMCxcbiAgICByZXF1aXJlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcmV2ZXJzZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHJvbGU6IDAsXG4gICAgcm93czogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgcm93U3BhbjogSEFTX05VTUVSSUNfVkFMVUUsXG4gICAgc2FuZGJveDogMCxcbiAgICBzY29wZTogMCxcbiAgICBzY29wZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHNjcm9sbGluZzogMCxcbiAgICBzZWFtbGVzczogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2VsZWN0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2hhcGU6IDAsXG4gICAgc2l6ZTogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgc2l6ZXM6IDAsXG4gICAgc3BhbjogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgc3BlbGxDaGVjazogMCxcbiAgICBzcmM6IDAsXG4gICAgc3JjRG9jOiAwLFxuICAgIHNyY0xhbmc6IDAsXG4gICAgc3JjU2V0OiAwLFxuICAgIHN0YXJ0OiBIQVNfTlVNRVJJQ19WQUxVRSxcbiAgICBzdGVwOiAwLFxuICAgIHN0eWxlOiAwLFxuICAgIHN1bW1hcnk6IDAsXG4gICAgdGFiSW5kZXg6IDAsXG4gICAgdGFyZ2V0OiAwLFxuICAgIHRpdGxlOiAwLFxuICAgIC8vIFNldHRpbmcgLnR5cGUgdGhyb3dzIG9uIG5vbi08aW5wdXQ+IHRhZ3NcbiAgICB0eXBlOiAwLFxuICAgIHVzZU1hcDogMCxcbiAgICB2YWx1ZTogMCxcbiAgICB3aWR0aDogMCxcbiAgICB3bW9kZTogMCxcbiAgICB3cmFwOiAwLFxuXG4gICAgLyoqXG4gICAgICogUkRGYSBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgYWJvdXQ6IDAsXG4gICAgZGF0YXR5cGU6IDAsXG4gICAgaW5saXN0OiAwLFxuICAgIHByZWZpeDogMCxcbiAgICAvLyBwcm9wZXJ0eSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgT3BlbkdyYXBoIGluIG1ldGEgdGFncy5cbiAgICBwcm9wZXJ0eTogMCxcbiAgICByZXNvdXJjZTogMCxcbiAgICAndHlwZW9mJzogMCxcbiAgICB2b2NhYjogMCxcblxuICAgIC8qKlxuICAgICAqIE5vbi1zdGFuZGFyZCBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgLy8gYXV0b0NhcGl0YWxpemUgYW5kIGF1dG9Db3JyZWN0IGFyZSBzdXBwb3J0ZWQgaW4gTW9iaWxlIFNhZmFyaSBmb3JcbiAgICAvLyBrZXlib2FyZCBoaW50cy5cbiAgICBhdXRvQ2FwaXRhbGl6ZTogMCxcbiAgICBhdXRvQ29ycmVjdDogMCxcbiAgICAvLyBhdXRvU2F2ZSBhbGxvd3MgV2ViS2l0L0JsaW5rIHRvIHBlcnNpc3QgdmFsdWVzIG9mIGlucHV0IGZpZWxkcyBvbiBwYWdlIHJlbG9hZHNcbiAgICBhdXRvU2F2ZTogMCxcbiAgICAvLyBjb2xvciBpcyBmb3IgU2FmYXJpIG1hc2staWNvbiBsaW5rXG4gICAgY29sb3I6IDAsXG4gICAgLy8gaXRlbVByb3AsIGl0ZW1TY29wZSwgaXRlbVR5cGUgYXJlIGZvclxuICAgIC8vIE1pY3JvZGF0YSBzdXBwb3J0LiBTZWUgaHR0cDovL3NjaGVtYS5vcmcvZG9jcy9ncy5odG1sXG4gICAgaXRlbVByb3A6IDAsXG4gICAgaXRlbVNjb3BlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBpdGVtVHlwZTogMCxcbiAgICAvLyBpdGVtSUQgYW5kIGl0ZW1SZWYgYXJlIGZvciBNaWNyb2RhdGEgc3VwcG9ydCBhcyB3ZWxsIGJ1dFxuICAgIC8vIG9ubHkgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgc3BlYyBkb2N1bWVudC4gU2VlXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvbWljcm9kYXRhLmh0bWwjbWljcm9kYXRhLWRvbS1hcGlcbiAgICBpdGVtSUQ6IDAsXG4gICAgaXRlbVJlZjogMCxcbiAgICAvLyByZXN1bHRzIHNob3cgbG9va2luZyBnbGFzcyBpY29uIGFuZCByZWNlbnQgc2VhcmNoZXMgb24gaW5wdXRcbiAgICAvLyBzZWFyY2ggZmllbGRzIGluIFdlYktpdC9CbGlua1xuICAgIHJlc3VsdHM6IDAsXG4gICAgLy8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgc2VjdXJpdHkgcmVzdHJpY3Rpb25zIG9uIGFuIGlmcmFtZVxuICAgIC8vIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzYW5kYm94IGF0dHJpYnV0ZSBvbiBJRTwxMFxuICAgIHNlY3VyaXR5OiAwLFxuICAgIC8vIElFLW9ubHkgYXR0cmlidXRlIHRoYXQgY29udHJvbHMgZm9jdXMgYmVoYXZpb3JcbiAgICB1bnNlbGVjdGFibGU6IDBcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHtcbiAgICBhY2NlcHRDaGFyc2V0OiAnYWNjZXB0LWNoYXJzZXQnLFxuICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICBodG1sRm9yOiAnZm9yJyxcbiAgICBodHRwRXF1aXY6ICdodHRwLWVxdWl2J1xuICB9LFxuICBET01Qcm9wZXJ0eU5hbWVzOiB7fSxcbiAgRE9NTXV0YXRpb25NZXRob2RzOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChub2RlLCB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBOdW1iZXIgaW5wdXRzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBkdWUgdG8gc29tZSBlZGdlIGNhc2VzIGluXG4gICAgICAvLyBDaHJvbWUuIExldCBldmVyeXRoaW5nIGVsc2UgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgYXMgbm9ybWFsLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzI2lzc3VlY29tbWVudC0yMzYwNzQzMjZcbiAgICAgIGlmIChub2RlLnR5cGUgIT09ICdudW1iZXInIHx8IG5vZGUuaGFzQXR0cmlidXRlKCd2YWx1ZScpID09PSBmYWxzZSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnJyArIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS52YWxpZGl0eSAmJiAhbm9kZS52YWxpZGl0eS5iYWRJbnB1dCAmJiBub2RlLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gbm9kZSkge1xuICAgICAgICAvLyBEb24ndCBhc3NpZ24gYW4gYXR0cmlidXRlIGlmIHZhbGlkYXRpb24gcmVwb3J0cyBiYWRcbiAgICAgICAgLy8gaW5wdXQuIENocm9tZSB3aWxsIGNsZWFyIHRoZSB2YWx1ZS4gQWRkaXRpb25hbGx5LCBkb24ndFxuICAgICAgICAvLyBvcGVyYXRlIG9uIGlucHV0cyB0aGF0IGhhdmUgZm9jdXMsIG90aGVyd2lzZSBDaHJvbWUgbWlnaHRcbiAgICAgICAgLy8gc3RyaXAgb2ZmIHRyYWlsaW5nIGRlY2ltYWwgcGxhY2VzIGFuZCBjYXVzZSB0aGUgdXNlcidzXG4gICAgICAgIC8vIGN1cnNvciBwb3NpdGlvbiB0byBqdW1wIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiBSZWFjdERPTUlucHV0LCB3ZSBoYXZlIGFuIG9uQmx1ciBldmVudCB0aGF0IHdpbGwgdHJpZ2dlclxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIGFnYWluIHdoZW4gZm9jdXMgaXMgbG9zdC5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgJycgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhUTUxET01Qcm9wZXJ0eUNvbmZpZztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvSFRNTERPTVByb3BlcnR5Q29uZmlnLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG5cbnZhciBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxuZnVuY3Rpb24gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RhbmNlcywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKSB7XG4gIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLlxuICB2YXIga2V5VW5pcXVlID0gY2hpbGRJbnN0YW5jZXNbbmFtZV0gPT09IHVuZGVmaW5lZDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHtcbiAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuICAgIH1cbiAgICBpZiAoIWtleVVuaXF1ZSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtleXMgbXVzdCBiZSB1bmlxdWU7IHdoZW4gdHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcgKyAndGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNjYXBlKG5hbWUpLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGlmIChjaGlsZCAhPSBudWxsICYmIGtleVVuaXF1ZSkge1xuICAgIGNoaWxkSW5zdGFuY2VzW25hbWVdID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChjaGlsZCwgdHJ1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFjdENoaWxkUmVjb25jaWxlciBwcm92aWRlcyBoZWxwZXJzIGZvciBpbml0aWFsaXppbmcgb3IgdXBkYXRpbmcgYSBzZXQgb2ZcbiAqIGNoaWxkcmVuLiBJdHMgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIGl0IG9udG8gUmVhY3RNdWx0aUNoaWxkIHdoaWNoXG4gKiBkb2VzIGRpZmZlZCByZW9yZGVyaW5nIGFuZCBpbnNlcnRpb24uXG4gKi9cbnZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFwibW91bnQgaW1hZ2VcIiBmb3IgZWFjaCBvZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlXG4gICAqIG9mIGBSZWFjdERPTUNvbXBvbmVudGAsIGEgbW91bnQgaW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkTm9kZXMgTmVzdGVkIGNoaWxkIG1hcHMuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IEEgc2V0IG9mIGNoaWxkIGluc3RhbmNlcy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBpbnN0YW50aWF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKSAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290c1xuICB7XG4gICAgaWYgKG5lc3RlZENoaWxkTm9kZXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjaGlsZEluc3RhbmNlcyA9IHt9O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4obmVzdGVkQ2hpbGROb2RlcywgZnVuY3Rpb24gKGNoaWxkSW5zdHMsIGNoaWxkLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNoaWxkKGNoaWxkSW5zdHMsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCk7XG4gICAgICB9LCBjaGlsZEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4obmVzdGVkQ2hpbGROb2RlcywgaW5zdGFudGlhdGVDaGlsZCwgY2hpbGRJbnN0YW5jZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRJbnN0YW5jZXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHJlbmRlcmVkIGNoaWxkcmVuIGFuZCByZXR1cm5zIGEgbmV3IHNldCBvZiBjaGlsZHJlbi5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFsaXplZCBzZXQgb2YgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENoaWxkcmVuIEZsYXQgY2hpbGQgZWxlbWVudCBtYXBzLlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9IEEgbmV3IHNldCBvZiBjaGlsZCBpbnN0YW5jZXMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChwcmV2Q2hpbGRyZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCkgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAge1xuICAgIC8vIFdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgd2F5IHRvIHRyYWNrIG1vdmVzIGhlcmUgYnV0IGlmIHdlIHVzZSBpdGVyYXRvcnNcbiAgICAvLyBpbnN0ZWFkIG9mIGZvci4uaW4gd2UgY2FuIHppcCB0aGUgaXRlcmF0b3JzIGFuZCBjaGVjayBpZiBhbiBpdGVtIGhhc1xuICAgIC8vIG1vdmVkLlxuICAgIC8vIFRPRE86IElmIG5vdGhpbmcgaGFzIGNoYW5nZWQsIHJldHVybiB0aGUgcHJldkNoaWxkcmVuIG9iamVjdCBzbyB0aGF0IHdlXG4gICAgLy8gY2FuIHF1aWNrbHkgYmFpbG91dCBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkLlxuICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIHByZXZDaGlsZDtcbiAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Q2hpbGQgJiYgcHJldkNoaWxkLl9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBuZXh0RWxlbWVudCA9IG5leHRDaGlsZHJlbltuYW1lXTtcbiAgICAgIGlmIChwcmV2Q2hpbGQgIT0gbnVsbCAmJiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDaGlsZCwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gcHJldkNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgIHJlbW92ZWROb2Rlc1tuYW1lXSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpO1xuICAgICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLlxuICAgICAgICB2YXIgbmV4dENoaWxkSW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gbmV4dENoaWxkSW5zdGFuY2U7XG4gICAgICAgIC8vIENyZWF0aW5nIG1vdW50IGltYWdlIG5vdyBlbnN1cmVzIHJlZnMgYXJlIHJlc29sdmVkIGluIHJpZ2h0IG9yZGVyXG4gICAgICAgIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzEwMSBmb3IgZXhwbGFuYXRpb24pLlxuICAgICAgICB2YXIgbmV4dENoaWxkTW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChuZXh0Q2hpbGRJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgIG1vdW50SW1hZ2VzLnB1c2gobmV4dENoaWxkTW91bnRJbWFnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFVubW91bnQgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuXG4gICAgZm9yIChuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiAhKG5leHRDaGlsZHJlbiAmJiBuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpKSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgcmVtb3ZlZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYWxsIHJlbmRlcmVkIGNoaWxkcmVuLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGNsZWFuIHVwIGNoaWxkcmVuXG4gICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHJlbmRlcmVkQ2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFsaXplZCBzZXQgb2YgY2hpbGRyZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENoaWxkcmVuOiBmdW5jdGlvbiAocmVuZGVyZWRDaGlsZHJlbiwgc2FmZWx5KSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7XG4gICAgICBpZiAocmVuZGVyZWRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHJlbmRlcmVkQ2hpbGRyZW5bbmFtZV07XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHJlbmRlcmVkQ2hpbGQsIHNhZmVseSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q2hpbGRSZWNvbmNpbGVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdENoaWxkUmVjb25jaWxlci5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9SZWFjdERPTUlET3BlcmF0aW9ucycpO1xuXG4vKipcbiAqIEFic3RyYWN0cyBhd2F5IGFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWNvbmNpbGVyIHRoYXQgcmVxdWlyZXMga25vd2xlZGdlIG9mXG4gKiB0aGUgYnJvd3NlciBjb250ZXh0LiBUT0RPOiBUaGVzZSBjYWxsZXJzIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIGF2b2lkIHRoZVxuICogbmVlZCBmb3IgdGhpcyBpbmplY3Rpb24uXG4gKi9cbnZhciBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCA9IHtcbiAgcHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogUmVhY3RET01JRE9wZXJhdGlvbnMuZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLFxuXG4gIHJlcGxhY2VOb2RlV2l0aE1hcmt1cDogRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3ROb2RlVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0Tm9kZVR5cGVzJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG59XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIENvbXBvc2l0ZVR5cGVzID0ge1xuICBJbXB1cmVDbGFzczogMCxcbiAgUHVyZUNsYXNzOiAxLFxuICBTdGF0ZWxlc3NGdW5jdGlvbmFsOiAyXG59O1xuXG5mdW5jdGlvbiBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KSB7fVxuU3RhdGVsZXNzQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBDb21wb25lbnQgPSBSZWFjdEluc3RhbmNlTWFwLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgdmFyIGVsZW1lbnQgPSBDb21wb25lbnQodGhpcy5wcm9wcywgdGhpcy5jb250ZXh0LCB0aGlzLnVwZGF0ZXIpO1xuICB3YXJuSWZJbnZhbGlkRWxlbWVudChDb21wb25lbnQsIGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmZ1bmN0aW9uIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCksICclcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSAnICsgJ3JldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsICclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uYWwgY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICByZXR1cm4gISEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KSB7XG4gIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpO1xufVxuXG4vLyBTZXBhcmF0ZWQgaW50byBhIGZ1bmN0aW9uIHRvIGNvbnRhaW4gZGVvcHRpbWl6YXRpb25zIGNhdXNlZCBieSB0cnkvZmluYWxseS5cbmZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZuLCBkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGRlYnVnSUQgPT09IDApIHtcbiAgICAvLyBUb3AtbGV2ZWwgd3JhcHBlcnMgKHNlZSBSZWFjdE1vdW50KSBhbmQgZW1wdHkgY29tcG9uZW50cyAoc2VlXG4gICAgLy8gUmVhY3RET01FbXB0eUNvbXBvbmVudCkgYXJlIGludmlzaWJsZSB0byBob29rcyBhbmQgZGV2dG9vbHMuXG4gICAgLy8gQm90aCBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IHNob3VsZCBnbyBhd2F5IGluIHRoZSBmdXR1cmUuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLSBUaGUgTGlmZS1DeWNsZSBvZiBhIENvbXBvc2l0ZSBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogLSBjb25zdHJ1Y3RvcjogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGUuIFRoZSBpbnN0YW5jZSBpcyBub3cgcmV0YWluZWQuXG4gKiAgIC0gY29tcG9uZW50V2lsbE1vdW50XG4gKiAgIC0gcmVuZGVyXG4gKiAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzXVxuICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXJdXG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnREaWRNb3VudF1cbiAqICAgICAtIGNvbXBvbmVudERpZE1vdW50XG4gKlxuICogICAgICAgVXBkYXRlIFBoYXNlczpcbiAqICAgICAgIC0gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAob25seSBjYWxsZWQgaWYgcGFyZW50IHVwZGF0ZWQpXG4gKiAgICAgICAtIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuICogICAgICAgICAtIGNvbXBvbmVudFdpbGxVcGRhdGVcbiAqICAgICAgICAgICAtIHJlbmRlclxuICogICAgICAgICAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzIG9yIHJlY2VpdmUgcHJvcHMgcGhhc2VzXVxuICogICAgICAgICAtIGNvbXBvbmVudERpZFVwZGF0ZVxuICpcbiAqICAgICAtIGNvbXBvbmVudFdpbGxVbm1vdW50XG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsVW5tb3VudF1cbiAqICAgLSBbY2hpbGRyZW4gZGVzdHJveWVkXVxuICogLSAoZGVzdHJveWVkKTogVGhlIGluc3RhbmNlIGlzIG5vdyBibGFuaywgcmVsZWFzZWQgYnkgUmVhY3QgYW5kIHJlYWR5IGZvciBHQy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQW4gaW5jcmVtZW50aW5nIElEIGFzc2lnbmVkIHRvIGVhY2ggY29tcG9uZW50IHdoZW4gaXQgaXMgbW91bnRlZC4gVGhpcyBpc1xuICogdXNlZCB0byBlbmZvcmNlIHRoZSBvcmRlciBpbiB3aGljaCBgUmVhY3RVcGRhdGVzYCB1cGRhdGVzIGRpcnR5IGNvbXBvbmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIG5leHRNb3VudElEID0gMTtcblxuLyoqXG4gKiBAbGVuZHMge1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LnByb3RvdHlwZX1cbiAqL1xudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0ge1xuICAvKipcbiAgICogQmFzZSBjb25zdHJ1Y3RvciBmb3IgYWxsIGNvbXBvc2l0ZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IG51bGw7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcblxuICAgIC8vIFNlZSBSZWFjdFVwZGF0ZVF1ZXVlXG4gICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG51bGw7XG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuX21vdW50T3JkZXIgPSAwO1xuICAgIHRoaXMuX3RvcExldmVsV3JhcHBlciA9IG51bGw7XG5cbiAgICAvLyBTZWUgUmVhY3RVcGRhdGVzIGFuZCBSZWFjdFVwZGF0ZVF1ZXVlLlxuICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuXG4gICAgLy8gQ29tcG9uZW50V2lsbFVubW91bnQgc2hhbGwgb25seSBiZSBjYWxsZWQgb25jZVxuICAgIHRoaXMuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBhcmVudFxuICAgKiBAcGFyYW0gez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9tb3VudE9yZGVyID0gbmV4dE1vdW50SUQrKztcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIHB1YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTtcblxuICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gdHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHB1YmxpYyBjbGFzc1xuICAgIHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpO1xuICAgIHZhciBpbnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICAgIGlmICghZG9Db25zdHJ1Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBudWxsKSkge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdDtcbiAgICAgIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgcmVuZGVyZWRFbGVtZW50KTtcbiAgICAgICEoaW5zdCA9PT0gbnVsbCB8fCBpbnN0ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJheSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA1JywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIGluc3QgPSBuZXcgU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCk7XG4gICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xhc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuSW1wdXJlQ2xhc3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBsYXRlciBpbiBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50LCBidXQgYWRkIGFuIGVhcmx5XG4gICAgICAvLyB3YXJuaW5nIG5vdyB0byBoZWxwIGRlYnVnZ2luZ1xuICAgICAgaWYgKGluc3QucmVuZGVyID09IG51bGwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcHNNdXRhdGVkID0gaW5zdC5wcm9wcyAhPT0gcHVibGljUHJvcHM7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdC5wcm9wcyA9PT0gdW5kZWZpbmVkIHx8ICFwcm9wc011dGF0ZWQsICclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgXCJ1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBhcyBhIGNvbnZlbmllbmNlIGZvclxuICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICBpbnN0LnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgaW5zdC5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICBpbnN0LnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgICBpbnN0LnVwZGF0ZXIgPSB1cGRhdGVRdWV1ZTtcblxuICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdDtcblxuICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIGJhY2sgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5zZXQoaW5zdCwgdGhpcyk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gU2luY2UgcGxhaW4gSlMgY2xhc3NlcyBhcmUgZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWFsIGluaXRpYWxpemF0aW9uXG4gICAgICAvLyBsb2dpYywgd2UgY2FuIG5vdCBjYXRjaCBjb21tb24gZXJyb3JzIGVhcmx5LiBUaGVyZWZvcmUsIHdlIGhhdmUgdG9cbiAgICAgIC8vIGNhdGNoIHRoZW0gaGVyZSwgYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgaW5zdGVhZC5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldEluaXRpYWxTdGF0ZSB8fCBpbnN0LmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCB8fCBpbnN0LnN0YXRlLCAnZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0RGVmYXVsdFByb3BzIHx8IGluc3QuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkLCAnZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5zdC5wcm9wVHlwZXMsICdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmNvbnRleHRUeXBlcywgJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgJyArICdzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50U2hvdWxkVXBkYXRlICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdC5jb21wb25lbnREaWRVbm1vdW50ICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCB0aGlzLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsU3RhdGUgPSBpbnN0LnN0YXRlO1xuICAgIGlmIChpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5zdC5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdmFyIG1hcmt1cDtcbiAgICBpZiAoaW5zdC51bnN0YWJsZV9oYW5kbGVFcnJvcikge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmcocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChpbnN0LmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0sIF90aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkTW91bnQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkTW91bnQsIGluc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgX2NvbnN0cnVjdENvbXBvbmVudDogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgfVxuICB9LFxuXG4gIF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6IGZ1bmN0aW9uIChkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZG9Db25zdHJ1Y3QpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2N0b3InKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBjYW4gc3RpbGwgYmUgYW4gaW5zdGFuY2UgaW4gY2FzZSBvZiBmYWN0b3J5IGNvbXBvbmVudHNcbiAgICAvLyBidXQgd2UnbGwgY291bnQgdGhpcyBhcyB0aW1lIHNwZW50IHJlbmRlcmluZyBhcyB0aGUgbW9yZSBjb21tb24gY2FzZS5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3JlbmRlcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgfVxuICB9LFxuXG4gIHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIG1hcmt1cDtcbiAgICB2YXIgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTtcbiAgICB0cnkge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBSb2xsIGJhY2sgdG8gY2hlY2twb2ludCwgaGFuZGxlIGVycm9yICh3aGljaCBtYXkgYWRkIGl0ZW1zIHRvIHRoZSB0cmFuc2FjdGlvbiksIGFuZCB0YWtlIGEgbmV3IGNoZWNrcG9pbnRcbiAgICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpO1xuICAgICAgdGhpcy5faW5zdGFuY2UudW5zdGFibGVfaGFuZGxlRXJyb3IoZSk7XG4gICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHtcbiAgICAgICAgdGhpcy5faW5zdGFuY2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNlLnByb3BzLCB0aGlzLl9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGNoZWNrcG9pbnQgPSB0cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7XG4gICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjayhjaGVja3BvaW50KTtcblxuICAgICAgLy8gVHJ5IGFnYWluIC0gd2UndmUgaW5mb3JtZWQgdGhlIGNvbXBvbmVudCBhYm91dCB0aGUgZXJyb3IsIHNvIHRoZXkgY2FuIHJlbmRlciBhbiBlcnJvciBtZXNzYWdlIHRoaXMgdGltZS5cbiAgICAgIC8vIElmIHRoaXMgdGhyb3dzIGFnYWluLCB0aGUgZXJyb3Igd2lsbCBidWJibGUgdXAgKGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGEgaGlnaGVyIGVycm9yIGJvdW5kYXJ5KS5cbiAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgcGVyZm9ybUluaXRpYWxNb3VudDogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIHZhciBkZWJ1Z0lEID0gMDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgIH0sIGRlYnVnSUQsICdjb21wb25lbnRXaWxsTW91bnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIG1vdW50aW5nLCBjYWxscyB0byBgc2V0U3RhdGVgIGJ5IGBjb21wb25lbnRXaWxsTW91bnRgIHdpbGwgc2V0XG4gICAgICAvLyBgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWVgIHdpdGhvdXQgdHJpZ2dlcmluZyBhIHJlLXJlbmRlci5cbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkge1xuICAgICAgICBpbnN0LnN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShpbnN0LnByb3BzLCBpbnN0LmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vdCBhIHN0YXRlbGVzcyBjb21wb25lbnQsIHdlIG5vdyByZW5kZXJcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHZhciBub2RlVHlwZSA9IFJlYWN0Tm9kZVR5cGVzLmdldFR5cGUocmVuZGVyZWRFbGVtZW50KTtcbiAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbm9kZVR5cGU7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChyZW5kZXJlZEVsZW1lbnQsIG5vZGVUeXBlICE9PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSAvKiBzaG91bGRIYXZlRGVidWdJRCAqL1xuICAgICk7XG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBjaGlsZDtcblxuICAgIHZhciBtYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgZGVidWdJRCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgICAgdmFyIGNoaWxkRGVidWdJRHMgPSBjaGlsZC5fZGVidWdJRCAhPT0gMCA/IFtjaGlsZC5fZGVidWdJRF0gOiBbXTtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLlxuICAgKlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5KSB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCAmJiAhaW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQpIHtcbiAgICAgIGluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKHNhZmVseSkge1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpICsgJy5jb21wb25lbnRXaWxsVW5tb3VudCgpJztcbiAgICAgICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQoaW5zdCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsVW5tb3VudCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsIHNhZmVseSk7XG4gICAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBwZW5kaW5nIGZpZWxkc1xuICAgIC8vIEV2ZW4gaWYgdGhpcyBjb21wb25lbnQgaXMgc2NoZWR1bGVkIGZvciBhbm90aGVyIHVwZGF0ZSBpbiBSZWFjdFVwZGF0ZXMsXG4gICAgLy8gaXQgd291bGQgc3RpbGwgYmUgaWdub3JlZCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzZXQuXG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBUaGVzZSBmaWVsZHMgZG8gbm90IHJlYWxseSBuZWVkIHRvIGJlIHJlc2V0IHNpbmNlIHRoaXMgb2JqZWN0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIGFjY2Vzc2libGUuXG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fdG9wTGV2ZWxXcmFwcGVyID0gbnVsbDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIHRvIHRoaXMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb25cbiAgICAvLyB3aGljaCBhbGxvdyB0aGUgaW50ZXJuYWxzIHRvIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgZXZlbiBpZiB0aGUgdXNlclxuICAgIC8vIGxlYWtzIGEgcmVmZXJlbmNlIHRvIHRoZSBwdWJsaWMgaW5zdGFuY2UuXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5yZW1vdmUoaW5zdCk7XG5cbiAgICAvLyBTb21lIGV4aXN0aW5nIGNvbXBvbmVudHMgcmVseSBvbiBpbnN0LnByb3BzIGV2ZW4gYWZ0ZXIgdGhleSd2ZSBiZWVuXG4gICAgLy8gZGVzdHJveWVkIChpbiBldmVudCBoYW5kbGVycykuXG4gICAgLy8gVE9ETzogaW5zdC5wcm9wcyA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5zdGF0ZSA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5jb250ZXh0ID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogRmlsdGVycyB0aGUgY29udGV4dCBvYmplY3QgdG8gb25seSBjb250YWluIGtleXMgc3BlY2lmaWVkIGluXG4gICAqIGBjb250ZXh0VHlwZXNgXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFza0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IENvbXBvbmVudC5jb250ZXh0VHlwZXM7XG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eU9iamVjdDtcbiAgICB9XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB7fTtcbiAgICBmb3IgKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIG1hc2tlZENvbnRleHRbY29udGV4dE5hbWVdID0gY29udGV4dFtjb250ZXh0TmFtZV07XG4gICAgfVxuICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICogYGNvbnRleHRUeXBlc2AsIGFuZCBhc3NlcnRzIHRoYXQgdGhleSBhcmUgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB0aGlzLl9tYXNrQ29udGV4dChjb250ZXh0KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICBpZiAoQ29tcG9uZW50LmNvbnRleHRUeXBlcykge1xuICAgICAgICB0aGlzLl9jaGVja0NvbnRleHRUeXBlcyhDb21wb25lbnQuY29udGV4dFR5cGVzLCBtYXNrZWRDb250ZXh0LCAnY29udGV4dCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFza2VkQ29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb250ZXh0XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoY3VycmVudENvbnRleHQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciBjaGlsZENvbnRleHQ7XG5cbiAgICBpZiAoaW5zdC5nZXRDaGlsZENvbnRleHQpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZENvbnRleHQgPSBpbnN0LmdldENoaWxkQ29udGV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZENvbnRleHQpIHtcbiAgICAgICEodHlwZW9mIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gdXNlIGdldENoaWxkQ29udGV4dCgpLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwNycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tDb250ZXh0VHlwZXMoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0Jyk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgICAhKG5hbWUgaW4gQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKToga2V5IFwiJXNcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDgnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfYXNzaWduKHt9LCBjdXJyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBBc3NlcnQgdGhhdCB0aGUgY29udGV4dCB0eXBlcyBhcmUgdmFsaWRcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgY29udGV4dCBmaWVsZCB0byBhIFJlYWN0UHJvcFR5cGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0NvbnRleHRUeXBlczogZnVuY3Rpb24gKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCB0aGlzLmdldE5hbWUoKSwgbnVsbCwgdGhpcy5fZGVidWdJRCk7XG4gICAgfVxuICB9LFxuXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIG5leHRDb250ZXh0KSB7XG4gICAgdmFyIHByZXZFbGVtZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQ7XG4gICAgdmFyIHByZXZDb250ZXh0ID0gdGhpcy5fY29udGV4dDtcblxuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLCBwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGFueSBvZiBgX3BlbmRpbmdFbGVtZW50YCwgYF9wZW5kaW5nU3RhdGVRdWV1ZWAsIG9yIGBfcGVuZGluZ0ZvcmNlVXBkYXRlYFxuICAgKiBpcyBzZXQsIHVwZGF0ZSB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcywgdGhpcy5fcGVuZGluZ0VsZW1lbnQsIHRyYW5zYWN0aW9uLCB0aGlzLl9jb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlICE9PSBudWxsIHx8IHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jdXJyZW50RWxlbWVudCwgdGhpcy5fY29udGV4dCwgdGhpcy5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYW4gdXBkYXRlIHRvIGEgbW91bnRlZCBjb21wb25lbnQuIFRoZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGFuZFxuICAgKiBzaG91bGRDb21wb25lbnRVcGRhdGUgbWV0aG9kcyBhcmUgY2FsbGVkLCB0aGVuIChhc3N1bWluZyB0aGUgdXBkYXRlIGlzbid0XG4gICAqIHNraXBwZWQpIHRoZSByZW1haW5pbmcgdXBkYXRlIGxpZmVjeWNsZSBtZXRob2RzIGFyZSBjYWxsZWQgYW5kIHRoZSBET01cbiAgICogcmVwcmVzZW50YXRpb24gaXMgdXBkYXRlZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1lbnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uXG4gICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2UGFyZW50RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dFBhcmVudEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZQYXJlbnRFbGVtZW50LCBuZXh0UGFyZW50RWxlbWVudCwgcHJldlVubWFza2VkQ29udGV4dCwgbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgIShpbnN0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0F0dGVtcHRlZCB0byB1cGRhdGUgY29tcG9uZW50IGAlc2AgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3IgZmFpbGVkIHRvIG1vdW50KS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMzYnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHZhciB3aWxsUmVjZWl2ZSA9IGZhbHNlO1xuICAgIHZhciBuZXh0Q29udGV4dDtcblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgY29udGV4dCBoYXMgY2hhbmdlZCBvciBub3RcbiAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgICAgbmV4dENvbnRleHQgPSBpbnN0LmNvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gdGhpcy5fcHJvY2Vzc0NvbnRleHQobmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByZXZQcm9wcyA9IHByZXZQYXJlbnRFbGVtZW50LnByb3BzO1xuICAgIHZhciBuZXh0UHJvcHMgPSBuZXh0UGFyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIE5vdCBhIHNpbXBsZSBzdGF0ZSB1cGRhdGUgYnV0IGEgcHJvcHMgdXBkYXRlXG4gICAgaWYgKHByZXZQYXJlbnRFbGVtZW50ICE9PSBuZXh0UGFyZW50RWxlbWVudCkge1xuICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFuIHVwZGF0ZSBoZXJlIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIGJ1dCBpbW1lZGlhdGVseSBzZXRcbiAgICAvLyBfcGVuZGluZ1N0YXRlUXVldWUgd2hpY2ggd2lsbCBlbnN1cmUgdGhhdCBhbnkgc3RhdGUgdXBkYXRlcyBnZXRzXG4gICAgLy8gaW1tZWRpYXRlbHkgcmVjb25jaWxlZCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGJhdGNoLlxuICAgIGlmICh3aWxsUmVjZWl2ZSAmJiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0U3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHtcbiAgICAgIGlmIChpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdzaG91bGRDb21wb25lbnRVcGRhdGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9zaXRlVHlwZSA9PT0gQ29tcG9zaXRlVHlwZXMuUHVyZUNsYXNzKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gIXNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChpbnN0LnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkLCAnJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsO1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgLy8gV2lsbCBzZXQgYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgLlxuICAgICAgdGhpcy5fcGVyZm9ybUNvbXBvbmVudFVwZGF0ZShuZXh0UGFyZW50RWxlbWVudCwgbmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlvbiwgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGl0J3MgZGV0ZXJtaW5lZCB0aGF0IGEgY29tcG9uZW50IHNob3VsZCBub3QgdXBkYXRlLCB3ZSBzdGlsbCB3YW50XG4gICAgICAvLyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLlxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0UGFyZW50RWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0O1xuICAgICAgaW5zdC5wcm9wcyA9IG5leHRQcm9wcztcbiAgICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICBpbnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICB9XG4gIH0sXG5cbiAgX3Byb2Nlc3NQZW5kaW5nU3RhdGU6IGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7XG4gICAgdmFyIHJlcGxhY2UgPSB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICByZXR1cm4gaW5zdC5zdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAocmVwbGFjZSAmJiBxdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBxdWV1ZVswXTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFN0YXRlID0gX2Fzc2lnbih7fSwgcmVwbGFjZSA/IHF1ZXVlWzBdIDogaW5zdC5zdGF0ZSk7XG4gICAgZm9yICh2YXIgaSA9IHJlcGxhY2UgPyAxIDogMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydGlhbCA9IHF1ZXVlW2ldO1xuICAgICAgX2Fzc2lnbihuZXh0U3RhdGUsIHR5cGVvZiBwYXJ0aWFsID09PSAnZnVuY3Rpb24nID8gcGFydGlhbC5jYWxsKGluc3QsIG5leHRTdGF0ZSwgcHJvcHMsIGNvbnRleHQpIDogcGFydGlhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfSxcblxuICAvKipcbiAgICogTWVyZ2VzIG5ldyBwcm9wcyBhbmQgc3RhdGUsIG5vdGlmaWVzIGRlbGVnYXRlIG1ldGhvZHMgb2YgdXBkYXRlIGFuZFxuICAgKiBwZXJmb3JtcyB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBOZXh0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wcyBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlIE5leHQgb2JqZWN0IHRvIHNldCBhcyBzdGF0ZS5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dCBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSB1bm1hc2tlZENvbnRleHRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJhbnNhY3Rpb24sIHVubWFza2VkQ29udGV4dCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIHZhciBoYXNDb21wb25lbnREaWRVcGRhdGUgPSBCb29sZWFuKGluc3QuY29tcG9uZW50RGlkVXBkYXRlKTtcbiAgICB2YXIgcHJldlByb3BzO1xuICAgIHZhciBwcmV2U3RhdGU7XG4gICAgdmFyIHByZXZDb250ZXh0O1xuICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgIHByZXZQcm9wcyA9IGluc3QucHJvcHM7XG4gICAgICBwcmV2U3RhdGUgPSBpbnN0LnN0YXRlO1xuICAgICAgcHJldkNvbnRleHQgPSBpbnN0LmNvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVcGRhdGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy5fY29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0LnByb3BzID0gbmV4dFByb3BzO1xuICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgaW5zdC5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG5cbiAgICB0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudCh0cmFuc2FjdGlvbiwgdW5tYXNrZWRDb250ZXh0KTtcblxuICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQoaW5zdCwgcHJldlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KSwgX3RoaXMyLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkVXBkYXRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIGluc3QpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ2FsbCB0aGUgY29tcG9uZW50J3MgYHJlbmRlcmAgbWV0aG9kIGFuZCB1cGRhdGUgdGhlIERPTSBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZXZDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgIHZhciBwcmV2UmVuZGVyZWRFbGVtZW50ID0gcHJldkNvbXBvbmVudEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgbmV4dFJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuXG4gICAgdmFyIGRlYnVnSUQgPSAwO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldlJlbmRlcmVkRWxlbWVudCwgbmV4dFJlbmRlcmVkRWxlbWVudCkpIHtcbiAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgbmV4dFJlbmRlcmVkRWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb2xkSG9zdE5vZGUgPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgZmFsc2UpO1xuXG4gICAgICB2YXIgbm9kZVR5cGUgPSBSZWFjdE5vZGVUeXBlcy5nZXRUeXBlKG5leHRSZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlO1xuICAgICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0UmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVnSUQgKi9cbiAgICAgICk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkO1xuXG4gICAgICB2YXIgbmV4dE1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24sIHRoaXMuX2hvc3RQYXJlbnQsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgICAgICB2YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lEXSA6IFtdO1xuICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkNvbXBvbmVudEluc3RhbmNlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRkZW4gaW4gc2hhbGxvdyByZW5kZXJpbmcuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKSB7XG4gICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9zdE5vZGUsIG5leHRNYXJrdXAsIHByZXZJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zdC5yZW5kZXIoKTtcbiAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdyZW5kZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdC5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQgJiYgaW5zdC5yZW5kZXIuX2lzTW9ja0Z1bmN0aW9uKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kXG4gICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkRWxlbWVudDtcbiAgfSxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVuZGVyZWRFbGVtZW50O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nIHx8IHRoaXMuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgfVxuICAgICEoXG4gICAgLy8gVE9ETzogQW4gYGlzVmFsaWROb2RlYCBmdW5jdGlvbiB3b3VsZCBwcm9iYWJseSBiZSBtb3JlIGFwcHJvcHJpYXRlXG4gICAgcmVuZGVyZWRFbGVtZW50ID09PSBudWxsIHx8IHJlbmRlcmVkRWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQocmVuZGVyZWRFbGVtZW50KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMucmVuZGVyKCk6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDknLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHJldHVybiByZW5kZXJlZEVsZW1lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExhemlseSBhbGxvY2F0ZXMgdGhlIHJlZnMgb2JqZWN0IGFuZCBzdG9yZXMgYGNvbXBvbmVudGAgYXMgYHJlZmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7Y29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHN0b3JlIGFzIGByZWZgLlxuICAgKiBAZmluYWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGF0dGFjaFJlZjogZnVuY3Rpb24gKHJlZiwgY29tcG9uZW50KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgIShpbnN0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHJlZnMuJykgOiBfcHJvZEludmFyaWFudCgnMTEwJykgOiB2b2lkIDA7XG4gICAgdmFyIHB1YmxpY0NvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gY29tcG9uZW50ICYmIGNvbXBvbmVudC5nZXROYW1lID8gY29tcG9uZW50LmdldE5hbWUoKSA6ICdhIGNvbXBvbmVudCc7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwdWJsaWNDb21wb25lbnRJbnN0YW5jZSAhPSBudWxsIHx8IGNvbXBvbmVudC5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzICcgKyAnKFNlZSByZWYgXCIlc1wiIGluICVzIGNyZWF0ZWQgYnkgJXMpLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuJywgcmVmLCBjb21wb25lbnROYW1lLCB0aGlzLmdldE5hbWUoKSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIHZhciByZWZzID0gaW5zdC5yZWZzID09PSBlbXB0eU9iamVjdCA/IGluc3QucmVmcyA9IHt9IDogaW5zdC5yZWZzO1xuICAgIHJlZnNbcmVmXSA9IHB1YmxpY0NvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRhY2hlcyBhIHJlZmVyZW5jZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgdG8gZGVyZWZlcmVuY2UuXG4gICAqIEBmaW5hbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGV0YWNoUmVmOiBmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIHJlZnMgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBpdFxuICAgKiBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvciBudWxsLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldE5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLm5hbWUgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcG9uZW50IC0gaS5lLiB3aGF0XG4gICAqIGlzIGV4cG9zZWQgYnkgcmVmcyBhbmQgcmV0dXJuZWQgYnkgcmVuZGVyLiBDYW4gYmUgbnVsbCBmb3Igc3RhdGVsZXNzXG4gICAqIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSB0aGUgcHVibGljIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgaWYgKHRoaXMuX2NvbXBvc2l0ZVR5cGUgPT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdDtcbiAgfSxcblxuICAvLyBTdHViXG4gIF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvc2l0ZUNvbXBvbmVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJbmplY3Rpb24nKTtcbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5vZGUnKTtcbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlcXVpcmUoJy4vcmVuZGVyU3VidHJlZUludG9Db250YWluZXInKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5SZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7XG5cbnZhciBSZWFjdERPTSA9IHtcbiAgZmluZERPTU5vZGU6IGZpbmRET01Ob2RlLFxuICByZW5kZXI6IFJlYWN0TW91bnQucmVuZGVyLFxuICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbiAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyxcbiAgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG4gIC8qIGVzbGludC1lbmFibGUgY2FtZWxjYXNlICovXG59O1xuXG4vLyBJbmplY3QgdGhlIHJ1bnRpbWUgaW50byBhIGRldnRvb2xzIGdsb2JhbCBob29rIHJlZ2FyZGxlc3Mgb2YgYnJvd3Nlci5cbi8vIEFsbG93cyBmb3IgZGVidWdnaW5nIHdoZW4gdGhlIGhvb2sgaXMgaW5qZWN0ZWQgb24gdGhlIHBhZ2UuXG5pZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7XG4gICAgQ29tcG9uZW50VHJlZToge1xuICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0ZSlcbiAgICAgICAgaWYgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNb3VudDogUmVhY3RNb3VudCxcbiAgICBSZWNvbmNpbGVyOiBSZWFjdFJlY29uY2lsZXJcbiAgfSk7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG4gIGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBGaXJzdCBjaGVjayBpZiBkZXZ0b29scyBpcyBub3QgaW5zdGFsbGVkXG4gICAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCBoYXZlIHRoZSBpc3N1ZSB3aXRoIGRldnRvb2xzIGxvYWRlZCBvdmVyIGZpbGU6Ly9cbiAgICAgICAgdmFyIHNob3dGaWxlVXJsTWVzc2FnZSA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKCdodHRwJykgPT09IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID09PSAtMTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAoc2hvd0ZpbGVVcmxNZXNzYWdlID8gJ2FuZCB1c2UgYW4gSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgYSBmaWxlOiBVUkwpICcgOiAnJykgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0ZXN0RnVuYyA9IGZ1bmN0aW9uIHRlc3RGbigpIHt9O1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCh0ZXN0RnVuYy5uYW1lIHx8IHRlc3RGdW5jLnRvU3RyaW5nKCkpLmluZGV4T2YoJ3Rlc3RGbicpICE9PSAtMSwgXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBhIG1pbmlmaWVkIGNvcHkgb2YgdGhlIGRldmVsb3BtZW50IGJ1aWxkIFwiICsgJ29mIFJlYWN0LiBXaGVuIGRlcGxveWluZyBSZWFjdCBhcHBzIHRvIHByb2R1Y3Rpb24sIG1ha2Ugc3VyZSB0byB1c2UgJyArICd0aGUgcHJvZHVjdGlvbiBidWlsZCB3aGljaCBza2lwcyBkZXZlbG9wbWVudCB3YXJuaW5ncyBhbmQgaXMgZmFzdGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LW1pbmlmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAwO1xuXG4gICAgLy8gSWYgd2UncmUgaW4gSUU4LCBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgcHJvdmlkZVxuICAgIC8vIGluZm9ybWF0aW9uIG9uIHByZXZlbnRpbmcgY29tcGF0aWJpbGl0eSBtb2RlXG4gICAgdmFyIGllQ29tcGF0aWJpbGl0eU1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgODtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpZUNvbXBhdGliaWxpdHlNb2RlLCAnSW50ZXJuZXQgRXhwbG9yZXIgaXMgcnVubmluZyBpbiBjb21wYXRpYmlsaXR5IG1vZGU7IHBsZWFzZSBhZGQgdGhlICcgKyAnZm9sbG93aW5nIHRhZyB0byB5b3VyIEhUTUwgdG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nOiAnICsgJzxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiSUU9ZWRnZVwiIC8+JykgOiB2b2lkIDA7XG5cbiAgICB2YXIgZXhwZWN0ZWRGZWF0dXJlcyA9IFtcbiAgICAvLyBzaGltc1xuICAgIEFycmF5LmlzQXJyYXksIEFycmF5LnByb3RvdHlwZS5ldmVyeSwgQXJyYXkucHJvdG90eXBlLmZvckVhY2gsIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLCBBcnJheS5wcm90b3R5cGUubWFwLCBEYXRlLm5vdywgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIE9iamVjdC5rZXlzLCBTdHJpbmcucHJvdG90eXBlLnRyaW1dO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWV4cGVjdGVkRmVhdHVyZXNbaV0pIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmUgb3IgbW9yZSBFUzUgc2hpbXMgZXhwZWN0ZWQgYnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLXBvbHlmaWxscycpIDogdm9pZCAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuICB2YXIgUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rID0gcmVxdWlyZSgnLi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2snKTtcbiAgdmFyIFJlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rJyk7XG4gIHZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01JbnZhbGlkQVJJQUhvb2snKTtcblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTUludmFsaWRBUklBSG9vayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbCBoYXNPd25Qcm9wZXJ0eTp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQXV0b0ZvY3VzVXRpbHMgPSByZXF1aXJlKCcuL0F1dG9Gb2N1c1V0aWxzJyk7XG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudEZsYWdzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERPTUlucHV0ID0gcmVxdWlyZSgnLi9SZWFjdERPTUlucHV0Jyk7XG52YXIgUmVhY3RET01PcHRpb24gPSByZXF1aXJlKCcuL1JlYWN0RE9NT3B0aW9uJyk7XG52YXIgUmVhY3RET01TZWxlY3QgPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0Jyk7XG52YXIgUmVhY3RET01UZXh0YXJlYSA9IHJlcXVpcmUoJy4vUmVhY3RET01UZXh0YXJlYScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0TXVsdGlDaGlsZCA9IHJlcXVpcmUoJy4vUmVhY3RNdWx0aUNoaWxkJyk7XG52YXIgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcbnZhciBzaGFsbG93RXF1YWwgPSByZXF1aXJlKCdmYmpzL2xpYi9zaGFsbG93RXF1YWwnKTtcbnZhciBpbnB1dFZhbHVlVHJhY2tpbmcgPSByZXF1aXJlKCcuL2lucHV0VmFsdWVUcmFja2luZycpO1xudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIEZsYWdzID0gUmVhY3RET01Db21wb25lbnRGbGFncztcbnZhciBkZWxldGVMaXN0ZW5lciA9IEV2ZW50UGx1Z2luSHViLmRlbGV0ZUxpc3RlbmVyO1xudmFyIGdldE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZTtcbnZhciBsaXN0ZW5UbyA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5saXN0ZW5UbztcbnZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxlcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7XG5cbi8vIEZvciBxdWlja2x5IG1hdGNoaW5nIGNoaWxkcmVuIHR5cGUsIHRvIHRlc3QgaWYgY2FuIGJlIHRyZWF0ZWQgYXMgY29udGVudC5cbnZhciBDT05URU5UX1RZUEVTID0geyBzdHJpbmc6IHRydWUsIG51bWJlcjogdHJ1ZSB9O1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAgY2hpbGRyZW46IG51bGwsXG4gIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiBudWxsLFxuICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IG51bGxcbn07XG5cbi8vIE5vZGUgdHlwZSBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpLlxudmFyIERPQ19GUkFHTUVOVF9UWVBFID0gMTE7XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3RhbmNlKSB7XG4gIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgdmFyIG93bmVyID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyIHx8IG51bGw7XG4gICAgaWYgKG93bmVyKSB7XG4gICAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZnJpZW5kbHlTdHJpbmdpZnkob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAnWycgKyBvYmoubWFwKGZyaWVuZGx5U3RyaW5naWZ5KS5qb2luKCcsICcpICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIga2V5RXNjYXBlZCA9IC9eW2EteiRfXVtcXHckX10qJC9pLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgICAgICAgcGFpcnMucHVzaChrZXlFc2NhcGVkICsgJzogJyArIGZyaWVuZGx5U3RyaW5naWZ5KG9ialtrZXldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBwYWlycy5qb2luKCcsICcpICsgJ30nO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gJ1tmdW5jdGlvbiBvYmplY3RdJztcbiAgfVxuICAvLyBEaWZmZXJzIGZyb20gSlNPTi5zdHJpbmdpZnkgaW4gdGhhdCB1bmRlZmluZWQgYmVjYXVzZSB1bmRlZmluZWQgYW5kIHRoYXRcbiAgLy8gaW5mIGFuZCBuYW4gZG9uJ3QgYmVjb21lIG51bGxcbiAgcmV0dXJuIFN0cmluZyhvYmopO1xufVxuXG52YXIgc3R5bGVNdXRhdGlvbldhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxlMSwgc3R5bGUyLCBjb21wb25lbnQpIHtcbiAgaWYgKHN0eWxlMSA9PSBudWxsIHx8IHN0eWxlMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaGFsbG93RXF1YWwoc3R5bGUxLCBzdHlsZTIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuX3RhZztcbiAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcikge1xuICAgIG93bmVyTmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgfVxuXG4gIHZhciBoYXNoID0gb3duZXJOYW1lICsgJ3wnICsgY29tcG9uZW50TmFtZTtcblxuICBpZiAoc3R5bGVNdXRhdGlvbldhcm5pbmcuaGFzT3duUHJvcGVydHkoaGFzaCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZU11dGF0aW9uV2FybmluZ1toYXNoXSA9IHRydWU7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgJXNgIHdhcyBwYXNzZWQgYSBzdHlsZSBvYmplY3QgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICcgKyAnTXV0YXRpbmcgYHN0eWxlYCBpcyBkZXByZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICcgKyAndGhlIGByZW5kZXJgICVzLiBQcmV2aW91cyBzdHlsZTogJXMuIE11dGF0ZWQgc3R5bGU6ICVzLicsIGNvbXBvbmVudE5hbWUsIG93bmVyID8gJ29mIGAnICsgb3duZXJOYW1lICsgJ2AnIDogJ3VzaW5nIDwnICsgY29tcG9uZW50TmFtZSArICc+JywgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUxKSwgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUyKSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBwcm9wc1xuICovXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKGNvbXBvbmVudCwgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW2NvbXBvbmVudC5fdGFnXSkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzJywgY29tcG9uZW50Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpICsgJy4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzEzNycsIGNvbXBvbmVudC5fdGFnLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lciA/ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJyArIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJyA6ICcnKSA6IHZvaWQgMDtcbiAgfVxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJykgOiBfcHJvZEludmFyaWFudCgnNjAnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUvcmVhY3QtaW52YXJpYW50LWRhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzYxJykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5pbm5lckhUTUwgPT0gbnVsbCwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsLCAnQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLm9uRm9jdXNJbiA9PSBudWxsICYmIHByb3BzLm9uRm9jdXNPdXQgPT0gbnVsbCwgJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJykgOiB2b2lkIDA7XG4gIH1cbiAgIShwcm9wcy5zdHlsZSA9PSBudWxsIHx8IHR5cGVvZiBwcm9wcy5zdHlsZSA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArIFxcJ2VtXFwnfX0gd2hlbiB1c2luZyBKU1guJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiBfcHJvZEludmFyaWFudCgnNjInLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lciwgdHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxgIGV2ZW50IGRvZXNuJ3RcbiAgICAvLyBidWJibGUuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocmVnaXN0cmF0aW9uTmFtZSAhPT0gJ29uU2Nyb2xsJyB8fCBpc0V2ZW50U3VwcG9ydGVkKCdzY3JvbGwnLCB0cnVlKSwgXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBgb25TY3JvbGxgIGV2ZW50XCIpIDogdm9pZCAwO1xuICB9XG4gIHZhciBjb250YWluZXJJbmZvID0gaW5zdC5faG9zdENvbnRhaW5lckluZm87XG4gIHZhciBpc0RvY3VtZW50RnJhZ21lbnQgPSBjb250YWluZXJJbmZvLl9ub2RlICYmIGNvbnRhaW5lckluZm8uX25vZGUubm9kZVR5cGUgPT09IERPQ19GUkFHTUVOVF9UWVBFO1xuICB2YXIgZG9jID0gaXNEb2N1bWVudEZyYWdtZW50ID8gY29udGFpbmVySW5mby5fbm9kZSA6IGNvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIGRvYyk7XG4gIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocHV0TGlzdGVuZXIsIHtcbiAgICBpbnN0OiBpbnN0LFxuICAgIHJlZ2lzdHJhdGlvbk5hbWU6IHJlZ2lzdHJhdGlvbk5hbWUsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwdXRMaXN0ZW5lcigpIHtcbiAgdmFyIGxpc3RlbmVyVG9QdXQgPSB0aGlzO1xuICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcihsaXN0ZW5lclRvUHV0Lmluc3QsIGxpc3RlbmVyVG9QdXQucmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXJUb1B1dC5saXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIGlucHV0UG9zdE1vdW50KCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIFJlYWN0RE9NSW5wdXQucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxuZnVuY3Rpb24gdGV4dGFyZWFQb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01UZXh0YXJlYS5wb3N0TW91bnRXcmFwcGVyKGluc3QpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25Qb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01PcHRpb24ucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxudmFyIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZW1wdHlGdW5jdGlvbjtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICB2YXIgaGFzRXhpc3RpbmdDb250ZW50ID0gdGhpcy5fY29udGVudERlYnVnSUQgIT0gbnVsbDtcbiAgICB2YXIgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgLy8gVGhpcyBJRCByZXByZXNlbnRzIHRoZSBpbmxpbmVkIGNoaWxkIHRoYXQgaGFzIG5vIGJhY2tpbmcgaW5zdGFuY2U6XG4gICAgdmFyIGNvbnRlbnREZWJ1Z0lEID0gLWRlYnVnSUQ7XG5cbiAgICBpZiAoY29udGVudCA9PSBudWxsKSB7XG4gICAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVudERlYnVnSUQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBTdHJpbmcoY29udGVudCksIHRoaXMsIHRoaXMuX2FuY2VzdG9ySW5mbyk7XG4gICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBjb250ZW50RGVidWdJRDtcbiAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQsIGRlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgW2NvbnRlbnREZWJ1Z0lEXSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBUaGVyZSBhcmUgc28gbWFueSBtZWRpYSBldmVudHMsIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3Rcbi8vIG1haW50YWluIGEgbGlzdCByYXRoZXIgdGhhbiBjcmVhdGUgYSBgdHJhcEJ1YmJsZWRFdmVudGAgZm9yIGVhY2hcbnZhciBtZWRpYUV2ZW50cyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcENhblBsYXk6ICdjYW5wbGF5JyxcbiAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsXG4gIHRvcER1cmF0aW9uQ2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLFxuICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsXG4gIHRvcEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsXG4gIHRvcEVuZGVkOiAnZW5kZWQnLFxuICB0b3BFcnJvcjogJ2Vycm9yJyxcbiAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLFxuICB0b3BMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJyxcbiAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JyxcbiAgdG9wUGF1c2U6ICdwYXVzZScsXG4gIHRvcFBsYXk6ICdwbGF5JyxcbiAgdG9wUGxheWluZzogJ3BsYXlpbmcnLFxuICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJyxcbiAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLFxuICB0b3BTZWVrZWQ6ICdzZWVrZWQnLFxuICB0b3BTZWVraW5nOiAnc2Vla2luZycsXG4gIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJyxcbiAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLFxuICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsXG4gIHRvcFZvbHVtZUNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsXG4gIHRvcFdhaXRpbmc6ICd3YWl0aW5nJ1xufTtcblxuZnVuY3Rpb24gdHJhY2tJbnB1dFZhbHVlKCkge1xuICBpbnB1dFZhbHVlVHJhY2tpbmcudHJhY2sodGhpcyk7XG59XG5cbmZ1bmN0aW9uIHRyYXBCdWJibGVkRXZlbnRzTG9jYWwoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgLy8gSWYgYSBjb21wb25lbnQgcmVuZGVycyB0byBudWxsIG9yIGlmIGFub3RoZXIgY29tcG9uZW50IGZhdGFscyBhbmQgY2F1c2VzXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSB0byBiZSBjb3JydXB0ZWQsIGBub2RlYCBoZXJlIGNhbiBiZSBudWxsLlxuICAhaW5zdC5fcm9vdE5vZGVJRCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNdXN0IGJlIG1vdW50ZWQgdG8gdHJhcCBldmVudHMnKSA6IF9wcm9kSW52YXJpYW50KCc2MycpIDogdm9pZCAwO1xuICB2YXIgbm9kZSA9IGdldE5vZGUoaW5zdCk7XG4gICFub2RlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RyYXBCdWJibGVkRXZlbnQoLi4uKTogUmVxdWlyZXMgbm9kZSB0byBiZSByZW5kZXJlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc2NCcpIDogdm9pZCAwO1xuXG4gIHN3aXRjaCAoaW5zdC5fdGFnKSB7XG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIC8vIENyZWF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBtZWRpYSBldmVudFxuICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpIHtcbiAgICAgICAgaWYgKG1lZGlhRXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudChldmVudCwgbWVkaWFFdmVudHNbZXZlbnRdLCBub2RlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ltZyc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZm9ybSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BSZXNldCcsICdyZXNldCcsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU3VibWl0JywgJ3N1Ym1pdCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEludmFsaWQnLCAnaW52YWxpZCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyKCkge1xuICBSZWFjdERPTVNlbGVjdC5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKTtcbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSB3aGl0ZWxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cblxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlXG4gIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG59O1xuXG52YXIgbmV3bGluZUVhdGluZ1RhZ3MgPSB7XG4gIGxpc3Rpbmc6IHRydWUsXG4gIHByZTogdHJ1ZSxcbiAgdGV4dGFyZWE6IHRydWVcbn07XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXNcbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbi8vIFdlIGFjY2VwdCBhbnkgdGFnIHRvIGJlIHJlbmRlcmVkIGJ1dCBzaW5jZSB0aGlzIGdldHMgaW5qZWN0ZWQgaW50byBhcmJpdHJhcnlcbi8vIEhUTUwsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaXQncyBhIHNhZmUgdGFnLlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jTlQtTmFtZVxuXG52YXIgVkFMSURfVEFHX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVo6X1xcLlxcLVxcZF0qJC87IC8vIFNpbXBsaWZpZWQgc3Vic2V0XG52YXIgdmFsaWRhdGVkVGFnQ2FjaGUgPSB7fTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpIHtcbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZFRhZ0NhY2hlLCB0YWcpKSB7XG4gICAgIVZBTElEX1RBR19SRUdFWC50ZXN0KHRhZykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCB0YWc6ICVzJywgdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NScsIHRhZykgOiB2b2lkIDA7XG4gICAgdmFsaWRhdGVkVGFnQ2FjaGVbdGFnXSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID49IDAgfHwgcHJvcHMuaXMgIT0gbnVsbDtcbn1cblxudmFyIGdsb2JhbElkQ291bnRlciA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWFjdCBjbGFzcyB0aGF0IGlzIGlkZW1wb3RlbnQgYW5kIGNhcGFibGUgb2YgY29udGFpbmluZyBvdGhlclxuICogUmVhY3QgY29tcG9uZW50cy4gSXQgYWNjZXB0cyBldmVudCBsaXN0ZW5lcnMgYW5kIERPTSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiB2YWxpZCBhY2NvcmRpbmcgdG8gYERPTVByb3BlcnR5YC5cbiAqXG4gKiAgLSBFdmVudCBsaXN0ZW5lcnM6IGBvbkNsaWNrYCwgYG9uTW91c2VEb3duYCwgZXRjLlxuICogIC0gRE9NIHByb3BlcnRpZXM6IGBjbGFzc05hbWVgLCBgbmFtZWAsIGB0aXRsZWAsIGV0Yy5cbiAqXG4gKiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBmdW5jdGlvbnMgZGlmZmVyZW50bHkgZnJvbSB0aGUgRE9NIEFQSS4gSXQgYWNjZXB0cyBhblxuICogb2JqZWN0IG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yIFJlYWN0RE9NQ29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdE11bHRpQ2hpbGRcbiAqL1xuZnVuY3Rpb24gUmVhY3RET01Db21wb25lbnQoZWxlbWVudCkge1xuICB2YXIgdGFnID0gZWxlbWVudC50eXBlO1xuICB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpO1xuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuX3RhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBudWxsO1xuICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IG51bGw7XG4gIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDtcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcbiAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsO1xuICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuICB0aGlzLl9mbGFncyA9IDA7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gbnVsbDtcbiAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICB9XG59XG5cblJlYWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gJ1JlYWN0RE9NQ29tcG9uZW50JztcblxuUmVhY3RET01Db21wb25lbnQuTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgcm9vdCB0YWcgbWFya3VwIHRoZW4gcmVjdXJzZXMuIFRoaXMgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdHMgYW5kXG4gICAqIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P1JlYWN0RE9NQ29tcG9uZW50fSB0aGUgcGFyZW50IGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXB1dGVkIG1hcmt1cC5cbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IGdsb2JhbElkQ291bnRlcisrO1xuICAgIHRoaXMuX2RvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdhdWRpbyc6XG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgICBjYXNlICdpbWcnOlxuICAgICAgY2FzZSAnbGluayc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2FzZSAnc291cmNlJzpcbiAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgdGhpcy5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgUmVhY3RET01JbnB1dC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFja0lucHV0VmFsdWUsIHRoaXMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIFJlYWN0RE9NT3B0aW9uLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBSZWFjdERPTVRleHRhcmVhLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYWNrSW5wdXRWYWx1ZSwgdGhpcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGFzc2VydFZhbGlkUHJvcHModGhpcywgcHJvcHMpO1xuXG4gICAgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAgIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cbiAgICB2YXIgbmFtZXNwYWNlVVJJO1xuICAgIHZhciBwYXJlbnRUYWc7XG4gICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdFBhcmVudC5fbmFtZXNwYWNlVVJJO1xuICAgICAgcGFyZW50VGFnID0gaG9zdFBhcmVudC5fdGFnO1xuICAgIH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8uX3RhZykge1xuICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdENvbnRhaW5lckluZm8uX25hbWVzcGFjZVVSSTtcbiAgICAgIHBhcmVudFRhZyA9IGhvc3RDb250YWluZXJJbmZvLl90YWc7XG4gICAgfVxuICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCBuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmIHBhcmVudFRhZyA9PT0gJ2ZvcmVpZ25vYmplY3QnKSB7XG4gICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLmh0bWw7XG4gICAgfVxuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkge1xuICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3N2ZycpIHtcbiAgICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5zdmc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZyA9PT0gJ21hdGgnKSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMubWF0aG1sO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudEluZm87XG4gICAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3RvckluZm87XG4gICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50SW5mbykge1xuICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWxcbiAgICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZ1xuICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcodGhpcy5fdGFnLCBudWxsLCB0aGlzLCBwYXJlbnRJbmZvKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEluZm8sIHRoaXMuX3RhZywgdGhpcyk7XG4gICAgfVxuXG4gICAgdmFyIG1vdW50SW1hZ2U7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgZWw7XG4gICAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPjwvJyArIHR5cGUgKyAnPic7XG4gICAgICAgICAgZWwgPSBkaXYucmVtb3ZlQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLmlzKSB7XG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSwgcHJvcHMuaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjdWFzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtcbiAgICAgIH1cbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgZWwpO1xuICAgICAgdGhpcy5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2RlcztcbiAgICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0QXR0cmlidXRlRm9yUm9vdChlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51bGwsIHByb3BzLCB0cmFuc2FjdGlvbik7XG4gICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShlbCk7XG4gICAgICB0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4odHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0LCBsYXp5VHJlZSk7XG4gICAgICBtb3VudEltYWdlID0gbGF6eVRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWdPcGVuID0gdGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyh0cmFuc2FjdGlvbiwgcHJvcHMpO1xuICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0aGlzLl9jcmVhdGVDb250ZW50TWFya3VwKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCk7XG4gICAgICBpZiAoIXRhZ0NvbnRlbnQgJiYgb21pdHRlZENsb3NlVGFnc1t0aGlzLl90YWddKSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJy8+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJz4nICsgdGFnQ29udGVudCArICc8LycgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlICsgJz4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5wdXRQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodGV4dGFyZWFQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG9wdGlvblBvc3RNb3VudCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBtb3VudEltYWdlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhlIG9wZW4gdGFnIGFuZCBhbGwgYXR0cmlidXRlcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBiZWNhdXNlIGV2ZW50cyBnZXQgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogSXRlcmF0aW5nIG92ZXIgb2JqZWN0IHByb3BlcnRpZXMgaXMgZmFzdGVyIHRoYW4gaXRlcmF0aW5nIG92ZXIgYXJyYXlzLlxuICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL29iai12cy1hcnItaXRlcmF0aW9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgb2Ygb3BlbmluZyB0YWcuXG4gICAqL1xuICBfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcykge1xuICAgIHZhciByZXQgPSAnPCcgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgZm9yICh2YXIgcHJvcEtleSBpbiBwcm9wcykge1xuICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wS2V5XTtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgZW5xdWV1ZVB1dExpc3RlbmVyKHRoaXMsIHByb3BLZXksIHByb3BWYWx1ZSwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAvLyBTZWUgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gc3R5bGUgYmxvY2tcbiAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BWYWx1ZSA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gX2Fzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wVmFsdWUgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yU3R5bGVzKHByb3BWYWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmt1cCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90YWcgIT0gbnVsbCAmJiBpc0N1c3RvbUNvbXBvbmVudCh0aGlzLl90YWcsIHByb3BzKSkge1xuICAgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocHJvcEtleSwgcHJvcFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya3VwID0gRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmt1cCkge1xuICAgICAgICAgIHJldCArPSAnICcgKyBtYXJrdXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3Igc3RhdGljIHBhZ2VzLCBubyBuZWVkIHRvIHB1dCBSZWFjdCBJRCBhbmQgY2hlY2tzdW0uIFNhdmVzIGxvdHMgb2ZcbiAgICAvLyBieXRlcy5cbiAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9ob3N0UGFyZW50KSB7XG4gICAgICByZXQgKz0gJyAnICsgRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclJvb3QoKTtcbiAgICB9XG4gICAgcmV0ICs9ICcgJyArIERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JJRCh0aGlzLl9kb21JRCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIHRhZ3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7c3RyaW5nfSBDb250ZW50IG1hcmt1cC5cbiAgICovXG4gIF9jcmVhdGVDb250ZW50TWFya3VwOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gSW50ZW50aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuXG4gICAgdmFyIGlubmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuICAgIGlmIChpbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkge1xuICAgICAgICByZXQgPSBpbm5lckhUTUwuX19odG1sO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmIChjb250ZW50VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IHRleHQgaXMgYWxsb3dlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZVxuICAgICAgICByZXQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIoY29udGVudFRvVXNlKTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIGNvbnRlbnRUb1VzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5Ub1VzZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBtb3VudEltYWdlcyA9IHRoaXMubW91bnRDaGlsZHJlbihjaGlsZHJlblRvVXNlLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICAgIHJldCA9IG1vdW50SW1hZ2VzLmpvaW4oJycpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV3bGluZUVhdGluZ1RhZ3NbdGhpcy5fdGFnXSAmJiByZXQuY2hhckF0KDApID09PSAnXFxuJykge1xuICAgICAgLy8gdGV4dC9odG1sIGlnbm9yZXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGVzZSB0YWdzIGlmIGl0J3MgYSBuZXdsaW5lXG4gICAgICAvLyBQcmVmZXIgdG8gYnJlYWsgYXBwbGljYXRpb24veG1sIG92ZXIgdGV4dC9odG1sIChmb3Igbm93KSBieSBhZGRpbmdcbiAgICAgIC8vIGEgbmV3bGluZSBzcGVjaWZpY2FsbHkgdG8gZ2V0IGVhdGVuIGJ5IHRoZSBwYXJzZXIuIChBbHRlcm5hdGVseSBmb3JcbiAgICAgIC8vIHRleHRhcmVhcywgcmVwbGFjaW5nIFwiXlxcblwiIHdpdGggXCJcXHJcXG5cIiBkb2Vzbid0IGdldCBlYXRlbiwgYW5kIHRoZSBmaXJzdFxuICAgICAgLy8gXFxyIGlzIG5vcm1hbGl6ZWQgb3V0IGJ5IEhUTUxUZXh0QXJlYUVsZW1lbnQjdmFsdWUuKVxuICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbC1wb2x5Z2xvdC8jbmV3bGluZXMtaW4tdGV4dGFyZWEtYW5kLXByZT5cbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI2VsZW1lbnQtcmVzdHJpY3Rpb25zPlxuICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjbmV3bGluZXM+XG4gICAgICAvLyBTZWU6IFBhcnNpbmcgb2YgXCJ0ZXh0YXJlYVwiIFwibGlzdGluZ1wiIGFuZCBcInByZVwiIGVsZW1lbnRzXG4gICAgICAvLyAgZnJvbSA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keT5cbiAgICAgIHJldHVybiAnXFxuJyArIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZUluaXRpYWxDaGlsZHJlbjogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpIHtcbiAgICAvLyBJbnRlbnRpb25hbCB1c2Ugb2YgIT0gdG8gYXZvaWQgY2F0Y2hpbmcgemVyby9mYWxzZS5cbiAgICB2YXIgaW5uZXJIVE1MID0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7XG4gICAgaWYgKGlubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICBpZiAoaW5uZXJIVE1MLl9faHRtbCAhPSBudWxsKSB7XG4gICAgICAgIERPTUxhenlUcmVlLnF1ZXVlSFRNTChsYXp5VHJlZSwgaW5uZXJIVE1MLl9faHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb250ZW50VG9Vc2UgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGlsZHJlbl0gPyBwcm9wcy5jaGlsZHJlbiA6IG51bGw7XG4gICAgICB2YXIgY2hpbGRyZW5Ub1VzZSA9IGNvbnRlbnRUb1VzZSAhPSBudWxsID8gbnVsbCA6IHByb3BzLmNoaWxkcmVuO1xuICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGVcbiAgICAgIGlmIChjb250ZW50VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIHRleHQgYXJlYSB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIHRleHRhcmVhIHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIGlmIChjb250ZW50VG9Vc2UgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgY29udGVudFRvVXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVUZXh0KGxhenlUcmVlLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdW50SW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgbW91bnRJbWFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNlaXZlcyBhIG5leHQgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKi9cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50O1xuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBET00gY29tcG9uZW50IGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGFuZFxuICAgKiBhdHRhY2hlZCB0byB0aGUgRE9NLiBSZWNvbmNpbGVzIHRoZSByb290IERPTSBub2RlLCB0aGVuIHJlY3Vyc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCkge1xuICAgIHZhciBsYXN0UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgUmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNvbmNpbGVzIHRoZSBwcm9wZXJ0aWVzIGJ5IGRldGVjdGluZyBkaWZmZXJlbmNlcyBpbiBwcm9wZXJ0eSB2YWx1ZXMgYW5kXG4gICAqIHVwZGF0aW5nIHRoZSBET00gYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdFxuICAgKiBjcml0aWNhbCBwYXRoIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFRPRE86IEJlbmNobWFyayB3aGV0aGVyIGNoZWNraW5nIGZvciBjaGFuZ2VkIHZhbHVlcyBpbiBtZW1vcnkgYWN0dWFsbHlcbiAgICogICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnRzKS5cbiAgICogVE9ETzogQmVuY2htYXJrIHRoZSBlZmZlY3RzIG9mIHB1dHRpbmcgdGhpcyBhdCB0aGUgdG9wIHNpbmNlIDk5JSBvZiBwcm9wc1xuICAgKiAgICAgICBkbyBub3QgY2hhbmdlIGZvciBhIGdpdmVuIHJlY29uY2lsaWF0aW9uLlxuICAgKiBUT0RPOiBCZW5jaG1hcmsgYXJlYXMgdGhhdCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBjYWNoaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZVxuICAgKi9cbiAgX3VwZGF0ZURPTVByb3BlcnRpZXM6IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgcHJvcEtleTtcbiAgICB2YXIgc3R5bGVOYW1lO1xuICAgIHZhciBzdHlsZVVwZGF0ZXM7XG4gICAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIHZhciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weTtcbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChsYXN0UHJvcHNbcHJvcEtleV0pIHtcbiAgICAgICAgICAvLyBPbmx5IGNhbGwgZGVsZXRlTGlzdGVuZXIgaWYgdGhlcmUgd2FzIGEgbGlzdGVuZXIgcHJldmlvdXNseSBvclxuICAgICAgICAgIC8vIGVsc2Ugd2lsbERlbGV0ZUxpc3RlbmVyIGdldHMgY2FsbGVkIHdoZW4gdGhlcmUgd2Fzbid0IGFjdHVhbGx5IGFcbiAgICAgICAgICAvLyBsaXN0ZW5lciAoZS5nLiwgb25DbGljaz17bnVsbH0pXG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBsYXN0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wS2V5XSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShnZXROb2RlKHRoaXMpLCBwcm9wS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgdmFyIGxhc3RQcm9wID0gcHJvcEtleSA9PT0gU1RZTEUgPyB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA6IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5LCB0aGlzLl9wcmV2aW91c1N0eWxlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBuZXh0UHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFByb3AgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG4gICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIGVucXVldWVQdXRMaXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBuZXh0UHJvcCwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBuZXh0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV0gfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUocHJvcEtleSkpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBnZXROb2RlKHRoaXMpO1xuICAgICAgICAvLyBJZiB3ZSdyZSB1cGRhdGluZyB0byBudWxsIG9yIHVuZGVmaW5lZCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgcHJvcGVydHlcbiAgICAgICAgLy8gZnJvbSB0aGUgRE9NIG5vZGUgaW5zdGVhZCBvZiBpbmFkdmVydGVudGx5IHNldHRpbmcgdG8gYSBzdHJpbmcuIFRoaXNcbiAgICAgICAgLy8gYnJpbmdzIHVzIGluIGxpbmUgd2l0aCB0aGUgc2FtZSBiZWhhdmlvciB3ZSBoYXZlIG9uIGluaXRpYWwgcmVuZGVyLlxuICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAgICBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JTdHlsZXMoZ2V0Tm9kZSh0aGlzKSwgc3R5bGVVcGRhdGVzLCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGFmZmVjdCB0aGVcbiAgICogY2hpbGRyZW4gY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGxhc3RQcm9wc1xuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICovXG4gIF91cGRhdGVET01DaGlsZHJlbjogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBsYXN0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIGxhc3RQcm9wcy5jaGlsZHJlbl0gPyBsYXN0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgIHZhciBuZXh0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIG5leHRQcm9wcy5jaGlsZHJlbl0gPyBuZXh0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuXG4gICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIGxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG4gICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIG5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG5cbiAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgYCE9YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgIHZhciBsYXN0Q2hpbGRyZW4gPSBsYXN0Q29udGVudCAhPSBudWxsID8gbnVsbCA6IGxhc3RQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBjaGlsZHJlbiB0byBjb250ZW50L2h0bWwgb3IgdmljZSB2ZXJzYSwgcmVtb3ZlXG4gICAgLy8gdGhlIG9sZCBjb250ZW50XG4gICAgdmFyIGxhc3RIYXNDb250ZW50T3JIdG1sID0gbGFzdENvbnRlbnQgIT0gbnVsbCB8fCBsYXN0SHRtbCAhPSBudWxsO1xuICAgIHZhciBuZXh0SGFzQ29udGVudE9ySHRtbCA9IG5leHRDb250ZW50ICE9IG51bGwgfHwgbmV4dEh0bWwgIT0gbnVsbDtcbiAgICBpZiAobGFzdENoaWxkcmVuICE9IG51bGwgJiYgbmV4dENoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obnVsbCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAobGFzdEhhc0NvbnRlbnRPckh0bWwgJiYgIW5leHRIYXNDb250ZW50T3JIdG1sKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV4dENvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKGxhc3RDb250ZW50ICE9PSBuZXh0Q29udGVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnICsgbmV4dENvbnRlbnQpO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbmV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTWFya3VwKCcnICsgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCwgW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfVxuICB9LFxuXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldE5vZGUodGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGFsbCBldmVudCByZWdpc3RyYXRpb25zIGZvciB0aGlzIGluc3RhbmNlLiBEb2VzIG5vdCByZW1vdmUgZnJvbVxuICAgKiB0aGUgRE9NLiBUaGF0IG11c3QgYmUgZG9uZSBieSB0aGUgcGFyZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnYXVkaW8nOlxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICBjYXNlICdpZnJhbWUnOlxuICAgICAgY2FzZSAnaW1nJzpcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICBjYXNlICd2aWRlbyc6XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzO1xuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIGlucHV0VmFsdWVUcmFja2luZy5zdG9wVHJhY2tpbmcodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcG9uZW50cyBsaWtlIDxodG1sPiA8aGVhZD4gYW5kIDxib2R5PiBjYW4ndCBiZSByZW1vdmVkIG9yIGFkZGVkXG4gICAgICAgICAqIGVhc2lseSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LCBob3dldmVyIGl0J3MgdmFsdWFibGUgdG8gYmUgYWJsZSB0b1xuICAgICAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiBSZWFjdCdzIHJlY29uY2lsaWF0aW9uIGZvciBzdHlsaW5nIGFuZCA8dGl0bGU+XG4gICAgICAgICAqIG1hbmFnZW1lbnQuIFNvIHdlIGp1c3QgZG9jdW1lbnQgaXQgYW5kIHRocm93IGluIGRhbmdlcm91cyBjYXNlcy5cbiAgICAgICAgICovXG4gICAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICc8JXM+IHRyaWVkIHRvIHVubW91bnQuIEJlY2F1c2Ugb2YgY3Jvc3MtYnJvd3NlciBxdWlya3MgaXQgaXMgaW1wb3NzaWJsZSB0byB1bm1vdW50IHNvbWUgdG9wLWxldmVsIGNvbXBvbmVudHMgKGVnIDxodG1sPiwgPGhlYWQ+LCBhbmQgPGJvZHk+KSByZWxpYWJseSBhbmQgZWZmaWNpZW50bHkuIFRvIGZpeCB0aGlzLCBoYXZlIGEgc2luZ2xlIHRvcC1sZXZlbCBjb21wb25lbnQgdGhhdCBuZXZlciB1bm1vdW50cyByZW5kZXIgdGhlc2UgZWxlbWVudHMuJywgdGhpcy5fdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NicsIHRoaXMuX3RhZykgOiB2b2lkIDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMudW5tb3VudENoaWxkcmVuKHNhZmVseSk7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICAgIEV2ZW50UGx1Z2luSHViLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKTtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl9kb21JRCA9IDA7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlID0gbnVsbDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgIH1cbiAgfSxcblxuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9XG59O1xuXG5fYXNzaWduKFJlYWN0RE9NQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RET01Db21wb25lbnQuTWl4aW4sIFJlYWN0TXVsdGlDaGlsZC5NaXhpbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG5cbnZhciBET0NfTk9ERV9UWVBFID0gOTtcblxuZnVuY3Rpb24gUmVhY3RET01Db250YWluZXJJbmZvKHRvcExldmVsV3JhcHBlciwgbm9kZSkge1xuICB2YXIgaW5mbyA9IHtcbiAgICBfdG9wTGV2ZWxXcmFwcGVyOiB0b3BMZXZlbFdyYXBwZXIsXG4gICAgX2lkQ291bnRlcjogMSxcbiAgICBfb3duZXJEb2N1bWVudDogbm9kZSA/IG5vZGUubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUgPyBub2RlIDogbm9kZS5vd25lckRvY3VtZW50IDogbnVsbCxcbiAgICBfbm9kZTogbm9kZSxcbiAgICBfdGFnOiBub2RlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbCxcbiAgICBfbmFtZXNwYWNlVVJJOiBub2RlID8gbm9kZS5uYW1lc3BhY2VVUkkgOiBudWxsXG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaW5mby5fYW5jZXN0b3JJbmZvID0gbm9kZSA/IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIGluZm8uX3RhZywgbnVsbCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBpbmZvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29udGFpbmVySW5mbztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01Db250YWluZXJJbmZvLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkge1xuICAvLyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCB1c2VzIHRoaXM6XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcbiAgdGhpcy5fZG9tSUQgPSAwO1xufTtcbl9hc3NpZ24oUmVhY3RET01FbXB0eUNvbXBvbmVudC5wcm90b3R5cGUsIHtcbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIG5vZGVWYWx1ZSA9ICcgcmVhY3QtZW1wdHk6ICcgKyB0aGlzLl9kb21JRCArICcgJztcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBub2RlID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG5vZGUpO1xuICAgICAgcmV0dXJuIERPTUxhenlUcmVlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBpbnNlcnQgYSBjb21tZW50IG5vZGUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uXG4gICAgICAgIC8vIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlciAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm5cbiAgICAgICAgLy8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc8IS0tJyArIG5vZGVWYWx1ZSArICctLT4nO1xuICAgIH1cbiAgfSxcbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKCkge30sXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICB9LFxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUVtcHR5Q29tcG9uZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUVtcHR5Q29tcG9uZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NRmVhdHVyZUZsYWdzID0ge1xuICB1c2VDcmVhdGVFbGVtZW50OiB0cnVlLFxuICB1c2VGaWJlcjogZmFsc2Vcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01GZWF0dXJlRmxhZ3M7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NQ2hpbGRyZW5PcGVyYXRpb25zJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIHVzZWQgdG8gcHJvY2VzcyB1cGRhdGVzIHRvIERPTSBub2Rlcy5cbiAqL1xudmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0ge1xuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudEluc3QsIHVwZGF0ZXMpIHtcbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO1xuICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5wcm9jZXNzVXBkYXRlcyhub2RlLCB1cGRhdGVzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlET3BlcmF0aW9ucztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01JRE9wZXJhdGlvbnMuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5T3BlcmF0aW9ucycpO1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVlVXRpbHMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICAgIFJlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG52YXIgUmVhY3RET01JbnB1dCA9IHtcbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICB2YXIgY2hlY2tlZCA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0Q2hlY2tlZChwcm9wcyk7XG5cbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC50eXBlIGJlZm9yZSBhbnkgb3RoZXIgcHJvcGVydGllcyAoc2V0dGluZyAudmFsdWVcbiAgICAgIC8vIGJlZm9yZSAudHlwZSBtZWFucyAudmFsdWUgaXMgbG9zdCBpbiBJRTExIGFuZCBiZWxvdylcbiAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgLnN0ZXAgYmVmb3JlIC52YWx1ZSAoc2V0dGluZyAudmFsdWUgYmVmb3JlIC5zdGVwXG4gICAgICAvLyBtZWFucyAudmFsdWUgaXMgcm91bmRlZCBvbiBtb3VudCwgYmFzZWQgdXBvbiBzdGVwIHByZWNpc2lvbilcbiAgICAgIHN0ZXA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgLm1pbiAmIC5tYXggYmVmb3JlIC52YWx1ZSAodG8gZW5zdXJlIHByb3BlciBvcmRlclxuICAgICAgLy8gaW4gY29ybmVyIGNhc2VzIHN1Y2ggYXMgbWluIG9yIG1heCBkZXJpdmluZyBmcm9tIHZhbHVlLCBlLmcuIElzc3VlICM3MTcwKVxuICAgICAgbWluOiB1bmRlZmluZWQsXG4gICAgICBtYXg6IHVuZGVmaW5lZFxuICAgIH0sIHByb3BzLCB7XG4gICAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsXG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIExpbmtlZFZhbHVlVXRpbHMuY2hlY2tQcm9wVHlwZXMoJ2lucHV0JywgcHJvcHMsIGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7XG5cbiAgICAgIHZhciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcblxuICAgICAgaWYgKHByb3BzLnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlua2AgcHJvcCBvbiBgaW5wdXRgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNoZWNrZWRMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkTGluaykge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BjaGVja2VkTGlua2AgcHJvcCBvbiBgaW5wdXRgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5DaGVja2VkTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgICBpbml0aWFsVmFsdWU6IHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIGxpc3RlbmVyczogbnVsbCxcbiAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCksXG4gICAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gICAgfTtcbiAgfSxcblxuICB1cGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcbiAgICAgIHZhciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcblxuICAgICAgaWYgKCFpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgY29udHJvbGxlZC4gJyArICdJbnB1dCBlbGVtZW50cyBzaG91bGQgbm90IHN3aXRjaCBmcm9tIHVuY29udHJvbGxlZCB0byBjb250cm9sbGVkIChvciB2aWNlIHZlcnNhKS4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGluc3QuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogU2hvdWxkbid0IHRoaXMgYmUgZ2V0Q2hlY2tlZChwcm9wcyk/XG4gICAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICAgIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpLCAnY2hlY2tlZCcsIGNoZWNrZWQgfHwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJykge1xuICAgICAgICBub2RlLnZhbHVlID0gJzAnO1xuICAgICAgICAvLyBOb3RlOiBJRTkgcmVwb3J0cyBhIG51bWJlciBpbnB1dHMgYXMgJ3RleHQnLCBzbyBjaGVjayBwcm9wcyBpbnN0ZWFkLlxuICAgICAgfSBlbHNlIGlmIChwcm9wcy50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBTaW11bGF0ZSBgaW5wdXQudmFsdWVBc051bWJlcmAuIElFOSBkb2VzIG5vdCBzdXBwb3J0IGl0XG4gICAgICAgIHZhciB2YWx1ZUFzTnVtYmVyID0gcGFyc2VGbG9hdChub2RlLnZhbHVlLCAxMCkgfHwgMDtcblxuICAgICAgICBpZiAoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB2YWx1ZSAhPSB2YWx1ZUFzTnVtYmVyIHx8XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB2YWx1ZSA9PSB2YWx1ZUFzTnVtYmVyICYmIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICAgICAgICBub2RlLnZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlICE9PSAnJyArIHZhbHVlKSB7XG4gICAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICAgICAgbm9kZS52YWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAgIC8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbiAgICAgICAgLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gJycgKyBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuXG4gICAgLy8gRGV0YWNoIHZhbHVlIGZyb20gZGVmYXVsdFZhbHVlLiBXZSB3b24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSB3b3JraW5nIG9uXG4gICAgLy8gc3VibWl0IG9yIHJlc2V0IGlucHV0cyBhcyB0aG9zZSB2YWx1ZXMgJiBkZWZhdWx0VmFsdWVzIGFyZSBsaW5rZWQuIFRoZXlcbiAgICAvLyBhcmUgbm90IHJlc2V0YWJsZSBub2RlcyBzbyB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IG1hdHRlciBhbmQgYWN0dWFsbHlcbiAgICAvLyByZW1vdmVzIGJyb3dzZXItZGVmYXVsdCB2YWx1ZXMgKGVnIFwiU3VibWl0IFF1ZXJ5XCIpIHdoZW4gbm8gdmFsdWUgaXNcbiAgICAvLyBwcm92aWRlZC5cblxuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG5vLXNob3cgaXNzdWUgb24gaU9TIFNhZmFyaSBhbmQgQW5kcm9pZCBDaHJvbWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzIzM1xuICAgICAgICBub2RlLnZhbHVlID0gJyc7XG4gICAgICAgIG5vZGUudmFsdWUgPSBub2RlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAgIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG4gICAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG4gICAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgICBub2RlLm5hbWUgPSAnJztcbiAgICB9XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG5cbiAgLy8gSGVyZSB3ZSB1c2UgYXNhcCB0byB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2hcbiAgLy8gaXMgaW1wb3J0YW50IHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7XG5cbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0sIGxldCdzIGp1c3QgdXNlIHRoZSBnbG9iYWxcbiAgICAvLyBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0IG1pc3MgYW55dGhpbmcuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG4gICAgICB2YXIgb3RoZXJJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG90aGVyTm9kZSk7XG4gICAgICAhb3RoZXJJbnN0YW5jZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5MCcpIDogdm9pZCAwO1xuICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG4gICAgICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgb3RoZXJJbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW5wdXQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NSW5wdXQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSwgZGVidWdJRCkge1xuICBpZiAod2FybmVkUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgc3RhbmRhcmROYW1lID0gRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgIC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cbiAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cbiAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIHN0YW5kYXJkTmFtZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyhkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gZWxlbWVudC5wcm9wcykge1xuICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eShlbGVtZW50LnR5cGUsIGtleSwgZGVidWdJRCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgfSkuam9pbignLCAnKTtcblxuICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL2ludmFsaWQtYXJpYS1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9pbnZhbGlkLWFyaWEtcHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnByb3BzLmlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHMoZGVidWdJRCwgZWxlbWVudCk7XG59XG5cbnZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHtcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgICB9XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUludmFsaWRBUklBSG9vaztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01JbnZhbGlkQVJJQUhvb2suanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC50eXBlICE9PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiBlbGVtZW50LnR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGVtZW50LnByb3BzICE9IG51bGwgJiYgZWxlbWVudC5wcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4lcycsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG5cbiAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2suanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERPTVNlbGVjdCA9IHJlcXVpcmUoJy4vUmVhY3RET01TZWxlY3QnKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG52YXIgZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbiA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJztcblxuICAvLyBGbGF0dGVuIGNoaWxkcmVuIGFuZCB3YXJuIGlmIHRoZXkgYXJlbid0IHN0cmluZ3Mgb3IgbnVtYmVycztcbiAgLy8gaW52YWxpZCB0eXBlcyBhcmUgaWdub3JlZC5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgY29udGVudCArPSBjaGlsZDtcbiAgICB9IGVsc2UgaWYgKCFkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuKSB7XG4gICAgICBkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJykgOiB2b2lkIDA7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xudmFyIFJlYWN0RE9NT3B0aW9uID0ge1xuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcywgaG9zdFBhcmVudCkge1xuICAgIC8vIFRPRE8gKHl1bmdzdGVycyk6IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5zZWxlY3RlZCA9PSBudWxsLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gTG9vayB1cCB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzICdzZWxlY3RlZCdcbiAgICB2YXIgc2VsZWN0VmFsdWUgPSBudWxsO1xuICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgIHZhciBzZWxlY3RQYXJlbnQgPSBob3N0UGFyZW50O1xuXG4gICAgICBpZiAoc2VsZWN0UGFyZW50Ll90YWcgPT09ICdvcHRncm91cCcpIHtcbiAgICAgICAgc2VsZWN0UGFyZW50ID0gc2VsZWN0UGFyZW50Ll9ob3N0UGFyZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0UGFyZW50ICE9IG51bGwgJiYgc2VsZWN0UGFyZW50Ll90YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHNlbGVjdFZhbHVlID0gUmVhY3RET01TZWxlY3QuZ2V0U2VsZWN0VmFsdWVDb250ZXh0KHNlbGVjdFBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwgKGUuZy4sIG5vIHNwZWNpZmllZCB2YWx1ZSBvciBhZnRlciBpbml0aWFsIG1vdW50KVxuICAgIC8vIG9yIG1pc3NpbmcgKGUuZy4sIGZvciA8ZGF0YWxpc3Q+KSwgd2UgZG9uJ3QgY2hhbmdlIHByb3BzLnNlbGVjdGVkXG4gICAgdmFyIHNlbGVjdGVkID0gbnVsbDtcbiAgICBpZiAoc2VsZWN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSArICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBmbGF0dGVuQ2hpbGRyZW4ocHJvcHMuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdFZhbHVlKSkge1xuICAgICAgICAvLyBtdWx0aXBsZVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCcnICsgc2VsZWN0VmFsdWVbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkID0gJycgKyBzZWxlY3RWYWx1ZSA9PT0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0geyBzZWxlY3RlZDogc2VsZWN0ZWQgfTtcbiAgfSxcblxuICBwb3N0TW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgcHJvcHMudmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsgc2VsZWN0ZWQ6IHVuZGVmaW5lZCwgY2hpbGRyZW46IHVuZGVmaW5lZCB9LCBwcm9wcyk7XG5cbiAgICAvLyBSZWFkIHN0YXRlIG9ubHkgZnJvbSBpbml0aWFsIG1vdW50IGJlY2F1c2UgPHNlbGVjdD4gdXBkYXRlcyB2YWx1ZVxuICAgIC8vIG1hbnVhbGx5OyB3ZSBuZWVkIHRoZSBpbml0aWFsIHN0YXRlIG9ubHkgZm9yIHNlcnZlciByZW5kZXJpbmdcbiAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLnNlbGVjdGVkICE9IG51bGwpIHtcbiAgICAgIGhvc3RQcm9wcy5zZWxlY3RlZCA9IGluc3QuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZDtcbiAgICB9XG5cbiAgICB2YXIgY29udGVudCA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7XG5cbiAgICBpZiAoY29udGVudCkge1xuICAgICAgaG9zdFByb3BzLmNoaWxkcmVuID0gY29udGVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NT3B0aW9uO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTU9wdGlvbi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0ID0gcmVxdWlyZSgnLi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0Jyk7XG52YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFdoaWxlIGBpc0NvbGxhcHNlZGAgaXMgYXZhaWxhYmxlIG9uIHRoZSBTZWxlY3Rpb24gb2JqZWN0IGFuZCBgY29sbGFwc2VkYFxuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBSYW5nZSBvYmplY3QsIElFMTEgc29tZXRpbWVzIGdldHMgdGhlbSB3cm9uZy5cbiAqIElmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYW5kIG9mZnNldHMgYXJlIHRoZSBzYW1lLCB0aGUgcmFuZ2UgaXMgY29sbGFwc2VkLlxuICovXG5mdW5jdGlvbiBpc0NvbGxhcHNlZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgcmV0dXJuIGFuY2hvck5vZGUgPT09IGZvY3VzTm9kZSAmJiBhbmNob3JPZmZzZXQgPT09IGZvY3VzT2Zmc2V0O1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYW5jaG9yIGFuZCBmb2N1cyBub2RlL29mZnNldCBwYWlycyBmb3IgSUUuXG4gKlxuICogVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCBJRSdzIHNlbGVjdGlvbiBBUEkgZG9lc24ndCBwcm92aWRlIGluZm9ybWF0aW9uXG4gKiBhYm91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgZm9yd2FyZCBvciBiYWNrd2FyZCwgc28gd2UgaGF2ZSB0b1xuICogYmVoYXZlIGFzIHRob3VnaCBpdCdzIGFsd2F5cyBmb3J3YXJkLlxuICpcbiAqIElFIHRleHQgZGlmZmVycyBmcm9tIG1vZGVybiBzZWxlY3Rpb24gaW4gdGhhdCBpdCBiZWhhdmVzIGFzIHRob3VnaFxuICogYmxvY2sgZWxlbWVudHMgZW5kIHdpdGggYSBuZXcgbGluZS4gVGhpcyBtZWFucyBjaGFyYWN0ZXIgb2Zmc2V0cyB3aWxsXG4gKiBkaWZmZXIgYmV0d2VlbiB0aGUgdHdvIEFQSXMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldElFT2Zmc2V0cyhub2RlKSB7XG4gIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5zZWxlY3Rpb247XG4gIHZhciBzZWxlY3RlZFJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gIHZhciBzZWxlY3RlZExlbmd0aCA9IHNlbGVjdGVkUmFuZ2UudGV4dC5sZW5ndGg7XG5cbiAgLy8gRHVwbGljYXRlIHNlbGVjdGlvbiBzbyB3ZSBjYW4gbW92ZSByYW5nZSB3aXRob3V0IGJyZWFraW5nIHVzZXIgc2VsZWN0aW9uLlxuICB2YXIgZnJvbVN0YXJ0ID0gc2VsZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTtcbiAgZnJvbVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO1xuICBmcm9tU3RhcnQuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCBzZWxlY3RlZFJhbmdlKTtcblxuICB2YXIgc3RhcnRPZmZzZXQgPSBmcm9tU3RhcnQudGV4dC5sZW5ndGg7XG4gIHZhciBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHNlbGVjdGVkTGVuZ3RoO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0T2Zmc2V0LFxuICAgIGVuZDogZW5kT2Zmc2V0XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzKG5vZGUpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gJiYgd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICB2YXIgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldDtcbiAgdmFyIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7XG4gIHZhciBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcblxuICB2YXIgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgLy8gSW4gRmlyZWZveCwgcmFuZ2Uuc3RhcnRDb250YWluZXIgYW5kIHJhbmdlLmVuZENvbnRhaW5lciBjYW4gYmUgXCJhbm9ueW1vdXNcbiAgLy8gZGl2c1wiLCBlLmcuIHRoZSB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91c1xuICAvLyBkaXZzIGRvIG5vdCBzZWVtIHRvIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZFxuICAvLyBlcnJvclwiIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZVxuICAvLyB3YXkgdG8gYXZvaWQgZXJyb3JpbmcgaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yXG4gIC8vIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQgY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lci5ub2RlVHlwZTtcbiAgICBjdXJyZW50UmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIHRoZSBub2RlIGFuZCBvZmZzZXQgdmFsdWVzIGFyZSB0aGUgc2FtZSwgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQuXG4gIC8vIGBTZWxlY3Rpb24uaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgYnV0IElFIHNvbWV0aW1lcyBnZXRzXG4gIC8vIHRoaXMgdmFsdWUgd3JvbmcuXG4gIHZhciBpc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LCBzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpO1xuXG4gIHZhciByYW5nZUxlbmd0aCA9IGlzU2VsZWN0aW9uQ29sbGFwc2VkID8gMCA6IGN1cnJlbnRSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcblxuICB2YXIgdGVtcFJhbmdlID0gY3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgdGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgdGVtcFJhbmdlLnNldEVuZChjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIsIGN1cnJlbnRSYW5nZS5zdGFydE9mZnNldCk7XG5cbiAgdmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkID0gaXNDb2xsYXBzZWQodGVtcFJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQsIHRlbXBSYW5nZS5lbmRDb250YWluZXIsIHRlbXBSYW5nZS5lbmRPZmZzZXQpO1xuXG4gIHZhciBzdGFydCA9IGlzVGVtcFJhbmdlQ29sbGFwc2VkID8gMCA6IHRlbXBSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcbiAgdmFyIGVuZCA9IHN0YXJ0ICsgcmFuZ2VMZW5ndGg7XG5cbiAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBiYWNrd2FyZC5cbiAgdmFyIGRldGVjdGlvblJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xuICB2YXIgaXNCYWNrd2FyZCA9IGRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBpc0JhY2t3YXJkID8gZW5kIDogc3RhcnQsXG4gICAgZW5kOiBpc0JhY2t3YXJkID8gc3RhcnQgOiBlbmRcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldElFT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpO1xuICB2YXIgc3RhcnQsIGVuZDtcblxuICBpZiAob2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICBlbmQgPSBzdGFydDtcbiAgfSBlbHNlIGlmIChvZmZzZXRzLnN0YXJ0ID4gb2Zmc2V0cy5lbmQpIHtcbiAgICBzdGFydCA9IG9mZnNldHMuZW5kO1xuICAgIGVuZCA9IG9mZnNldHMuc3RhcnQ7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICAgIGVuZCA9IG9mZnNldHMuZW5kO1xuICB9XG5cbiAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSk7XG4gIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpO1xuICByYW5nZS5zZXRFbmRQb2ludCgnRW5kVG9TdGFydCcsIHJhbmdlKTtcbiAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpO1xuICByYW5nZS5zZWxlY3QoKTtcbn1cblxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldE1vZGVybk9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZVtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldLmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpO1xuXG4gIC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdXNlSUVPZmZzZXRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdzZWxlY3Rpb24nIGluIGRvY3VtZW50ICYmICEoJ2dldFNlbGVjdGlvbicgaW4gd2luZG93KTtcblxudmFyIFJlYWN0RE9NU2VsZWN0aW9uID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqL1xuICBnZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBnZXRJRU9mZnNldHMgOiBnZXRNb2Rlcm5PZmZzZXRzLFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAgICovXG4gIHNldE9mZnNldHM6IHVzZUlFT2Zmc2V0cyA/IHNldElFT2Zmc2V0cyA6IHNldE1vZGVybk9mZnNldHNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Rpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0aW9uLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTtcbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSByZXF1aXJlKCcuL3ZhbGlkYXRlRE9NTmVzdGluZycpO1xuXG4vKipcbiAqIFRleHQgbm9kZXMgdmlvbGF0ZSBhIGNvdXBsZSBhc3N1bXB0aW9ucyB0aGF0IFJlYWN0IG1ha2VzIGFib3V0IGNvbXBvbmVudHM6XG4gKlxuICogIC0gV2hlbiBtb3VudGluZyB0ZXh0IGludG8gdGhlIERPTSwgYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUgbWVyZ2VkLlxuICogIC0gVGV4dCBub2RlcyBjYW5ub3QgYmUgYXNzaWduZWQgYSBSZWFjdCByb290IElELlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGlzIHVzZWQgdG8gd3JhcCBzdHJpbmdzIGJldHdlZW4gY29tbWVudCBub2RlcyBzbyB0aGF0IHRoZXlcbiAqIGNhbiB1bmRlcmdvIHRoZSBzYW1lIHJlY29uY2lsaWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBlbGVtZW50cy5cbiAqXG4gKiBUT0RPOiBJbnZlc3RpZ2F0ZSByZXByZXNlbnRpbmcgUmVhY3QgY29tcG9uZW50cyBpbiB0aGUgRE9NIHdpdGggdGV4dCBub2Rlcy5cbiAqXG4gKiBAY2xhc3MgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdENvbXBvbmVudFxuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdERPTVRleHRDb21wb25lbnQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAvLyBUT0RPOiBUaGlzIGlzIHJlYWxseSBhIFJlYWN0VGV4dCAoUmVhY3ROb2RlKSwgbm90IGEgUmVhY3RFbGVtZW50XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gdGV4dDtcbiAgdGhpcy5fc3RyaW5nVGV4dCA9ICcnICsgdGV4dDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG5cbiAgLy8gUHJvcGVydGllc1xuICB0aGlzLl9kb21JRCA9IDA7XG4gIHRoaXMuX21vdW50SW5kZXggPSAwO1xuICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7XG4gIHRoaXMuX2NvbW1lbnROb2RlcyA9IG51bGw7XG59O1xuXG5fYXNzaWduKFJlYWN0RE9NVGV4dENvbXBvbmVudC5wcm90b3R5cGUsIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG1hcmt1cCBmb3IgdGhpcyB0ZXh0IG5vZGUuIFRoaXMgbm9kZSBpcyBub3QgaW50ZW5kZWQgdG8gaGF2ZVxuICAgKiBhbnkgZmVhdHVyZXMgYmVzaWRlcyBjb250YWluaW5nIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIGZvciB0aGlzIHRleHQgbm9kZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGFyZW50SW5mbztcbiAgICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RQYXJlbnQuX2FuY2VzdG9ySW5mbztcbiAgICAgIH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8gIT0gbnVsbCkge1xuICAgICAgICBwYXJlbnRJbmZvID0gaG9zdENvbnRhaW5lckluZm8uX2FuY2VzdG9ySW5mbztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnRJbmZvKSB7XG4gICAgICAgIC8vIHBhcmVudEluZm8gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IGV4Y2VwdCBmb3IgdGhlIHRvcC1sZXZlbFxuICAgICAgICAvLyBjb21wb25lbnQgd2hlbiBzZXJ2ZXIgcmVuZGVyaW5nXG4gICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0aGlzLl9zdHJpbmdUZXh0LCB0aGlzLCBwYXJlbnRJbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdmFyIG9wZW5pbmdWYWx1ZSA9ICcgcmVhY3QtdGV4dDogJyArIGRvbUlEICsgJyAnO1xuICAgIHZhciBjbG9zaW5nVmFsdWUgPSAnIC9yZWFjdC10ZXh0ICc7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBvcGVuaW5nQ29tbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChvcGVuaW5nVmFsdWUpO1xuICAgICAgdmFyIGNsb3NpbmdDb21tZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KGNsb3NpbmdWYWx1ZSk7XG4gICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShvd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShvcGVuaW5nQ29tbWVudCkpO1xuICAgICAgaWYgKHRoaXMuX3N0cmluZ1RleHQpIHtcbiAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLl9zdHJpbmdUZXh0KSkpO1xuICAgICAgfVxuICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUoY2xvc2luZ0NvbW1lbnQpKTtcbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgb3BlbmluZ0NvbW1lbnQpO1xuICAgICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBjbG9zaW5nQ29tbWVudDtcbiAgICAgIHJldHVybiBsYXp5VHJlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVzY2FwZWRUZXh0ID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRoaXMuX3N0cmluZ1RleHQpO1xuXG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCB3cmFwIHRoaXMgYmV0d2VlbiBjb21tZW50IG5vZGVzIGZvciB0aGUgcmVhc29ucyBzdGF0ZWRcbiAgICAgICAgLy8gYWJvdmUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlclxuICAgICAgICAvLyAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm4gdGhlIHRleHQgYXMgaXQgaXMuXG4gICAgICAgIHJldHVybiBlc2NhcGVkVGV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICc8IS0tJyArIG9wZW5pbmdWYWx1ZSArICctLT4nICsgZXNjYXBlZFRleHQgKyAnPCEtLScgKyBjbG9zaW5nVmFsdWUgKyAnLS0+JztcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhpcyBjb21wb25lbnQgYnkgdXBkYXRpbmcgdGhlIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFRleHR9IG5leHRUZXh0IFRoZSBuZXh0IHRleHQgY29udGVudFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRUZXh0LCB0cmFuc2FjdGlvbikge1xuICAgIGlmIChuZXh0VGV4dCAhPT0gdGhpcy5fY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dFRleHQ7XG4gICAgICB2YXIgbmV4dFN0cmluZ1RleHQgPSAnJyArIG5leHRUZXh0O1xuICAgICAgaWYgKG5leHRTdHJpbmdUZXh0ICE9PSB0aGlzLl9zdHJpbmdUZXh0KSB7XG4gICAgICAgIC8vIFRPRE86IFNhdmUgdGhpcyBhcyBwZW5kaW5nIHByb3BzIGFuZCB1c2UgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5XG4gICAgICAgIC8vIGFuZC9vciB1cGRhdGVDb21wb25lbnQgdG8gZG8gdGhlIGFjdHVhbCB1cGRhdGUgZm9yIGNvbnNpc3RlbmN5IHdpdGhcbiAgICAgICAgLy8gb3RoZXIgY29tcG9uZW50IHR5cGVzP1xuICAgICAgICB0aGlzLl9zdHJpbmdUZXh0ID0gbmV4dFN0cmluZ1RleHQ7XG4gICAgICAgIHZhciBjb21tZW50Tm9kZXMgPSB0aGlzLmdldEhvc3ROb2RlKCk7XG4gICAgICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5yZXBsYWNlRGVsaW1pdGVkVGV4dChjb21tZW50Tm9kZXNbMF0sIGNvbW1lbnROb2Rlc1sxXSwgbmV4dFN0cmluZ1RleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBob3N0Tm9kZSA9IHRoaXMuX2NvbW1lbnROb2RlcztcbiAgICBpZiAoaG9zdE5vZGUpIHtcbiAgICAgIHJldHVybiBob3N0Tm9kZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9jbG9zaW5nQ29tbWVudCkge1xuICAgICAgdmFyIG9wZW5pbmdDb21tZW50ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7XG4gICAgICB2YXIgbm9kZSA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgIShub2RlICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01pc3NpbmcgY2xvc2luZyBjb21tZW50IGZvciB0ZXh0IGNvbXBvbmVudCAlcycsIHRoaXMuX2RvbUlEKSA6IF9wcm9kSW52YXJpYW50KCc2NycsIHRoaXMuX2RvbUlEKSA6IHZvaWQgMDtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgL3JlYWN0LXRleHQgJykge1xuICAgICAgICAgIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gbm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgaG9zdE5vZGUgPSBbdGhpcy5faG9zdE5vZGUsIHRoaXMuX2Nsb3NpbmdDb21tZW50XTtcbiAgICB0aGlzLl9jb21tZW50Tm9kZXMgPSBob3N0Tm9kZTtcbiAgICByZXR1cm4gaG9zdE5vZGU7XG4gIH0sXG5cbiAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gbnVsbDtcbiAgICB0aGlzLl9jb21tZW50Tm9kZXMgPSBudWxsO1xuICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0Q29tcG9uZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRDb21wb25lbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xudmFyIFJlYWN0RE9NVGV4dGFyZWEgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MScpIDogdm9pZCAwO1xuXG4gICAgLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAgIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitCZW4gc2VlbWVkIHRvIGxpa2UgdGhpcyBzb2x1dGlvbi5cbiAgICAvLyBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZCB0byBiZSBhIHN0cmluZy5cbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGNoaWxkcmVuOiAnJyArIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsXG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIExpbmtlZFZhbHVlVXRpbHMuY2hlY2tQcm9wVHlwZXMoJ3RleHRhcmVhJywgcHJvcHMsIGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7XG4gICAgICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdmFsdWU7XG5cbiAgICAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGNoaWxkcmVuIGNvbnRlbnQgaW4gPHRleHRhcmVhPi5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgICEoZGVmYXVsdFZhbHVlID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MicpIDogdm9pZCAwO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAhKGNoaWxkcmVuLmxlbmd0aCA8PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJykgOiBfcHJvZEludmFyaWFudCgnOTMnKSA6IHZvaWQgMDtcbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gJycgKyBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7XG4gICAgICBpbml0aWFsVmFsdWU6ICcnICsgaW5pdGlhbFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KVxuICAgIH07XG4gIH0sXG5cbiAgdXBkYXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgICB2YXIgbmV3VmFsdWUgPSAnJyArIHZhbHVlO1xuXG4gICAgICAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuICAgICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBwb3N0TW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7XG5cbiAgICAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAgIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gICAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cbiAgICBpZiAodGV4dENvbnRlbnQgPT09IGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG4gIFJlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLCB0aGlzKTtcbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVGV4dGFyZWE7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dGFyZWEuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwO1xuXG4gIHZhciBkZXB0aEEgPSAwO1xuICBmb3IgKHZhciB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSB0ZW1wQS5faG9zdFBhcmVudCkge1xuICAgIGRlcHRoQSsrO1xuICB9XG4gIHZhciBkZXB0aEIgPSAwO1xuICBmb3IgKHZhciB0ZW1wQiA9IGluc3RCOyB0ZW1wQjsgdGVtcEIgPSB0ZW1wQi5faG9zdFBhcmVudCkge1xuICAgIGRlcHRoQisrO1xuICB9XG5cbiAgLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJlbnQ7XG4gICAgZGVwdGhBLS07XG4gIH1cblxuICAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDtcbiAgICBkZXB0aEItLTtcbiAgfVxuXG4gIC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKGluc3RBID09PSBpbnN0Qikge1xuICAgICAgcmV0dXJuIGluc3RBO1xuICAgIH1cbiAgICBpbnN0QSA9IGluc3RBLl9ob3N0UGFyZW50O1xuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIGlmIEEgaXMgYW4gYW5jZXN0b3Igb2YgQi5cbiAqL1xuZnVuY3Rpb24gaXNBbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNScpIDogdm9pZCAwO1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RCKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7XG5cbiAgd2hpbGUgKGluc3RCKSB7XG4gICAgaWYgKGluc3RCID09PSBpbnN0QSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBwYXNzZWQtaW4gaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXRQYXJlbnRJbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNicpIDogdm9pZCAwO1xuXG4gIHJldHVybiBpbnN0Ll9ob3N0UGFyZW50O1xufVxuXG4vKipcbiAqIFNpbXVsYXRlcyB0aGUgdHJhdmVyc2FsIG9mIGEgdHdvLXBoYXNlLCBjYXB0dXJlL2J1YmJsZSBldmVudCBkaXNwYXRjaC5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VUd29QaGFzZShpbnN0LCBmbiwgYXJnKSB7XG4gIHZhciBwYXRoID0gW107XG4gIHdoaWxlIChpbnN0KSB7XG4gICAgcGF0aC5wdXNoKGluc3QpO1xuICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50O1xuICB9XG4gIHZhciBpO1xuICBmb3IgKGkgPSBwYXRoLmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICBmbihwYXRoW2ldLCAnY2FwdHVyZWQnLCBhcmcpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4ocGF0aFtpXSwgJ2J1YmJsZWQnLCBhcmcpO1xuICB9XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIHRoZSBJRCBoaWVyYXJjaHkgYW5kIGludm9rZXMgdGhlIHN1cHBsaWVkIGBjYmAgb24gYW55IElEcyB0aGF0XG4gKiBzaG91bGQgd291bGQgcmVjZWl2ZSBhIGBtb3VzZUVudGVyYCBvciBgbW91c2VMZWF2ZWAgZXZlbnQuXG4gKlxuICogRG9lcyBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IgYmVjYXVzZSBub3RoaW5nXG4gKiBcImVudGVyZWRcIiBvciBcImxlZnRcIiB0aGF0IGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcbiAgdmFyIHBhdGhGcm9tID0gW107XG4gIHdoaWxlIChmcm9tICYmIGZyb20gIT09IGNvbW1vbikge1xuICAgIHBhdGhGcm9tLnB1c2goZnJvbSk7XG4gICAgZnJvbSA9IGZyb20uX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIHBhdGhUbyA9IFtdO1xuICB3aGlsZSAodG8gJiYgdG8gIT09IGNvbW1vbikge1xuICAgIHBhdGhUby5wdXNoKHRvKTtcbiAgICB0byA9IHRvLl9ob3N0UGFyZW50O1xuICB9XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgcGF0aEZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoRnJvbVtpXSwgJ2J1YmJsZWQnLCBhcmdGcm9tKTtcbiAgfVxuICBmb3IgKGkgPSBwYXRoVG8ubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgIGZuKHBhdGhUb1tpXSwgJ2NhcHR1cmVkJywgYXJnVG8pO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FuY2VzdG9yOiBpc0FuY2VzdG9yLFxuICBnZXRMb3dlc3RDb21tb25BbmNlc3RvcjogZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsXG4gIGdldFBhcmVudEluc3RhbmNlOiBnZXRQYXJlbnRJbnN0YW5jZSxcbiAgdHJhdmVyc2VUd29QaGFzZTogdHJhdmVyc2VUd29QaGFzZSxcbiAgdHJhdmVyc2VFbnRlckxlYXZlOiB0cmF2ZXJzZUVudGVyTGVhdmVcbn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NVHJlZVRyYXZlcnNhbC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcmVhY3RQcm9wcyA9IHtcbiAgICBjaGlsZHJlbjogdHJ1ZSxcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogdHJ1ZSxcbiAgICBrZXk6IHRydWUsXG4gICAgcmVmOiB0cnVlLFxuXG4gICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICB2YWx1ZUxpbms6IHRydWUsXG4gICAgZGVmYXVsdENoZWNrZWQ6IHRydWUsXG4gICAgY2hlY2tlZExpbms6IHRydWUsXG4gICAgaW5uZXJIVE1MOiB0cnVlLFxuICAgIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZzogdHJ1ZSxcbiAgICBvbkZvY3VzSW46IHRydWUsXG4gICAgb25Gb2N1c091dDogdHJ1ZVxuICB9O1xuICB2YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xuXG4gIHZhciB2YWxpZGF0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIGRlYnVnSUQpIHtcbiAgICBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChyZWFjdFByb3BzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHJlYWN0UHJvcHNbbmFtZV0gfHwgd2FybmVkUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBkYXRhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuICAgIHZhciBzdGFuZGFyZE5hbWUgPSBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgIGlmIChzdGFuZGFyZE5hbWUgIT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIERPTSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgc3RhbmRhcmROYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuIGAlc2A/JXMnLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlIHVuYWJsZSB0byBndWVzcyB3aGljaCBwcm9wIHRoZSB1c2VyIGludGVuZGVkLlxuICAgICAgLy8gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIHVzZXIgd2FzIGp1c3QgYmxpbmRseSBzcHJlYWRpbmcvZm9yd2FyZGluZyBwcm9wc1xuICAgICAgLy8gQ29tcG9uZW50cyBzaG91bGQgYmUgY2FyZWZ1bCB0byBvbmx5IHJlbmRlciB2YWxpZCBwcm9wcy9hdHRyaWJ1dGVzLlxuICAgICAgLy8gV2FybmluZyB3aWxsIGJlIGludm9rZWQgaW4gd2FyblVua25vd25Qcm9wZXJ0aWVzIHRvIGFsbG93IGdyb3VwaW5nLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIHZhciB1bmtub3duUHJvcHMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpIHtcbiAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkoZWxlbWVudC50eXBlLCBrZXksIGRlYnVnSUQpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gcHJvcCAlcyBvbiA8JXM+IHRhZy4gUmVtb3ZlIHRoaXMgcHJvcCBmcm9tIHRoZSBlbGVtZW50LiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC11bmtub3duLXByb3AlcycsIHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3BzICVzIG9uIDwlcz4gdGFnLiBSZW1vdmUgdGhlc2UgcHJvcHMgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnByb3BzLmlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyhkZWJ1Z0lELCBlbGVtZW50KTtcbn1cblxudmFyIFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayA9IHtcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vaztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaycpO1xudmFyIFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rID0gcmVxdWlyZSgnLi9SZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vaycpO1xudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIHBlcmZvcm1hbmNlTm93ID0gcmVxdWlyZSgnZmJqcy9saWIvcGVyZm9ybWFuY2VOb3cnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgaG9va3MgPSBbXTtcbnZhciBkaWRIb29rVGhyb3dGb3JFdmVudCA9IHt9O1xuXG5mdW5jdGlvbiBjYWxsSG9vayhldmVudCwgZm4sIGNvbnRleHQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpIHtcbiAgdHJ5IHtcbiAgICBmbi5jYWxsKGNvbnRleHQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdLCAnRXhjZXB0aW9uIHRocm93biBieSBob29rIHdoaWxlIGhhbmRsaW5nICVzOiAlcycsIGV2ZW50LCBlICsgJ1xcbicgKyBlLnN0YWNrKSA6IHZvaWQgMDtcbiAgICBkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0gPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFdmVudChldmVudCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGhvb2sgPSBob29rc1tpXTtcbiAgICB2YXIgZm4gPSBob29rW2V2ZW50XTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGNhbGxIb29rKGV2ZW50LCBmbiwgaG9vaywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc1Byb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZsdXNoSGlzdG9yeSA9IFtdO1xudmFyIGxpZmVDeWNsZVRpbWVyU3RhY2sgPSBbXTtcbnZhciBjdXJyZW50Rmx1c2hOZXN0aW5nID0gMDtcbnZhciBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMgPSBbXTtcbnZhciBjdXJyZW50Rmx1c2hTdGFydFRpbWUgPSAwO1xudmFyIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsO1xudmFyIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7XG52YXIgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG52YXIgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7XG5cbnZhciBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjbGVhckhpc3RvcnkoKSB7XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sucHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzKCk7XG4gIFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmNsZWFySGlzdG9yeSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmVlU25hcHNob3QocmVnaXN0ZXJlZElEcykge1xuICByZXR1cm4gcmVnaXN0ZXJlZElEcy5yZWR1Y2UoZnVuY3Rpb24gKHRyZWUsIGlkKSB7XG4gICAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQoaWQpO1xuICAgIHZhciBwYXJlbnRJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgIHRyZWVbaWRdID0ge1xuICAgICAgZGlzcGxheU5hbWU6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoaWQpLFxuICAgICAgdGV4dDogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRUZXh0KGlkKSxcbiAgICAgIHVwZGF0ZUNvdW50OiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFVwZGF0ZUNvdW50KGlkKSxcbiAgICAgIGNoaWxkSURzOiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldENoaWxkSURzKGlkKSxcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBvd25lcnMgYnV0IHRoaXMgaXMgY2xvc2UgZW5vdWdoLlxuICAgICAgb3duZXJJRDogb3duZXJJRCB8fCBwYXJlbnRJRCAmJiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQocGFyZW50SUQpIHx8IDAsXG4gICAgICBwYXJlbnRJRDogcGFyZW50SURcbiAgICB9O1xuICAgIHJldHVybiB0cmVlO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0TWVhc3VyZW1lbnRzKCkge1xuICB2YXIgcHJldmlvdXNTdGFydFRpbWUgPSBjdXJyZW50Rmx1c2hTdGFydFRpbWU7XG4gIHZhciBwcmV2aW91c01lYXN1cmVtZW50cyA9IGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cztcbiAgdmFyIHByZXZpb3VzT3BlcmF0aW9ucyA9IFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmdldEhpc3RvcnkoKTtcblxuICBpZiAoY3VycmVudEZsdXNoTmVzdGluZyA9PT0gMCkge1xuICAgIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IDA7XG4gICAgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzID0gW107XG4gICAgY2xlYXJIaXN0b3J5KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzTWVhc3VyZW1lbnRzLmxlbmd0aCB8fCBwcmV2aW91c09wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgdmFyIHJlZ2lzdGVyZWRJRHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFJlZ2lzdGVyZWRJRHMoKTtcbiAgICBmbHVzaEhpc3RvcnkucHVzaCh7XG4gICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIHByZXZpb3VzU3RhcnRUaW1lLFxuICAgICAgbWVhc3VyZW1lbnRzOiBwcmV2aW91c01lYXN1cmVtZW50cyB8fCBbXSxcbiAgICAgIG9wZXJhdGlvbnM6IHByZXZpb3VzT3BlcmF0aW9ucyB8fCBbXSxcbiAgICAgIHRyZWVTbmFwc2hvdDogZ2V0VHJlZVNuYXBzaG90KHJlZ2lzdGVyZWRJRHMpXG4gICAgfSk7XG4gIH1cblxuICBjbGVhckhpc3RvcnkoKTtcbiAgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzID0gW107XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVidWdJRChkZWJ1Z0lEKSB7XG4gIHZhciBhbGxvd1Jvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChhbGxvd1Jvb3QgJiYgZGVidWdJRCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRlYnVnSUQpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0RGVidWdUb29sOiBkZWJ1Z0lEIG1heSBub3QgYmUgZW1wdHkuJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnJlbnRUaW1lclR5cGUgJiYgIWxpZmVDeWNsZVRpbWVySGFzV2FybmVkKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgUmVhY3QgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgY29kZS4gJyArICdEaWQgbm90IGV4cGVjdCAlcyB0aW1lciB0byBzdGFydCB3aGlsZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAnICsgJ3Byb2dyZXNzIGZvciAlcyBpbnN0YW5jZS4nLCB0aW1lclR5cGUsIGN1cnJlbnRUaW1lclR5cGUgfHwgJ25vJywgZGVidWdJRCA9PT0gY3VycmVudFRpbWVyRGVidWdJRCA/ICd0aGUgc2FtZScgOiAnYW5vdGhlcicpIDogdm9pZCAwO1xuICAgIGxpZmVDeWNsZVRpbWVySGFzV2FybmVkID0gdHJ1ZTtcbiAgfVxuICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDtcbiAgY3VycmVudFRpbWVyRGVidWdJRCA9IGRlYnVnSUQ7XG4gIGN1cnJlbnRUaW1lclR5cGUgPSB0aW1lclR5cGU7XG59XG5cbmZ1bmN0aW9uIGVuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSkge1xuICBpZiAoY3VycmVudEZsdXNoTmVzdGluZyA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY3VycmVudFRpbWVyVHlwZSAhPT0gdGltZXJUeXBlICYmICFsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICcgKyAnV2UgZGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RvcCB3aGlsZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAnICsgJ3Byb2dyZXNzIGZvciAlcyBpbnN0YW5jZS4gUGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnIGluIFJlYWN0LicsIHRpbWVyVHlwZSwgY3VycmVudFRpbWVyVHlwZSB8fCAnbm8nLCBkZWJ1Z0lEID09PSBjdXJyZW50VGltZXJEZWJ1Z0lEID8gJ3RoZSBzYW1lJyA6ICdhbm90aGVyJykgOiB2b2lkIDA7XG4gICAgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSB0cnVlO1xuICB9XG4gIGlmIChpc1Byb2ZpbGluZykge1xuICAgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cy5wdXNoKHtcbiAgICAgIHRpbWVyVHlwZTogdGltZXJUeXBlLFxuICAgICAgaW5zdGFuY2VJRDogZGVidWdJRCxcbiAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZU5vdygpIC0gY3VycmVudFRpbWVyU3RhcnRUaW1lIC0gY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvblxuICAgIH0pO1xuICB9XG4gIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7XG4gIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwO1xuICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDtcbiAgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhdXNlQ3VycmVudExpZmVDeWNsZVRpbWVyKCkge1xuICB2YXIgY3VycmVudFRpbWVyID0ge1xuICAgIHN0YXJ0VGltZTogY3VycmVudFRpbWVyU3RhcnRUaW1lLFxuICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lOiBwZXJmb3JtYW5jZU5vdygpLFxuICAgIGRlYnVnSUQ6IGN1cnJlbnRUaW1lckRlYnVnSUQsXG4gICAgdGltZXJUeXBlOiBjdXJyZW50VGltZXJUeXBlXG4gIH07XG4gIGxpZmVDeWNsZVRpbWVyU3RhY2sucHVzaChjdXJyZW50VGltZXIpO1xuICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDtcbiAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7XG4gIGN1cnJlbnRUaW1lclR5cGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIoKSB7XG4gIHZhciBfbGlmZUN5Y2xlVGltZXJTdGFjayQgPSBsaWZlQ3ljbGVUaW1lclN0YWNrLnBvcCgpLFxuICAgICAgc3RhcnRUaW1lID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLnN0YXJ0VGltZSxcbiAgICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLm5lc3RlZEZsdXNoU3RhcnRUaW1lLFxuICAgICAgZGVidWdJRCA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5kZWJ1Z0lELFxuICAgICAgdGltZXJUeXBlID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLnRpbWVyVHlwZTtcblxuICB2YXIgbmVzdGVkRmx1c2hEdXJhdGlvbiA9IHBlcmZvcm1hbmNlTm93KCkgLSBuZXN0ZWRGbHVzaFN0YXJ0VGltZTtcbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gc3RhcnRUaW1lO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uICs9IG5lc3RlZEZsdXNoRHVyYXRpb247XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEO1xuICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBlO1xufVxuXG52YXIgbGFzdE1hcmtUaW1lU3RhbXAgPSAwO1xudmFyIGNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSA9IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm1hcmsgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm1lYXN1cmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIHNob3VsZE1hcmsoZGVidWdJRCkge1xuICBpZiAoIWlzUHJvZmlsaW5nIHx8ICFjYW5Vc2VQZXJmb3JtYW5jZU1lYXN1cmUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoZGVidWdJRCk7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpc0hvc3RFbGVtZW50ID0gdHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZyc7XG4gIGlmIChpc0hvc3RFbGVtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrQmVnaW4oZGVidWdJRCwgbWFya1R5cGUpIHtcbiAgaWYgKCFzaG91bGRNYXJrKGRlYnVnSUQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG1hcmtOYW1lID0gZGVidWdJRCArICc6OicgKyBtYXJrVHlwZTtcbiAgbGFzdE1hcmtUaW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKTtcbn1cblxuZnVuY3Rpb24gbWFya0VuZChkZWJ1Z0lELCBtYXJrVHlwZSkge1xuICBpZiAoIXNob3VsZE1hcmsoZGVidWdJRCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWFya05hbWUgPSBkZWJ1Z0lEICsgJzo6JyArIG1hcmtUeXBlO1xuICB2YXIgZGlzcGxheU5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGRlYnVnSUQpIHx8ICdVbmtub3duJztcblxuICAvLyBDaHJvbWUgaGFzIGFuIGlzc3VlIG9mIGRyb3BwaW5nIG1hcmtlcnMgcmVjb3JkZWQgdG9vIGZhc3Q6XG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTY0MDY1MlxuICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3ZSB3aWxsIG5vdCByZXBvcnQgdmVyeSBzbWFsbCBtZWFzdXJlbWVudHMuXG4gIC8vIEkgZGV0ZXJtaW5lZCB0aGUgbWFnaWMgbnVtYmVyIGJ5IHR3ZWFraW5nIGl0IGJhY2sgYW5kIGZvcnRoLlxuICAvLyAwLjA1bXMgd2FzIGVub3VnaCB0byBwcmV2ZW50IHRoZSBpc3N1ZSwgYnV0IEkgc2V0IGl0IHRvIDAuMW1zIHRvIGJlIHNhZmUuXG4gIC8vIFdoZW4gdGhlIGJ1ZyBpcyBmaXhlZCwgd2UgY2FuIGBtZWFzdXJlKClgIHVuY29uZGl0aW9uYWxseSBpZiB3ZSB3YW50IHRvLlxuICB2YXIgdGltZVN0YW1wID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgaWYgKHRpbWVTdGFtcCAtIGxhc3RNYXJrVGltZVN0YW1wID4gMC4xKSB7XG4gICAgdmFyIG1lYXN1cmVtZW50TmFtZSA9IGRpc3BsYXlOYW1lICsgJyBbJyArIG1hcmtUeXBlICsgJ10nO1xuICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUobWVhc3VyZW1lbnROYW1lLCBtYXJrTmFtZSk7XG4gIH1cblxuICBwZXJmb3JtYW5jZS5jbGVhck1hcmtzKG1hcmtOYW1lKTtcbiAgaWYgKG1lYXN1cmVtZW50TmFtZSkge1xuICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMobWVhc3VyZW1lbnROYW1lKTtcbiAgfVxufVxuXG52YXIgUmVhY3REZWJ1Z1Rvb2wgPSB7XG4gIGFkZEhvb2s6IGZ1bmN0aW9uIChob29rKSB7XG4gICAgaG9va3MucHVzaChob29rKTtcbiAgfSxcbiAgcmVtb3ZlSG9vazogZnVuY3Rpb24gKGhvb2spIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaG9va3NbaV0gPT09IGhvb2spIHtcbiAgICAgICAgaG9va3Muc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc1Byb2ZpbGluZzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc1Byb2ZpbGluZztcbiAgfSxcbiAgYmVnaW5Qcm9maWxpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNQcm9maWxpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc1Byb2ZpbGluZyA9IHRydWU7XG4gICAgZmx1c2hIaXN0b3J5Lmxlbmd0aCA9IDA7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBSZWFjdERlYnVnVG9vbC5hZGRIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKTtcbiAgfSxcbiAgZW5kUHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1Byb2ZpbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUHJvZmlsaW5nID0gZmFsc2U7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBSZWFjdERlYnVnVG9vbC5yZW1vdmVIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKTtcbiAgfSxcbiAgZ2V0Rmx1c2hIaXN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsdXNoSGlzdG9yeTtcbiAgfSxcbiAgb25CZWdpbkZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgY3VycmVudEZsdXNoTmVzdGluZysrO1xuICAgIHJlc2V0TWVhc3VyZW1lbnRzKCk7XG4gICAgcGF1c2VDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5GbHVzaCcpO1xuICB9LFxuICBvbkVuZEZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBjdXJyZW50Rmx1c2hOZXN0aW5nLS07XG4gICAgcmVzdW1lQ3VycmVudExpZmVDeWNsZVRpbWVyKCk7XG4gICAgZW1pdEV2ZW50KCdvbkVuZEZsdXNoJyk7XG4gIH0sXG4gIG9uQmVnaW5MaWZlQ3ljbGVUaW1lcjogZnVuY3Rpb24gKGRlYnVnSUQsIHRpbWVyVHlwZSkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5MaWZlQ3ljbGVUaW1lcicsIGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgYmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpO1xuICB9LFxuICBvbkVuZExpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCB0aW1lclR5cGUpO1xuICAgIGVtaXRFdmVudCgnb25FbmRMaWZlQ3ljbGVUaW1lcicsIGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIH0sXG4gIG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCcpO1xuICB9LFxuICBvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCcpO1xuICB9LFxuICBvbkhvc3RPcGVyYXRpb246IGZ1bmN0aW9uIChvcGVyYXRpb24pIHtcbiAgICBjaGVja0RlYnVnSUQob3BlcmF0aW9uLmluc3RhbmNlSUQpO1xuICAgIGVtaXRFdmVudCgnb25Ib3N0T3BlcmF0aW9uJywgb3BlcmF0aW9uKTtcbiAgfSxcbiAgb25TZXRTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGVtaXRFdmVudCgnb25TZXRTdGF0ZScpO1xuICB9LFxuICBvblNldENoaWxkcmVuOiBmdW5jdGlvbiAoZGVidWdJRCwgY2hpbGREZWJ1Z0lEcykge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBjaGlsZERlYnVnSURzLmZvckVhY2goY2hlY2tEZWJ1Z0lEKTtcbiAgICBlbWl0RXZlbnQoJ29uU2V0Q2hpbGRyZW4nLCBkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTtcbiAgfSxcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQsIHBhcmVudERlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgY2hlY2tEZWJ1Z0lEKHBhcmVudERlYnVnSUQsIHRydWUpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVNb3VudENvbXBvbmVudCcsIGRlYnVnSUQsIGVsZW1lbnQsIHBhcmVudERlYnVnSUQpO1xuICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAnbW91bnQnKTtcbiAgfSxcbiAgb25Nb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAnbW91bnQnKTtcbiAgICBlbWl0RXZlbnQoJ29uTW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVVcGRhdGVDb21wb25lbnQnLCBkZWJ1Z0lELCBlbGVtZW50KTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VwZGF0ZScpO1xuICB9LFxuICBvblVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAndXBkYXRlJyk7XG4gICAgZW1pdEV2ZW50KCdvblVwZGF0ZUNvbXBvbmVudCcsIGRlYnVnSUQpO1xuICB9LFxuICBvbkJlZm9yZVVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lEKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVVbm1vdW50Q29tcG9uZW50JywgZGVidWdJRCk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsICd1bm1vdW50Jyk7XG4gIH0sXG4gIG9uVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAndW5tb3VudCcpO1xuICAgIGVtaXRFdmVudCgnb25Vbm1vdW50Q29tcG9uZW50JywgZGVidWdJRCk7XG4gIH0sXG4gIG9uVGVzdEV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvblRlc3RFdmVudCcpO1xuICB9XG59O1xuXG4vLyBUT0RPIHJlbW92ZSB0aGVzZSB3aGVuIFJOL3d3dyBnZXRzIHVwZGF0ZWRcblJlYWN0RGVidWdUb29sLmFkZERldnRvb2wgPSBSZWFjdERlYnVnVG9vbC5hZGRIb29rO1xuUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlRGV2dG9vbCA9IFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2s7XG5cblJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vayk7XG5SZWFjdERlYnVnVG9vbC5hZGRIb29rKFJlYWN0Q29tcG9uZW50VHJlZUhvb2spO1xudmFyIHVybCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnJztcbmlmICgvWz8mXXJlYWN0X3BlcmZcXGIvLnRlc3QodXJsKSkge1xuICBSZWFjdERlYnVnVG9vbC5iZWdpblByb2ZpbGluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVidWdUb29sO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERlYnVnVG9vbC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG5cbnZhciBSRVNFVF9CQVRDSEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGVtcHR5RnVuY3Rpb24sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xuICB9XG59O1xuXG52YXIgRkxVU0hfQkFUQ0hFRF9VUERBVEVTID0ge1xuICBpbml0aWFsaXplOiBlbXB0eUZ1bmN0aW9uLFxuICBjbG9zZTogUmVhY3RVcGRhdGVzLmZsdXNoQmF0Y2hlZFVwZGF0ZXMuYmluZChSZWFjdFVwZGF0ZXMpXG59O1xuXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbRkxVU0hfQkFUQ0hFRF9VUERBVEVTLCBSRVNFVF9CQVRDSEVEX1VQREFURVNdO1xuXG5mdW5jdGlvbiBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24oKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbn1cblxuX2Fzc2lnbihSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwge1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTO1xuICB9XG59KTtcblxudmFyIHRyYW5zYWN0aW9uID0gbmV3IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbigpO1xuXG52YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSA9IHtcbiAgaXNCYXRjaGluZ1VwZGF0ZXM6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpbiBhIGNvbnRleHQgd2l0aGluIHdoaWNoIGNhbGxzIHRvIGBzZXRTdGF0ZWBcbiAgICogYW5kIGZyaWVuZHMgYXJlIGJhdGNoZWQgc3VjaCB0aGF0IGNvbXBvbmVudHMgYXJlbid0IHVwZGF0ZWQgdW5uZWNlc3NhcmlseS5cbiAgICovXG4gIGJhdGNoZWRVcGRhdGVzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpIHtcbiAgICB2YXIgYWxyZWFkeUJhdGNoaW5nVXBkYXRlcyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM7XG5cbiAgICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBjb2RlIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgZXh0cmEgYWxsb2NhdGlvbnNcbiAgICBpZiAoYWxyZWFkeUJhdGNoaW5nVXBkYXRlcykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGEsIGIsIGMsIGQsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb24ucGVyZm9ybShjYWxsYmFjaywgbnVsbCwgYSwgYiwgYywgZCwgZSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3k7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9BUklBRE9NUHJvcGVydHlDb25maWcnKTtcbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luJyk7XG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL0NoYW5nZUV2ZW50UGx1Z2luJyk7XG52YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSByZXF1aXJlKCcuL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyJyk7XG52YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9FbnRlckxlYXZlRXZlbnRQbHVnaW4nKTtcbnZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL0hUTUxET01Qcm9wZXJ0eUNvbmZpZycpO1xudmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01FbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IHJlcXVpcmUoJy4vUmVhY3RET01UcmVlVHJhdmVyc2FsJyk7XG52YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTVRleHRDb21wb25lbnQnKTtcbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Jyk7XG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50TGlzdGVuZXInKTtcbnZhciBSZWFjdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbmplY3Rpb24nKTtcbnZhciBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJyk7XG52YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL1NWR0RPTVByb3BlcnR5Q29uZmlnJyk7XG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NlbGVjdEV2ZW50UGx1Z2luJyk7XG52YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NpbXBsZUV2ZW50UGx1Z2luJyk7XG5cbnZhciBhbHJlYWR5SW5qZWN0ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5qZWN0KCkge1xuICBpZiAoYWxyZWFkeUluamVjdGVkKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBjdXJyZW50bHkgdHJ1ZSBiZWNhdXNlIHRoZXNlIGluamVjdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuXG4gICAgLy8gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBwYWNrYWdlLiBUaGV5IHNob3VsZCBiZSBidWlsdCBpbmRlcGVuZGVudGx5XG4gICAgLy8gYW5kIG5vdCBzaGFyZSBhbnkgaW5qZWN0aW9uIHN0YXRlLiBUaGVuIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHNvbHZlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgYWxyZWFkeUluamVjdGVkID0gdHJ1ZTtcblxuICBSZWFjdEluamVjdGlvbi5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKFJlYWN0RXZlbnRMaXN0ZW5lcik7XG5cbiAgLyoqXG4gICAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcik7XG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShSZWFjdERPTUNvbXBvbmVudFRyZWUpO1xuICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTtcblxuICAvKipcbiAgICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gICAqIHRoZW0pLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHtcbiAgICBTaW1wbGVFdmVudFBsdWdpbjogU2ltcGxlRXZlbnRQbHVnaW4sXG4gICAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gICAgQ2hhbmdlRXZlbnRQbHVnaW46IENoYW5nZUV2ZW50UGx1Z2luLFxuICAgIFNlbGVjdEV2ZW50UGx1Z2luOiBTZWxlY3RFdmVudFBsdWdpbixcbiAgICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4gIH0pO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKFJlYWN0RE9NQ29tcG9uZW50KTtcblxuICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhSZWFjdERPTVRleHRDb21wb25lbnQpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFSSUFET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEhUTUxET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmlnKTtcblxuICBSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkoZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFjdERPTUVtcHR5Q29tcG9uZW50KGluc3RhbnRpYXRlKTtcbiAgfSk7XG5cbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbmplY3Q6IGluamVjdFxufTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3REZWZhdWx0SW5qZWN0aW9uLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsnZm9yJ10oJ3JlYWN0LmVsZW1lbnQnKSB8fCAweGVhYzc7XG5cbm1vZHVsZS5leHBvcnRzID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEVsZW1lbnRTeW1ib2wuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50UXVldWVJbkJhdGNoKGV2ZW50cykge1xuICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50cyk7XG4gIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTtcbn1cblxudmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBTdHJlYW1zIGEgZmlyZWQgdG9wLWxldmVsIGV2ZW50IHRvIGBFdmVudFBsdWdpbkh1YmAgd2hlcmUgcGx1Z2lucyBoYXZlIHRoZVxuICAgKiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYFJlYWN0RXZlbnRgcyB0byBiZSBkaXNwYXRjaGVkLlxuICAgKi9cbiAgaGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBldmVudHMgPSBFdmVudFBsdWdpbkh1Yi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVudHMpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRFbWl0dGVyTWl4aW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xudmFyIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24nKTtcblxuLyoqXG4gKiBGaW5kIHRoZSBkZWVwZXN0IFJlYWN0IGNvbXBvbmVudCBjb21wbGV0ZWx5IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlXG4gKiBwYXNzZWQtaW4gaW5zdGFuY2UgKGZvciB1c2Ugd2hlbiBlbnRpcmUgUmVhY3QgdHJlZXMgYXJlIG5lc3RlZCB3aXRoaW4gZWFjaFxuICogb3RoZXIpLiBJZiBSZWFjdCB0cmVlcyBhcmUgbm90IG5lc3RlZCwgcmV0dXJucyBudWxsLlxuICovXG5mdW5jdGlvbiBmaW5kUGFyZW50KGluc3QpIHtcbiAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET01cbiAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYVxuICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy5cbiAgd2hpbGUgKGluc3QuX2hvc3RQYXJlbnQpIHtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgdmFyIGNvbnRhaW5lciA9IHJvb3ROb2RlLnBhcmVudE5vZGU7XG4gIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcbn1cblxuLy8gVXNlZCB0byBzdG9yZSBhbmNlc3RvciBoaWVyYXJjaHkgaW4gdG9wIGxldmVsIGNhbGxiYWNrXG5mdW5jdGlvbiBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICB0aGlzLnRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZTtcbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICB0aGlzLmFuY2VzdG9ycyA9IFtdO1xufVxuX2Fzc2lnbihUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucHJvdG90eXBlLCB7XG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRvcExldmVsVHlwZSA9IG51bGw7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5hbmNlc3RvcnMubGVuZ3RoID0gMDtcbiAgfVxufSk7XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLCBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIGhhbmRsZVRvcExldmVsSW1wbChib29rS2VlcGluZykge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGhpZXJhcmNoeSwgaW4gY2FzZSB0aGVyZSdzIGFueSBuZXN0ZWQgY29tcG9uZW50cy5cbiAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBidWlsZCB0aGUgYXJyYXkgb2YgYW5jZXN0b3JzIGJlZm9yZSBjYWxsaW5nIGFueVxuICAvLyBldmVudCBoYW5kbGVycywgYmVjYXVzZSBldmVudCBoYW5kbGVycyBjYW4gbW9kaWZ5IHRoZSBET00sIGxlYWRpbmcgdG9cbiAgLy8gaW5jb25zaXN0ZW5jaWVzIHdpdGggUmVhY3RNb3VudCdzIG5vZGUgY2FjaGUuIFNlZSAjMTEwNS5cbiAgdmFyIGFuY2VzdG9yID0gdGFyZ2V0SW5zdDtcbiAgZG8ge1xuICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICBhbmNlc3RvciA9IGFuY2VzdG9yICYmIGZpbmRQYXJlbnQoYW5jZXN0b3IpO1xuICB9IHdoaWxlIChhbmNlc3Rvcik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY3JvbGxWYWx1ZU1vbml0b3IoY2IpIHtcbiAgdmFyIHNjcm9sbFBvc2l0aW9uID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2luZG93KTtcbiAgY2Ioc2Nyb2xsUG9zaXRpb24pO1xufVxuXG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0ge1xuICBfZW5hYmxlZDogdHJ1ZSxcbiAgX2hhbmRsZVRvcExldmVsOiBudWxsLFxuXG4gIFdJTkRPV19IQU5ETEU6IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHdpbmRvdyA6IG51bGwsXG5cbiAgc2V0SGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uIChoYW5kbGVUb3BMZXZlbCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwgPSBoYW5kbGVUb3BMZXZlbDtcbiAgfSxcblxuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCA9ICEhZW5hYmxlZDtcbiAgfSxcblxuICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyB0b3AtbGV2ZWwgZXZlbnRzIGJ5IHVzaW5nIGV2ZW50IGJ1YmJsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiBcImNsaWNrXCIpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudCBFbGVtZW50IG9uIHdoaWNoIHRvIGF0dGFjaCBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5XG4gICAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5saXN0ZW4oZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyBhIHRvcC1sZXZlbCBldmVudCBieSB1c2luZyBldmVudCBjYXB0dXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5jYXB0dXJlKGVsZW1lbnQsIGhhbmRsZXJCYXNlTmFtZSwgUmVhY3RFdmVudExpc3RlbmVyLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTtcbiAgfSxcblxuICBtb25pdG9yU2Nyb2xsVmFsdWU6IGZ1bmN0aW9uIChyZWZyZXNoKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2Nyb2xsVmFsdWVNb25pdG9yLmJpbmQobnVsbCwgcmVmcmVzaCk7XG4gICAgRXZlbnRMaXN0ZW5lci5saXN0ZW4od2luZG93LCAnc2Nyb2xsJywgY2FsbGJhY2spO1xuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gICAgaWYgKCFSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm9va0tlZXBpbmcgPSBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcuZ2V0UG9vbGVkKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgIHRyeSB7XG4gICAgICAvLyBFdmVudCBxdWV1ZSBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgY3ljbGUgYWxsb3dzXG4gICAgICAvLyBgcHJldmVudERlZmF1bHRgLlxuICAgICAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKGhhbmRsZVRvcExldmVsSW1wbCwgYm9va0tlZXBpbmcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucmVsZWFzZShib29rS2VlcGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRMaXN0ZW5lcjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudExpc3RlbmVyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGlzdG9yeSA9IFtdO1xuXG52YXIgUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2sgPSB7XG4gIG9uSG9zdE9wZXJhdGlvbjogZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIGhpc3RvcnkucHVzaChvcGVyYXRpb24pO1xuICB9LFxuICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2suX3ByZXZlbnRDbGVhcmluZykge1xuICAgICAgLy8gU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdHMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGlzdG9yeSA9IFtdO1xuICB9LFxuICBnZXRIaXN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGhpc3Rvcnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2s7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcbnZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEhvc3RDb21wb25lbnQnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgUmVhY3RJbmplY3Rpb24gPSB7XG4gIENvbXBvbmVudDogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5pbmplY3Rpb24sXG4gIERPTVByb3BlcnR5OiBET01Qcm9wZXJ0eS5pbmplY3Rpb24sXG4gIEVtcHR5Q29tcG9uZW50OiBSZWFjdEVtcHR5Q29tcG9uZW50LmluamVjdGlvbixcbiAgRXZlbnRQbHVnaW5IdWI6IEV2ZW50UGx1Z2luSHViLmluamVjdGlvbixcbiAgRXZlbnRQbHVnaW5VdGlsczogRXZlbnRQbHVnaW5VdGlscy5pbmplY3Rpb24sXG4gIEV2ZW50RW1pdHRlcjogUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmluamVjdGlvbixcbiAgSG9zdENvbXBvbmVudDogUmVhY3RIb3N0Q29tcG9uZW50LmluamVjdGlvbixcbiAgVXBkYXRlczogUmVhY3RVcGRhdGVzLmluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEluamVjdGlvbjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IGZhbHNlO1xuXG4gIHZhciB3YXJuSW52YWxpZFNldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFwcm9jZXNzaW5nQ2hpbGRDb250ZXh0LCAnc2V0U3RhdGUoLi4uKTogQ2Fubm90IGNhbGwgc2V0U3RhdGUoKSBpbnNpZGUgZ2V0Q2hpbGRDb250ZXh0KCknKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxudmFyIFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2sgPSB7XG4gIG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IHRydWU7XG4gIH0sXG4gIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSBmYWxzZTtcbiAgfSxcbiAgb25TZXRTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIHdhcm5JbnZhbGlkU2V0U3RhdGUoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcblxudmFyIFRBR19FTkQgPSAvXFwvPz4vO1xudmFyIENPTU1FTlRfU1RBUlQgPSAvXjxcXCFcXC1cXC0vO1xuXG52YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHtcbiAgQ0hFQ0tTVU1fQVRUUl9OQU1FOiAnZGF0YS1yZWFjdC1jaGVja3N1bScsXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcgd2l0aCBjaGVja3N1bSBhdHRyaWJ1dGUgYXR0YWNoZWRcbiAgICovXG4gIGFkZENoZWNrc3VtVG9NYXJrdXA6IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgY2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7XG5cbiAgICAvLyBBZGQgY2hlY2tzdW0gKGhhbmRsZSBib3RoIHBhcmVudCB0YWdzLCBjb21tZW50cyBhbmQgc2VsZi1jbG9zaW5nIHRhZ3MpXG4gICAgaWYgKENPTU1FTlRfU1RBUlQudGVzdChtYXJrdXApKSB7XG4gICAgICByZXR1cm4gbWFya3VwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWFya3VwLnJlcGxhY2UoVEFHX0VORCwgJyAnICsgUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUgKyAnPVwiJyArIGNoZWNrc3VtICsgJ1wiJCYnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgdG8gdXNlXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCByb290IFJlYWN0IGVsZW1lbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHRoZSBtYXJrdXAgaXMgdGhlIHNhbWVcbiAgICovXG4gIGNhblJldXNlTWFya3VwOiBmdW5jdGlvbiAobWFya3VwLCBlbGVtZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nQ2hlY2tzdW0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG4gICAgZXhpc3RpbmdDaGVja3N1bSA9IGV4aXN0aW5nQ2hlY2tzdW0gJiYgcGFyc2VJbnQoZXhpc3RpbmdDaGVja3N1bSwgMTApO1xuICAgIHZhciBtYXJrdXBDaGVja3N1bSA9IGFkbGVyMzIobWFya3VwKTtcbiAgICByZXR1cm4gbWFya3VwQ2hlY2tzdW0gPT09IGV4aXN0aW5nQ2hlY2tzdW07XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNYXJrdXBDaGVja3N1bTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RNYXJrdXBDaGVja3N1bS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFJlYWN0Q2hpbGRSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkUmVjb25jaWxlcicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBmbGF0dGVuQ2hpbGRyZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW5DaGlsZHJlbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBtYXJrdXAgdG8gYmUgcmVuZGVyZWQgYW5kIGluc2VydGVkIGF0IGEgc3VwcGxpZWQgaW5kZXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhhdCByZW5kZXJzIGludG8gYW4gZWxlbWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUluc2VydE1hcmt1cChtYXJrdXAsIGFmdGVyTm9kZSwgdG9JbmRleCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0lOU0VSVF9NQVJLVVAnLFxuICAgIGNvbnRlbnQ6IG1hcmt1cCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogdG9JbmRleCxcbiAgICBhZnRlck5vZGU6IGFmdGVyTm9kZVxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBtb3ZpbmcgYW4gZXhpc3RpbmcgZWxlbWVudCB0byBhbm90aGVyIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggU291cmNlIGluZGV4IG9mIHRoZSBleGlzdGluZyBlbGVtZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlTW92ZShjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4KSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTU9WRV9FWElTVElORycsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBmcm9tSW5kZXg6IGNoaWxkLl9tb3VudEluZGV4LFxuICAgIGZyb21Ob2RlOiBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUoY2hpbGQpLFxuICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgcmVtb3ZpbmcgYW4gZWxlbWVudCBhdCBhbiBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VSZW1vdmUoY2hpbGQsIG5vZGUpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdSRU1PVkVfTk9ERScsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBmcm9tSW5kZXg6IGNoaWxkLl9tb3VudEluZGV4LFxuICAgIGZyb21Ob2RlOiBub2RlLFxuICAgIHRvSW5kZXg6IG51bGwsXG4gICAgYWZ0ZXJOb2RlOiBudWxsXG4gIH07XG59XG5cbi8qKlxuICogTWFrZSBhbiB1cGRhdGUgZm9yIHNldHRpbmcgdGhlIG1hcmt1cCBvZiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhhdCByZW5kZXJzIGludG8gYW4gZWxlbWVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VTZXRNYXJrdXAobWFya3VwKSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnU0VUX01BUktVUCcsXG4gICAgY29udGVudDogbWFya3VwLFxuICAgIGZyb21JbmRleDogbnVsbCxcbiAgICBmcm9tTm9kZTogbnVsbCxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRDb250ZW50IFRleHQgY29udGVudCB0byBzZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlVGV4dENvbnRlbnQodGV4dENvbnRlbnQpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdURVhUX0NPTlRFTlQnLFxuICAgIGNvbnRlbnQ6IHRleHRDb250ZW50LFxuICAgIGZyb21JbmRleDogbnVsbCxcbiAgICBmcm9tTm9kZTogbnVsbCxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIFB1c2ggYW4gdXBkYXRlLCBpZiBhbnksIG9udG8gdGhlIHF1ZXVlLiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGlmIG5vbmUgaXNcbiAqIHBhc3NlZCBhbmQgYWx3YXlzIHJldHVybnMgdGhlIHF1ZXVlLiBNdXRhdGl2ZS5cbiAqL1xuZnVuY3Rpb24gZW5xdWV1ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIGlmICh1cGRhdGUpIHtcbiAgICBxdWV1ZSA9IHF1ZXVlIHx8IFtdO1xuICAgIHF1ZXVlLnB1c2godXBkYXRlKTtcbiAgfVxuICByZXR1cm4gcXVldWU7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFueSBlbnF1ZXVlZCB1cGRhdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShpbnN0LCB1cGRhdGVRdWV1ZSkge1xuICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoaW5zdCwgdXBkYXRlUXVldWUpO1xufVxuXG52YXIgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24gPSBlbXB0eUZ1bmN0aW9uO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGdldERlYnVnSUQgPSBmdW5jdGlvbiAoaW5zdCkge1xuICAgIGlmICghaW5zdC5fZGVidWdJRCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIEFSVC1saWtlIGluc3RhbmNlcy4gVE9ETzogVGhpcyBpcyBzaWxseS9ncm9zcy5cbiAgICAgIHZhciBpbnRlcm5hbDtcbiAgICAgIGlmIChpbnRlcm5hbCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3QpKSB7XG4gICAgICAgIGluc3QgPSBpbnRlcm5hbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc3QuX2RlYnVnSUQ7XG4gIH07XG4gIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgdmFyIGRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpO1xuICAgIC8vIFRPRE86IFJlYWN0IE5hdGl2ZSBlbXB0eSBjb21wb25lbnRzIGFyZSBhbHNvIG11bHRpY2hpbGQuXG4gICAgLy8gVGhpcyBtZWFucyB0aGV5IHN0aWxsIGdldCBpbnRvIHRoaXMgbWV0aG9kIGJ1dCBkb24ndCBoYXZlIF9kZWJ1Z0lELlxuICAgIGlmIChkZWJ1Z0lEICE9PSAwKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBjaGlsZHJlbiA/IE9iamVjdC5rZXlzKGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW5ba2V5XS5fZGVidWdJRDtcbiAgICAgIH0pIDogW10pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFjdE11bHRpQ2hpbGQgYXJlIGNhcGFibGUgb2YgcmVjb25jaWxpbmcgbXVsdGlwbGUgY2hpbGRyZW4uXG4gKlxuICogQGNsYXNzIFJlYWN0TXVsdGlDaGlsZFxuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdE11bHRpQ2hpbGQgPSB7XG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgY29tcG9uZW50cyB0aGF0IG11c3QgcmVjb25jaWxlIG11bHRpcGxlXG4gICAqIGNoaWxkcmVuLiBUaGlzIGlzIHVzZWQgYnkgYFJlYWN0RE9NQ29tcG9uZW50YCB0byBtb3VudCwgdXBkYXRlLCBhbmRcbiAgICogdW5tb3VudCBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAbGVuZHMge1JlYWN0TXVsdGlDaGlsZC5wcm90b3R5cGV9XG4gICAqL1xuICBNaXhpbjoge1xuICAgIF9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciBuZXh0Q2hpbGRyZW47XG4gICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2VsZkRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIG5leHRDaGlsZHJlbiA9IGZsYXR0ZW5DaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgc2VsZkRlYnVnSUQpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9ob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpO1xuICAgICAgICAgIHJldHVybiBuZXh0Q2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHRDaGlsZHJlbiA9IGZsYXR0ZW5DaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgc2VsZkRlYnVnSUQpO1xuICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9ob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpO1xuICAgICAgcmV0dXJuIG5leHRDaGlsZHJlbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgXCJtb3VudCBpbWFnZVwiIGZvciBlYWNoIG9mIHRoZSBzdXBwbGllZCBjaGlsZHJlbi4gSW4gdGhlIGNhc2VcbiAgICAgKiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50IGltYWdlIGlzIGEgc3RyaW5nIG9mIG1hcmt1cC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmVzdGVkQ2hpbGRyZW4gTmVzdGVkIGNoaWxkIG1hcHMuXG4gICAgICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IG9mIG1vdW50ZWQgcmVwcmVzZW50YXRpb25zLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHZhciBtb3VudEltYWdlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5bbmFtZV07XG4gICAgICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gMDtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgc2VsZkRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBpbmRleCsrO1xuICAgICAgICAgIG1vdW50SW1hZ2VzLnB1c2gobW91bnRJbWFnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2FsbCh0aGlzLCBjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtb3VudEltYWdlcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSB0ZXh0IGNvbnRlbnQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRDb250ZW50IFN0cmluZyBvZiBjb250ZW50LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZVRleHRDb250ZW50OiBmdW5jdGlvbiAobmV4dENvbnRlbnQpIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgLy8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi5cbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlVGV4dENvbnRlbnQgY2FsbGVkIG9uIG5vbi1lbXB0eSBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMTE4JykgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBuZXcgdGV4dCBjb250ZW50LlxuICAgICAgdmFyIHVwZGF0ZXMgPSBbbWFrZVRleHRDb250ZW50KG5leHRDb250ZW50KV07XG4gICAgICBwcm9jZXNzUXVldWUodGhpcywgdXBkYXRlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbWFya3VwIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0TWFya3VwIFN0cmluZyBvZiBtYXJrdXAuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlTWFya3VwOiBmdW5jdGlvbiAobmV4dE1hcmt1cCkge1xuICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47XG4gICAgICAvLyBSZW1vdmUgYW55IHJlbmRlcmVkIGNoaWxkcmVuLlxuICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbiwgZmFsc2UpO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGVUZXh0Q29udGVudCBjYWxsZWQgb24gbm9uLWVtcHR5IGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTgnKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHVwZGF0ZXMgPSBbbWFrZVNldE1hcmt1cChuZXh0TWFya3VwKV07XG4gICAgICBwcm9jZXNzUXVldWUodGhpcywgdXBkYXRlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggbmV3IGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyBOZXN0ZWQgY2hpbGQgZWxlbWVudCBtYXBzLlxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgLy8gSG9vayB1c2VkIGJ5IFJlYWN0IEFSVFxuICAgICAgdGhpcy5fdXBkYXRlQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyBOZXN0ZWQgY2hpbGQgZWxlbWVudCBtYXBzLlxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAZmluYWxcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3VwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIHZhciByZW1vdmVkTm9kZXMgPSB7fTtcbiAgICAgIHZhciBtb3VudEltYWdlcyA9IFtdO1xuICAgICAgdmFyIG5leHRDaGlsZHJlbiA9IHRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiAmJiAhcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB1cGRhdGVzID0gbnVsbDtcbiAgICAgIHZhciBuYW1lO1xuICAgICAgLy8gYG5leHRJbmRleGAgd2lsbCBpbmNyZW1lbnQgZm9yIGVhY2ggY2hpbGQgaW4gYG5leHRDaGlsZHJlbmAsIGJ1dFxuICAgICAgLy8gYGxhc3RJbmRleGAgd2lsbCBiZSB0aGUgbGFzdCBpbmRleCB2aXNpdGVkIGluIGBwcmV2Q2hpbGRyZW5gLlxuICAgICAgdmFyIG5leHRJbmRleCA9IDA7XG4gICAgICB2YXIgbGFzdEluZGV4ID0gMDtcbiAgICAgIC8vIGBuZXh0TW91bnRJbmRleGAgd2lsbCBpbmNyZW1lbnQgZm9yIGVhY2ggbmV3bHkgbW91bnRlZCBjaGlsZC5cbiAgICAgIHZhciBuZXh0TW91bnRJbmRleCA9IDA7XG4gICAgICB2YXIgbGFzdFBsYWNlZE5vZGUgPSBudWxsO1xuICAgICAgZm9yIChuYW1lIGluIG5leHRDaGlsZHJlbikge1xuICAgICAgICBpZiAoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gbmV4dENoaWxkcmVuW25hbWVdO1xuICAgICAgICBpZiAocHJldkNoaWxkID09PSBuZXh0Q2hpbGQpIHtcbiAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLm1vdmVDaGlsZChwcmV2Q2hpbGQsIGxhc3RQbGFjZWROb2RlLCBuZXh0SW5kZXgsIGxhc3RJbmRleCkpO1xuICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICBwcmV2Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGBsYXN0SW5kZXhgIGJlZm9yZSBgX21vdW50SW5kZXhgIGdldHMgdW5zZXQgYnkgdW5tb3VudGluZy5cbiAgICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICAgIC8vIFRoZSBgcmVtb3ZlZE5vZGVzYCBsb29wIGJlbG93IHdpbGwgYWN0dWFsbHkgcmVtb3ZlIHRoZSBjaGlsZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBpdCdzIG1vdW50ZWQuXG4gICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5fbW91bnRDaGlsZEF0SW5kZXgobmV4dENoaWxkLCBtb3VudEltYWdlc1tuZXh0TW91bnRJbmRleF0sIGxhc3RQbGFjZWROb2RlLCBuZXh0SW5kZXgsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSk7XG4gICAgICAgICAgbmV4dE1vdW50SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUobmV4dENoaWxkKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudC5cbiAgICAgIGZvciAobmFtZSBpbiByZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgaWYgKHJlbW92ZWROb2Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMuX3VubW91bnRDaGlsZChwcmV2Q2hpbGRyZW5bbmFtZV0sIHJlbW92ZWROb2Rlc1tuYW1lXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlcykge1xuICAgICAgICBwcm9jZXNzUXVldWUodGhpcywgdXBkYXRlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbmV4dENoaWxkcmVuO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbi5jYWxsKHRoaXMsIG5leHRDaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubW91bnRzIGFsbCByZW5kZXJlZCBjaGlsZHJlbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBjbGVhbiB1cCBjaGlsZHJlblxuICAgICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLiBJdCBkb2VzIG5vdCBhY3R1YWxseSBwZXJmb3JtIGFueVxuICAgICAqIGJhY2tlbmQgb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVubW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKHNhZmVseSkge1xuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHJlbmRlcmVkQ2hpbGRyZW4sIHNhZmVseSk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBjaGlsZCBjb21wb25lbnQgdG8gdGhlIHN1cHBsaWVkIGluZGV4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIG1vdmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhc3RJbmRleCBMYXN0IGluZGV4IHZpc2l0ZWQgb2YgdGhlIHNpYmxpbmdzIG9mIGBjaGlsZGAuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgsIGxhc3RJbmRleCkge1xuICAgICAgLy8gSWYgdGhlIGluZGV4IG9mIGBjaGlsZGAgaXMgbGVzcyB0aGFuIGBsYXN0SW5kZXhgLCB0aGVuIGl0IG5lZWRzIHRvXG4gICAgICAvLyBiZSBtb3ZlZC4gT3RoZXJ3aXNlLCB3ZSBkbyBub3QgbmVlZCB0byBtb3ZlIGl0IGJlY2F1c2UgYSBjaGlsZCB3aWxsIGJlXG4gICAgICAvLyBpbnNlcnRlZCBvciBtb3ZlZCBiZWZvcmUgYGNoaWxkYC5cbiAgICAgIGlmIChjaGlsZC5fbW91bnRJbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICByZXR1cm4gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb3VudEltYWdlIE1hcmt1cCB0byBpbnNlcnQuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGNyZWF0ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFnZSkge1xuICAgICAgcmV0dXJuIG1ha2VJbnNlcnRNYXJrdXAobW91bnRJbWFnZSwgYWZ0ZXJOb2RlLCBjaGlsZC5fbW91bnRJbmRleCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDaGlsZCB0byByZW1vdmUuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHJlbW92ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIG5vZGUpIHtcbiAgICAgIHJldHVybiBtYWtlUmVtb3ZlKGNoaWxkLCBub2RlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTW91bnRzIGEgY2hpbGQgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoaXMgaXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBoZXJlIGZvciByZWFkYWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBtb3VudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjaGlsZC5cbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbW91bnRDaGlsZEF0SW5kZXg6IGZ1bmN0aW9uIChjaGlsZCwgbW91bnRJbWFnZSwgYWZ0ZXJOb2RlLCBpbmRleCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIGNoaWxkLl9tb3VudEluZGV4ID0gaW5kZXg7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZChjaGlsZCwgYWZ0ZXJOb2RlLCBtb3VudEltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5tb3VudHMgYSByZW5kZXJlZCBjaGlsZC5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoaXMgaXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBoZXJlIGZvciByZWFkYWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byB1bm1vdW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VubW91bnRDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7XG4gICAgICB2YXIgdXBkYXRlID0gdGhpcy5yZW1vdmVDaGlsZChjaGlsZCwgbm9kZSk7XG4gICAgICBjaGlsZC5fbW91bnRJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE11bHRpQ2hpbGQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0TXVsdGlDaGlsZC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgb3duZXIuXG4gKiBAZmluYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE93bmVyKG9iamVjdCkge1xuICByZXR1cm4gISEob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QuYXR0YWNoUmVmID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmplY3QuZGV0YWNoUmVmID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBSZWFjdE93bmVycyBhcmUgY2FwYWJsZSBvZiBzdG9yaW5nIHJlZmVyZW5jZXMgdG8gb3duZWQgY29tcG9uZW50cy5cbiAqXG4gKiBBbGwgY29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAvL2JlaW5nLy8gcmVmZXJlbmNlZCBieSBvd25lciBjb21wb25lbnRzLCBidXRcbiAqIG9ubHkgUmVhY3RPd25lciBjb21wb25lbnRzIGFyZSBjYXBhYmxlIG9mIC8vcmVmZXJlbmNpbmcvLyBvd25lZCBjb21wb25lbnRzLlxuICogVGhlIG5hbWVkIHJlZmVyZW5jZSBpcyBrbm93biBhcyBhIFwicmVmXCIuXG4gKlxuICogUmVmcyBhcmUgYXZhaWxhYmxlIHdoZW4gbW91bnRlZCBhbmQgdXBkYXRlZCBkdXJpbmcgcmVjb25jaWxpYXRpb24uXG4gKlxuICogICB2YXIgTXlDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAoXG4gKiAgICAgICAgIDxkaXYgb25DbGljaz17dGhpcy5oYW5kbGVDbGlja30+XG4gKiAgICAgICAgICAgPEN1c3RvbUNvbXBvbmVudCByZWY9XCJjdXN0b21cIiAvPlxuICogICAgICAgICA8L2Rpdj5cbiAqICAgICAgICk7XG4gKiAgICAgfSxcbiAqICAgICBoYW5kbGVDbGljazogZnVuY3Rpb24oKSB7XG4gKiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmhhbmRsZUNsaWNrKCk7XG4gKiAgICAgfSxcbiAqICAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG4gKiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmluaXRpYWxpemUoKTtcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFJlZnMgc2hvdWxkIHJhcmVseSBiZSB1c2VkLiBXaGVuIHJlZnMgYXJlIHVzZWQsIHRoZXkgc2hvdWxkIG9ubHkgYmUgZG9uZSB0b1xuICogY29udHJvbCBkYXRhIHRoYXQgaXMgbm90IGhhbmRsZWQgYnkgUmVhY3QncyBkYXRhIGZsb3cuXG4gKlxuICogQGNsYXNzIFJlYWN0T3duZXJcbiAqL1xudmFyIFJlYWN0T3duZXIgPSB7XG4gIC8qKlxuICAgKiBBZGRzIGEgY29tcG9uZW50IGJ5IHJlZiB0byBhbiBvd25lciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgYnkgd2hpY2ggdG8gcmVmZXIgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHtSZWFjdE93bmVyfSBvd25lciBDb21wb25lbnQgb24gd2hpY2ggdG8gcmVjb3JkIHRoZSByZWYuXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGFkZENvbXBvbmVudEFzUmVmVG86IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwgb3duZXIpIHtcbiAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdhZGRDb21wb25lbnRBc1JlZlRvKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJlZnMuIFlvdSBtaWdodCBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XFwncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1tdXN0LWhhdmUtb3duZXIpLicpIDogX3Byb2RJbnZhcmlhbnQoJzExOScpIDogdm9pZCAwO1xuICAgIG93bmVyLmF0dGFjaFJlZihyZWYsIGNvbXBvbmVudCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjb21wb25lbnQgYnkgcmVmIGZyb20gYW4gb3duZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGRlcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgb2YgdGhlIHJlZiB0byByZW1vdmUuXG4gICAqIEBwYXJhbSB7UmVhY3RPd25lcn0gb3duZXIgQ29tcG9uZW50IG9uIHdoaWNoIHRoZSByZWYgaXMgcmVjb3JkZWQuXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbTogZnVuY3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikge1xuICAgICFpc1ZhbGlkT3duZXIob3duZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3JlbW92ZUNvbXBvbmVudEFzUmVmRnJvbSguLi4pOiBPbmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZzLiBZb3UgbWlnaHQgYmUgcmVtb3ZpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XFwncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1tdXN0LWhhdmUtb3duZXIpLicpIDogX3Byb2RJbnZhcmlhbnQoJzEyMCcpIDogdm9pZCAwO1xuICAgIHZhciBvd25lclB1YmxpY0luc3RhbmNlID0gb3duZXIuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAvLyBDaGVjayB0aGF0IGBjb21wb25lbnRgJ3Mgb3duZXIgaXMgc3RpbGwgYWxpdmUgYW5kIHRoYXQgYGNvbXBvbmVudGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgcmVmXG4gICAgLy8gYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0byBkZXRhY2ggdGhlIHJlZiBpZiBhbm90aGVyIGNvbXBvbmVudCBzdG9sZSBpdC5cbiAgICBpZiAob3duZXJQdWJsaWNJbnN0YW5jZSAmJiBvd25lclB1YmxpY0luc3RhbmNlLnJlZnNbcmVmXSA9PT0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCkpIHtcbiAgICAgIG93bmVyLmRldGFjaFJlZihyZWYpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE93bmVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdE93bmVyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IHJlcXVpcmUoJy4vQ2FsbGJhY2tRdWV1ZScpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xudmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTtcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQsIHdoZW4gcG9zc2libGUsIHRoZSBzZWxlY3Rpb24gcmFuZ2UgKGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XG4gKiBpbnB1dCkgaXMgbm90IGRpc3R1cmJlZCBieSBwZXJmb3JtaW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAqL1xudmFyIFNFTEVDVElPTl9SRVNUT1JBVElPTiA9IHtcbiAgLyoqXG4gICAqIEByZXR1cm4ge1NlbGVjdGlvbn0gU2VsZWN0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaW5pdGlhbGl6ZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvcm1hdGlvbixcbiAgLyoqXG4gICAqIEBwYXJhbSB7U2VsZWN0aW9ufSBzZWwgU2VsZWN0aW9uIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gYGluaXRpYWxpemVgLlxuICAgKi9cbiAgY2xvc2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24ucmVzdG9yZVNlbGVjdGlvblxufTtcblxuLyoqXG4gKiBTdXBwcmVzc2VzIGV2ZW50cyAoYmx1ci9mb2N1cykgdGhhdCBjb3VsZCBiZSBpbmFkdmVydGVudGx5IGRpc3BhdGNoZWQgZHVlIHRvXG4gKiBoaWdoIGxldmVsIERPTSBtYW5pcHVsYXRpb25zIChsaWtlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGEgdGV4dCBpbnB1dCBmcm9tIHRoZVxuICogRE9NKS5cbiAqL1xudmFyIEVWRU5UX1NVUFBSRVNTSU9OID0ge1xuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIGVuYWJsZWQgc3RhdHVzIG9mIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGJlZm9yZVxuICAgKiB0aGUgcmVjb25jaWxpYXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRseUVuYWJsZWQgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaXNFbmFibGVkKCk7XG4gICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJsZWQoZmFsc2UpO1xuICAgIHJldHVybiBjdXJyZW50bHlFbmFibGVkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByZXZpb3VzbHlFbmFibGVkIEVuYWJsZWQgc3RhdHVzIG9mXG4gICAqICAgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgYmVmb3JlIHRoZSByZWNvbmNpbGlhdGlvbiBvY2N1cnJlZC4gYGNsb3NlYFxuICAgKiAgIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICovXG4gIGNsb3NlOiBmdW5jdGlvbiAocHJldmlvdXNseUVuYWJsZWQpIHtcbiAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc2V0RW5hYmxlZChwcmV2aW91c2x5RW5hYmxlZCk7XG4gIH1cbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYSBxdWV1ZSBmb3IgY29sbGVjdGluZyBgY29tcG9uZW50RGlkTW91bnRgIGFuZFxuICogYGNvbXBvbmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gKi9cbnZhciBPTl9ET01fUkVBRFlfUVVFVUVJTkcgPSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgYG9uRE9NUmVhZHlgIHF1ZXVlLlxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFmdGVyIERPTSBpcyBmbHVzaGVkLCBpbnZva2UgYWxsIHJlZ2lzdGVyZWQgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcy5cbiAgICovXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCk7XG4gIH1cbn07XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtTRUxFQ1RJT05fUkVTVE9SQVRJT04sIEVWRU5UX1NVUFBSRVNTSU9OLCBPTl9ET01fUkVBRFlfUVVFVUVJTkddO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHtcbiAgICBpbml0aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoLFxuICAgIGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaFxuICB9KTtcbn1cblxuLyoqXG4gKiBDdXJyZW50bHk6XG4gKiAtIFRoZSBvcmRlciB0aGF0IHRoZXNlIGFyZSBsaXN0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNyaXRpY2FsOlxuICogLSBTdXBwcmVzc2VzIGV2ZW50cy5cbiAqIC0gUmVzdG9yZXMgc2VsZWN0aW9uIHJhbmdlLlxuICpcbiAqIEZ1dHVyZTpcbiAqIC0gUmVzdG9yZSBkb2N1bWVudC9vdmVyZmxvdyBzY3JvbGwgcG9zaXRpb25zIHRoYXQgd2VyZSB1bmludGVudGlvbmFsbHlcbiAqICAgbW9kaWZpZWQgdmlhIERPTSBpbnNlcnRpb25zIGFib3ZlIHRoZSB0b3Agdmlld3BvcnQgYm91bmRhcnkuXG4gKiAtIEltcGxlbWVudC9pbnRlZ3JhdGUgd2l0aCBjdXN0b21pemVkIGNvbnN0cmFpbnQgYmFzZWQgbGF5b3V0IHN5c3RlbSBhbmQga2VlcFxuICogICB0cmFjayBvZiB3aGljaCBkaW1lbnNpb25zIG11c3QgYmUgcmVtZWFzdXJlZC5cbiAqXG4gKiBAY2xhc3MgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvblxuICovXG5mdW5jdGlvbiBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKHVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xuICAvLyBPbmx5IHNlcnZlci1zaWRlIHJlbmRlcmluZyByZWFsbHkgbmVlZHMgdGhpcyBvcHRpb24gKHNlZVxuICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdgKSwgYnV0IHNlcnZlci1zaWRlIHVzZXNcbiAgLy8gYFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb25gIGluc3RlYWQuIFRoaXMgb3B0aW9uIGlzIGhlcmUgc28gdGhhdCBpdCdzXG4gIC8vIGFjY2Vzc2libGUgYW5kIGRlZmF1bHRzIHRvIGZhbHNlIHdoZW4gYFJlYWN0RE9NQ29tcG9uZW50YCBhbmRcbiAgLy8gYFJlYWN0RE9NVGV4dENvbXBvbmVudGAgY2hlY2tzIGl0IGluIGBtb3VudENvbXBvbmVudGAuYFxuICB0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwID0gZmFsc2U7XG4gIHRoaXMucmVhY3RNb3VudFJlYWR5ID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQobnVsbCk7XG4gIHRoaXMudXNlQ3JlYXRlRWxlbWVudCA9IHVzZUNyZWF0ZUVsZW1lbnQ7XG59XG5cbnZhciBNaXhpbiA9IHtcbiAgLyoqXG4gICAqIEBzZWUgVHJhbnNhY3Rpb25cbiAgICogQGFic3RyYWN0XG4gICAqIEBmaW5hbFxuICAgKiBAcmV0dXJuIHthcnJheTxvYmplY3Q+fSBMaXN0IG9mIG9wZXJhdGlvbiB3cmFwIHByb2NlZHVyZXMuXG4gICAqICAgVE9ETzogY29udmVydCB0byBhcnJheTxUcmFuc2FjdGlvbldyYXBwZXI+XG4gICAqL1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxsYmFja3Mgd2l0aC5cbiAgICovXG4gIGdldFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeTtcbiAgfSxcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuXG4gICAqL1xuICBnZXRVcGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdFVwZGF0ZVF1ZXVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTYXZlIGN1cnJlbnQgdHJhbnNhY3Rpb24gc3RhdGUgLS0gaWYgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzXG4gICAqIHBhc3NlZCB0byBgcm9sbGJhY2tgLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSByZXNldCB0byB0aGF0IHN0YXRlLlxuICAgKi9cbiAgY2hlY2twb2ludDogZnVuY3Rpb24gKCkge1xuICAgIC8vIHJlYWN0TW91bnRSZWFkeSBpcyB0aGUgb3VyIG9ubHkgc3RhdGVmdWwgd3JhcHBlclxuICAgIHJldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeS5jaGVja3BvaW50KCk7XG4gIH0sXG5cbiAgcm9sbGJhY2s6IGZ1bmN0aW9uIChjaGVja3BvaW50KSB7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soY2hlY2twb2ludCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMsIGFuZCB3aWxsIGludm9rZSB0aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzXG4gICAqIGluc3RhbmNlIHRvIGJlIHJldXNlZC5cbiAgICovXG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5yZWFjdE1vdW50UmVhZHkpO1xuICAgIHRoaXMucmVhY3RNb3VudFJlYWR5ID0gbnVsbDtcbiAgfVxufTtcblxuX2Fzc2lnbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIE1peGluKTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdE93bmVyJyk7XG5cbnZhciBSZWFjdFJlZiA9IHt9O1xuXG5mdW5jdGlvbiBhdHRhY2hSZWYocmVmLCBjb21wb25lbnQsIG93bmVyKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5hZGRDb21wb25lbnRBc1JlZlRvKGNvbXBvbmVudCwgcmVmLCBvd25lcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBvd25lcikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZihudWxsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20oY29tcG9uZW50LCByZWYsIG93bmVyKTtcbiAgfVxufVxuXG5SZWFjdFJlZi5hdHRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGF0dGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cblJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMgPSBmdW5jdGlvbiAocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIC8vIElmIGVpdGhlciB0aGUgb3duZXIgb3IgYSBgcmVmYCBoYXMgY2hhbmdlZCwgbWFrZSBzdXJlIHRoZSBuZXdlc3Qgb3duZXJcbiAgLy8gaGFzIHN0b3JlZCBhIHJlZmVyZW5jZSB0byBgdGhpc2AsIGFuZCB0aGUgcHJldmlvdXMgb3duZXIgKGlmIGRpZmZlcmVudClcbiAgLy8gaGFzIGZvcmdvdHRlbiB0aGUgcmVmZXJlbmNlIHRvIGB0aGlzYC4gV2UgdXNlIHRoZSBlbGVtZW50IGluc3RlYWRcbiAgLy8gb2YgdGhlIHB1YmxpYyB0aGlzLnByb3BzIGJlY2F1c2UgdGhlIHBvc3QgcHJvY2Vzc2luZyBjYW5ub3QgZGV0ZXJtaW5lXG4gIC8vIGEgcmVmLiBUaGUgcmVmIGNvbmNlcHR1YWxseSBsaXZlcyBvbiB0aGUgZWxlbWVudC5cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBldmVuIGJlIHBvc3NpYmxlPyBUaGUgb3duZXIgY2Fubm90IGNoYW5nZSBiZWNhdXNlXG4gIC8vIGl0J3MgZm9yYmlkZGVuIGJ5IHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LiBUaGUgcmVmIGNhbiBjaGFuZ2VcbiAgLy8gaWYgeW91IHN3YXAgdGhlIGtleXMgb2YgYnV0IG5vdCB0aGUgcmVmcy4gUmVjb25zaWRlciB3aGVyZSB0aGlzIGNoZWNrXG4gIC8vIGlzIG1hZGUuIEl0IHByb2JhYmx5IGJlbG9uZ3Mgd2hlcmUgdGhlIGtleSBjaGVja2luZyBhbmRcbiAgLy8gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCBpcyBkb25lLlxuXG4gIHZhciBwcmV2UmVmID0gbnVsbDtcbiAgdmFyIHByZXZPd25lciA9IG51bGw7XG4gIGlmIChwcmV2RWxlbWVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcHJldkVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgcHJldlJlZiA9IHByZXZFbGVtZW50LnJlZjtcbiAgICBwcmV2T3duZXIgPSBwcmV2RWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgbmV4dFJlZiA9IG51bGw7XG4gIHZhciBuZXh0T3duZXIgPSBudWxsO1xuICBpZiAobmV4dEVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIG5leHRSZWYgPSBuZXh0RWxlbWVudC5yZWY7XG4gICAgbmV4dE93bmVyID0gbmV4dEVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIHByZXZSZWYgIT09IG5leHRSZWYgfHxcbiAgLy8gSWYgb3duZXIgY2hhbmdlcyBidXQgd2UgaGF2ZSBhbiB1bmNoYW5nZWQgZnVuY3Rpb24gcmVmLCBkb24ndCB1cGRhdGUgcmVmc1xuICB0eXBlb2YgbmV4dFJlZiA9PT0gJ3N0cmluZycgJiYgbmV4dE93bmVyICE9PSBwcmV2T3duZXI7XG59O1xuXG5SZWFjdFJlZi5kZXRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGRldGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWY7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0UmVmLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlJyk7XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtdO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHtcbiAgICBpbml0aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoLFxuICAgIGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaFxuICB9KTtcbn1cblxudmFyIG5vb3BDYWxsYmFja1F1ZXVlID0ge1xuICBlbnF1ZXVlOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuLyoqXG4gKiBAY2xhc3MgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSByZW5kZXJUb1N0YXRpY01hcmt1cFxuICovXG5mdW5jdGlvbiBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKHJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cCA9IHJlbmRlclRvU3RhdGljTWFya3VwO1xuICB0aGlzLnVzZUNyZWF0ZUVsZW1lbnQgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG5ldyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRoaXMpO1xufVxuXG52YXIgTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBAc2VlIFRyYW5zYWN0aW9uXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZmluYWxcbiAgICogQHJldHVybiB7YXJyYXl9IEVtcHR5IGxpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5vb3BDYWxsYmFja1F1ZXVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMsIGFuZCB3aWxsIGludm9rZSB0aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzXG4gICAqIGluc3RhbmNlIHRvIGJlIHJldXNlZC5cbiAgICovXG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIGNoZWNrcG9pbnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIHJvbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuX2Fzc2lnbihSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIE1peGluKTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBSZWFjdFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb3V0c2lkZSBjb21wb25lbnRXaWxsTW91bnQoKSBvbiB0aGUgc2VydmVyLiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5hbWUsIGNvbnN0cnVjdG9yICYmIChjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgdXBkYXRlIHF1ZXVlIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcuXG4gKiBJdCBkZWxlZ2F0ZXMgdG8gUmVhY3RVcGRhdGVRdWV1ZSB3aGlsZSBzZXJ2ZXIgcmVuZGVyaW5nIGlzIGluIHByb2dyZXNzIGFuZFxuICogc3dpdGNoZXMgdG8gUmVhY3ROb29wVXBkYXRlUXVldWUgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQuXG4gKiBAY2xhc3MgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAqL1xuXG52YXIgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0cmFuc2FjdGlvbikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuaXNNb3VudGVkID0gZnVuY3Rpb24gaXNNb3VudGVkKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVzXG4gICAqIGhhdmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZUNhbGxiYWNrID0gZnVuY3Rpb24gZW5xdWV1ZUNhbGxiYWNrKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVDYWxsYmFjayhwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZUZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZW5xdWV1ZUZvcmNlVXBkYXRlKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUZvcmNlVXBkYXRlKHB1YmxpY0luc3RhbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlUmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gZW5xdWV1ZVJlcGxhY2VTdGF0ZShwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVSZXBsYWNlU3RhdGUocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlU2V0U3RhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZTtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAnMTUuNi4xJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RWZXJzaW9uLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIE5TID0ge1xuICB4bGluazogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLFxuICB4bWw6ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnXG59O1xuXG4vLyBXZSB1c2UgYXR0cmlidXRlcyBmb3IgZXZlcnl0aGluZyBTVkcgc28gbGV0J3MgYXZvaWQgc29tZSBkdXBsaWNhdGlvbiBhbmQgcnVuXG4vLyBjb2RlIGluc3RlYWQuXG4vLyBUaGUgZm9sbG93aW5nIGFyZSBhbGwgc3BlY2lmaWVkIGluIHRoZSBIVE1MIGNvbmZpZyBhbHJlYWR5IHNvIHdlIGV4Y2x1ZGUgaGVyZS5cbi8vIC0gY2xhc3MgKGFzIGNsYXNzTmFtZSlcbi8vIC0gY29sb3Jcbi8vIC0gaGVpZ2h0XG4vLyAtIGlkXG4vLyAtIGxhbmdcbi8vIC0gbWF4XG4vLyAtIG1lZGlhXG4vLyAtIG1ldGhvZFxuLy8gLSBtaW5cbi8vIC0gbmFtZVxuLy8gLSBzdHlsZVxuLy8gLSB0YXJnZXRcbi8vIC0gdHlwZVxuLy8gLSB3aWR0aFxudmFyIEFUVFJTID0ge1xuICBhY2NlbnRIZWlnaHQ6ICdhY2NlbnQtaGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogMCxcbiAgYWRkaXRpdmU6IDAsXG4gIGFsaWdubWVudEJhc2VsaW5lOiAnYWxpZ25tZW50LWJhc2VsaW5lJyxcbiAgYWxsb3dSZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogMCxcbiAgYW1wbGl0dWRlOiAwLFxuICBhcmFiaWNGb3JtOiAnYXJhYmljLWZvcm0nLFxuICBhc2NlbnQ6IDAsXG4gIGF0dHJpYnV0ZU5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRlVHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvUmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogMCxcbiAgYmFzZUZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlUHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmFzZWxpbmVTaGlmdDogJ2Jhc2VsaW5lLXNoaWZ0JyxcbiAgYmJveDogMCxcbiAgYmVnaW46IDAsXG4gIGJpYXM6IDAsXG4gIGJ5OiAwLFxuICBjYWxjTW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwSGVpZ2h0OiAnY2FwLWhlaWdodCcsXG4gIGNsaXA6IDAsXG4gIGNsaXBQYXRoOiAnY2xpcC1wYXRoJyxcbiAgY2xpcFJ1bGU6ICdjbGlwLXJ1bGUnLFxuICBjbGlwUGF0aFVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNvbG9ySW50ZXJwb2xhdGlvbjogJ2NvbG9yLWludGVycG9sYXRpb24nLFxuICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgY29sb3JQcm9maWxlOiAnY29sb3ItcHJvZmlsZScsXG4gIGNvbG9yUmVuZGVyaW5nOiAnY29sb3ItcmVuZGVyaW5nJyxcbiAgY29udGVudFNjcmlwdFR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRTdHlsZVR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAwLFxuICBjeDogMCxcbiAgY3k6IDAsXG4gIGQ6IDAsXG4gIGRlY2VsZXJhdGU6IDAsXG4gIGRlc2NlbnQ6IDAsXG4gIGRpZmZ1c2VDb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogMCxcbiAgZGlzcGxheTogMCxcbiAgZGl2aXNvcjogMCxcbiAgZG9taW5hbnRCYXNlbGluZTogJ2RvbWluYW50LWJhc2VsaW5lJyxcbiAgZHVyOiAwLFxuICBkeDogMCxcbiAgZHk6IDAsXG4gIGVkZ2VNb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246IDAsXG4gIGVuYWJsZUJhY2tncm91bmQ6ICdlbmFibGUtYmFja2dyb3VuZCcsXG4gIGVuZDogMCxcbiAgZXhwb25lbnQ6IDAsXG4gIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogMCxcbiAgZmlsbE9wYWNpdHk6ICdmaWxsLW9wYWNpdHknLFxuICBmaWxsUnVsZTogJ2ZpbGwtcnVsZScsXG4gIGZpbHRlcjogMCxcbiAgZmlsdGVyUmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVyVW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kQ29sb3I6ICdmbG9vZC1jb2xvcicsXG4gIGZsb29kT3BhY2l0eTogJ2Zsb29kLW9wYWNpdHknLFxuICBmb2N1c2FibGU6IDAsXG4gIGZvbnRGYW1pbHk6ICdmb250LWZhbWlseScsXG4gIGZvbnRTaXplOiAnZm9udC1zaXplJyxcbiAgZm9udFNpemVBZGp1c3Q6ICdmb250LXNpemUtYWRqdXN0JyxcbiAgZm9udFN0cmV0Y2g6ICdmb250LXN0cmV0Y2gnLFxuICBmb250U3R5bGU6ICdmb250LXN0eWxlJyxcbiAgZm9udFZhcmlhbnQ6ICdmb250LXZhcmlhbnQnLFxuICBmb250V2VpZ2h0OiAnZm9udC13ZWlnaHQnLFxuICBmb3JtYXQ6IDAsXG4gIGZyb206IDAsXG4gIGZ4OiAwLFxuICBmeTogMCxcbiAgZzE6IDAsXG4gIGcyOiAwLFxuICBnbHlwaE5hbWU6ICdnbHlwaC1uYW1lJyxcbiAgZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJyxcbiAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLFxuICBnbHlwaFJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnRUcmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50VW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogMCxcbiAgaG9yaXpBZHZYOiAnaG9yaXotYWR2LXgnLFxuICBob3Jpek9yaWdpblg6ICdob3Jpei1vcmlnaW4teCcsXG4gIGlkZW9ncmFwaGljOiAwLFxuICBpbWFnZVJlbmRlcmluZzogJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbic6IDAsXG4gIGluMjogMCxcbiAgaW50ZXJjZXB0OiAwLFxuICBrOiAwLFxuICBrMTogMCxcbiAgazI6IDAsXG4gIGszOiAwLFxuICBrNDogMCxcbiAga2VybmVsTWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsVW5pdExlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAwLFxuICBrZXlQb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlTcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleVRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhBZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJTcGFjaW5nOiAnbGV0dGVyLXNwYWNpbmcnLFxuICBsaWdodGluZ0NvbG9yOiAnbGlnaHRpbmctY29sb3InLFxuICBsaW1pdGluZ0NvbmVBbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6IDAsXG4gIG1hcmtlckVuZDogJ21hcmtlci1lbmQnLFxuICBtYXJrZXJNaWQ6ICdtYXJrZXItbWlkJyxcbiAgbWFya2VyU3RhcnQ6ICdtYXJrZXItc3RhcnQnLFxuICBtYXJrZXJIZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJVbml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2VyV2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6IDAsXG4gIG1hc2tDb250ZW50VW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza1VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAwLFxuICBtb2RlOiAwLFxuICBudW1PY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogMCxcbiAgb3BhY2l0eTogMCxcbiAgb3BlcmF0b3I6IDAsXG4gIG9yZGVyOiAwLFxuICBvcmllbnQ6IDAsXG4gIG9yaWVudGF0aW9uOiAwLFxuICBvcmlnaW46IDAsXG4gIG92ZXJmbG93OiAwLFxuICBvdmVybGluZVBvc2l0aW9uOiAnb3ZlcmxpbmUtcG9zaXRpb24nLFxuICBvdmVybGluZVRoaWNrbmVzczogJ292ZXJsaW5lLXRoaWNrbmVzcycsXG4gIHBhaW50T3JkZXI6ICdwYWludC1vcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UtMScsXG4gIHBhdGhMZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybkNvbnRlbnRVbml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJuVHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm5Vbml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJFdmVudHM6ICdwb2ludGVyLWV2ZW50cycsXG4gIHBvaW50czogMCxcbiAgcG9pbnRzQXRYOiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzQXRZOiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzQXRaOiAncG9pbnRzQXRaJyxcbiAgcHJlc2VydmVBbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZVVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICByOiAwLFxuICByYWRpdXM6IDAsXG4gIHJlZlg6ICdyZWZYJyxcbiAgcmVmWTogJ3JlZlknLFxuICByZW5kZXJpbmdJbnRlbnQ6ICdyZW5kZXJpbmctaW50ZW50JyxcbiAgcmVwZWF0Q291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdER1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkRXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkRmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzdGFydDogMCxcbiAgcmVzdWx0OiAwLFxuICByb3RhdGU6IDAsXG4gIHJ4OiAwLFxuICByeTogMCxcbiAgc2NhbGU6IDAsXG4gIHNlZWQ6IDAsXG4gIHNoYXBlUmVuZGVyaW5nOiAnc2hhcGUtcmVuZGVyaW5nJyxcbiAgc2xvcGU6IDAsXG4gIHNwYWNpbmc6IDAsXG4gIHNwZWN1bGFyQ29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJFeHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogMCxcbiAgc3ByZWFkTWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRPZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZERldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAwLFxuICBzdGVtdjogMCxcbiAgc3RpdGNoVGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3BDb2xvcjogJ3N0b3AtY29sb3InLFxuICBzdG9wT3BhY2l0eTogJ3N0b3Atb3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hQb3NpdGlvbjogJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLFxuICBzdHJpbmc6IDAsXG4gIHN0cm9rZTogMCxcbiAgc3Ryb2tlRGFzaGFycmF5OiAnc3Ryb2tlLWRhc2hhcnJheScsXG4gIHN0cm9rZURhc2hvZmZzZXQ6ICdzdHJva2UtZGFzaG9mZnNldCcsXG4gIHN0cm9rZUxpbmVjYXA6ICdzdHJva2UtbGluZWNhcCcsXG4gIHN0cm9rZUxpbmVqb2luOiAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogJ3N0cm9rZS1taXRlcmxpbWl0JyxcbiAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JyxcbiAgc3Ryb2tlV2lkdGg6ICdzdHJva2Utd2lkdGgnLFxuICBzdXJmYWNlU2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1MYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGVWYWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldFg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0WTogJ3RhcmdldFknLFxuICB0ZXh0QW5jaG9yOiAndGV4dC1hbmNob3InLFxuICB0ZXh0RGVjb3JhdGlvbjogJ3RleHQtZGVjb3JhdGlvbicsXG4gIHRleHRSZW5kZXJpbmc6ICd0ZXh0LXJlbmRlcmluZycsXG4gIHRleHRMZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdG86IDAsXG4gIHRyYW5zZm9ybTogMCxcbiAgdTE6IDAsXG4gIHUyOiAwLFxuICB1bmRlcmxpbmVQb3NpdGlvbjogJ3VuZGVybGluZS1wb3NpdGlvbicsXG4gIHVuZGVybGluZVRoaWNrbmVzczogJ3VuZGVybGluZS10aGlja25lc3MnLFxuICB1bmljb2RlOiAwLFxuICB1bmljb2RlQmlkaTogJ3VuaWNvZGUtYmlkaScsXG4gIHVuaWNvZGVSYW5nZTogJ3VuaWNvZGUtcmFuZ2UnLFxuICB1bml0c1BlckVtOiAndW5pdHMtcGVyLWVtJyxcbiAgdkFscGhhYmV0aWM6ICd2LWFscGhhYmV0aWMnLFxuICB2SGFuZ2luZzogJ3YtaGFuZ2luZycsXG4gIHZJZGVvZ3JhcGhpYzogJ3YtaWRlb2dyYXBoaWMnLFxuICB2TWF0aGVtYXRpY2FsOiAndi1tYXRoZW1hdGljYWwnLFxuICB2YWx1ZXM6IDAsXG4gIHZlY3RvckVmZmVjdDogJ3ZlY3Rvci1lZmZlY3QnLFxuICB2ZXJzaW9uOiAwLFxuICB2ZXJ0QWR2WTogJ3ZlcnQtYWR2LXknLFxuICB2ZXJ0T3JpZ2luWDogJ3ZlcnQtb3JpZ2luLXgnLFxuICB2ZXJ0T3JpZ2luWTogJ3ZlcnQtb3JpZ2luLXknLFxuICB2aWV3Qm94OiAndmlld0JveCcsXG4gIHZpZXdUYXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogMCxcbiAgd2lkdGhzOiAwLFxuICB3b3JkU3BhY2luZzogJ3dvcmQtc3BhY2luZycsXG4gIHdyaXRpbmdNb2RlOiAnd3JpdGluZy1tb2RlJyxcbiAgeDogMCxcbiAgeEhlaWdodDogJ3gtaGVpZ2h0JyxcbiAgeDE6IDAsXG4gIHgyOiAwLFxuICB4Q2hhbm5lbFNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhsaW5rQWN0dWF0ZTogJ3hsaW5rOmFjdHVhdGUnLFxuICB4bGlua0FyY3JvbGU6ICd4bGluazphcmNyb2xlJyxcbiAgeGxpbmtIcmVmOiAneGxpbms6aHJlZicsXG4gIHhsaW5rUm9sZTogJ3hsaW5rOnJvbGUnLFxuICB4bGlua1Nob3c6ICd4bGluazpzaG93JyxcbiAgeGxpbmtUaXRsZTogJ3hsaW5rOnRpdGxlJyxcbiAgeGxpbmtUeXBlOiAneGxpbms6dHlwZScsXG4gIHhtbEJhc2U6ICd4bWw6YmFzZScsXG4gIHhtbG5zOiAwLFxuICB4bWxuc1hsaW5rOiAneG1sbnM6eGxpbmsnLFxuICB4bWxMYW5nOiAneG1sOmxhbmcnLFxuICB4bWxTcGFjZTogJ3htbDpzcGFjZScsXG4gIHk6IDAsXG4gIHkxOiAwLFxuICB5MjogMCxcbiAgeUNoYW5uZWxTZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAwLFxuICB6b29tQW5kUGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBTVkdET01Qcm9wZXJ0eUNvbmZpZyA9IHtcbiAgUHJvcGVydGllczoge30sXG4gIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6IHtcbiAgICB4bGlua0FjdHVhdGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rQXJjcm9sZTogTlMueGxpbmssXG4gICAgeGxpbmtIcmVmOiBOUy54bGluayxcbiAgICB4bGlua1JvbGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rU2hvdzogTlMueGxpbmssXG4gICAgeGxpbmtUaXRsZTogTlMueGxpbmssXG4gICAgeGxpbmtUeXBlOiBOUy54bGluayxcbiAgICB4bWxCYXNlOiBOUy54bWwsXG4gICAgeG1sTGFuZzogTlMueG1sLFxuICAgIHhtbFNwYWNlOiBOUy54bWxcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHt9XG59O1xuXG5PYmplY3Qua2V5cyhBVFRSUykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIFNWR0RPTVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXNba2V5XSA9IDA7XG4gIGlmIChBVFRSU1trZXldKSB7XG4gICAgU1ZHRE9NUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNba2V5XSA9IEFUVFJTW2tleV07XG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWR0RPTVByb3BlcnR5Q29uZmlnO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TVkdET01Qcm9wZXJ0eUNvbmZpZy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpO1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQnKTtcbnZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpO1xudmFyIHNoYWxsb3dFcXVhbCA9IHJlcXVpcmUoJ2ZianMvbGliL3NoYWxsb3dFcXVhbCcpO1xuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gIHNlbGVjdDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25TZWxlY3QnLFxuICAgICAgY2FwdHVyZWQ6ICdvblNlbGVjdENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb250ZXh0TWVudScsICd0b3BGb2N1cycsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93bicsICd0b3BNb3VzZVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddXG4gIH1cbn07XG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG5cbi8vIFRyYWNrIHdoZXRoZXIgYSBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkb1xuLy8gbm90IGV4dHJhY3QgZXZlbnRzLiBTZWUgIzM2MzkuXG52YXIgaGFzTGlzdGVuZXIgPSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEVsZW1lbnQ6IHJhbmdlLnBhcmVudEVsZW1lbnQoKSxcbiAgICAgIHRleHQ6IHJhbmdlLnRleHQsXG4gICAgICB0b3A6IHJhbmdlLmJvdW5kaW5nVG9wLFxuICAgICAgbGVmdDogcmFuZ2UuYm91bmRpbmdMZWZ0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQgIT09IGdldEFjdGl2ZUVsZW1lbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihhY3RpdmVFbGVtZW50KTtcbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcblxuICAgIHZhciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnNlbGVjdCwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICBzeW50aGV0aWNFdmVudC50eXBlID0gJ3NlbGVjdCc7XG4gICAgc3ludGhldGljRXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudDtcblxuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhzeW50aGV0aWNFdmVudCk7XG5cbiAgICByZXR1cm4gc3ludGhldGljRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgaWYgKCFoYXNMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgICAgLy8gVHJhY2sgdGhlIGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuXG4gICAgICBjYXNlICd0b3BGb2N1cyc6XG4gICAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXROb2RlO1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcEJsdXInOlxuICAgICAgICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuICAgICAgY2FzZSAndG9wTW91c2VEb3duJzpcbiAgICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BDb250ZXh0TWVudSc6XG4gICAgICBjYXNlICd0b3BNb3VzZVVwJzpcbiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgICAvL1xuICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuICAgICAgY2FzZSAndG9wU2VsZWN0aW9uQ2hhbmdlJzpcbiAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25TZWxlY3QnKSB7XG4gICAgICBoYXNMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdEV2ZW50UGx1Z2luO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TZWxlY3RFdmVudFBsdWdpbi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50Jyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRm9jdXNFdmVudCcpO1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQnKTtcbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50Jyk7XG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNEcmFnRXZlbnQnKTtcbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUb3VjaEV2ZW50Jyk7XG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljV2hlZWxFdmVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEFib3J0J10sXG4gKiAgIH0sXG4gKiAgIC4uLlxuICogfTtcbiAqIHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZyA9IHtcbiAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29uZmlnIH1cbiAqIH07XG4gKi9cbnZhciBldmVudFR5cGVzID0ge307XG52YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0ge307XG5bJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmltYXRpb25JdGVyYXRpb24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RvdWJsZUNsaWNrJywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaE1vdmUnLCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5nZScsICd3YWl0aW5nJywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gIHZhciBvbkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7XG4gIHZhciB0b3BFdmVudCA9ICd0b3AnICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF1cbiAgfTtcbiAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlO1xuICB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTtcbn0pO1xuXG52YXIgb25DbGlja0xpc3RlbmVycyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIGlmICghZGlzcGF0Y2hDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvcjtcbiAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgICAgY2FzZSAndG9wQWJvcnQnOlxuICAgICAgY2FzZSAndG9wQ2FuUGxheSc6XG4gICAgICBjYXNlICd0b3BDYW5QbGF5VGhyb3VnaCc6XG4gICAgICBjYXNlICd0b3BEdXJhdGlvbkNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BFbXB0aWVkJzpcbiAgICAgIGNhc2UgJ3RvcEVuY3J5cHRlZCc6XG4gICAgICBjYXNlICd0b3BFbmRlZCc6XG4gICAgICBjYXNlICd0b3BFcnJvcic6XG4gICAgICBjYXNlICd0b3BJbnB1dCc6XG4gICAgICBjYXNlICd0b3BJbnZhbGlkJzpcbiAgICAgIGNhc2UgJ3RvcExvYWQnOlxuICAgICAgY2FzZSAndG9wTG9hZGVkRGF0YSc6XG4gICAgICBjYXNlICd0b3BMb2FkZWRNZXRhZGF0YSc6XG4gICAgICBjYXNlICd0b3BMb2FkU3RhcnQnOlxuICAgICAgY2FzZSAndG9wUGF1c2UnOlxuICAgICAgY2FzZSAndG9wUGxheSc6XG4gICAgICBjYXNlICd0b3BQbGF5aW5nJzpcbiAgICAgIGNhc2UgJ3RvcFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RvcFJhdGVDaGFuZ2UnOlxuICAgICAgY2FzZSAndG9wUmVzZXQnOlxuICAgICAgY2FzZSAndG9wU2Vla2VkJzpcbiAgICAgIGNhc2UgJ3RvcFNlZWtpbmcnOlxuICAgICAgY2FzZSAndG9wU3RhbGxlZCc6XG4gICAgICBjYXNlICd0b3BTdWJtaXQnOlxuICAgICAgY2FzZSAndG9wU3VzcGVuZCc6XG4gICAgICBjYXNlICd0b3BUaW1lVXBkYXRlJzpcbiAgICAgIGNhc2UgJ3RvcFZvbHVtZUNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BXYWl0aW5nJzpcbiAgICAgICAgLy8gSFRNTCBFdmVudHNcbiAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9pbmRleC5odG1sI2V2ZW50cy0wXG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQmx1cic6XG4gICAgICBjYXNlICd0b3BGb2N1cyc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcENsaWNrJzpcbiAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BEb3VibGVDbGljayc6XG4gICAgICBjYXNlICd0b3BNb3VzZURvd24nOlxuICAgICAgY2FzZSAndG9wTW91c2VNb3ZlJzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlVXAnOlxuICAgICAgLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAndG9wTW91c2VPdXQnOlxuICAgICAgY2FzZSAndG9wTW91c2VPdmVyJzpcbiAgICAgIGNhc2UgJ3RvcENvbnRleHRNZW51JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wRHJhZyc6XG4gICAgICBjYXNlICd0b3BEcmFnRW5kJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFbnRlcic6XG4gICAgICBjYXNlICd0b3BEcmFnRXhpdCc6XG4gICAgICBjYXNlICd0b3BEcmFnTGVhdmUnOlxuICAgICAgY2FzZSAndG9wRHJhZ092ZXInOlxuICAgICAgY2FzZSAndG9wRHJhZ1N0YXJ0JzpcbiAgICAgIGNhc2UgJ3RvcERyb3AnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFRvdWNoQ2FuY2VsJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoRW5kJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoTW92ZSc6XG4gICAgICBjYXNlICd0b3BUb3VjaFN0YXJ0JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQW5pbWF0aW9uRW5kJzpcbiAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvbkl0ZXJhdGlvbic6XG4gICAgICBjYXNlICd0b3BBbmltYXRpb25TdGFydCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BUcmFuc2l0aW9uRW5kJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BTY3JvbGwnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BXaGVlbCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcENvcHknOlxuICAgICAgY2FzZSAndG9wQ3V0JzpcbiAgICAgIGNhc2UgJ3RvcFBhc3RlJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgIUV2ZW50Q29uc3RydWN0b3IgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU2ltcGxlRXZlbnRQbHVnaW46IFVuaGFuZGxlZCBldmVudCB0eXBlLCBgJXNgLicsIHRvcExldmVsVHlwZSkgOiBfcHJvZEludmFyaWFudCgnODYnLCB0b3BMZXZlbFR5cGUpIDogdm9pZCAwO1xuICAgIHZhciBldmVudCA9IEV2ZW50Q29uc3RydWN0b3IuZ2V0UG9vbGVkKGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9LFxuXG4gIGRpZFB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAgIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gICAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAgIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2ZShpbnN0Ll90YWcpKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICBpZiAoIW9uQ2xpY2tMaXN0ZW5lcnNba2V5XSkge1xuICAgICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0gPSBFdmVudExpc3RlbmVyLmxpc3Rlbihub2RlLCAnY2xpY2snLCBlbXB0eUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2lsbERlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25DbGljaycgJiYgIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSkge1xuICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0ucmVtb3ZlKCk7XG4gICAgICBkZWxldGUgb25DbGlja0xpc3RlbmVyc1trZXldO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaW1wbGVFdmVudFBsdWdpbjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvU2ltcGxlRXZlbnRQbHVnaW4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xudmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0ge1xuICBhbmltYXRpb25OYW1lOiBudWxsLFxuICBlbGFwc2VkVGltZTogbnVsbCxcbiAgcHNldWRvRWxlbWVudDogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LCBBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQ2xpcGJvYXJkRXZlbnQsIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljQ2xpcGJvYXJkRXZlbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IHtcbiAgZGF0YTogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljQ29tcG9zaXRpb25FdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LCBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGFUcmFuc2ZlcjogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRHJhZ0V2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNEcmFnRXZlbnQsIERyYWdFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRHJhZ0V2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNEcmFnRXZlbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0ge1xuICByZWxhdGVkVGFyZ2V0OiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNGb2N1c0V2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNGb2N1c0V2ZW50LCBGb2N1c0V2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xudmFyIElucHV0RXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0lucHV0RXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljSW5wdXRFdmVudCwgSW5wdXRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljSW5wdXRFdmVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljSW5wdXRFdmVudC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG5cbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG52YXIgZ2V0RXZlbnRLZXkgPSByZXF1aXJlKCcuL2dldEV2ZW50S2V5Jyk7XG52YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlID0gcmVxdWlyZSgnLi9nZXRFdmVudE1vZGlmaWVyU3RhdGUnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IHtcbiAga2V5OiBnZXRFdmVudEtleSxcbiAgbG9jYXRpb246IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIHJlcGVhdDogbnVsbCxcbiAgbG9jYWxlOiBudWxsLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIC8vIExlZ2FjeSBJbnRlcmZhY2VcbiAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci5cblxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5LlxuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAgZGVwZW5kaW5nIG9uIHRoZVxuICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNLZXlib2FyZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNLZXlib2FyZEV2ZW50LCBLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNLZXlib2FyZEV2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHRvdWNoZXM6IG51bGwsXG4gIHRhcmdldFRvdWNoZXM6IG51bGwsXG4gIGNoYW5nZWRUb3VjaGVzOiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1RvdWNoRXZlbnQsIFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RvdWNoRXZlbnQuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHByb3BlcnR5TmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVHJhbnNpdGlvbkV2ZW50LCBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljVHJhbnNpdGlvbkV2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiBudWxsLFxuXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNNb3VzZUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNXaGVlbEV2ZW50LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgTU9EID0gNjU1MjE7XG5cbi8vIGFkbGVyMzIgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYW5kIGlzIG9ubHkgdXNlZCB0byBzYW5pdHkgY2hlY2sgdGhhdFxuLy8gbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyIG1hdGNoZXMgdGhlIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudC5cbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gKGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgU2hlZXRKUyB2ZXJzaW9uKSBoYXMgYmVlbiBvcHRpbWl6ZWRcbi8vIGZvciBvdXIgdXNlIGNhc2UsIGF0IHRoZSBleHBlbnNlIG9mIGNvbmZvcm1pbmcgdG8gdGhlIGFkbGVyMzIgc3BlY2lmaWNhdGlvblxuLy8gZm9yIG5vbi1hc2NpaSBpbnB1dHMuXG5mdW5jdGlvbiBhZGxlcjMyKGRhdGEpIHtcbiAgdmFyIGEgPSAxO1xuICB2YXIgYiA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBkYXRhLmxlbmd0aDtcbiAgdmFyIG0gPSBsICYgfjB4MztcbiAgd2hpbGUgKGkgPCBtKSB7XG4gICAgdmFyIG4gPSBNYXRoLm1pbihpICsgNDA5NiwgbSk7XG4gICAgZm9yICg7IGkgPCBuOyBpICs9IDQpIHtcbiAgICAgIGIgKz0gKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMSkpICsgKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAyKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDMpKTtcbiAgICB9XG4gICAgYSAlPSBNT0Q7XG4gICAgYiAlPSBNT0Q7XG4gIH1cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBiICs9IGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIGEgJT0gTU9EO1xuICBiICU9IE1PRDtcbiAgcmV0dXJuIGEgfCBiIDw8IDE2O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkge1xuICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICB2YXIgZXJyb3I7XG4gICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBDU1NQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vQ1NTUHJvcGVydHknKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgaXNVbml0bGVzc051bWJlciA9IENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXI7XG52YXIgc3R5bGVXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGNvbXBvbmVudCwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdmFyIGlzTm9uTnVtZXJpYyA9IGlzTmFOKHZhbHVlKTtcbiAgaWYgKGlzQ3VzdG9tUHJvcGVydHkgfHwgaXNOb25OdW1lcmljIHx8IHZhbHVlID09PSAwIHx8IGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkge1xuICAgIHJldHVybiAnJyArIHZhbHVlOyAvLyBjYXN0IHRvIHN0cmluZ1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gQWxsb3cgJzAnIHRvIHBhc3MgdGhyb3VnaCB3aXRob3V0IHdhcm5pbmcuIDAgaXMgYWxyZWFkeSBzcGVjaWFsIGFuZFxuICAgICAgLy8gZG9lc24ndCByZXF1aXJlIHVuaXRzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4gYWJvdXQgaXQuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IG93bmVyLmdldE5hbWUoKSA6IG51bGw7XG4gICAgICAgIGlmIChvd25lck5hbWUgJiYgIXN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSkge1xuICAgICAgICAgIHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgIHZhciB3YXJuaW5ncyA9IHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXTtcbiAgICAgICAgICB3YXJuZWQgPSB3YXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgICAgd2FybmluZ3NbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYSBgJXNgIHRhZyAob3duZXI6IGAlc2ApIHdhcyBwYXNzZWQgYSBudW1lcmljIHN0cmluZyB2YWx1ZSAnICsgJ2ZvciBDU1MgcHJvcGVydHkgYCVzYCAodmFsdWU6IGAlc2ApIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCAnICsgJ2FzIGEgdW5pdGxlc3MgbnVtYmVyIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3QuJywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC50eXBlLCBvd25lck5hbWUgfHwgJ3Vua25vd24nLCBuYW1lLCB2YWx1ZSkgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlICsgJ3B4Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkYW5nZXJvdXNTdHlsZVZhbHVlO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9kYW5nZXJvdXNTdHlsZVZhbHVlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG5cbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIERPTSBub2RlIHJlbmRlcmVkIGJ5IHRoaXMgZWxlbWVudC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20uZmluZGRvbW5vZGVcbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fERPTUVsZW1lbnR9IGNvbXBvbmVudE9yRWxlbWVudFxuICogQHJldHVybiB7P0RPTUVsZW1lbnR9IFRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIGlmIChvd25lciAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcob3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyLCAnJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHZhciBpbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoY29tcG9uZW50T3JFbGVtZW50KTtcbiAgaWYgKGluc3QpIHtcbiAgICBpbnN0ID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCk7XG4gICAgcmV0dXJuIGluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSA6IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbXBvbmVudE9yRWxlbWVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZmluZERPTU5vZGUgd2FzIGNhbGxlZCBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQ0JykgOiB2b2lkIDA7XG4gIH0gZWxzZSB7XG4gICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VsZW1lbnQgYXBwZWFycyB0byBiZSBuZWl0aGVyIFJlYWN0Q29tcG9uZW50IG5vciBET01Ob2RlIChrZXlzOiAlcyknLCBPYmplY3Qua2V5cyhjb21wb25lbnRPckVsZW1lbnQpKSA6IF9wcm9kSW52YXJpYW50KCc0NScsIE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVudCkpIDogdm9pZCAwO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZERPTU5vZGU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2ZpbmRET01Ob2RlLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBwYXNzZWQgdGhyb3VnaCB0cmF2ZXJzYWwuXG4gKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hpbGQgUmVhY3QgY2hpbGQgY29tcG9uZW50LlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmluZyBuYW1lIG9mIGtleSBwYXRoIHRvIGNoaWxkLlxuICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVidWdJRCBPcHRpb25hbCBkZWJ1Z0lEIG9mIHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkge1xuICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgaWYgKHRyYXZlcnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7XG4gICAgdmFyIGtleVVuaXF1ZSA9IHJlc3VsdFtuYW1lXSA9PT0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHtcbiAgICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWtleVVuaXF1ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGlsZHJlbiguLi4pOiBFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcgKyAnYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hhcmUgYSBrZXksIG9ubHkgJyArICd0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleVVuaXF1ZSAmJiBjaGlsZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHRbbmFtZV0gPSBjaGlsZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGbGF0dGVucyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuIEFueSBudWxsXG4gKiBjaGlsZHJlbiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEByZXR1cm4geyFvYmplY3R9IGZsYXR0ZW5lZCBjaGlsZHJlbiBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4sIHNlbGZEZWJ1Z0lEKSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lKSB7XG4gICAgICByZXR1cm4gZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpO1xuICAgIH0sIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQsIHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuQ2hpbGRyZW47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2ZsYXR0ZW5DaGlsZHJlbi5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICA4OiAnQmFja3NwYWNlJyxcbiAgOTogJ1RhYicsXG4gIDEyOiAnQ2xlYXInLFxuICAxMzogJ0VudGVyJyxcbiAgMTY6ICdTaGlmdCcsXG4gIDE3OiAnQ29udHJvbCcsXG4gIDE4OiAnQWx0JyxcbiAgMTk6ICdQYXVzZScsXG4gIDIwOiAnQ2Fwc0xvY2snLFxuICAyNzogJ0VzY2FwZScsXG4gIDMyOiAnICcsXG4gIDMzOiAnUGFnZVVwJyxcbiAgMzQ6ICdQYWdlRG93bicsXG4gIDM1OiAnRW5kJyxcbiAgMzY6ICdIb21lJyxcbiAgMzc6ICdBcnJvd0xlZnQnLFxuICAzODogJ0Fycm93VXAnLFxuICAzOTogJ0Fycm93UmlnaHQnLFxuICA0MDogJ0Fycm93RG93bicsXG4gIDQ1OiAnSW5zZXJ0JyxcbiAgNDY6ICdEZWxldGUnLFxuICAxMTI6ICdGMScsXG4gIDExMzogJ0YyJyxcbiAgMTE0OiAnRjMnLFxuICAxMTU6ICdGNCcsXG4gIDExNjogJ0Y1JyxcbiAgMTE3OiAnRjYnLFxuICAxMTg6ICdGNycsXG4gIDExOTogJ0Y4JyxcbiAgMTIwOiAnRjknLFxuICAxMjE6ICdGMTAnLFxuICAxMjI6ICdGMTEnLFxuICAxMjM6ICdGMTInLFxuICAxNDQ6ICdOdW1Mb2NrJyxcbiAgMTQ1OiAnU2Nyb2xsTG9jaycsXG4gIDIyNDogJ01ldGEnXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cblxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7XG5cbiAgICAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRLZXk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgU3ltYm9sICovXG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAqXG4gKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gKiAgICAgICAuLi5cbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuXG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydtcycgKyBzdHlsZVByb3BdID0gJ01TJyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ08nICsgc3R5bGVQcm9wXSA9ICdvJyArIGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyJyk7XG5cbi8qKlxuICogRXNjYXBlcyBhdHRyaWJ1dGUgdmFsdWUgdG8gcHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKSB7XG4gIHJldHVybiAnXCInICsgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHZhbHVlKSArICdcIic7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1kb20vbGliL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0TW91bnQgPSByZXF1aXJlKCcuL1JlYWN0TW91bnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50LnJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lci5qcyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBGaWxlSW5wdXQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9LFxuICAgICAgICBmaWxlOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIHpJbmRleDogMVxuICAgICAgICB9LFxuICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgekluZGV4OiAtMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICBoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uKGUpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHZhbHVlOiBlLnRhcmdldC52YWx1ZS5zcGxpdCgvKFxcXFx8XFwvKS9nKS5wb3AoKVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKGUpO1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFJlYWN0LkRPTS5kaXYoe1xuICAgICAgICBzdHlsZTogdGhpcy5zdGF0ZS5zdHlsZXMucGFyZW50XG4gICAgICB9LFxuXG4gICAgICAvLyBBY3R1YWwgZmlsZSBpbnB1dFxuICAgICAgUmVhY3QuRE9NLmlucHV0KHtcbiAgICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLm5hbWUsXG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMucHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIGFjY2VwdDogdGhpcy5wcm9wcy5hY2NlcHQsXG4gICAgICAgIHN0eWxlOiB0aGlzLnN0YXRlLnN0eWxlcy5maWxlXG4gICAgICB9KSxcblxuICAgICAgLy8gRW11bGF0ZWQgZmlsZSBpbnB1dFxuICAgICAgUmVhY3QuRE9NLmlucHV0KHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZSArICdfZmlsZW5hbWUnLFxuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5wcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgc3R5bGU6IHRoaXMuc3RhdGUuc3R5bGVzLnRleHRcbiAgICAgIH0pKTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsZUlucHV0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1maWxlLWlucHV0L2xpYi9pbmRleC5qcyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGlsZHJlbiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBzdG9yZVNoYXBlLCBzdWJzY3JpcHRpb25TaGFwZSB9IGZyb20gJy4uL3V0aWxzL1Byb3BUeXBlcyc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi91dGlscy93YXJuaW5nJztcblxudmFyIGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlID0gZmFsc2U7XG5mdW5jdGlvbiB3YXJuQWJvdXRSZWNlaXZpbmdTdG9yZSgpIHtcbiAgaWYgKGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlID0gdHJ1ZTtcblxuICB3YXJuaW5nKCc8UHJvdmlkZXI+IGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgYHN0b3JlYCBvbiB0aGUgZmx5LiAnICsgJ0l0IGlzIG1vc3QgbGlrZWx5IHRoYXQgeW91IHNlZSB0aGlzIGVycm9yIGJlY2F1c2UgeW91IHVwZGF0ZWQgdG8gJyArICdSZWR1eCAyLnggYW5kIFJlYWN0IFJlZHV4IDIueCB3aGljaCBubyBsb25nZXIgaG90IHJlbG9hZCByZWR1Y2VycyAnICsgJ2F1dG9tYXRpY2FsbHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1yZWR1eC9yZWxlYXNlcy8nICsgJ3RhZy92Mi4wLjAgZm9yIHRoZSBtaWdyYXRpb24gaW5zdHJ1Y3Rpb25zLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoKSB7XG4gIHZhciBfUHJvdmlkZXIkY2hpbGRDb250ZXg7XG5cbiAgdmFyIHN0b3JlS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnc3RvcmUnO1xuICB2YXIgc3ViS2V5ID0gYXJndW1lbnRzWzFdO1xuXG4gIHZhciBzdWJzY3JpcHRpb25LZXkgPSBzdWJLZXkgfHwgc3RvcmVLZXkgKyAnU3Vic2NyaXB0aW9uJztcblxuICB2YXIgUHJvdmlkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhQcm92aWRlciwgX0NvbXBvbmVudCk7XG5cbiAgICBQcm92aWRlci5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgICAgdmFyIF9yZWY7XG5cbiAgICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZbc3RvcmVLZXldID0gdGhpc1tzdG9yZUtleV0sIF9yZWZbc3Vic2NyaXB0aW9uS2V5XSA9IG51bGwsIF9yZWY7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFByb3ZpZGVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvdmlkZXIpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgX3RoaXNbc3RvcmVLZXldID0gcHJvcHMuc3RvcmU7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgUHJvdmlkZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBDaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgIH07XG5cbiAgICByZXR1cm4gUHJvdmlkZXI7XG4gIH0oQ29tcG9uZW50KTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFByb3ZpZGVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gKG5leHRQcm9wcykge1xuICAgICAgaWYgKHRoaXNbc3RvcmVLZXldICE9PSBuZXh0UHJvcHMuc3RvcmUpIHtcbiAgICAgICAgd2FybkFib3V0UmVjZWl2aW5nU3RvcmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIHN0b3JlOiBzdG9yZVNoYXBlLmlzUmVxdWlyZWQsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5lbGVtZW50LmlzUmVxdWlyZWRcbiAgfTtcbiAgUHJvdmlkZXIuY2hpbGRDb250ZXh0VHlwZXMgPSAoX1Byb3ZpZGVyJGNoaWxkQ29udGV4ID0ge30sIF9Qcm92aWRlciRjaGlsZENvbnRleFtzdG9yZUtleV0gPSBzdG9yZVNoYXBlLmlzUmVxdWlyZWQsIF9Qcm92aWRlciRjaGlsZENvbnRleFtzdWJzY3JpcHRpb25LZXldID0gc3Vic2NyaXB0aW9uU2hhcGUsIF9Qcm92aWRlciRjaGlsZENvbnRleCk7XG4gIFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gJ1Byb3ZpZGVyJztcblxuICByZXR1cm4gUHJvdmlkZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVByb3ZpZGVyKCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL1Byb3ZpZGVyLmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgY29ubmVjdEFkdmFuY2VkIGZyb20gJy4uL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkJztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmltcG9ydCBkZWZhdWx0TWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzIGZyb20gJy4vbWFwRGlzcGF0Y2hUb1Byb3BzJztcbmltcG9ydCBkZWZhdWx0TWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzIGZyb20gJy4vbWFwU3RhdGVUb1Byb3BzJztcbmltcG9ydCBkZWZhdWx0TWVyZ2VQcm9wc0ZhY3RvcmllcyBmcm9tICcuL21lcmdlUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi9zZWxlY3RvckZhY3RvcnknO1xuXG4vKlxuICBjb25uZWN0IGlzIGEgZmFjYWRlIG92ZXIgY29ubmVjdEFkdmFuY2VkLiBJdCB0dXJucyBpdHMgYXJncyBpbnRvIGEgY29tcGF0aWJsZVxuICBzZWxlY3RvckZhY3RvcnksIHdoaWNoIGhhcyB0aGUgc2lnbmF0dXJlOlxuXG4gICAgKGRpc3BhdGNoLCBvcHRpb25zKSA9PiAobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpID0+IG5leHRGaW5hbFByb3BzXG4gIFxuICBjb25uZWN0IHBhc3NlcyBpdHMgYXJncyB0byBjb25uZWN0QWR2YW5jZWQgYXMgb3B0aW9ucywgd2hpY2ggd2lsbCBpbiB0dXJuIHBhc3MgdGhlbSB0b1xuICBzZWxlY3RvckZhY3RvcnkgZWFjaCB0aW1lIGEgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2UgaXMgaW5zdGFudGlhdGVkIG9yIGhvdCByZWxvYWRlZC5cblxuICBzZWxlY3RvckZhY3RvcnkgcmV0dXJucyBhIGZpbmFsIHByb3BzIHNlbGVjdG9yIGZyb20gaXRzIG1hcFN0YXRlVG9Qcm9wcyxcbiAgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcywgbWVyZ2VQcm9wcyxcbiAgbWVyZ2VQcm9wc0ZhY3RvcmllcywgYW5kIHB1cmUgYXJncy5cblxuICBUaGUgcmVzdWx0aW5nIGZpbmFsIHByb3BzIHNlbGVjdG9yIGlzIGNhbGxlZCBieSB0aGUgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2Ugd2hlbmV2ZXJcbiAgaXQgcmVjZWl2ZXMgbmV3IHByb3BzIG9yIHN0b3JlIHN0YXRlLlxuICovXG5cbmZ1bmN0aW9uIG1hdGNoKGFyZywgZmFjdG9yaWVzLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSBmYWN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFjdG9yaWVzW2ldKGFyZyk7XG4gICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIG9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgb2YgdHlwZSAnICsgdHlwZW9mIGFyZyArICcgZm9yICcgKyBuYW1lICsgJyBhcmd1bWVudCB3aGVuIGNvbm5lY3RpbmcgY29tcG9uZW50ICcgKyBvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lICsgJy4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cblxuLy8gY3JlYXRlQ29ubmVjdCB3aXRoIGRlZmF1bHQgYXJncyBidWlsZHMgdGhlICdvZmZpY2lhbCcgY29ubmVjdCBiZWhhdmlvci4gQ2FsbGluZyBpdCB3aXRoXG4vLyBkaWZmZXJlbnQgb3B0aW9ucyBvcGVucyB1cCBzb21lIHRlc3RpbmcgYW5kIGV4dGVuc2liaWxpdHkgc2NlbmFyaW9zXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdCgpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgX3JlZiRjb25uZWN0SE9DID0gX3JlZi5jb25uZWN0SE9DLFxuICAgICAgY29ubmVjdEhPQyA9IF9yZWYkY29ubmVjdEhPQyA9PT0gdW5kZWZpbmVkID8gY29ubmVjdEFkdmFuY2VkIDogX3JlZiRjb25uZWN0SE9DLFxuICAgICAgX3JlZiRtYXBTdGF0ZVRvUHJvcHNGID0gX3JlZi5tYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsXG4gICAgICBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgOiBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YsXG4gICAgICBfcmVmJG1hcERpc3BhdGNoVG9Qcm8gPSBfcmVmLm1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA6IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyxcbiAgICAgIF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9IF9yZWYubWVyZ2VQcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1lcmdlUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1lcmdlUHJvcHNGYWN0b3IgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIDogX3JlZiRtZXJnZVByb3BzRmFjdG9yLFxuICAgICAgX3JlZiRzZWxlY3RvckZhY3RvcnkgPSBfcmVmLnNlbGVjdG9yRmFjdG9yeSxcbiAgICAgIHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYkc2VsZWN0b3JGYWN0b3J5ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IDogX3JlZiRzZWxlY3RvckZhY3Rvcnk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpIHtcbiAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9LFxuICAgICAgICBfcmVmMiRwdXJlID0gX3JlZjIucHVyZSxcbiAgICAgICAgcHVyZSA9IF9yZWYyJHB1cmUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmMiRwdXJlLFxuICAgICAgICBfcmVmMiRhcmVTdGF0ZXNFcXVhbCA9IF9yZWYyLmFyZVN0YXRlc0VxdWFsLFxuICAgICAgICBhcmVTdGF0ZXNFcXVhbCA9IF9yZWYyJGFyZVN0YXRlc0VxdWFsID09PSB1bmRlZmluZWQgPyBzdHJpY3RFcXVhbCA6IF9yZWYyJGFyZVN0YXRlc0VxdWFsLFxuICAgICAgICBfcmVmMiRhcmVPd25Qcm9wc0VxdWEgPSBfcmVmMi5hcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgICBhcmVPd25Qcm9wc0VxdWFsID0gX3JlZjIkYXJlT3duUHJvcHNFcXVhID09PSB1bmRlZmluZWQgPyBzaGFsbG93RXF1YWwgOiBfcmVmMiRhcmVPd25Qcm9wc0VxdWEsXG4gICAgICAgIF9yZWYyJGFyZVN0YXRlUHJvcHNFcSA9IF9yZWYyLmFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsID0gX3JlZjIkYXJlU3RhdGVQcm9wc0VxID09PSB1bmRlZmluZWQgPyBzaGFsbG93RXF1YWwgOiBfcmVmMiRhcmVTdGF0ZVByb3BzRXEsXG4gICAgICAgIF9yZWYyJGFyZU1lcmdlZFByb3BzRSA9IF9yZWYyLmFyZU1lcmdlZFByb3BzRXF1YWwsXG4gICAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBfcmVmMiRhcmVNZXJnZWRQcm9wc0UgPT09IHVuZGVmaW5lZCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYyJGFyZU1lcmdlZFByb3BzRSxcbiAgICAgICAgZXh0cmFPcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBbJ3B1cmUnLCAnYXJlU3RhdGVzRXF1YWwnLCAnYXJlT3duUHJvcHNFcXVhbCcsICdhcmVTdGF0ZVByb3BzRXF1YWwnLCAnYXJlTWVyZ2VkUHJvcHNFcXVhbCddKTtcblxuICAgIHZhciBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWF0Y2gobWFwU3RhdGVUb1Byb3BzLCBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgICB2YXIgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hdGNoKG1hcERpc3BhdGNoVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG4gICAgdmFyIGluaXRNZXJnZVByb3BzID0gbWF0Y2gobWVyZ2VQcm9wcywgbWVyZ2VQcm9wc0ZhY3RvcmllcywgJ21lcmdlUHJvcHMnKTtcblxuICAgIHJldHVybiBjb25uZWN0SE9DKHNlbGVjdG9yRmFjdG9yeSwgX2V4dGVuZHMoe1xuICAgICAgLy8gdXNlZCBpbiBlcnJvciBtZXNzYWdlc1xuICAgICAgbWV0aG9kTmFtZTogJ2Nvbm5lY3QnLFxuXG4gICAgICAvLyB1c2VkIHRvIGNvbXB1dGUgQ29ubmVjdCdzIGRpc3BsYXlOYW1lIGZyb20gdGhlIHdyYXBwZWQgY29tcG9uZW50J3MgZGlzcGxheU5hbWUuXG4gICAgICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gJ0Nvbm5lY3QoJyArIG5hbWUgKyAnKSc7XG4gICAgICB9LFxuXG4gICAgICAvLyBpZiBtYXBTdGF0ZVRvUHJvcHMgaXMgZmFsc3ksIHRoZSBDb25uZWN0IGNvbXBvbmVudCBkb2Vzbid0IHN1YnNjcmliZSB0byBzdG9yZSBzdGF0ZSBjaGFuZ2VzXG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXM6IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKSxcblxuICAgICAgLy8gcGFzc2VkIHRocm91Z2ggdG8gc2VsZWN0b3JGYWN0b3J5XG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzOiBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wczogaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzOiBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIHB1cmU6IHB1cmUsXG4gICAgICBhcmVTdGF0ZXNFcXVhbDogYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsOiBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsOiBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsOiBhcmVNZXJnZWRQcm9wc0VxdWFsXG5cbiAgICB9LCBleHRyYU9wdGlvbnMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29ubmVjdCgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9jb25uZWN0LmpzIiwiaW1wb3J0IHsgYmluZEFjdGlvbkNyZWF0b3JzIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHsgd3JhcE1hcFRvUHJvcHNDb25zdGFudCwgd3JhcE1hcFRvUHJvcHNGdW5jIH0gZnJvbSAnLi93cmFwTWFwVG9Qcm9wcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbihtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nKG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZnVuY3Rpb24gKGRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHsgZGlzcGF0Y2g6IGRpc3BhdGNoIH07XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdvYmplY3QnID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpO1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW3doZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nLCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3RdO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanMiLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uKG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmcobWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwU3RhdGVUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW3doZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nXTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuaW1wb3J0IHZlcmlmeVBsYWluT2JqZWN0IGZyb20gJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBfcmVmLmRpc3BsYXlOYW1lLFxuICAgICAgICBwdXJlID0gX3JlZi5wdXJlLFxuICAgICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gX3JlZi5hcmVNZXJnZWRQcm9wc0VxdWFsO1xuXG4gICAgdmFyIGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICB2YXIgbWVyZ2VkUHJvcHMgPSB2b2lkIDA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICB2YXIgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghcHVyZSB8fCAhYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24obWVyZ2VQcm9wcykge1xuICByZXR1cm4gdHlwZW9mIG1lcmdlUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZChtZXJnZVByb3BzKSB7XG4gIHJldHVybiAhbWVyZ2VQcm9wcyA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1lcmdlUHJvcHM7XG4gIH0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFt3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24sIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkXTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWVyZ2VQcm9wcy5qcyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW1wdXJlRmluYWxQcm9wc1NlbGVjdG9yKHN0YXRlLCBvd25Qcm9wcykge1xuICAgIHJldHVybiBtZXJnZVByb3BzKG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpLCBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKSwgb3duUHJvcHMpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBfcmVmKSB7XG4gIHZhciBhcmVTdGF0ZXNFcXVhbCA9IF9yZWYuYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsID0gX3JlZi5hcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsID0gX3JlZi5hcmVTdGF0ZVByb3BzRXF1YWw7XG5cbiAgdmFyIGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIHZhciBzdGF0ZSA9IHZvaWQgMDtcbiAgdmFyIG93blByb3BzID0gdm9pZCAwO1xuICB2YXIgc3RhdGVQcm9wcyA9IHZvaWQgMDtcbiAgdmFyIGRpc3BhdGNoUHJvcHMgPSB2b2lkIDA7XG4gIHZhciBtZXJnZWRQcm9wcyA9IHZvaWQgMDtcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcblxuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHMoKSB7XG4gICAgaWYgKG1hcFN0YXRlVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuXG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdTdGF0ZSgpIHtcbiAgICB2YXIgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICB2YXIgc3RhdGVQcm9wc0NoYW5nZWQgPSAhYXJlU3RhdGVQcm9wc0VxdWFsKG5leHRTdGF0ZVByb3BzLCBzdGF0ZVByb3BzKTtcbiAgICBzdGF0ZVByb3BzID0gbmV4dFN0YXRlUHJvcHM7XG5cbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICB2YXIgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChuZXh0U3RhdGUsIHN0YXRlKTtcbiAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IG5leHRPd25Qcm9wcztcblxuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG5cbi8vIFRPRE86IEFkZCBtb3JlIGNvbW1lbnRzXG5cbi8vIElmIHB1cmUgaXMgdHJ1ZSwgdGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0QWR2YW5jZWQncyBzaG91bGRDb21wb25lbnRVcGRhdGUgdG8gcmV0dXJuIGZhbHNlIGlmIGZpbmFsXG4vLyBwcm9wcyBoYXZlIG5vdCBjaGFuZ2VkLiBJZiBmYWxzZSwgdGhlIHNlbGVjdG9yIHdpbGwgYWx3YXlzIHJldHVybiBhIG5ld1xuLy8gb2JqZWN0IGFuZCBzaG91bGRDb21wb25lbnRVcGRhdGUgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYyKSB7XG4gIHZhciBpbml0TWFwU3RhdGVUb1Byb3BzID0gX3JlZjIuaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBfcmVmMi5pbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHMgPSBfcmVmMi5pbml0TWVyZ2VQcm9wcyxcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFsnaW5pdE1hcFN0YXRlVG9Qcm9wcycsICdpbml0TWFwRGlzcGF0Y2hUb1Byb3BzJywgJ2luaXRNZXJnZVByb3BzJ10pO1xuXG4gIHZhciBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgdmFyIG1hcERpc3BhdGNoVG9Qcm9wcyA9IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgb3B0aW9ucy5kaXNwbGF5TmFtZSk7XG4gIH1cblxuICB2YXIgc2VsZWN0b3JGYWN0b3J5ID0gb3B0aW9ucy5wdXJlID8gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgOiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuXG4gIHJldHVybiBzZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzIiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSwgZGlzcGxheU5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB2YWx1ZSBmb3IgJyArIG1ldGhvZE5hbWUgKyAnIGluICcgKyBkaXNwbGF5TmFtZSArICcuJyk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIXNlbGVjdG9yLmhhc093blByb3BlcnR5KCdkZXBlbmRzT25Pd25Qcm9wcycpKSB7XG4gICAgICB3YXJuaW5nKCdUaGUgc2VsZWN0b3IgZm9yICcgKyBtZXRob2ROYW1lICsgJyBvZiAnICsgZGlzcGxheU5hbWUgKyAnIGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2ZXJpZnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJywgZGlzcGxheU5hbWUpO1xuICB2ZXJpZnkobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJywgZGlzcGxheU5hbWUpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbnZhciBDTEVBUkVEID0gbnVsbDtcbnZhciBudWxsTGlzdGVuZXJzID0ge1xuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHt9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKSB7XG4gIC8vIHRoZSBjdXJyZW50L25leHQgcGF0dGVybiBpcyBjb3BpZWQgZnJvbSByZWR1eCdzIGNyZWF0ZVN0b3JlIGNvZGUuXG4gIC8vIFRPRE86IHJlZmFjdG9yK2V4cG9zZSB0aGF0IGNvZGUgdG8gYmUgcmV1c2FibGUgaGVyZT9cbiAgdmFyIGN1cnJlbnQgPSBbXTtcbiAgdmFyIG5leHQgPSBbXTtcblxuICByZXR1cm4ge1xuICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIG5leHQgPSBDTEVBUkVEO1xuICAgICAgY3VycmVudCA9IENMRUFSRUQ7XG4gICAgfSxcbiAgICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50ID0gbmV4dDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlbmVyc1tpXSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgaWYgKG5leHQgPT09IGN1cnJlbnQpIG5leHQgPSBjdXJyZW50LnNsaWNlKCk7XG4gICAgICBuZXh0LnB1c2gobGlzdGVuZXIpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGN1cnJlbnQgPT09IENMRUFSRUQpIHJldHVybjtcbiAgICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5leHQgPT09IGN1cnJlbnQpIG5leHQgPSBjdXJyZW50LnNsaWNlKCk7XG4gICAgICAgIG5leHQuc3BsaWNlKG5leHQuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViLCBvblN0YXRlQ2hhbmdlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnNjcmlwdGlvbik7XG5cbiAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5wYXJlbnRTdWIgPSBwYXJlbnRTdWI7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gb25TdGF0ZUNoYW5nZTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICB0aGlzLmxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gIH1cblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmFkZE5lc3RlZFN1YiA9IGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRoaXMudHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5ub3RpZnlOZXN0ZWRTdWJzID0gZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICB0aGlzLmxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmlzU3Vic2NyaWJlZCA9IGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnVuc3Vic2NyaWJlKTtcbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLnRyeVN1YnNjcmliZSA9IGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLnBhcmVudFN1YiA/IHRoaXMucGFyZW50U3ViLmFkZE5lc3RlZFN1Yih0aGlzLm9uU3RhdGVDaGFuZ2UpIDogdGhpcy5zdG9yZS5zdWJzY3JpYmUodGhpcy5vblN0YXRlQ2hhbmdlKTtcblxuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS50cnlVbnN1YnNjcmliZSA9IGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTdWJzY3JpcHRpb247XG59KCk7XG5cbmV4cG9ydCB7IFN1YnNjcmlwdGlvbiBhcyBkZWZhdWx0IH07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy91dGlscy9TdWJzY3JpcHRpb24uanMiLCJ2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duLmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yZWR1eC9lcy91dGlscy9zaGFsbG93RXF1YWwuanMiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNyZWF0ZUhpc3RvcnkgZnJvbSAnaGlzdG9yeS9jcmVhdGVCcm93c2VySGlzdG9yeSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBhIDxSb3V0ZXI+IHRoYXQgdXNlcyBIVE1MNSBoaXN0b3J5LlxuICovXG5cbnZhciBCcm93c2VyUm91dGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEJyb3dzZXJSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXIoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCcm93c2VyUm91dGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlSGlzdG9yeShfdGhpcy5wcm9wcyksIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgQnJvd3NlclJvdXRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwgeyBoaXN0b3J5OiB0aGlzLmhpc3RvcnksIGNoaWxkcmVuOiB0aGlzLnByb3BzLmNoaWxkcmVuIH0pO1xuICB9O1xuXG4gIHJldHVybiBCcm93c2VyUm91dGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Ccm93c2VyUm91dGVyLnByb3BUeXBlcyA9IHtcbiAgYmFzZW5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGZvcmNlUmVmcmVzaDogUHJvcFR5cGVzLmJvb2wsXG4gIGdldFVzZXJDb25maXJtYXRpb246IFByb3BUeXBlcy5mdW5jLFxuICBrZXlMZW5ndGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBCcm93c2VyUm91dGVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9Ccm93c2VyUm91dGVyLmpzIiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjcmVhdGVIaXN0b3J5IGZyb20gJ2hpc3RvcnkvY3JlYXRlSGFzaEhpc3RvcnknO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgYSA8Um91dGVyPiB0aGF0IHVzZXMgd2luZG93LmxvY2F0aW9uLmhhc2guXG4gKi9cblxudmFyIEhhc2hSb3V0ZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSGFzaFJvdXRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSGFzaFJvdXRlcigpIHtcbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhhc2hSb3V0ZXIpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLmhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5KF90aGlzLnByb3BzKSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBIYXNoUm91dGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSwgY2hpbGRyZW46IHRoaXMucHJvcHMuY2hpbGRyZW4gfSk7XG4gIH07XG5cbiAgcmV0dXJuIEhhc2hSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkhhc2hSb3V0ZXIucHJvcFR5cGVzID0ge1xuICBiYXNlbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gIGhhc2hUeXBlOiBQcm9wVHlwZXMub25lT2YoWydoYXNoYmFuZycsICdub3NsYXNoJywgJ3NsYXNoJ10pLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgSGFzaFJvdXRlcjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvSGFzaFJvdXRlci5qcyIsImV4cG9ydCB7IE1lbW9yeVJvdXRlciBhcyBkZWZhdWx0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvTWVtb3J5Um91dGVyLmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgUm91dGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuaW1wb3J0IExpbmsgZnJvbSAnLi9MaW5rJztcblxuLyoqXG4gKiBBIDxMaW5rPiB3cmFwcGVyIHRoYXQga25vd3MgaWYgaXQncyBcImFjdGl2ZVwiIG9yIG5vdC5cbiAqL1xudmFyIE5hdkxpbmsgPSBmdW5jdGlvbiBOYXZMaW5rKF9yZWYpIHtcbiAgdmFyIHRvID0gX3JlZi50byxcbiAgICAgIGV4YWN0ID0gX3JlZi5leGFjdCxcbiAgICAgIHN0cmljdCA9IF9yZWYuc3RyaWN0LFxuICAgICAgbG9jYXRpb24gPSBfcmVmLmxvY2F0aW9uLFxuICAgICAgYWN0aXZlQ2xhc3NOYW1lID0gX3JlZi5hY3RpdmVDbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGFjdGl2ZVN0eWxlID0gX3JlZi5hY3RpdmVTdHlsZSxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIGdldElzQWN0aXZlID0gX3JlZi5pc0FjdGl2ZSxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgWyd0bycsICdleGFjdCcsICdzdHJpY3QnLCAnbG9jYXRpb24nLCAnYWN0aXZlQ2xhc3NOYW1lJywgJ2NsYXNzTmFtZScsICdhY3RpdmVTdHlsZScsICdzdHlsZScsICdpc0FjdGl2ZSddKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZSwge1xuICAgIHBhdGg6ICh0eXBlb2YgdG8gPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHRvKSkgPT09ICdvYmplY3QnID8gdG8ucGF0aG5hbWUgOiB0byxcbiAgICBleGFjdDogZXhhY3QsXG4gICAgc3RyaWN0OiBzdHJpY3QsXG4gICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgIGNoaWxkcmVuOiBmdW5jdGlvbiBjaGlsZHJlbihfcmVmMikge1xuICAgICAgdmFyIGxvY2F0aW9uID0gX3JlZjIubG9jYXRpb24sXG4gICAgICAgICAgbWF0Y2ggPSBfcmVmMi5tYXRjaDtcblxuICAgICAgdmFyIGlzQWN0aXZlID0gISEoZ2V0SXNBY3RpdmUgPyBnZXRJc0FjdGl2ZShtYXRjaCwgbG9jYXRpb24pIDogbWF0Y2gpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChMaW5rLCBfZXh0ZW5kcyh7XG4gICAgICAgIHRvOiB0byxcbiAgICAgICAgY2xhc3NOYW1lOiBpc0FjdGl2ZSA/IFthY3RpdmVDbGFzc05hbWUsIGNsYXNzTmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0pLmpvaW4oJyAnKSA6IGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IGlzQWN0aXZlID8gX2V4dGVuZHMoe30sIHN0eWxlLCBhY3RpdmVTdHlsZSkgOiBzdHlsZVxuICAgICAgfSwgcmVzdCkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5OYXZMaW5rLnByb3BUeXBlcyA9IHtcbiAgdG86IExpbmsucHJvcFR5cGVzLnRvLFxuICBleGFjdDogUHJvcFR5cGVzLmJvb2wsXG4gIHN0cmljdDogUHJvcFR5cGVzLmJvb2wsXG4gIGxvY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICBhY3RpdmVDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWN0aXZlU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBpc0FjdGl2ZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbk5hdkxpbmsuZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmVDbGFzc05hbWU6ICdhY3RpdmUnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBOYXZMaW5rO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9OYXZMaW5rLmpzIiwiZXhwb3J0IHsgUHJvbXB0IGFzIGRlZmF1bHQgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9Qcm9tcHQuanMiLCJleHBvcnQgeyBSZWRpcmVjdCBhcyBkZWZhdWx0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvUmVkaXJlY3QuanMiLCJleHBvcnQgeyBSb3V0ZSBhcyBkZWZhdWx0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvUm91dGUuanMiLCJleHBvcnQgeyBSb3V0ZXIgYXMgZGVmYXVsdCB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXItZG9tL2VzL1JvdXRlci5qcyIsImV4cG9ydCB7IFN0YXRpY1JvdXRlciBhcyBkZWZhdWx0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci1kb20vZXMvU3RhdGljUm91dGVyLmpzIiwiZXhwb3J0IHsgU3dpdGNoIGFzIGRlZmF1bHQgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyLWRvbS9lcy9Td2l0Y2guanMiLCJleHBvcnQgeyBtYXRjaFBhdGggYXMgZGVmYXVsdCB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXItZG9tL2VzL21hdGNoUGF0aC5qcyIsImV4cG9ydCB7IHdpdGhSb3V0ZXIgYXMgZGVmYXVsdCB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXItZG9tL2VzL3dpdGhSb3V0ZXIuanMiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNyZWF0ZUhpc3RvcnkgZnJvbSAnaGlzdG9yeS9jcmVhdGVNZW1vcnlIaXN0b3J5JztcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBhIDxSb3V0ZXI+IHRoYXQgc3RvcmVzIGxvY2F0aW9uIGluIG1lbW9yeS5cbiAqL1xuXG52YXIgTWVtb3J5Um91dGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1lbW9yeVJvdXRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVtb3J5Um91dGVyKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVtb3J5Um91dGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlSGlzdG9yeShfdGhpcy5wcm9wcyksIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgTWVtb3J5Um91dGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSwgY2hpbGRyZW46IHRoaXMucHJvcHMuY2hpbGRyZW4gfSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lbW9yeVJvdXRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuTWVtb3J5Um91dGVyLnByb3BUeXBlcyA9IHtcbiAgaW5pdGlhbEVudHJpZXM6IFByb3BUeXBlcy5hcnJheSxcbiAgaW5pdGlhbEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBnZXRVc2VyQ29uZmlybWF0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAga2V5TGVuZ3RoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgTWVtb3J5Um91dGVyO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyL2VzL01lbW9yeVJvdXRlci5qcyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIHByb21wdGluZyB0aGUgdXNlciBiZWZvcmUgbmF2aWdhdGluZyBhd2F5XG4gKiBmcm9tIGEgc2NyZWVuIHdpdGggYSBjb21wb25lbnQuXG4gKi9cblxudmFyIFByb21wdCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQcm9tcHQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFByb21wdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvbXB0KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUHJvbXB0LnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnVuYmxvY2spIHRoaXMudW5ibG9jaygpO1xuXG4gICAgdGhpcy51bmJsb2NrID0gdGhpcy5jb250ZXh0LnJvdXRlci5oaXN0b3J5LmJsb2NrKG1lc3NhZ2UpO1xuICB9O1xuXG4gIFByb21wdC5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgaWYgKHRoaXMudW5ibG9jaykge1xuICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICB0aGlzLnVuYmxvY2sgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBQcm9tcHQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy53aGVuKSB0aGlzLmVuYWJsZSh0aGlzLnByb3BzLm1lc3NhZ2UpO1xuICB9O1xuXG4gIFByb21wdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy53aGVuKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMud2hlbiB8fCB0aGlzLnByb3BzLm1lc3NhZ2UgIT09IG5leHRQcm9wcy5tZXNzYWdlKSB0aGlzLmVuYWJsZShuZXh0UHJvcHMubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgfTtcblxuICBQcm9tcHQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gIH07XG5cbiAgUHJvbXB0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFByb21wdDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuUHJvbXB0LnByb3BUeXBlcyA9IHtcbiAgd2hlbjogUHJvcFR5cGVzLmJvb2wsXG4gIG1lc3NhZ2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZFxufTtcblByb21wdC5kZWZhdWx0UHJvcHMgPSB7XG4gIHdoZW46IHRydWVcbn07XG5Qcm9tcHQuY29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGJsb2NrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG4gICAgfSkuaXNSZXF1aXJlZFxuICB9KS5pc1JlcXVpcmVkXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFByb21wdDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci9lcy9Qcm9tcHQuanMiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciB1cGRhdGluZyB0aGUgbG9jYXRpb24gcHJvZ3JhbWF0aWNhbGx5XG4gKiB3aXRoIGEgY29tcG9uZW50LlxuICovXG5cbnZhciBSZWRpcmVjdCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSZWRpcmVjdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUmVkaXJlY3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZGlyZWN0KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUmVkaXJlY3QucHJvdG90eXBlLmlzU3RhdGljID0gZnVuY3Rpb24gaXNTdGF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5yb3V0ZXIgJiYgdGhpcy5jb250ZXh0LnJvdXRlci5zdGF0aWNDb250ZXh0O1xuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgaWYgKHRoaXMuaXNTdGF0aWMoKSkgdGhpcy5wZXJmb3JtKCk7XG4gIH07XG5cbiAgUmVkaXJlY3QucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RhdGljKCkpIHRoaXMucGVyZm9ybSgpO1xuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5wZXJmb3JtID0gZnVuY3Rpb24gcGVyZm9ybSgpIHtcbiAgICB2YXIgaGlzdG9yeSA9IHRoaXMuY29udGV4dC5yb3V0ZXIuaGlzdG9yeTtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcHVzaCA9IF9wcm9wcy5wdXNoLFxuICAgICAgICB0byA9IF9wcm9wcy50bztcblxuXG4gICAgaWYgKHB1c2gpIHtcbiAgICAgIGhpc3RvcnkucHVzaCh0byk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpc3RvcnkucmVwbGFjZSh0byk7XG4gICAgfVxuICB9O1xuXG4gIFJlZGlyZWN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlZGlyZWN0O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5SZWRpcmVjdC5wcm9wVHlwZXMgPSB7XG4gIHB1c2g6IFByb3BUeXBlcy5ib29sLFxuICBmcm9tOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0bzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm9iamVjdF0pXG59O1xuUmVkaXJlY3QuZGVmYXVsdFByb3BzID0ge1xuICBwdXNoOiBmYWxzZVxufTtcblJlZGlyZWN0LmNvbnRleHRUeXBlcyA9IHtcbiAgcm91dGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBwdXNoOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgcmVwbGFjZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0pLmlzUmVxdWlyZWQsXG4gICAgc3RhdGljQ29udGV4dDogUHJvcFR5cGVzLm9iamVjdFxuICB9KS5pc1JlcXVpcmVkXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFJlZGlyZWN0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyL2VzL1JlZGlyZWN0LmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgYWRkTGVhZGluZ1NsYXNoLCBjcmVhdGVQYXRoLCBwYXJzZVBhdGggfSBmcm9tICdoaXN0b3J5L1BhdGhVdGlscyc7XG5pbXBvcnQgUm91dGVyIGZyb20gJy4vUm91dGVyJztcblxudmFyIG5vcm1hbGl6ZUxvY2F0aW9uID0gZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb24ob2JqZWN0KSB7XG4gIHZhciBfb2JqZWN0JHBhdGhuYW1lID0gb2JqZWN0LnBhdGhuYW1lLFxuICAgICAgcGF0aG5hbWUgPSBfb2JqZWN0JHBhdGhuYW1lID09PSB1bmRlZmluZWQgPyAnLycgOiBfb2JqZWN0JHBhdGhuYW1lLFxuICAgICAgX29iamVjdCRzZWFyY2ggPSBvYmplY3Quc2VhcmNoLFxuICAgICAgc2VhcmNoID0gX29iamVjdCRzZWFyY2ggPT09IHVuZGVmaW5lZCA/ICcnIDogX29iamVjdCRzZWFyY2gsXG4gICAgICBfb2JqZWN0JGhhc2ggPSBvYmplY3QuaGFzaCxcbiAgICAgIGhhc2ggPSBfb2JqZWN0JGhhc2ggPT09IHVuZGVmaW5lZCA/ICcnIDogX29iamVjdCRoYXNoO1xuXG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2ggPT09ICc/JyA/ICcnIDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2ggPT09ICcjJyA/ICcnIDogaGFzaFxuICB9O1xufTtcblxudmFyIGFkZEJhc2VuYW1lID0gZnVuY3Rpb24gYWRkQmFzZW5hbWUoYmFzZW5hbWUsIGxvY2F0aW9uKSB7XG4gIGlmICghYmFzZW5hbWUpIHJldHVybiBsb2NhdGlvbjtcblxuICByZXR1cm4gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7XG4gICAgcGF0aG5hbWU6IGFkZExlYWRpbmdTbGFzaChiYXNlbmFtZSkgKyBsb2NhdGlvbi5wYXRobmFtZVxuICB9KTtcbn07XG5cbnZhciBzdHJpcEJhc2VuYW1lID0gZnVuY3Rpb24gc3RyaXBCYXNlbmFtZShiYXNlbmFtZSwgbG9jYXRpb24pIHtcbiAgaWYgKCFiYXNlbmFtZSkgcmV0dXJuIGxvY2F0aW9uO1xuXG4gIHZhciBiYXNlID0gYWRkTGVhZGluZ1NsYXNoKGJhc2VuYW1lKTtcblxuICBpZiAobG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZihiYXNlKSAhPT0gMCkgcmV0dXJuIGxvY2F0aW9uO1xuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgbG9jYXRpb24sIHtcbiAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyKGJhc2UubGVuZ3RoKVxuICB9KTtcbn07XG5cbnZhciBjcmVhdGVMb2NhdGlvbiA9IGZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnID8gcGFyc2VQYXRoKGxvY2F0aW9uKSA6IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcbn07XG5cbnZhciBjcmVhdGVVUkwgPSBmdW5jdGlvbiBjcmVhdGVVUkwobG9jYXRpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3N0cmluZycgPyBsb2NhdGlvbiA6IGNyZWF0ZVBhdGgobG9jYXRpb24pO1xufTtcblxudmFyIHN0YXRpY0hhbmRsZXIgPSBmdW5jdGlvbiBzdGF0aWNIYW5kbGVyKG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdZb3UgY2Fubm90ICVzIHdpdGggPFN0YXRpY1JvdXRlcj4nLCBtZXRob2ROYW1lKTtcbiAgfTtcbn07XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG4vKipcbiAqIFRoZSBwdWJsaWMgdG9wLWxldmVsIEFQSSBmb3IgYSBcInN0YXRpY1wiIDxSb3V0ZXI+LCBzby1jYWxsZWQgYmVjYXVzZSBpdFxuICogY2FuJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHNcbiAqIGxvY2F0aW9uIGNoYW5nZXMgaW4gYSBjb250ZXh0IG9iamVjdC4gVXNlZnVsIG1haW5seSBpbiB0ZXN0aW5nIGFuZFxuICogc2VydmVyLXJlbmRlcmluZyBzY2VuYXJpb3MuXG4gKi9cblxudmFyIFN0YXRpY1JvdXRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhTdGF0aWNSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFN0YXRpY1JvdXRlcigpIHtcbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRpY1JvdXRlcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuY3JlYXRlSHJlZiA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICByZXR1cm4gYWRkTGVhZGluZ1NsYXNoKF90aGlzLnByb3BzLmJhc2VuYW1lICsgY3JlYXRlVVJMKHBhdGgpKTtcbiAgICB9LCBfdGhpcy5oYW5kbGVQdXNoID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBiYXNlbmFtZSA9IF90aGlzJHByb3BzLmJhc2VuYW1lLFxuICAgICAgICAgIGNvbnRleHQgPSBfdGhpcyRwcm9wcy5jb250ZXh0O1xuXG4gICAgICBjb250ZXh0LmFjdGlvbiA9ICdQVVNIJztcbiAgICAgIGNvbnRleHQubG9jYXRpb24gPSBhZGRCYXNlbmFtZShiYXNlbmFtZSwgY3JlYXRlTG9jYXRpb24obG9jYXRpb24pKTtcbiAgICAgIGNvbnRleHQudXJsID0gY3JlYXRlVVJMKGNvbnRleHQubG9jYXRpb24pO1xuICAgIH0sIF90aGlzLmhhbmRsZVJlcGxhY2UgPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBiYXNlbmFtZSA9IF90aGlzJHByb3BzMi5iYXNlbmFtZSxcbiAgICAgICAgICBjb250ZXh0ID0gX3RoaXMkcHJvcHMyLmNvbnRleHQ7XG5cbiAgICAgIGNvbnRleHQuYWN0aW9uID0gJ1JFUExBQ0UnO1xuICAgICAgY29udGV4dC5sb2NhdGlvbiA9IGFkZEJhc2VuYW1lKGJhc2VuYW1lLCBjcmVhdGVMb2NhdGlvbihsb2NhdGlvbikpO1xuICAgICAgY29udGV4dC51cmwgPSBjcmVhdGVVUkwoY29udGV4dC5sb2NhdGlvbik7XG4gICAgfSwgX3RoaXMuaGFuZGxlTGlzdGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfSwgX3RoaXMuaGFuZGxlQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbm9vcDtcbiAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIFN0YXRpY1JvdXRlci5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXI6IHtcbiAgICAgICAgc3RhdGljQ29udGV4dDogdGhpcy5wcm9wcy5jb250ZXh0XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBTdGF0aWNSb3V0ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYmFzZW5hbWUgPSBfcHJvcHMuYmFzZW5hbWUsXG4gICAgICAgIGNvbnRleHQgPSBfcHJvcHMuY29udGV4dCxcbiAgICAgICAgbG9jYXRpb24gPSBfcHJvcHMubG9jYXRpb24sXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydiYXNlbmFtZScsICdjb250ZXh0JywgJ2xvY2F0aW9uJ10pO1xuXG4gICAgdmFyIGhpc3RvcnkgPSB7XG4gICAgICBjcmVhdGVIcmVmOiB0aGlzLmNyZWF0ZUhyZWYsXG4gICAgICBhY3Rpb246ICdQT1AnLFxuICAgICAgbG9jYXRpb246IHN0cmlwQmFzZW5hbWUoYmFzZW5hbWUsIGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uKSksXG4gICAgICBwdXNoOiB0aGlzLmhhbmRsZVB1c2gsXG4gICAgICByZXBsYWNlOiB0aGlzLmhhbmRsZVJlcGxhY2UsXG4gICAgICBnbzogc3RhdGljSGFuZGxlcignZ28nKSxcbiAgICAgIGdvQmFjazogc3RhdGljSGFuZGxlcignZ29CYWNrJyksXG4gICAgICBnb0ZvcndhcmQ6IHN0YXRpY0hhbmRsZXIoJ2dvRm9yd2FyZCcpLFxuICAgICAgbGlzdGVuOiB0aGlzLmhhbmRsZUxpc3RlbixcbiAgICAgIGJsb2NrOiB0aGlzLmhhbmRsZUJsb2NrXG4gICAgfTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7IGhpc3Rvcnk6IGhpc3RvcnkgfSkpO1xuICB9O1xuXG4gIHJldHVybiBTdGF0aWNSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblN0YXRpY1JvdXRlci5wcm9wVHlwZXMgPSB7XG4gIGJhc2VuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGxvY2F0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSlcbn07XG5TdGF0aWNSb3V0ZXIuZGVmYXVsdFByb3BzID0ge1xuICBiYXNlbmFtZTogJycsXG4gIGxvY2F0aW9uOiAnLydcbn07XG5TdGF0aWNSb3V0ZXIuY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gIHJvdXRlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRpY1JvdXRlcjtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci9lcy9TdGF0aWNSb3V0ZXIuanMiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgbWF0Y2hQYXRoIGZyb20gJy4vbWF0Y2hQYXRoJztcblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcmVuZGVyaW5nIHRoZSBmaXJzdCA8Um91dGU+IHRoYXQgbWF0Y2hlcy5cbiAqL1xuXG52YXIgU3dpdGNoID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFN3aXRjaCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3dpdGNoKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTd2l0Y2gpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBTd2l0Y2gucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIHdhcm5pbmcoIShuZXh0UHJvcHMubG9jYXRpb24gJiYgIXRoaXMucHJvcHMubG9jYXRpb24pLCAnPFN3aXRjaD4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBpbml0aWFsbHkgdXNlZCBubyBcImxvY2F0aW9uXCIgcHJvcCBhbmQgdGhlbiBwcm92aWRlZCBvbmUgb24gYSBzdWJzZXF1ZW50IHJlbmRlci4nKTtcblxuICAgIHdhcm5pbmcoISghbmV4dFByb3BzLmxvY2F0aW9uICYmIHRoaXMucHJvcHMubG9jYXRpb24pLCAnPFN3aXRjaD4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBwcm92aWRlZCBhIFwibG9jYXRpb25cIiBwcm9wIGluaXRpYWxseSBidXQgb21pdHRlZCBpdCBvbiBhIHN1YnNlcXVlbnQgcmVuZGVyLicpO1xuICB9O1xuXG4gIFN3aXRjaC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciByb3V0ZSA9IHRoaXMuY29udGV4dC5yb3V0ZXIucm91dGU7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcblxuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMucHJvcHMubG9jYXRpb24gfHwgcm91dGUubG9jYXRpb247XG5cbiAgICB2YXIgbWF0Y2ggPSB2b2lkIDAsXG4gICAgICAgIGNoaWxkID0gdm9pZCAwO1xuICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSByZXR1cm47XG5cbiAgICAgIHZhciBfZWxlbWVudCRwcm9wcyA9IGVsZW1lbnQucHJvcHMsXG4gICAgICAgICAgcGF0aFByb3AgPSBfZWxlbWVudCRwcm9wcy5wYXRoLFxuICAgICAgICAgIGV4YWN0ID0gX2VsZW1lbnQkcHJvcHMuZXhhY3QsXG4gICAgICAgICAgc3RyaWN0ID0gX2VsZW1lbnQkcHJvcHMuc3RyaWN0LFxuICAgICAgICAgIGZyb20gPSBfZWxlbWVudCRwcm9wcy5mcm9tO1xuXG4gICAgICB2YXIgcGF0aCA9IHBhdGhQcm9wIHx8IGZyb207XG5cbiAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7XG4gICAgICAgIGNoaWxkID0gZWxlbWVudDtcbiAgICAgICAgbWF0Y2ggPSBwYXRoID8gbWF0Y2hQYXRoKGxvY2F0aW9uLnBhdGhuYW1lLCB7IHBhdGg6IHBhdGgsIGV4YWN0OiBleGFjdCwgc3RyaWN0OiBzdHJpY3QgfSkgOiByb3V0ZS5tYXRjaDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRjaCA/IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgeyBsb2NhdGlvbjogbG9jYXRpb24sIGNvbXB1dGVkTWF0Y2g6IG1hdGNoIH0pIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gU3dpdGNoO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Td2l0Y2guY29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgcm91dGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICB9KS5pc1JlcXVpcmVkXG59O1xuU3dpdGNoLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBTd2l0Y2g7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXIvZXMvU3dpdGNoLmpzIiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IFJvdXRlIGZyb20gJy4vUm91dGUnO1xuXG4vKipcbiAqIEEgcHVibGljIGhpZ2hlci1vcmRlciBjb21wb25lbnQgdG8gYWNjZXNzIHRoZSBpbXBlcmF0aXZlIEFQSVxuICovXG52YXIgd2l0aFJvdXRlciA9IGZ1bmN0aW9uIHdpdGhSb3V0ZXIoQ29tcG9uZW50KSB7XG4gIHZhciBDID0gZnVuY3Rpb24gQyhwcm9wcykge1xuICAgIHZhciB3cmFwcGVkQ29tcG9uZW50UmVmID0gcHJvcHMud3JhcHBlZENvbXBvbmVudFJlZixcbiAgICAgICAgcmVtYWluaW5nUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFsnd3JhcHBlZENvbXBvbmVudFJlZiddKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlLCB7IHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKHJvdXRlQ29tcG9uZW50UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcmVtYWluaW5nUHJvcHMsIHJvdXRlQ29tcG9uZW50UHJvcHMsIHsgcmVmOiB3cmFwcGVkQ29tcG9uZW50UmVmIH0pKTtcbiAgICAgIH0gfSk7XG4gIH07XG5cbiAgQy5kaXNwbGF5TmFtZSA9ICd3aXRoUm91dGVyKCcgKyAoQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lKSArICcpJztcbiAgQy5XcmFwcGVkQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuICBDLnByb3BUeXBlcyA9IHtcbiAgICB3cmFwcGVkQ29tcG9uZW50UmVmOiBQcm9wVHlwZXMuZnVuY1xuICB9O1xuXG4gIHJldHVybiBob2lzdFN0YXRpY3MoQywgQ29tcG9uZW50KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC1yb3V0ZXIvZXMvd2l0aFJvdXRlci5qcyIsIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3Qtcm91dGVyL34vaXNhcnJheS9pbmRleC5qcyIsInZhciBpc2FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbi8qKlxuICogRXhwb3NlIGBwYXRoVG9SZWdleHBgLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGhUb1JlZ2V4cFxubW9kdWxlLmV4cG9ydHMucGFyc2UgPSBwYXJzZVxubW9kdWxlLmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGVcbm1vZHVsZS5leHBvcnRzLnRva2Vuc1RvRnVuY3Rpb24gPSB0b2tlbnNUb0Z1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cy50b2tlbnNUb1JlZ0V4cCA9IHRva2Vuc1RvUmVnRXhwXG5cbi8qKlxuICogVGhlIG1haW4gcGF0aCBtYXRjaGluZyByZWdleHAgdXRpbGl0eS5cbiAqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG52YXIgUEFUSF9SRUdFWFAgPSBuZXcgUmVnRXhwKFtcbiAgLy8gTWF0Y2ggZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGFwcGVhciBpbiBmdXR1cmUgbWF0Y2hlcy5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IHdvbid0IHRyYW5zZm9ybS5cbiAgJyhcXFxcXFxcXC4pJyxcbiAgLy8gTWF0Y2ggRXhwcmVzcy1zdHlsZSBwYXJhbWV0ZXJzIGFuZCB1bi1uYW1lZCBwYXJhbWV0ZXJzIHdpdGggYSBwcmVmaXhcbiAgLy8gYW5kIG9wdGlvbmFsIHN1ZmZpeGVzLiBNYXRjaGVzIGFwcGVhciBhczpcbiAgLy9cbiAgLy8gXCIvOnRlc3QoXFxcXGQrKT9cIiA9PiBbXCIvXCIsIFwidGVzdFwiLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCBcIj9cIiwgdW5kZWZpbmVkXVxuICAvLyBcIi9yb3V0ZShcXFxcZCspXCIgID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gIC8vIFwiLypcIiAgICAgICAgICAgID0+IFtcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIipcIl1cbiAgJyhbXFxcXC8uXSk/KD86KD86XFxcXDooXFxcXHcrKSg/OlxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpP3xcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKShbKyo/XSk/fChcXFxcKikpJ1xuXS5qb2luKCd8JyksICdnJylcblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBmb3IgdGhlIHJhdyB0b2tlbnMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshQXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlIChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIHRva2VucyA9IFtdXG4gIHZhciBrZXkgPSAwXG4gIHZhciBpbmRleCA9IDBcbiAgdmFyIHBhdGggPSAnJ1xuICB2YXIgZGVmYXVsdERlbGltaXRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kZWxpbWl0ZXIgfHwgJy8nXG4gIHZhciByZXNcblxuICB3aGlsZSAoKHJlcyA9IFBBVEhfUkVHRVhQLmV4ZWMoc3RyKSkgIT0gbnVsbCkge1xuICAgIHZhciBtID0gcmVzWzBdXG4gICAgdmFyIGVzY2FwZWQgPSByZXNbMV1cbiAgICB2YXIgb2Zmc2V0ID0gcmVzLmluZGV4XG4gICAgcGF0aCArPSBzdHIuc2xpY2UoaW5kZXgsIG9mZnNldClcbiAgICBpbmRleCA9IG9mZnNldCArIG0ubGVuZ3RoXG5cbiAgICAvLyBJZ25vcmUgYWxyZWFkeSBlc2NhcGVkIHNlcXVlbmNlcy5cbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgcGF0aCArPSBlc2NhcGVkWzFdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBuZXh0ID0gc3RyW2luZGV4XVxuICAgIHZhciBwcmVmaXggPSByZXNbMl1cbiAgICB2YXIgbmFtZSA9IHJlc1szXVxuICAgIHZhciBjYXB0dXJlID0gcmVzWzRdXG4gICAgdmFyIGdyb3VwID0gcmVzWzVdXG4gICAgdmFyIG1vZGlmaWVyID0gcmVzWzZdXG4gICAgdmFyIGFzdGVyaXNrID0gcmVzWzddXG5cbiAgICAvLyBQdXNoIHRoZSBjdXJyZW50IHBhdGggb250byB0aGUgdG9rZW5zLlxuICAgIGlmIChwYXRoKSB7XG4gICAgICB0b2tlbnMucHVzaChwYXRoKVxuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWwgPSBwcmVmaXggIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwgJiYgbmV4dCAhPT0gcHJlZml4XG4gICAgdmFyIHJlcGVhdCA9IG1vZGlmaWVyID09PSAnKycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBvcHRpb25hbCA9IG1vZGlmaWVyID09PSAnPycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXNbMl0gfHwgZGVmYXVsdERlbGltaXRlclxuICAgIHZhciBwYXR0ZXJuID0gY2FwdHVyZSB8fCBncm91cFxuXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSB8fCBrZXkrKyxcbiAgICAgIHByZWZpeDogcHJlZml4IHx8ICcnLFxuICAgICAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICAgIHBhcnRpYWw6IHBhcnRpYWwsXG4gICAgICBhc3RlcmlzazogISFhc3RlcmlzayxcbiAgICAgIHBhdHRlcm46IHBhdHRlcm4gPyBlc2NhcGVHcm91cChwYXR0ZXJuKSA6IChhc3RlcmlzayA/ICcuKicgOiAnW14nICsgZXNjYXBlU3RyaW5nKGRlbGltaXRlcikgKyAnXSs/JylcbiAgICB9KVxuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KVxuICB9XG5cbiAgLy8gSWYgdGhlIHBhdGggZXhpc3RzLCBwdXNoIGl0IG9udG8gdGhlIGVuZC5cbiAgaWYgKHBhdGgpIHtcbiAgICB0b2tlbnMucHVzaChwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBzdHJpbmcgdG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGhlIHBhdGguXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICBzdHJcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IWZ1bmN0aW9uKE9iamVjdD0sIE9iamVjdD0pfVxuICovXG5mdW5jdGlvbiBjb21waWxlIChzdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvRnVuY3Rpb24ocGFyc2Uoc3RyLCBvcHRpb25zKSlcbn1cblxuLyoqXG4gKiBQcmV0dGllciBlbmNvZGluZyBvZiBVUkkgcGF0aCBzZWdtZW50cy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bXFwvPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEVuY29kZSB0aGUgYXN0ZXJpc2sgcGFyYW1ldGVyLiBTaW1pbGFyIHRvIGBwcmV0dHlgLCBidXQgYWxsb3dzIHNsYXNoZXMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbmNvZGVBc3RlcmlzayAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIG1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIHRva2VucyBpbnRvIHRoZSBwYXRoIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uICh0b2tlbnMpIHtcbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIHZhciBtYXRjaGVzID0gbmV3IEFycmF5KHRva2Vucy5sZW5ndGgpXG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRva2Vuc1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1hdGNoZXNbaV0gPSBuZXcgUmVnRXhwKCdeKD86JyArIHRva2Vuc1tpXS5wYXR0ZXJuICsgJykkJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIHZhciBwYXRoID0gJydcbiAgICB2YXIgZGF0YSA9IG9iaiB8fCB7fVxuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fVxuICAgIHZhciBlbmNvZGUgPSBvcHRpb25zLnByZXR0eSA/IGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSA6IGVuY29kZVVSSUNvbXBvbmVudFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRoICs9IHRva2VuXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZGF0YVt0b2tlbi5uYW1lXVxuICAgICAgdmFyIHNlZ21lbnRcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gUHJlcGVuZCBwYXJ0aWFsIHNlZ21lbnQgcHJlZml4ZXMuXG4gICAgICAgICAgaWYgKHRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIGJlIGRlZmluZWQnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc2FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAoIXRva2VuLnJlcGVhdCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzZWdtZW50ID0gZW5jb2RlKHZhbHVlW2pdKVxuXG4gICAgICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGFsbCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHNlZ21lbnQpICsgJ2AnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGggKz0gKGogPT09IDAgPyB0b2tlbi5wcmVmaXggOiB0b2tlbi5kZWxpbWl0ZXIpICsgc2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc2VnbWVudCA9IHRva2VuLmFzdGVyaXNrID8gZW5jb2RlQXN0ZXJpc2sodmFsdWUpIDogZW5jb2RlKHZhbHVlKVxuXG4gICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBcIicgKyBzZWdtZW50ICsgJ1wiJylcbiAgICAgIH1cblxuICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXggKyBzZWdtZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxufVxuXG4vKipcbiAqIEVzY2FwZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4rKj89XiE6JHt9KClbXFxdfFxcL1xcXFxdKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGhlIGNhcHR1cmluZyBncm91cCBieSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBncm91cFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVHcm91cCAoZ3JvdXApIHtcbiAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoLyhbPSE6JFxcLygpXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogQXR0YWNoIHRoZSBrZXlzIGFzIGEgcHJvcGVydHkgb2YgdGhlIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshUmVnRXhwfSByZVxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXR0YWNoS2V5cyAocmUsIGtleXMpIHtcbiAgcmUua2V5cyA9IGtleXNcbiAgcmV0dXJuIHJlXG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyBmb3IgYSByZWdleHAgZnJvbSB0aGUgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmxhZ3MgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2Vuc2l0aXZlID8gJycgOiAnaSdcbn1cblxuLyoqXG4gKiBQdWxsIG91dCBrZXlzIGZyb20gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcmVnZXhwVG9SZWdleHAgKHBhdGgsIGtleXMpIHtcbiAgLy8gVXNlIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIG1hdGNoIG9ubHkgY2FwdHVyaW5nIGdyb3Vwcy5cbiAgdmFyIGdyb3VwcyA9IHBhdGguc291cmNlLm1hdGNoKC9cXCgoPyFcXD8pL2cpXG5cbiAgaWYgKGdyb3Vwcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXlzLnB1c2goe1xuICAgICAgICBuYW1lOiBpLFxuICAgICAgICBwcmVmaXg6IG51bGwsXG4gICAgICAgIGRlbGltaXRlcjogbnVsbCxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICByZXBlYXQ6IGZhbHNlLFxuICAgICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgICAgYXN0ZXJpc2s6IGZhbHNlLFxuICAgICAgICBwYXR0ZXJuOiBudWxsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHBhdGgsIGtleXMpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5IGludG8gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgcGF0aFxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICB2YXIgcGFydHMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2gocGF0aFRvUmVnZXhwKHBhdGhbaV0sIGtleXMsIG9wdGlvbnMpLnNvdXJjZSlcbiAgfVxuXG4gIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKCcoPzonICsgcGFydHMuam9pbignfCcpICsgJyknLCBmbGFncyhvcHRpb25zKSlcblxuICByZXR1cm4gYXR0YWNoS2V5cyhyZWdleHAsIGtleXMpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGF0aCByZWdleHAgZnJvbSBzdHJpbmcgaW5wdXQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvUmVnRXhwKHBhcnNlKHBhdGgsIG9wdGlvbnMpLCBrZXlzLCBvcHRpb25zKVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIGZ1bmN0aW9uIGZvciB0YWtpbmcgdG9rZW5zIGFuZCByZXR1cm5pbmcgYSBSZWdFeHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgICAgICAgICB0b2tlbnNcbiAqIEBwYXJhbSAgeyhBcnJheXxPYmplY3QpPX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiB0b2tlbnNUb1JlZ0V4cCAodG9rZW5zLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpXG4gICAga2V5cyA9IFtdXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdFxuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlXG4gIHZhciByb3V0ZSA9ICcnXG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0b2tlbnMgYW5kIGNyZWF0ZSBvdXIgcmVnZXhwIHN0cmluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByb3V0ZSArPSBlc2NhcGVTdHJpbmcodG9rZW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmVmaXggPSBlc2NhcGVTdHJpbmcodG9rZW4ucHJlZml4KVxuICAgICAgdmFyIGNhcHR1cmUgPSAnKD86JyArIHRva2VuLnBhdHRlcm4gKyAnKSdcblxuICAgICAga2V5cy5wdXNoKHRva2VuKVxuXG4gICAgICBpZiAodG9rZW4ucmVwZWF0KSB7XG4gICAgICAgIGNhcHR1cmUgKz0gJyg/OicgKyBwcmVmaXggKyBjYXB0dXJlICsgJykqJ1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgY2FwdHVyZSA9ICcoPzonICsgcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpKT8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKT8nXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcHR1cmUgPSBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJyknXG4gICAgICB9XG5cbiAgICAgIHJvdXRlICs9IGNhcHR1cmVcbiAgICB9XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZXNjYXBlU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJylcbiAgdmFyIGVuZHNXaXRoRGVsaW1pdGVyID0gcm91dGUuc2xpY2UoLWRlbGltaXRlci5sZW5ndGgpID09PSBkZWxpbWl0ZXJcblxuICAvLyBJbiBub24tc3RyaWN0IG1vZGUgd2UgYWxsb3cgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIG1hdGNoLiBJZiB0aGUgcGF0aCB0b1xuICAvLyBtYXRjaCBhbHJlYWR5IGVuZHMgd2l0aCBhIHNsYXNoLCB3ZSByZW1vdmUgaXQgZm9yIGNvbnNpc3RlbmN5LiBUaGUgc2xhc2hcbiAgLy8gaXMgdmFsaWQgYXQgdGhlIGVuZCBvZiBhIHBhdGggbWF0Y2gsIG5vdCBpbiB0aGUgbWlkZGxlLiBUaGlzIGlzIGltcG9ydGFudFxuICAvLyBpbiBub24tZW5kaW5nIG1vZGUsIHdoZXJlIFwiL3Rlc3QvXCIgc2hvdWxkbid0IG1hdGNoIFwiL3Rlc3QvL3JvdXRlXCIuXG4gIGlmICghc3RyaWN0KSB7XG4gICAgcm91dGUgPSAoZW5kc1dpdGhEZWxpbWl0ZXIgPyByb3V0ZS5zbGljZSgwLCAtZGVsaW1pdGVyLmxlbmd0aCkgOiByb3V0ZSkgKyAnKD86JyArIGRlbGltaXRlciArICcoPz0kKSk/J1xuICB9XG5cbiAgaWYgKGVuZCkge1xuICAgIHJvdXRlICs9ICckJ1xuICB9IGVsc2Uge1xuICAgIC8vIEluIG5vbi1lbmRpbmcgbW9kZSwgd2UgbmVlZCB0aGUgY2FwdHVyaW5nIGdyb3VwcyB0byBtYXRjaCBhcyBtdWNoIGFzXG4gICAgLy8gcG9zc2libGUgYnkgdXNpbmcgYSBwb3NpdGl2ZSBsb29rYWhlYWQgdG8gdGhlIGVuZCBvciBuZXh0IHBhdGggc2VnbWVudC5cbiAgICByb3V0ZSArPSBzdHJpY3QgJiYgZW5kc1dpdGhEZWxpbWl0ZXIgPyAnJyA6ICcoPz0nICsgZGVsaW1pdGVyICsgJ3wkKSdcbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKG5ldyBSZWdFeHAoJ14nICsgcm91dGUsIGZsYWdzKG9wdGlvbnMpKSwga2V5cylcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIHBhdGggc3RyaW5nLCByZXR1cm5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQW4gZW1wdHkgYXJyYXkgY2FuIGJlIHBhc3NlZCBpbiBmb3IgdGhlIGtleXMsIHdoaWNoIHdpbGwgaG9sZCB0aGVcbiAqIHBsYWNlaG9sZGVyIGtleSBkZXNjcmlwdGlvbnMuIEZvciBleGFtcGxlLCB1c2luZyBgL3VzZXIvOmlkYCwgYGtleXNgIHdpbGxcbiAqIGNvbnRhaW4gYFt7IG5hbWU6ICdpZCcsIGRlbGltaXRlcjogJy8nLCBvcHRpb25hbDogZmFsc2UsIHJlcGVhdDogZmFsc2UgfV1gLlxuICpcbiAqIEBwYXJhbSAgeyhzdHJpbmd8UmVnRXhwfEFycmF5KX0gcGF0aFxuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSAgICAgICBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHBhdGhUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBpZiAoIWlzYXJyYXkoa2V5cykpIHtcbiAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoa2V5cyB8fCBvcHRpb25zKVxuICAgIGtleXMgPSBbXVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiByZWdleHBUb1JlZ2V4cChwYXRoLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpKVxuICB9XG5cbiAgaWYgKGlzYXJyYXkocGF0aCkpIHtcbiAgICByZXR1cm4gYXJyYXlUb1JlZ2V4cCgvKiogQHR5cGUgeyFBcnJheX0gKi8gKHBhdGgpLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIHN0cmluZ1RvUmVnZXhwKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0LXJvdXRlci9+L3BhdGgtdG8tcmVnZXhwL2luZGV4LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlKGtleSkge1xuICB2YXIgdW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7XG4gIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0wJzogJz0nLFxuICAgICc9Mic6ICc6J1xuICB9O1xuICB2YXIga2V5U3Vic3RyaW5nID0ga2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5LnN1YnN0cmluZygxKTtcblxuICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiB1bmVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbn1cblxudmFyIEtleUVzY2FwZVV0aWxzID0ge1xuICBlc2NhcGU6IGVzY2FwZSxcbiAgdW5lc2NhcGU6IHVuZXNjYXBlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0aWxzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL0tleUVzY2FwZVV0aWxzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogU3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBlYWNoIHBvdGVudGlhbCBudW1iZXIgb2ZcbiAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVyaWMgcG9vbGVyIGlzIGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGRcbiAqIHJlcXVpcmUgYWNjZXNzaW5nIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCByZWZlcnMgdG9cbiAqIHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90aGVycyBhcmUgbmVlZGVkLCBzaW1wbHkgYWRkIHRoZW1cbiAqIGhlcmUsIG9yIGluIHRoZWlyIG93biBmaWxlcy5cbiAqL1xudmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVsZHNGcm9tKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7XG4gIH1cbn07XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIpO1xuICB9XG59O1xuXG52YXIgdGhyZWVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMpO1xuICB9XG59O1xuXG52YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0KSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzLCBhNCk7XG4gIH1cbn07XG5cbnZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwO1xuICBpbnN0YW5jZS5kZXN0cnVjdG9yKCk7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUpIHtcbiAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbi8qKlxuICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzc1xuICogaXRzZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0cnVjdG9yXG4gKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYVxuICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci5cbiAqL1xudmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikge1xuICAvLyBDYXN0aW5nIGFzIGFueSBzbyB0aGF0IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVzdHNcbiAgLy8gaXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWRcbiAgdmFyIE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yO1xuICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTtcbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSO1xuICBpZiAoIU5ld0tsYXNzLnBvb2xTaXplKSB7XG4gICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTtcbiAgfVxuICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjtcbiAgcmV0dXJuIE5ld0tsYXNzO1xufTtcblxudmFyIFBvb2xlZENsYXNzID0ge1xuICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdUbyxcbiAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLFxuICB0d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsXG4gIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVlQXJndW1lbnRQb29sZXIsXG4gIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1Bvb2xlZENsYXNzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSByZXF1aXJlKCcuL3RyYXZlcnNlQWxsQ2hpbGRyZW4nKTtcblxudmFyIHR3b0FyZ3VtZW50UG9vbGVyID0gUG9vbGVkQ2xhc3MudHdvQXJndW1lbnRQb29sZXI7XG52YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gUG9vbGVkQ2xhc3MuZm91ckFyZ3VtZW50UG9vbGVyO1xuXG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuICgnJyArIHRleHQpLnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cblxuLyoqXG4gKiBQb29sZWRDbGFzcyByZXByZXNlbnRpbmcgdGhlIGJvb2trZWVwaW5nIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGRcbiAqIHRyYXZlcnNhbC4gQWxsb3dzIGF2b2lkaW5nIGJpbmRpbmcgY2FsbGJhY2tzLlxuICpcbiAqIEBjb25zdHJ1Y3RvciBGb3JFYWNoQm9va0tlZXBpbmdcbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBmb3JFYWNoRnVuY3Rpb24gRnVuY3Rpb24gdG8gcGVyZm9ybSB0cmF2ZXJzYWwgd2l0aC5cbiAqIEBwYXJhbSB7Pyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgdG8gcGVyZm9ybSBjb250ZXh0IHdpdGguXG4gKi9cbmZ1bmN0aW9uIEZvckVhY2hCb29rS2VlcGluZyhmb3JFYWNoRnVuY3Rpb24sIGZvckVhY2hDb250ZXh0KSB7XG4gIHRoaXMuZnVuYyA9IGZvckVhY2hGdW5jdGlvbjtcbiAgdGhpcy5jb250ZXh0ID0gZm9yRWFjaENvbnRleHQ7XG4gIHRoaXMuY291bnQgPSAwO1xufVxuRm9yRWFjaEJvb2tLZWVwaW5nLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZ1bmMgPSBudWxsO1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLmNvdW50ID0gMDtcbn07XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oRm9yRWFjaEJvb2tLZWVwaW5nLCB0d29Bcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZChib29rS2VlcGluZywgY2hpbGQsIG5hbWUpIHtcbiAgdmFyIGZ1bmMgPSBib29rS2VlcGluZy5mdW5jLFxuICAgICAgY29udGV4dCA9IGJvb2tLZWVwaW5nLmNvbnRleHQ7XG5cbiAgZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBib29rS2VlcGluZy5jb3VudCsrKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4uZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IEZvckVhY2hCb29rS2VlcGluZy5nZXRQb29sZWQoZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNpbmdsZUNoaWxkLCB0cmF2ZXJzZUNvbnRleHQpO1xuICBGb3JFYWNoQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIFBvb2xlZENsYXNzIHJlcHJlc2VudGluZyB0aGUgYm9va2tlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBjaGlsZFxuICogbWFwcGluZy4gQWxsb3dzIGF2b2lkaW5nIGJpbmRpbmcgY2FsbGJhY2tzLlxuICpcbiAqIEBjb25zdHJ1Y3RvciBNYXBCb29rS2VlcGluZ1xuICogQHBhcmFtIHshKn0gbWFwUmVzdWx0IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICogQHBhcmFtIHshZnVuY3Rpb259IG1hcEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBlcmZvcm0gbWFwcGluZyB3aXRoLlxuICogQHBhcmFtIHs/Kn0gbWFwQ29udGV4dCBDb250ZXh0IHRvIHBlcmZvcm0gbWFwcGluZyB3aXRoLlxuICovXG5mdW5jdGlvbiBNYXBCb29rS2VlcGluZyhtYXBSZXN1bHQsIGtleVByZWZpeCwgbWFwRnVuY3Rpb24sIG1hcENvbnRleHQpIHtcbiAgdGhpcy5yZXN1bHQgPSBtYXBSZXN1bHQ7XG4gIHRoaXMua2V5UHJlZml4ID0ga2V5UHJlZml4O1xuICB0aGlzLmZ1bmMgPSBtYXBGdW5jdGlvbjtcbiAgdGhpcy5jb250ZXh0ID0gbWFwQ29udGV4dDtcbiAgdGhpcy5jb3VudCA9IDA7XG59XG5NYXBCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yZXN1bHQgPSBudWxsO1xuICB0aGlzLmtleVByZWZpeCA9IG51bGw7XG4gIHRoaXMuZnVuYyA9IG51bGw7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMuY291bnQgPSAwO1xufTtcblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhNYXBCb29rS2VlcGluZywgZm91ckFyZ3VtZW50UG9vbGVyKTtcblxuZnVuY3Rpb24gbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dChib29rS2VlcGluZywgY2hpbGQsIGNoaWxkS2V5KSB7XG4gIHZhciByZXN1bHQgPSBib29rS2VlcGluZy5yZXN1bHQsXG4gICAgICBrZXlQcmVmaXggPSBib29rS2VlcGluZy5rZXlQcmVmaXgsXG4gICAgICBmdW5jID0gYm9va0tlZXBpbmcuZnVuYyxcbiAgICAgIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0O1xuXG5cbiAgdmFyIG1hcHBlZENoaWxkID0gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBib29rS2VlcGluZy5jb3VudCsrKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChtYXBwZWRDaGlsZCwgcmVzdWx0LCBjaGlsZEtleSwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTtcbiAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgIG1hcHBlZENoaWxkID0gUmVhY3RFbGVtZW50LmNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCxcbiAgICAgIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgIGtleVByZWZpeCArIChtYXBwZWRDaGlsZC5rZXkgJiYgKCFjaGlsZCB8fCBjaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyBlc2NhcGVVc2VyUHJvdmlkZWRLZXkobWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobWFwcGVkQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIGFycmF5LCBwcmVmaXgsIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGVzY2FwZWRQcmVmaXggPSAnJztcbiAgaWYgKHByZWZpeCAhPSBudWxsKSB7XG4gICAgZXNjYXBlZFByZWZpeCA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShwcmVmaXgpICsgJy8nO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBNYXBCb29rS2VlcGluZy5nZXRQb29sZWQoYXJyYXksIGVzY2FwZWRQcmVmaXgsIGZ1bmMsIGNvbnRleHQpO1xuICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0LCB0cmF2ZXJzZUNvbnRleHQpO1xuICBNYXBCb29rS2VlcGluZy5yZWxlYXNlKHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwga2V5LCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBmdW5jLCBjb250ZXh0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkRHVtbXkodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNvdW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hTaW5nbGVDaGlsZER1bW15LCBudWxsKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4udG9hcnJheVxuICovXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgUmVhY3RDaGlsZHJlbiA9IHtcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBtYXA6IG1hcENoaWxkcmVuLFxuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsOiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENoaWxkcmVuO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0Q2hpbGRyZW4uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBIVE1MIHRhZyBlbGVtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwcGluZyBmcm9tIHN1cHBvcnRlZCBIVE1MIHRhZ3MgdG8gYFJlYWN0RE9NQ29tcG9uZW50YCBjbGFzc2VzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0ge1xuICBhOiBjcmVhdGVET01GYWN0b3J5KCdhJyksXG4gIGFiYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2FiYnInKSxcbiAgYWRkcmVzczogY3JlYXRlRE9NRmFjdG9yeSgnYWRkcmVzcycpLFxuICBhcmVhOiBjcmVhdGVET01GYWN0b3J5KCdhcmVhJyksXG4gIGFydGljbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FydGljbGUnKSxcbiAgYXNpZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FzaWRlJyksXG4gIGF1ZGlvOiBjcmVhdGVET01GYWN0b3J5KCdhdWRpbycpLFxuICBiOiBjcmVhdGVET01GYWN0b3J5KCdiJyksXG4gIGJhc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jhc2UnKSxcbiAgYmRpOiBjcmVhdGVET01GYWN0b3J5KCdiZGknKSxcbiAgYmRvOiBjcmVhdGVET01GYWN0b3J5KCdiZG8nKSxcbiAgYmlnOiBjcmVhdGVET01GYWN0b3J5KCdiaWcnKSxcbiAgYmxvY2txdW90ZTogY3JlYXRlRE9NRmFjdG9yeSgnYmxvY2txdW90ZScpLFxuICBib2R5OiBjcmVhdGVET01GYWN0b3J5KCdib2R5JyksXG4gIGJyOiBjcmVhdGVET01GYWN0b3J5KCdicicpLFxuICBidXR0b246IGNyZWF0ZURPTUZhY3RvcnkoJ2J1dHRvbicpLFxuICBjYW52YXM6IGNyZWF0ZURPTUZhY3RvcnkoJ2NhbnZhcycpLFxuICBjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdjYXB0aW9uJyksXG4gIGNpdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpdGUnKSxcbiAgY29kZTogY3JlYXRlRE9NRmFjdG9yeSgnY29kZScpLFxuICBjb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbCcpLFxuICBjb2xncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnY29sZ3JvdXAnKSxcbiAgZGF0YTogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YScpLFxuICBkYXRhbGlzdDogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YWxpc3QnKSxcbiAgZGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2RkJyksXG4gIGRlbDogY3JlYXRlRE9NRmFjdG9yeSgnZGVsJyksXG4gIGRldGFpbHM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RldGFpbHMnKSxcbiAgZGZuOiBjcmVhdGVET01GYWN0b3J5KCdkZm4nKSxcbiAgZGlhbG9nOiBjcmVhdGVET01GYWN0b3J5KCdkaWFsb2cnKSxcbiAgZGl2OiBjcmVhdGVET01GYWN0b3J5KCdkaXYnKSxcbiAgZGw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RsJyksXG4gIGR0OiBjcmVhdGVET01GYWN0b3J5KCdkdCcpLFxuICBlbTogY3JlYXRlRE9NRmFjdG9yeSgnZW0nKSxcbiAgZW1iZWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2VtYmVkJyksXG4gIGZpZWxkc2V0OiBjcmVhdGVET01GYWN0b3J5KCdmaWVsZHNldCcpLFxuICBmaWdjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdmaWdjYXB0aW9uJyksXG4gIGZpZ3VyZTogY3JlYXRlRE9NRmFjdG9yeSgnZmlndXJlJyksXG4gIGZvb3RlcjogY3JlYXRlRE9NRmFjdG9yeSgnZm9vdGVyJyksXG4gIGZvcm06IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvcm0nKSxcbiAgaDE6IGNyZWF0ZURPTUZhY3RvcnkoJ2gxJyksXG4gIGgyOiBjcmVhdGVET01GYWN0b3J5KCdoMicpLFxuICBoMzogY3JlYXRlRE9NRmFjdG9yeSgnaDMnKSxcbiAgaDQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2g0JyksXG4gIGg1OiBjcmVhdGVET01GYWN0b3J5KCdoNScpLFxuICBoNjogY3JlYXRlRE9NRmFjdG9yeSgnaDYnKSxcbiAgaGVhZDogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZCcpLFxuICBoZWFkZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWRlcicpLFxuICBoZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2hncm91cCcpLFxuICBocjogY3JlYXRlRE9NRmFjdG9yeSgnaHInKSxcbiAgaHRtbDogY3JlYXRlRE9NRmFjdG9yeSgnaHRtbCcpLFxuICBpOiBjcmVhdGVET01GYWN0b3J5KCdpJyksXG4gIGlmcmFtZTogY3JlYXRlRE9NRmFjdG9yeSgnaWZyYW1lJyksXG4gIGltZzogY3JlYXRlRE9NRmFjdG9yeSgnaW1nJyksXG4gIGlucHV0OiBjcmVhdGVET01GYWN0b3J5KCdpbnB1dCcpLFxuICBpbnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucycpLFxuICBrYmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2tiZCcpLFxuICBrZXlnZW46IGNyZWF0ZURPTUZhY3RvcnkoJ2tleWdlbicpLFxuICBsYWJlbDogY3JlYXRlRE9NRmFjdG9yeSgnbGFiZWwnKSxcbiAgbGVnZW5kOiBjcmVhdGVET01GYWN0b3J5KCdsZWdlbmQnKSxcbiAgbGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpJyksXG4gIGxpbms6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmsnKSxcbiAgbWFpbjogY3JlYXRlRE9NRmFjdG9yeSgnbWFpbicpLFxuICBtYXA6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcCcpLFxuICBtYXJrOiBjcmVhdGVET01GYWN0b3J5KCdtYXJrJyksXG4gIG1lbnU6IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnUnKSxcbiAgbWVudWl0ZW06IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnVpdGVtJyksXG4gIG1ldGE6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGEnKSxcbiAgbWV0ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGVyJyksXG4gIG5hdjogY3JlYXRlRE9NRmFjdG9yeSgnbmF2JyksXG4gIG5vc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdub3NjcmlwdCcpLFxuICBvYmplY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ29iamVjdCcpLFxuICBvbDogY3JlYXRlRE9NRmFjdG9yeSgnb2wnKSxcbiAgb3B0Z3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGdyb3VwJyksXG4gIG9wdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnb3B0aW9uJyksXG4gIG91dHB1dDogY3JlYXRlRE9NRmFjdG9yeSgnb3V0cHV0JyksXG4gIHA6IGNyZWF0ZURPTUZhY3RvcnkoJ3AnKSxcbiAgcGFyYW06IGNyZWF0ZURPTUZhY3RvcnkoJ3BhcmFtJyksXG4gIHBpY3R1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BpY3R1cmUnKSxcbiAgcHJlOiBjcmVhdGVET01GYWN0b3J5KCdwcmUnKSxcbiAgcHJvZ3Jlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ3Byb2dyZXNzJyksXG4gIHE6IGNyZWF0ZURPTUZhY3RvcnkoJ3EnKSxcbiAgcnA6IGNyZWF0ZURPTUZhY3RvcnkoJ3JwJyksXG4gIHJ0OiBjcmVhdGVET01GYWN0b3J5KCdydCcpLFxuICBydWJ5OiBjcmVhdGVET01GYWN0b3J5KCdydWJ5JyksXG4gIHM6IGNyZWF0ZURPTUZhY3RvcnkoJ3MnKSxcbiAgc2FtcDogY3JlYXRlRE9NRmFjdG9yeSgnc2FtcCcpLFxuICBzY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3NjcmlwdCcpLFxuICBzZWN0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdzZWN0aW9uJyksXG4gIHNlbGVjdDogY3JlYXRlRE9NRmFjdG9yeSgnc2VsZWN0JyksXG4gIHNtYWxsOiBjcmVhdGVET01GYWN0b3J5KCdzbWFsbCcpLFxuICBzb3VyY2U6IGNyZWF0ZURPTUZhY3RvcnkoJ3NvdXJjZScpLFxuICBzcGFuOiBjcmVhdGVET01GYWN0b3J5KCdzcGFuJyksXG4gIHN0cm9uZzogY3JlYXRlRE9NRmFjdG9yeSgnc3Ryb25nJyksXG4gIHN0eWxlOiBjcmVhdGVET01GYWN0b3J5KCdzdHlsZScpLFxuICBzdWI6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1YicpLFxuICBzdW1tYXJ5OiBjcmVhdGVET01GYWN0b3J5KCdzdW1tYXJ5JyksXG4gIHN1cDogY3JlYXRlRE9NRmFjdG9yeSgnc3VwJyksXG4gIHRhYmxlOiBjcmVhdGVET01GYWN0b3J5KCd0YWJsZScpLFxuICB0Ym9keTogY3JlYXRlRE9NRmFjdG9yeSgndGJvZHknKSxcbiAgdGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RkJyksXG4gIHRleHRhcmVhOiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0YXJlYScpLFxuICB0Zm9vdDogY3JlYXRlRE9NRmFjdG9yeSgndGZvb3QnKSxcbiAgdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoJyksXG4gIHRoZWFkOiBjcmVhdGVET01GYWN0b3J5KCd0aGVhZCcpLFxuICB0aW1lOiBjcmVhdGVET01GYWN0b3J5KCd0aW1lJyksXG4gIHRpdGxlOiBjcmVhdGVET01GYWN0b3J5KCd0aXRsZScpLFxuICB0cjogY3JlYXRlRE9NRmFjdG9yeSgndHInKSxcbiAgdHJhY2s6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyYWNrJyksXG4gIHU6IGNyZWF0ZURPTUZhY3RvcnkoJ3UnKSxcbiAgdWw6IGNyZWF0ZURPTUZhY3RvcnkoJ3VsJyksXG4gICd2YXInOiBjcmVhdGVET01GYWN0b3J5KCd2YXInKSxcbiAgdmlkZW86IGNyZWF0ZURPTUZhY3RvcnkoJ3ZpZGVvJyksXG4gIHdicjogY3JlYXRlRE9NRmFjdG9yeSgnd2JyJyksXG5cbiAgLy8gU1ZHXG4gIGNpcmNsZTogY3JlYXRlRE9NRmFjdG9yeSgnY2lyY2xlJyksXG4gIGNsaXBQYXRoOiBjcmVhdGVET01GYWN0b3J5KCdjbGlwUGF0aCcpLFxuICBkZWZzOiBjcmVhdGVET01GYWN0b3J5KCdkZWZzJyksXG4gIGVsbGlwc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2VsbGlwc2UnKSxcbiAgZzogY3JlYXRlRE9NRmFjdG9yeSgnZycpLFxuICBpbWFnZTogY3JlYXRlRE9NRmFjdG9yeSgnaW1hZ2UnKSxcbiAgbGluZTogY3JlYXRlRE9NRmFjdG9yeSgnbGluZScpLFxuICBsaW5lYXJHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgnbGluZWFyR3JhZGllbnQnKSxcbiAgbWFzazogY3JlYXRlRE9NRmFjdG9yeSgnbWFzaycpLFxuICBwYXRoOiBjcmVhdGVET01GYWN0b3J5KCdwYXRoJyksXG4gIHBhdHRlcm46IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdHRlcm4nKSxcbiAgcG9seWdvbjogY3JlYXRlRE9NRmFjdG9yeSgncG9seWdvbicpLFxuICBwb2x5bGluZTogY3JlYXRlRE9NRmFjdG9yeSgncG9seWxpbmUnKSxcbiAgcmFkaWFsR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3JhZGlhbEdyYWRpZW50JyksXG4gIHJlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3JlY3QnKSxcbiAgc3RvcDogY3JlYXRlRE9NRmFjdG9yeSgnc3RvcCcpLFxuICBzdmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N2ZycpLFxuICB0ZXh0OiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0JyksXG4gIHRzcGFuOiBjcmVhdGVET01GYWN0b3J5KCd0c3BhbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmFjdG9yaWVzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0RE9NRmFjdG9yaWVzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKSxcbiAgICBpc1ZhbGlkRWxlbWVudCA9IF9yZXF1aXJlLmlzVmFsaWRFbGVtZW50O1xuXG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvZmFjdG9yeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoaXNWYWxpZEVsZW1lbnQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0UHJvcFR5cGVzLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAnMTUuNi4xJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdFZlcnNpb24uanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P29iamVjdH0gZWxlbWVudCBUaGUgUmVhY3QgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHs/bnVtYmVyfSBkZWJ1Z0lEIFRoZSBSZWFjdCBjb21wb25lbnQgaW5zdGFuY2UgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQsIGRlYnVnSUQpIHtcbiAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICEodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdID09PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIFJlYWN0LlByb3BUeXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc4NCcsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogdm9pZCAwO1xuICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMDtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgIHZhciBjb21wb25lbnRTdGFja0luZm8gPSAnJztcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVidWdJRCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgJXMgdHlwZTogJXMlcycsIGxvY2F0aW9uLCBlcnJvci5tZXNzYWdlLCBjb21wb25lbnRTdGFja0luZm8pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUmVhY3RUeXBlU3BlYztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL1JlYWN0QmFzZUNsYXNzZXMnKSxcbiAgICBDb21wb25lbnQgPSBfcmVxdWlyZS5Db21wb25lbnQ7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpLFxuICAgIGlzVmFsaWRFbGVtZW50ID0gX3JlcXVpcmUyLmlzVmFsaWRFbGVtZW50O1xuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJ2NyZWF0ZS1yZWFjdC1jbGFzcy9mYWN0b3J5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShDb21wb25lbnQsIGlzVmFsaWRFbGVtZW50LCBSZWFjdE5vb3BVcGRhdGVRdWV1ZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWFjdC9saWIvY3JlYXRlQ2xhc3MuanMiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBuZXh0RGVidWdJRCA9IDE7XG5cbmZ1bmN0aW9uIGdldE5leHREZWJ1Z0lEKCkge1xuICByZXR1cm4gbmV4dERlYnVnSUQrKztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROZXh0RGVidWdJRDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MycpIDogdm9pZCAwO1xuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25seUNoaWxkO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL29ubHlDaGlsZC5qcyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpO1xuXG52YXIgZ2V0SXRlcmF0b3JGbiA9IHJlcXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2NhcGVVdGlscycpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuXG4vKipcbiAqIFRoaXMgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudCBzaW5jZSB0aGlzIGZpbGUgaXMgc2hhcmVkIGJldHdlZW5cbiAqIGlzb21vcnBoaWMgYW5kIHJlbmRlcmVycy4gV2UgY291bGQgZXh0cmFjdCB0aGlzIHRvIGFcbiAqXG4gKi9cblxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgY29tcG9uZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9uZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGNvbXBvbmVudC5rZXkpO1xuICB9XG4gIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbi8qKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0geyFzdHJpbmd9IG5hbWVTb0ZhciBOYW1lIG9mIHRoZSBrZXkgcGF0aCBzbyBmYXIuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZWFjaCBjaGlsZCBmb3VuZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaG91dCB0aGUgdHJhdmVyc2FsXG4gKiBwcm9jZXNzLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29GYXIsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fFxuICAvLyBUaGUgZm9sbG93aW5nIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXplXG4gIC8vIHNvbWUgY2hlY2tzLiBSZWFjdCBGaWJlciBhbHNvIGlubGluZXMgdGhpcyBsb2dpYyBmb3Igc2ltaWxhciBwdXJwb3Nlcy5cbiAgdHlwZSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4uJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sXG4gICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlpID0gMDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnO1xuICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFkZC1vbnMuJztcbiAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gXCIgSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgYW4gZWxlbWVudCBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50IFwiICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXRcbiAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczpcbiAqXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgXG4gKlxuICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlXG4gKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdFxuICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcmVhY3QvbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiLCJ2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKTtcbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBzdG9yZS5kaXNwYXRjaDtcbiAgICAgIHZhciBjaGFpbiA9IFtdO1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodW5kZWZpbmVkLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0b3JlLCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZWR1eC9lcy9hcHBseU1pZGRsZXdhcmUuanMiLCJmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGluc3RlYWQgcmVjZWl2ZWQgJyArIChhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhY3Rpb25DcmVhdG9ycykgKyAnLiAnICsgJ0RpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/Jyk7XG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFjdGlvbkNyZWF0b3JzKTtcbiAgdmFyIGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlZHV4L2VzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsImltcG9ydCB7IEFjdGlvblR5cGVzIH0gZnJvbSAnLi9jcmVhdGVTdG9yZSc7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdsb2Rhc2gtZXMvaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3V0aWxzL3dhcm5pbmcnO1xuXG5mdW5jdGlvbiBnZXRVbmRlZmluZWRTdGF0ZUVycm9yTWVzc2FnZShrZXksIGFjdGlvbikge1xuICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgdmFyIGFjdGlvbk5hbWUgPSBhY3Rpb25UeXBlICYmICdcIicgKyBhY3Rpb25UeXBlLnRvU3RyaW5nKCkgKyAnXCInIHx8ICdhbiBhY3Rpb24nO1xuXG4gIHJldHVybiAnR2l2ZW4gYWN0aW9uICcgKyBhY3Rpb25OYW1lICsgJywgcmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiAnICsgJ1RvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4nO1xufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gJ1RoZSAnICsgYXJndW1lbnROYW1lICsgJyBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJyArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgJ1wiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nICcgKyAoJ2tleXM6IFwiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuXG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gJ1VuZXhwZWN0ZWQgJyArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgJyAnICsgKCdcIicgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArICdcIiBmb3VuZCBpbiAnICsgYXJndW1lbnROYW1lICsgJy4gJykgKyAnRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiAnICsgKCdcIicgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArICdcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2FuaXR5KHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gJyArICdJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgJyArICdleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5ICcgKyAnbm90IGJlIHVuZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9ICdAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKTtcbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IHR5cGUgfSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgXCInICsga2V5ICsgJ1wiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuICcgKyAoJ0RvblxcJ3QgdHJ5IHRvIGhhbmRsZSAnICsgQWN0aW9uVHlwZXMuSU5JVCArICcgb3Igb3RoZXIgYWN0aW9ucyBpbiBcInJlZHV4LypcIiAnKSArICduYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSAnICsgJ2N1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsICcgKyAnaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlICcgKyAnYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoJ05vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2FuaXR5RXJyb3I7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNhbml0eShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNhbml0eUVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzWzFdO1xuXG4gICAgaWYgKHNhbml0eUVycm9yKSB7XG4gICAgICB0aHJvdyBzYW5pdHlFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGF0ZSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGZpbmFsUmVkdWNlcktleXNbaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNba2V5XTtcbiAgICAgIHZhciBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVba2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKGtleSwgYWN0aW9uKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBuZXh0U3RhdGVba2V5XSA9IG5leHRTdGF0ZUZvcktleTtcbiAgICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IG5leHRTdGF0ZUZvcktleSAhPT0gcHJldmlvdXNTdGF0ZUZvcktleTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3JlZHV4L2VzL2NvbWJpbmVSZWR1Y2Vycy5qcyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQWJzb2x1dGUgPSBmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGhuYW1lKSB7XG4gIHJldHVybiBwYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKVxudmFyIHNwbGljZU9uZSA9IGZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpIHtcbiAgICBsaXN0W2ldID0gbGlzdFtrXTtcbiAgfWxpc3QucG9wKCk7XG59O1xuXG4vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIGhlYXZpbHkgb24gbm9kZSdzIHVybC5wYXJzZVxudmFyIHJlc29sdmVQYXRobmFtZSA9IGZ1bmN0aW9uIHJlc29sdmVQYXRobmFtZSh0bykge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG5cbiAgdmFyIHRvUGFydHMgPSB0byAmJiB0by5zcGxpdCgnLycpIHx8IFtdO1xuICB2YXIgZnJvbVBhcnRzID0gZnJvbSAmJiBmcm9tLnNwbGl0KCcvJykgfHwgW107XG5cbiAgdmFyIGlzVG9BYnMgPSB0byAmJiBpc0Fic29sdXRlKHRvKTtcbiAgdmFyIGlzRnJvbUFicyA9IGZyb20gJiYgaXNBYnNvbHV0ZShmcm9tKTtcbiAgdmFyIG11c3RFbmRBYnMgPSBpc1RvQWJzIHx8IGlzRnJvbUFicztcblxuICBpZiAodG8gJiYgaXNBYnNvbHV0ZSh0bykpIHtcbiAgICAvLyB0byBpcyBhYnNvbHV0ZVxuICAgIGZyb21QYXJ0cyA9IHRvUGFydHM7XG4gIH0gZWxzZSBpZiAodG9QYXJ0cy5sZW5ndGgpIHtcbiAgICAvLyB0byBpcyByZWxhdGl2ZSwgZHJvcCB0aGUgZmlsZW5hbWVcbiAgICBmcm9tUGFydHMucG9wKCk7XG4gICAgZnJvbVBhcnRzID0gZnJvbVBhcnRzLmNvbmNhdCh0b1BhcnRzKTtcbiAgfVxuXG4gIGlmICghZnJvbVBhcnRzLmxlbmd0aCkgcmV0dXJuICcvJztcblxuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IHZvaWQgMDtcbiAgaWYgKGZyb21QYXJ0cy5sZW5ndGgpIHtcbiAgICB2YXIgbGFzdCA9IGZyb21QYXJ0c1tmcm9tUGFydHMubGVuZ3RoIC0gMV07XG4gICAgaGFzVHJhaWxpbmdTbGFzaCA9IGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nIHx8IGxhc3QgPT09ICcnO1xuICB9IGVsc2Uge1xuICAgIGhhc1RyYWlsaW5nU2xhc2ggPSBmYWxzZTtcbiAgfVxuXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBmcm9tUGFydHMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIHZhciBwYXJ0ID0gZnJvbVBhcnRzW2ldO1xuXG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgc3BsaWNlT25lKGZyb21QYXJ0cywgaSk7XG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBzcGxpY2VPbmUoZnJvbVBhcnRzLCBpKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3BsaWNlT25lKGZyb21QYXJ0cywgaSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbXVzdEVuZEFicykgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgZnJvbVBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gIH1pZiAobXVzdEVuZEFicyAmJiBmcm9tUGFydHNbMF0gIT09ICcnICYmICghZnJvbVBhcnRzWzBdIHx8ICFpc0Fic29sdXRlKGZyb21QYXJ0c1swXSkpKSBmcm9tUGFydHMudW5zaGlmdCgnJyk7XG5cbiAgdmFyIHJlc3VsdCA9IGZyb21QYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgcmVzdWx0LnN1YnN0cigtMSkgIT09ICcvJykgcmVzdWx0ICs9ICcvJztcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlUGF0aG5hbWU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9yZXNvbHZlLXBhdGhuYW1lL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9pbmRleCcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9zeW1ib2wtb2JzZXJ2YWJsZS9pbmRleC5qcyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9wb255ZmlsbCA9IHJlcXVpcmUoJy4vcG9ueWZpbGwnKTtcblxudmFyIF9wb255ZmlsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb255ZmlsbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHJvb3Q7IC8qIGdsb2JhbCB3aW5kb3cgKi9cblxuXG5pZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBzZWxmO1xufSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gbW9kdWxlO1xufSBlbHNlIHtcbiAgcm9vdCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG59XG5cbnZhciByZXN1bHQgPSAoMCwgX3BvbnlmaWxsMlsnZGVmYXVsdCddKShyb290KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHJlc3VsdDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3N5bWJvbC1vYnNlcnZhYmxlL2xpYi9pbmRleC5qcyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHN5bWJvbE9ic2VydmFibGVQb255ZmlsbDtcbmZ1bmN0aW9uIHN5bWJvbE9ic2VydmFibGVQb255ZmlsbChyb290KSB7XG5cdHZhciByZXN1bHQ7XG5cdHZhciBfU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cblx0aWYgKHR5cGVvZiBfU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKF9TeW1ib2wub2JzZXJ2YWJsZSkge1xuXHRcdFx0cmVzdWx0ID0gX1N5bWJvbC5vYnNlcnZhYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBfU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRfU3ltYm9sLm9ic2VydmFibGUgPSByZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9ICdAQG9ic2VydmFibGUnO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9zeW1ib2wtb2JzZXJ2YWJsZS9saWIvcG9ueWZpbGwuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIHZhbHVlRXF1YWwgPSBmdW5jdGlvbiB2YWx1ZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHJldHVybiBBcnJheS5pc0FycmF5KGIpICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHJldHVybiB2YWx1ZUVxdWFsKGl0ZW0sIGJbaW5kZXhdKTtcbiAgfSk7XG5cbiAgdmFyIGFUeXBlID0gdHlwZW9mIGEgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGEpO1xuICB2YXIgYlR5cGUgPSB0eXBlb2YgYiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoYik7XG5cbiAgaWYgKGFUeXBlICE9PSBiVHlwZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgYVZhbHVlID0gYS52YWx1ZU9mKCk7XG4gICAgdmFyIGJWYWx1ZSA9IGIudmFsdWVPZigpO1xuXG4gICAgaWYgKGFWYWx1ZSAhPT0gYSB8fCBiVmFsdWUgIT09IGIpIHJldHVybiB2YWx1ZUVxdWFsKGFWYWx1ZSwgYlZhbHVlKTtcblxuICAgIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuXG4gICAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gYUtleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHZhbHVlRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gdmFsdWVFcXVhbDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3ZhbHVlLWVxdWFsL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBGaWxlSW5wdXQgZnJvbSAncmVhY3QtZmlsZS1pbnB1dCc7XG5cbmltcG9ydCBJdGVtTGlzdCBmcm9tICcuL2l0ZW0tbGlzdCc7XG5pbXBvcnQgZ2V0UGF0aCBmcm9tICcuLi8uLi91dGlsL2dldFBhdGgnO1xuXG5cbmZ1bmN0aW9uIGdldEZpbGVzKGZzKSB7XG4gIHJldHVybiBmcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnKTtcbn1cblxubGV0IG1hcFN0YXRlVG9Qcm9wcyA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHRpdGxlOiAnRmlsZXMnLFxuICAgIGl0ZW1zOiBnZXRGaWxlcyhnZXRQYXRoKHN0YXRlKSksXG4gICAgaGVhZGVyRXh0cmFzOiAoPGlucHV0IGNsYXNzTmFtZT1cImZpbGVzLXVwbG9hZFwiIHR5cGU9XCJmaWxlXCIvPilcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCAoKSA9PiAoe30pKShJdGVtTGlzdCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZW50L2ZpbGUtbGlzdC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBJdGVtTGlzdCBmcm9tICcuL2l0ZW0tbGlzdCc7XG5pbXBvcnQgZ2V0UGF0aCBmcm9tICcuLi8uLi91dGlsL2dldFBhdGgnO1xuXG5cbmZ1bmN0aW9uIGdldEZvbGRlcnMoZnMpIHtcbiAgcmV0dXJuIGZzLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2ZvbGRlcicpO1xufVxuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogJ0ZvbGRlcnMnLFxuICAgIGl0ZW1zOiBnZXRGb2xkZXJzKGdldFBhdGgoc3RhdGUpLCBzdGF0ZS5jdXJyZW50UGF0aCksXG4gICAgaGVhZGVyRXh0cmFzOiAoPHNwYW4gY2xhc3NOYW1lPVwiZmEgZmEtZm9sZGVyXCIvPilcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGZ1bmN0aW9uIChkaXNwYXRjaCkge1xuICByZXR1cm4ge1xuICAgIGhhbmRsZUl0ZW1DbGljazogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogJ25hdmlnYXRlLXRvJyxcbiAgICAgICAgcGF5bG9hZDogeyBwYXRoIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKEl0ZW1MaXN0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvZm9sZGVyLWxpc3QuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuXG5jb25zdCBpY29uTWFwID0ge1xuICBmaWxlOiAnYWNyb2JhdC1maWxlJyxcbiAgZm9sZGVyOiAnc2hhcmVkMScsXG4gIG11c2ljOiAnbXVzaWMnLFxuICBwaWN0dXJlOiAncGhvdG9zJyxcbiAgc2hhcmVkOiAnc2hhcmVkMSdcbn07XG5cbmZ1bmN0aW9uIGdldEltYWdlUGF0aChpdGVtKSB7XG4gIGlmIChpdGVtLmJhY2tncm91bmRJbWFnZSB8fCBpdGVtLnR5cGUgPT09ICdwaWN0dXJlJykge1xuICAgIHJldHVybiAnLi9pbWFnZXMvJyArIChpdGVtLmJhY2tncm91bmRJbWFnZSB8fCBpdGVtLnRpdGxlKTtcbiAgfVxuICByZXR1cm4gJy4vaWNvbnMvdGV4dC1maWxlLnBuZyc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWNrSGFuZGxlcihoYW5kbGVDbGljaywgLi4uYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaGFuZGxlQ2xpY2suYXBwbHkobnVsbCwgYXJncyk7XG4gIH07XG59XG5cbmNvbnN0IEl0ZW0gPSBmdW5jdGlvbiAoe2l0ZW0sIHNlbGVjdE1vZGUsIGhhbmRsZUNsaWNrLCBjdXJyZW50UGF0aH0pIHtcblxuICBjb25zdCBpY29uID0gaWNvbk1hcFtpdGVtLnR5cGVdO1xuICBsZXQgZWxlbWVudFN0eWxlID0ge1xuICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgke2dldEltYWdlUGF0aChpdGVtKX0pYCxcbiAgICBiYWNrZ3JvdW5kUmVwZWF0OiAnbm8tcmVwZWF0JyxcbiAgICBiYWNrZ3JvdW5kU2l6ZTogJ2NvbnRhaW4nXG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8YSBocmVmPXsnIyd9IG9uQ2xpY2s9e3NlbGVjdE1vZGUgPyAoKCk9Pnt9KSA6IGNyZWF0ZUNsaWNrSGFuZGxlcihoYW5kbGVDbGljaywgY3VycmVudFBhdGggKyAnLycgKyBpdGVtLnRpdGxlKX0+XG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPXsnZmlsZXMtY29udGVudC1pdGVtJyArIChzZWxlY3RNb2RlICYmIGl0ZW0uc2VsZWN0ZWQgPyAnIGZpbGVzLWNvbnRlbnQtaXRlbS0tc2VsZWN0ZWQnIDogJycpfSBodG1sRm9yPXtgY2hrLSR7aXRlbS50aXRsZS5zcGxpdCgnLicpWzBdfWB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlLXBsYWNlaG9sZGVyXCIgc3R5bGU9e2VsZW1lbnRTdHlsZX0vPlxuICAgICAgICA8cD5cbiAgICAgICAgICB7IHNlbGVjdE1vZGUgPyA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9e2BjaGstJHtpdGVtLnRpdGxlLnNwbGl0KCcuJylbMF19YH0vPiA6IDxpbWcgc3JjPXtgL2ljb25zLyR7aWNvbn0ucG5nYCB9IC8+IH1cbiAgICAgICAgICB7aXRlbS50aXRsZX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2E+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KChzdGF0ZSkgPT4gKHtjdXJyZW50UGF0aDogc3RhdGUuY3VycmVudFBhdGh9KSwgKCkgPT4gKHt9KSkoSXRlbSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZW50L2l0ZW0uanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBJdGVtTGlzdCBmcm9tICcuL2l0ZW0tbGlzdCc7XG5cblxuZnVuY3Rpb24gZ2V0TXVzaWMoZnMpIHtcbiAgcmV0dXJuIGZzLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ211c2ljJyk7XG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHRpdGxlOiAnTXVzaWMnLFxuICAgIGl0ZW1zOiBnZXRNdXNpYyhzdGF0ZS5maWxlc3lzdGVtLmNvbnRlbnRzKVxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsICgpID0+ICh7fSkpKEl0ZW1MaXN0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvbXVzaWMtbGlzdC5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuaW1wb3J0IEl0ZW1MaXN0IGZyb20gJy4vaXRlbS1saXN0JztcblxuXG5mdW5jdGlvbiBnZXRQaG90b3MoZnMpIHtcbiAgcmV0dXJuIGZzLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3BpY3R1cmUnKTtcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6ICdQaG90b3MnLFxuICAgIGl0ZW1zOiBnZXRQaG90b3Moc3RhdGUuZmlsZXN5c3RlbS5jb250ZW50cylcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCAoKSA9PiAoe30pKShJdGVtTGlzdCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZW50L3Bob3RvLWxpc3QuanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBJdGVtTGlzdCBmcm9tICcuL2l0ZW0tbGlzdCc7XG5cblxuZnVuY3Rpb24gZ2V0U2hhcmVkKGZzKSB7XG4gIHJldHVybiBmcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzaGFyZWQnKTtcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6ICdTaGFyZWQnLFxuICAgIGl0ZW1zOiBnZXRTaGFyZWQoc3RhdGUuZmlsZXN5c3RlbS5jb250ZW50cylcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCAoKSA9PiAoe30pKShJdGVtTGlzdCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZW50L3NoYXJlZC1saXN0LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuY29uc3QgQnJlYWRjcnVtYnMgPSBmdW5jdGlvbiAoe2N1cnJlbnRQYXRoLCBoYW5kbGVDbGlja30pIHtcbiAgbGV0IGNydW1icyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNsaWNrSGFuZGxlcihwYXRoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gaGFuZGxlQ2xpY2socGF0aCk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChjdXJyZW50UGF0aCkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rID0gWycnXTtcbiAgICBjcnVtYnMgPSBjdXJyZW50UGF0aC5zcGxpdCgnLycpLnNsaWNlKDEpLm1hcChmdW5jdGlvbiAoY3J1bWIsIGlkeCkge1xuICAgICAgY3VycmVudExpbmsucHVzaChjcnVtYik7XG5cbiAgICAgIHJldHVybiA8bGkga2V5PXtpZHggKyAxfT48YSBocmVmPVwiXCIgb25DbGljaz17Y3JlYXRlQ2xpY2tIYW5kbGVyKGN1cnJlbnRMaW5rLmpvaW4oJy8nKSl9PntjcnVtYn0gPHNwYW4gY2xhc3NOYW1lPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiLz48L2E+PC9saT47XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8b2wgY2xhc3NOYW1lPVwiYnJlYWRjcnVtYlwiPlxuICAgICAgPGxpIGtleT17MH0+PGEgaHJlZj1cIlwiIG9uQ2xpY2s9e2NyZWF0ZUNsaWNrSGFuZGxlcignJyl9PkhvbWUgPHNwYW4gY2xhc3NOYW1lPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiLz48L2E+PC9saT5cbiAgICAgIHtjcnVtYnN9XG4gICAgPC9vbD5cbiAgKTtcbn07XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnRQYXRoOiBzdGF0ZS5jdXJyZW50UGF0aFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZnVuY3Rpb24gKGRpc3BhdGNoKSB7XG4gIHJldHVybiB7XG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICBkaXNwYXRjaCh7dHlwZTogJ25hdmlnYXRlLXRvJywgcGF5bG9hZDoge3BhdGh9fSk7XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoQnJlYWRjcnVtYnMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9icmVhZGNydW1icy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmNvbnN0IERpc3BsYXlNZW51ID0gZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJkaXNwbGF5LW1lbnVcIj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNvcnRcIj5Tb3J0PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkcm9wZG93blwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBkcm9wZG93bi10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJkcm9wZG93bk1lbnUxXCIgZGF0YS10b2dnbGU9XCIuZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAgTmFtZSAoRGVzY2VuZGluZylcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjYXJldFwiLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25NZW51MVwiPlxuICAgICAgICAgIDxsaT48YSBocmVmPVwiI1wiPkFjdGlvbjwvYT48L2xpPlxuICAgICAgICAgIDxsaT48YSBocmVmPVwiI1wiPkFub3RoZXIgYWN0aW9uPC9hPjwvbGk+XG4gICAgICAgICAgPGxpPjxhIGhyZWY9XCIjXCI+U29tZXRoaW5nIGVsc2UgaGVyZTwvYT48L2xpPlxuICAgICAgICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCIgY2xhc3NOYW1lPVwiZGl2aWRlclwiLz5cbiAgICAgICAgICA8bGk+PGEgaHJlZj1cIiNcIj5TZXBhcmF0ZWQgbGluazwvYT48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInZpZXdzdHlsZS1sZWZ0IHZpZXdzdHlsZS1hY3RpdmVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmEgZmEtdGhcIi8+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwidmlld3N0eWxlLXJpZ2h0IHZpZXdzdHlsZS1pbmFjdGl2ZVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmYSBmYS1saXN0LXVsXCIvPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QoKCkgPT4gKHt9KSwgKCkgPT4gKHt9KSkoRGlzcGxheU1lbnUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vZGlzcGxheS1tZW51LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuY29uc3QgVG9wTmF2ID0gZnVuY3Rpb24gKHtxdWVyeXN0cmluZywgc2VhcmNoQnlRdWVyeX0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImhlYWRlclwiPlxuICAgICAgPGZvcm0gY2xhc3NOYW1lPVwibmF2YmFyLWZvcm0gbmF2YmFyLWxlZnRcIiBvblN1Ym1pdD17c2VhcmNoQnlRdWVyeX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgdmFsdWU9e3F1ZXJ5c3RyaW5nfSAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IG5hdmJhci1idG5cIiB2YWx1ZT1cIlNlbGVjdFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdCgoKSA9PiAoe30pLCAoKSA9PiAoe30pKShUb3BOYXYpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vdG9wLW5hdi5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtyZW5kZXJ9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQge2NyZWF0ZVN0b3JlfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge0hhc2hSb3V0ZXIgYXMgUm91dGVyLCBTd2l0Y2gsIFJvdXRlfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuaW1wb3J0IE1haW4gZnJvbSAnLi9jb21wb25lbnRzL21haW4nO1xuaW1wb3J0IE1lbnUgZnJvbSAnLi9jb21wb25lbnRzL25hdmlnYXRpb24vbWVudSc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICcuL3JlZHVjZXJzL21haW4nO1xuXG5yZW5kZXIgKFxuICAoXG4gICAgPFByb3ZpZGVyIHN0b3JlPXtjcmVhdGVTdG9yZShyZWR1Y2VyKX0gPlxuICAgICAgPFJvdXRlcj5cbiAgICAgICAgPFN3aXRjaD5cbiAgICAgICAgICA8Um91dGUgY29tcG9uZW50PXtNZW51fSBwYXRoPVwiL21lbnVcIi8+XG4gICAgICAgICAgPFJvdXRlIGNvbXBvbmVudD17TWFpbn0gcGF0aD1cIi9cIiAvPlxuICAgICAgICA8L1N3aXRjaD5cbiAgICAgIDwvUm91dGVyPlxuICAgIDwvUHJvdmlkZXI+XG4gICksXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4nKVxuKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaW5kZXguanN4IiwiZXhwb3J0IGRlZmF1bHQge1xuICBjdXJyZW50UGF0aDogJycsXG4gIGZpbGVzeXN0ZW06IHtcbiAgICBjb250ZW50czogW1xuICAgICAge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgICAgICAgICAgdGl0bGU6ICcyMDE2LjEyLjE0am91cm5hbC5kb2MnLFxuICAgICAgICAgICAgICAgIGRhdGU6ICcyMDE2LjEyLjE0JyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHVzZXJncm91cDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdmb2xkZXIyLnBuZycsXG4gICAgICAgICAgICB0aXRsZTogJ0ZvbGRlciAyJyxcbiAgICAgICAgICAgIGRhdGU6ICcyMDE2LjEyLjI0JyxcbiAgICAgICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgICAgICB0aXRsZTogJzIwMTYuMTIuMTRqb3VybmFsLmRvYycsXG4gICAgICAgICAgICBkYXRlOiAnMjAxNi4xMi4xNCcsXG4gICAgICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgdXNlcmdyb3VwOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdmb2xkZXIxLnBuZycsXG4gICAgICAgIHRpdGxlOiAnRmluYWwgUGFwZXJzJyxcbiAgICAgICAgZGF0ZTogJzIwMTYuMTIuMjQnLFxuICAgICAgICB0eXBlOiAnZm9sZGVyJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgICAgICB0aXRsZTogJzIwMTYuMTIuMTRqb3VybmFsLmRvYycsXG4gICAgICAgICAgICBkYXRlOiAnMjAxNi4xMi4xNCcsXG4gICAgICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgdXNlcmdyb3VwOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdmb2xkZXIyLnBuZycsXG4gICAgICAgIHRpdGxlOiAnR3JvdXAgUHJvamVjdHMnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4yNCcsXG4gICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ2ZvbGRlcjMucG5nJyxcbiAgICAgICAgdGl0bGU6ICdGYW1pbHkgTWVtb3JpZXMnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4yNCcsXG4gICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ2ZvbGRlcjQucG5nJyxcbiAgICAgICAgdGl0bGU6ICdXaW50ZXIgVmFjYXRpb24nLFxuICAgICAgICBkYXRlOiAnMjAxNy4xLjI0JyxcbiAgICAgICAgdHlwZTogJ2ZvbGRlcicsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnZm9sZGVyNS5wbmcnLFxuICAgICAgICB0aXRsZTogJ05hdHVyZSBQaWNzJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMS4yNCcsXG4gICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiBmYWxzZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdJTUdfMDE0NS5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4yNCcsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ0lNR18wMTQ2LnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE2LjEyLjI1JyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnSU1HXzAxNDcucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTYuMTIuMjUnLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdzcXJjaHJpc3RtYXNwcmVzZW50LnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE2LjEyLjI1JyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnc3FyYXdrd2FyZGZhbS5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4yNycsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ0lNR18wMTUwLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE2LjEyLjMwJyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnc3FyYmx1ZXN0ZWVsbWFuLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAxLjAyJyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnSU1HXzAxNTIucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDInLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdJTUdfMDE1My5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMS4wNicsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ3NxcmNocmlzdG1hc3ByZXNlbnQucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDcnLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdJTUdfMDE0OC5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMS4yNScsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ3NxcmNvdW50cnlyb2FkLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAxLjI1JyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnc3FyZGVwdHN0b3JlLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAyLjAyJyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnSU1HXzAxNTgucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDIuMDUnLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdJTUdfMDE1OS5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMi4xNCcsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ0lNR18wMTYwLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAyLjE0JyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnSU1HXzAxNjEucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMTIuMTQnLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdJTUdfMDE2Mi5wbmcnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMi4xNCcsXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ0lNR18wMTYzLnBuZycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAyLjE0JyxcbiAgICAgICAgdHlwZTogJ3BpY3R1cmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnSU1HXzAxNjQucG5nJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDIuMTQnLFxuICAgICAgICB0eXBlOiAncGljdHVyZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTQ5LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICcyMDE2LjEyLjE0am91cm5hbC5kb2MnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4xNCcsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogZmFsc2UsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTU0LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICcyMDE2LjEyLjI4am91cm5hbC5kb2MnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4yOCcsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogZmFsc2UsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTU1LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICcyMDE3LjEuMWpvdXJuYWwuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDEnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IGZhbHNlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdJTUdfMDE0OS5wbmcnLFxuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnMjAxNy4xLjJqb3VybmFsLmRvYycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAxLjAyJyxcbiAgICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiBmYWxzZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnSU1HXzAxNTcucG5nJyxcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJzIwMTcuMS4xMWpvdXJuYWwuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMTEnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IGZhbHNlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdJTUdfMDE1NC5wbmcnLFxuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnMjAxNy4xLjE0am91cm5hbC5kb2MnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMS4xNCcsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogZmFsc2UsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTUxLnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICcyMDE3LjEuMTVqb3VybmFsLmRvYycsXG4gICAgICAgIGRhdGU6ICcyMDE3LjAxLjE1JyxcbiAgICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgb3duZXI6IHRydWUsXG4gICAgICAgICAgYW5vbjogZmFsc2UsXG4gICAgICAgICAgdXNlcmdyb3VwOiBmYWxzZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnSU1HXzAxNDkucG5nJyxcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJzIwMTcuMS4xNmpvdXJuYWwuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMTYnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IGZhbHNlLFxuICAgICAgICAgIHNwZWNpZmljVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdJTUdfMDE1NS5wbmcnLFxuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIHRpdGxlOiAnZWNvbjQ1N2ZpbmFsbm90ZXMuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTYuMTIuMTYnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTU3LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdkcmtuaXR6Y2xhc3Nub3Rlcy5kb2MnLFxuICAgICAgICBkYXRlOiAnMjAxNi4xMi4wMScsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnSU1HXzAxNTQucG5nJyxcbiAgICAgICAgY29udGVudHM6IFtdLFxuICAgICAgICB0aXRsZTogJ3BzeWNoc3lsbGFidXMuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDgnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTU3LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdnZW9nMTAxc3lsbGFidXMuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDYnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTQ5LnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdlY29uNDU4c3lsbGFidXMuZG9jJyxcbiAgICAgICAgZGF0ZTogJzIwMTcuMDEuMDYnLFxuICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICBvd25lcjogdHJ1ZSxcbiAgICAgICAgICBhbm9uOiBmYWxzZSxcbiAgICAgICAgICB1c2VyZ3JvdXA6IHRydWUsXG4gICAgICAgICAgc3BlY2lmaWNVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ0lNR18wMTUxLnBuZycsXG4gICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgdGl0bGU6ICdlY29uNDU4cHJlc2VudGF0aW9ucGxhbi5kb2MnLFxuICAgICAgICBkYXRlOiAnMjAxNy4wMS4xOScsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIG93bmVyOiB0cnVlLFxuICAgICAgICAgIGFub246IGZhbHNlLFxuICAgICAgICAgIHVzZXJncm91cDogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY1VzZXI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcblxuXG4gICAgXSxcbiAgICBjdXJyZW50UGF0aDogJydcbiAgfX07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zdGF0ZS5qcyJdLCJzb3VyY2VSb290IjoiIn0= |