HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/slenders.komma.pro/wwwroot/js/site/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/site/app"],{

/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
  !*** ./node_modules/process/browser.js ***!
  \*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.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; };


/***/ }),

/***/ "./node_modules/setimmediate/setImmediate.js":
/*!***************************************************!*\
  !*** ./node_modules/setimmediate/setImmediate.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
    "use strict";

    if (global.setImmediate) {
        return;
    }

    var nextHandle = 1; // Spec says greater than zero
    var tasksByHandle = {};
    var currentlyRunningATask = false;
    var doc = global.document;
    var registerImmediate;

    function setImmediate(callback) {
      // Callback can either be a function or a string
      if (typeof callback !== "function") {
        callback = new Function("" + callback);
      }
      // Copy function arguments
      var args = new Array(arguments.length - 1);
      for (var i = 0; i < args.length; i++) {
          args[i] = arguments[i + 1];
      }
      // Store and register the task
      var task = { callback: callback, args: args };
      tasksByHandle[nextHandle] = task;
      registerImmediate(nextHandle);
      return nextHandle++;
    }

    function clearImmediate(handle) {
        delete tasksByHandle[handle];
    }

    function run(task) {
        var callback = task.callback;
        var args = task.args;
        switch (args.length) {
        case 0:
            callback();
            break;
        case 1:
            callback(args[0]);
            break;
        case 2:
            callback(args[0], args[1]);
            break;
        case 3:
            callback(args[0], args[1], args[2]);
            break;
        default:
            callback.apply(undefined, args);
            break;
        }
    }

    function runIfPresent(handle) {
        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
        // So if we're currently running a task, we'll need to delay this invocation.
        if (currentlyRunningATask) {
            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
            // "too much recursion" error.
            setTimeout(runIfPresent, 0, handle);
        } else {
            var task = tasksByHandle[handle];
            if (task) {
                currentlyRunningATask = true;
                try {
                    run(task);
                } finally {
                    clearImmediate(handle);
                    currentlyRunningATask = false;
                }
            }
        }
    }

    function installNextTickImplementation() {
        registerImmediate = function(handle) {
            process.nextTick(function () { runIfPresent(handle); });
        };
    }

    function canUsePostMessage() {
        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
        // where `global.postMessage` means something completely different and can't be used for this purpose.
        if (global.postMessage && !global.importScripts) {
            var postMessageIsAsynchronous = true;
            var oldOnMessage = global.onmessage;
            global.onmessage = function() {
                postMessageIsAsynchronous = false;
            };
            global.postMessage("", "*");
            global.onmessage = oldOnMessage;
            return postMessageIsAsynchronous;
        }
    }

    function installPostMessageImplementation() {
        // Installs an event handler on `global` for the `message` event: see
        // * https://developer.mozilla.org/en/DOM/window.postMessage
        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages

        var messagePrefix = "setImmediate$" + Math.random() + "$";
        var onGlobalMessage = function(event) {
            if (event.source === global &&
                typeof event.data === "string" &&
                event.data.indexOf(messagePrefix) === 0) {
                runIfPresent(+event.data.slice(messagePrefix.length));
            }
        };

        if (global.addEventListener) {
            global.addEventListener("message", onGlobalMessage, false);
        } else {
            global.attachEvent("onmessage", onGlobalMessage);
        }

        registerImmediate = function(handle) {
            global.postMessage(messagePrefix + handle, "*");
        };
    }

    function installMessageChannelImplementation() {
        var channel = new MessageChannel();
        channel.port1.onmessage = function(event) {
            var handle = event.data;
            runIfPresent(handle);
        };

        registerImmediate = function(handle) {
            channel.port2.postMessage(handle);
        };
    }

    function installReadyStateChangeImplementation() {
        var html = doc.documentElement;
        registerImmediate = function(handle) {
            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
            var script = doc.createElement("script");
            script.onreadystatechange = function () {
                runIfPresent(handle);
                script.onreadystatechange = null;
                html.removeChild(script);
                script = null;
            };
            html.appendChild(script);
        };
    }

    function installSetTimeoutImplementation() {
        registerImmediate = function(handle) {
            setTimeout(runIfPresent, 0, handle);
        };
    }

    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;

    // Don't get fooled by e.g. browserify environments.
    if ({}.toString.call(global.process) === "[object process]") {
        // For Node.js before 0.9
        installNextTickImplementation();

    } else if (canUsePostMessage()) {
        // For non-IE10 modern browsers
        installPostMessageImplementation();

    } else if (global.MessageChannel) {
        // For web workers, where supported
        installMessageChannelImplementation();

    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
        // For IE 6–8
        installReadyStateChangeImplementation();

    } else {
        // For older browsers
        installSetTimeoutImplementation();
    }

    attachTo.setImmediate = setImmediate;
    attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))

/***/ }),

/***/ "./node_modules/timers-browserify/main.js":
/*!************************************************!*\
  !*** ./node_modules/timers-browserify/main.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
            (typeof self !== "undefined" && self) ||
            window;
var apply = Function.prototype.apply;

// DOM APIs, for completeness

exports.setTimeout = function() {
  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
};
exports.setInterval = function() {
  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) {
  if (timeout) {
    timeout.close();
  }
};

function Timeout(id, clearFn) {
  this._id = id;
  this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
  this._clearFn.call(scope, this._id);
};

// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = msecs;
};

exports.unenroll = function(item) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = -1;
};

exports._unrefActive = exports.active = function(item) {
  clearTimeout(item._idleTimeoutId);

  var msecs = item._idleTimeout;
  if (msecs >= 0) {
    item._idleTimeoutId = setTimeout(function onTimeout() {
      if (item._onTimeout)
        item._onTimeout();
    }, msecs);
  }
};

// setimmediate attaches itself to the global object
__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
// On some exotic environments, it's not clear which object `setimmediate` was
// able to install onto.  Search each possibility in the same order as the
// `setimmediate` library.
exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
                       (typeof global !== "undefined" && global.setImmediate) ||
                       (this && this.setImmediate);
exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
                         (typeof global !== "undefined" && global.clearImmediate) ||
                         (this && this.clearImmediate);

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || new Function("return this")();
} catch (e) {
	// This works if the window reference is available
	if (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;


/***/ }),

/***/ "./node_modules/webpack/buildin/module.js":
/*!***********************************!*\
  !*** (webpack)/buildin/module.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

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() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function() {
				return module.i;
			}
		});
		module.webpackPolyfill = 1;
	}
	return module;
};


/***/ }),

/***/ "./resources/js/global/polyfills/eventPolyFill.js":
/*!********************************************************!*\
  !*** ./resources/js/global/polyfills/eventPolyFill.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/**
 * Event semi polyfill. IE does not support new event. But does support document.createEvent.
 * Same thing for dispatching events. But then with createEvent and fireEvent.
 */
function createNewEvent(eventName) {
  var event;

  if (typeof Event === 'function') {
    //On ie it is typeOf object.
    event = new Event(eventName); //Non-ie
  } else {
    event = document.createEvent('Event'); //ie

    event.initEvent(eventName, true, true);
  }

  return event;
}

function dispatchEventForElement(element, event) {
  if (document.createEvent) {
    element.dispatchEvent(event);
  } else {
    element.fireEvent("on" + event.eventType, event);
  }
}

/***/ }),

/***/ "./resources/js/global/polyfills/isInteger.js":
/*!****************************************************!*\
  !*** ./resources/js/global/polyfills/isInteger.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

Number.isInteger = Number.isInteger || function (value) {
  return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};

/***/ }),

/***/ "./resources/js/global/polyfills/promise.js":
/*!**************************************************!*\
  !*** ./resources/js/global/polyfills/promise.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(setImmediate, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

(function (global, factory) {
  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? factory() :  true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
				__WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;
})(this, function () {
  'use strict';
  /**
   * @this {Promise}
   */

  function finallyConstructor(callback) {
    var constructor = this.constructor;
    return this.then(function (value) {
      return constructor.resolve(callback()).then(function () {
        return value;
      });
    }, function (reason) {
      return constructor.resolve(callback()).then(function () {
        return constructor.reject(reason);
      });
    });
  } // Store setTimeout reference so promise-polyfill will be unaffected by
  // other code modifying setTimeout (like sinon.useFakeTimers())


  var setTimeoutFunc = setTimeout;

  function noop() {} // Polyfill for Function.prototype.bind


  function bind(fn, thisArg) {
    return function () {
      fn.apply(thisArg, arguments);
    };
  }
  /**
   * @constructor
   * @param {Function} fn
   */


  function Promise(fn) {
    if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');
    if (typeof fn !== 'function') throw new TypeError('not a function');
    /** @type {!number} */

    this._state = 0;
    /** @type {!boolean} */

    this._handled = false;
    /** @type {Promise|undefined} */

    this._value = undefined;
    /** @type {!Array<!Function>} */

    this._deferreds = [];
    doResolve(fn, this);
  }

  function handle(self, deferred) {
    while (self._state === 3) {
      self = self._value;
    }

    if (self._state === 0) {
      self._deferreds.push(deferred);

      return;
    }

    self._handled = true;

    Promise._immediateFn(function () {
      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;

      if (cb === null) {
        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
        return;
      }

      var ret;

      try {
        ret = cb(self._value);
      } catch (e) {
        reject(deferred.promise, e);
        return;
      }

      resolve(deferred.promise, ret);
    });
  }

  function resolve(self, newValue) {
    try {
      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');

      if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) {
        var then = newValue.then;

        if (newValue instanceof Promise) {
          self._state = 3;
          self._value = newValue;
          finale(self);
          return;
        } else if (typeof then === 'function') {
          doResolve(bind(then, newValue), self);
          return;
        }
      }

      self._state = 1;
      self._value = newValue;
      finale(self);
    } catch (e) {
      reject(self, e);
    }
  }

  function reject(self, newValue) {
    self._state = 2;
    self._value = newValue;
    finale(self);
  }

  function finale(self) {
    if (self._state === 2 && self._deferreds.length === 0) {
      Promise._immediateFn(function () {
        if (!self._handled) {
          Promise._unhandledRejectionFn(self._value);
        }
      });
    }

    for (var i = 0, len = self._deferreds.length; i < len; i++) {
      handle(self, self._deferreds[i]);
    }

    self._deferreds = null;
  }
  /**
   * @constructor
   */


  function Handler(onFulfilled, onRejected, promise) {
    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
    this.onRejected = typeof onRejected === 'function' ? onRejected : null;
    this.promise = promise;
  }
  /**
   * Take a potentially misbehaving resolver function and make sure
   * onFulfilled and onRejected are only called once.
   *
   * Makes no guarantees about asynchrony.
   */


  function doResolve(fn, self) {
    var done = false;

    try {
      fn(function (value) {
        if (done) return;
        done = true;
        resolve(self, value);
      }, function (reason) {
        if (done) return;
        done = true;
        reject(self, reason);
      });
    } catch (ex) {
      if (done) return;
      done = true;
      reject(self, ex);
    }
  }

  Promise.prototype['catch'] = function (onRejected) {
    return this.then(null, onRejected);
  };

  Promise.prototype.then = function (onFulfilled, onRejected) {
    // @ts-ignore
    var prom = new this.constructor(noop);
    handle(this, new Handler(onFulfilled, onRejected, prom));
    return prom;
  };

  Promise.prototype['finally'] = finallyConstructor;

  Promise.all = function (arr) {
    return new Promise(function (resolve, reject) {
      if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');
      var args = Array.prototype.slice.call(arr);
      if (args.length === 0) return resolve([]);
      var remaining = args.length;

      function res(i, val) {
        try {
          if (val && (_typeof(val) === 'object' || typeof val === 'function')) {
            var then = val.then;

            if (typeof then === 'function') {
              then.call(val, function (val) {
                res(i, val);
              }, reject);
              return;
            }
          }

          args[i] = val;

          if (--remaining === 0) {
            resolve(args);
          }
        } catch (ex) {
          reject(ex);
        }
      }

      for (var i = 0; i < args.length; i++) {
        res(i, args[i]);
      }
    });
  };

  Promise.resolve = function (value) {
    if (value && _typeof(value) === 'object' && value.constructor === Promise) {
      return value;
    }

    return new Promise(function (resolve) {
      resolve(value);
    });
  };

  Promise.reject = function (value) {
    return new Promise(function (resolve, reject) {
      reject(value);
    });
  };

  Promise.race = function (values) {
    return new Promise(function (resolve, reject) {
      for (var i = 0, len = values.length; i < len; i++) {
        values[i].then(resolve, reject);
      }
    });
  }; // Use polyfill for setImmediate for performance gains


  Promise._immediateFn = typeof setImmediate === 'function' && function (fn) {
    setImmediate(fn);
  } || function (fn) {
    setTimeoutFunc(fn, 0);
  };

  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
    if (typeof console !== 'undefined' && console) {
      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
    }
  };
  /** @suppress {undefinedVars} */


  var globalNS = function () {
    // the only reliable means to get the global object is
    // `Function('return this')()`
    // However, this causes CSP violations in Chrome apps.
    if (typeof self !== 'undefined') {
      return self;
    }

    if (typeof window !== 'undefined') {
      return window;
    }

    if (typeof global !== 'undefined') {
      return global;
    }

    throw new Error('unable to locate global object');
  }();

  if (!('Promise' in globalNS)) {
    globalNS['Promise'] = Promise;
  } else if (!globalNS.Promise.prototype['finally']) {
    globalNS.Promise.prototype['finally'] = finallyConstructor;
  }
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./resources/js/global/polyfills/symbol-es6.min.js":
/*!*********************************************************!*\
  !*** ./resources/js/global/polyfills/symbol-es6.min.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global, module) {function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

!function (global, factory) {
  "use strict";

  "object" == ( false ? undefined : _typeof(module)) && "object" == _typeof(module.exports) ? module.exports = factory(global) : factory(global);
}("undefined" != typeof window ? window : global, function (global) {
  "use strict";

  var defineProperty = Object.defineProperty,
      defineProperties = Object.defineProperties,
      symbolHiddenCounter = 0,
      globalSymbolRegistry = [],
      slice = Array.prototype.slice,
      ES6 = "object" == _typeof(global.ES6) ? global.ES6 : global.ES6 = {},
      isArray = Array.isArray,
      objectToString = Object.prototype.toString,
      push = Array.prototype.push,
      emptyFunction = function emptyFunction() {},
      simpleFunction = function simpleFunction(arg) {
    return arg;
  },
      isCallable = function isCallable(fn) {
    return "function" == typeof fn;
  },
      Iterator = function Iterator() {},
      ArrayIterator = function ArrayIterator(array, flag) {
    this._array = array, this._flag = flag, this._nextIndex = 0;
  },
      StringIterator = function StringIterator(string, flag) {
    this._string = string, this._flag = flag, this._nextIndex = 0;
  },
      isObject = function isObject(value) {
    return null !== value && ("object" == _typeof(value) || "function" == typeof value);
  },
      setupSymbolInternals = function setupSymbolInternals(symbol, desc) {
    return defineProperties(symbol, {
      _description: {
        value: desc
      },
      _isSymbol: {
        value: !0
      },
      _id: {
        value: symbolHiddenCounter++
      }
    }), symbol;
  },
      appendArray = function appendArray(array1, array2) {
    if ("number" == typeof array1.length && array1.length >= 0 && "number" == typeof array2.length && array2.length >= 0) {
      var length1 = Math.floor(array1.length),
          length2 = Math.floor(array2.length),
          i = 0;

      for (array1.length = length1 + length2; i < length2; ++i) {
        array2.hasOwnProperty(i) && (array1[length1 + i] = array2[i]);
      }
    }
  },
      simpleInheritance = function simpleInheritance(child, parent) {
    if ("function" != typeof child || "function" != typeof parent) throw new TypeError("Child and Parent must be function type");
    child.prototype = Object.create(parent.prototype), child.prototype.constructor = child;
  },
      _Symbol = function _Symbol2(desc) {
    if (desc = void 0 === desc ? "" : String(desc), this instanceof _Symbol2) throw new TypeError("Symbol is not a constructor");
    return setupSymbolInternals(Object.create(_Symbol2.prototype), desc);
  };

  defineProperties(_Symbol, {
    "for": {
      value: function value(key) {
        key = String(key);

        for (var record, registryLength = globalSymbolRegistry.length, i = 0; i < registryLength; ++i) {
          if ((record = globalSymbolRegistry[i]).key === key) return record.symbol;
        }

        return record = {
          key: key,
          symbol: _Symbol(key)
        }, globalSymbolRegistry.push(record), record.symbol;
      },
      writable: !0,
      configurable: !0
    },
    keyFor: {
      value: function value(symbol) {
        if (!ES6.isSymbol(symbol)) throw new TypeError(String(symbol) + " is not a symbol");

        for (var record, registryLength = globalSymbolRegistry.length, i = 0; i < registryLength; ++i) {
          if ((record = globalSymbolRegistry[i]).symbol === symbol) return record.key;
        }
      },
      writable: !0,
      configurable: !0
    },
    hasInstance: {
      value: _Symbol("Symbol.hasInstance")
    },
    isConcatSpreadable: {
      value: _Symbol("Symbol.isConcatSpreadable")
    },
    iterator: {
      value: _Symbol("Symbol.iterator")
    },
    toStringTag: {
      value: _Symbol("Symbol.toStringTag")
    }
  }), _Symbol.prototype.toString = function () {
    return "@@_____" + this._id + "_____";
  }, _Symbol.prototype.valueOf = function () {
    return this;
  }, defineProperty(Iterator.prototype, _Symbol.iterator.toString(), {
    value: function value() {
      return this;
    },
    writable: !0,
    configurable: !0
  }), simpleInheritance(ArrayIterator, Iterator), simpleInheritance(StringIterator, Iterator), defineProperty(ArrayIterator.prototype, _Symbol.toStringTag.toString(), {
    value: "Array Iterator",
    configurable: !0
  }), defineProperty(StringIterator.prototype, _Symbol.toStringTag.toString(), {
    value: "String Iterator",
    configurable: !0
  }), ArrayIterator.prototype.next = function () {
    if (!(this instanceof ArrayIterator)) throw new TypeError("Method Array Iterator.prototype.next called on incompatible receiver " + String(this));
    var nextValue;
    return -1 === this._nextIndex ? {
      done: !0,
      value: void 0
    } : "number" == typeof this._array.length && this._array.length >= 0 && this._nextIndex < Math.floor(this._array.length) ? (1 === this._flag ? nextValue = [this._nextIndex, this._array[this._nextIndex]] : 2 === this._flag ? nextValue = this._array[this._nextIndex] : 3 === this._flag && (nextValue = this._nextIndex), this._nextIndex++, {
      done: !1,
      value: nextValue
    }) : (this._nextIndex = -1, {
      done: !0,
      value: void 0
    });
  }, StringIterator.prototype.next = function () {
    if (!(this instanceof StringIterator)) throw new TypeError("Method String Iterator.prototype.next called on incompatible receiver " + String(this));
    var nextValue,
        stringObject = new String(this._string);
    return -1 === this._nextIndex ? {
      done: !0,
      value: void 0
    } : this._nextIndex < stringObject.length ? (nextValue = stringObject[this._nextIndex], this._nextIndex++, {
      done: !1,
      value: nextValue
    }) : (this._nextIndex = -1, {
      done: !0,
      value: void 0
    });
  };

  var SpreadOperatorImpl = function SpreadOperatorImpl(target, thisArg) {
    this._target = target, this._values = [], this._thisArg = thisArg;
  };

  SpreadOperatorImpl.prototype.spread = function () {
    var self = this;
    return slice.call(arguments).forEach(function (iterable) {
      ES6.forOf(iterable, function (value) {
        self._values.push(value);
      });
    }), self;
  }, SpreadOperatorImpl.prototype.add = function () {
    var self = this;
    return slice.call(arguments).forEach(function (value) {
      self._values.push(value);
    }), self;
  }, SpreadOperatorImpl.prototype.call = function (thisArg) {
    if ("function" != typeof this._target) throw new TypeError("Target is not a function");
    return thisArg = arguments.length <= 0 ? this._thisArg : thisArg, this._target.apply(thisArg, this._values);
  }, SpreadOperatorImpl.prototype["new"] = function () {
    if ("function" != typeof this._target) throw new TypeError("Target is not a constructor");
    var temp, returnValue;
    return temp = Object.create(this._target.prototype), returnValue = this._target.apply(temp, this._values), isObject(returnValue) ? returnValue : temp;
  }, SpreadOperatorImpl.prototype.array = function () {
    if (!isArray(this._target)) throw new TypeError("Target is not a array");
    return push.apply(this._target, this._values), this._target;
  };
  return defineProperties(ES6, {
    isSymbol: {
      value: function value(symbol) {
        return symbol instanceof _Symbol && function (symbol) {
          return !0 === symbol._isSymbol && "number" == typeof symbol._id && "string" == typeof symbol._description;
        }(symbol);
      },
      writable: !0,
      configurable: !0
    },
    instanceOf: {
      value: function value(object, constructor) {
        if (!isObject(constructor)) throw new TypeError("Right-hand side of 'instanceof' is not an object");
        var hasInstanceSymbolProp = constructor[_Symbol.hasInstance];
        if (void 0 === hasInstanceSymbolProp) return object instanceof constructor;
        if ("function" != typeof hasInstanceSymbolProp) throw new TypeError(_typeof(hasInstanceSymbolProp) + " is not a function");
        return hasInstanceSymbolProp.call(constructor, object);
      },
      writable: !0,
      configurable: !0
    },
    forOf: {
      value: function value(iterable, callback, thisArg) {
        if (callback = "function" != typeof callback ? emptyFunction : callback, "function" != typeof iterable[_Symbol.iterator]) throw new TypeError("Iterable[Symbol.iterator] is not a function");

        var iterationResult,
            iterator = iterable[_Symbol.iterator]();

        if ("function" != typeof iterator.next) throw new TypeError(".iterator.next is not a function");

        for (;;) {
          if (iterationResult = iterator.next(), !isObject(iterationResult)) throw new TypeError("Iterator result " + iterationResult + " is not an object");
          if (iterationResult.done) break;
          callback.call(thisArg, iterationResult.value);
        }
      },
      writable: !0,
      configurable: !0
    },
    spreadOperator: {
      value: function value(target, thisArg) {
        if ("function" != typeof target && !isArray(target)) throw new TypeError("Spread operator only supports on array and function objects at this moment");
        return new SpreadOperatorImpl(target, thisArg);
      },
      writable: !0,
      configurable: !0
    }
  }), defineProperty(global, "Symbol", {
    value: _Symbol,
    writable: !0,
    configurable: !0
  }), defineProperty(Function.prototype, _Symbol.hasInstance.toString(), {
    value: function value(instance) {
      return "function" == typeof this && instance instanceof this;
    }
  }), defineProperty(Array.prototype, "concat", {
    value: function value() {
      if (void 0 === this || null === this) throw new TypeError("Array.prototype.concat called on null or undefined");
      var self = Object(this),
          targets = slice.call(arguments),
          outputs = [];
      return targets.unshift(self), targets.forEach(function (target) {
        isObject(target) ? void 0 !== target[_Symbol.isConcatSpreadable] ? target[_Symbol.isConcatSpreadable] ? appendArray(outputs, target) : outputs.push(target) : isArray(target) ? appendArray(outputs, target) : outputs.push(target) : outputs.push(target);
      }), outputs;
    },
    writable: !0,
    configurable: !0
  }), defineProperty(Object.prototype, "toString", {
    value: function value() {
      return void 0 === this || null === this ? objectToString.call(this) : "string" == typeof this[_Symbol.toStringTag] ? "[object " + this[_Symbol.toStringTag] + "]" : objectToString.call(this);
    },
    writable: !0,
    configurable: !0
  }), defineProperty(Array.prototype, _Symbol.iterator.toString(), {
    value: function value() {
      if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
      var self = Object(this);
      return new ArrayIterator(self, 2);
    },
    writable: !0,
    configurable: !0
  }), defineProperty(Array, "from", {
    value: function value(arrayLike, mapFn, thisArg) {
      var constructor,
          length,
          outputs,
          i = 0;
      if (constructor = isCallable(this) ? this : Array, void 0 === arrayLike || null === arrayLike) throw new TypeError("Cannot convert undefined or null to object");
      if (arrayLike = Object(arrayLike), void 0 === mapFn) mapFn = simpleFunction;else if (!isCallable(mapFn)) throw new TypeError(mapFn + " is not a function");

      if (void 0 === arrayLike[_Symbol.iterator]) {
        if (!("number" == typeof arrayLike.length && arrayLike.length >= 0)) return (outputs = new constructor(0)).length = 0, outputs;

        for (length = Math.floor(arrayLike.length), (outputs = new constructor(length)).length = length; i < length; ++i) {
          outputs[i] = mapFn.call(thisArg, arrayLike[i]);
        }
      } else (outputs = new constructor()).length = 0, ES6.forOf(arrayLike, function (value) {
        outputs.length++, outputs[outputs.length - 1] = mapFn.call(thisArg, value);
      });

      return outputs;
    },
    writable: !0,
    configurable: !0
  }), defineProperty(Array.prototype, "entries", {
    value: function value() {
      if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
      var self = Object(this);
      return new ArrayIterator(self, 1);
    },
    writable: !0,
    configurable: !0
  }), defineProperty(Array.prototype, "keys", {
    value: function value() {
      if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
      var self = Object(this);
      return new ArrayIterator(self, 3);
    },
    writable: !0,
    configurable: !0
  }), defineProperty(String.prototype, _Symbol.iterator.toString(), {
    value: function value() {
      if (void 0 === this || null === this) throw new TypeError("String.prototype[Symbol.iterator] called on null or undefined");
      return new StringIterator(String(this), 0);
    },
    writable: !0,
    configurable: !0
  }), ES6;
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))

/***/ }),

/***/ "./resources/js/site/app.js":
/*!**********************************!*\
  !*** ./resources/js/site/app.js ***!
  \**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/**
 * JavaScript dependencies
 */

/**
 * External dependencies
 */
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js"); // require('pjax');


__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/**
 * Global custom dependencies
 */


__webpack_require__(/*! ./../global/polyfills/eventPolyFill */ "./resources/js/global/polyfills/eventPolyFill.js");

__webpack_require__(/*! ./../global/polyfills/isInteger */ "./resources/js/global/polyfills/isInteger.js");

__webpack_require__(/*! ./../global/polyfills/promise */ "./resources/js/global/polyfills/promise.js");

__webpack_require__(/*! ./../global/polyfills/symbol-es6.min */ "./resources/js/global/polyfills/symbol-es6.min.js");
/**
 *  Site wide functionality
 */


__webpack_require__(/*! ./global/helpers */ "./resources/js/site/global/helpers.js");

__webpack_require__(/*! ./global/browserHandler */ "./resources/js/site/global/browserHandler.js"); // require('./global/pagetransitionHandler');
// require('./global/resizeHandler');
// require('./global/scrollHandler');

/**
 * Component specific functionality
 */


__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/site/components/chocolateFactory.js");

__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/site/components/cookieHandler.js");

__webpack_require__(/*! ./components/imageRackHandler */ "./resources/js/site/components/imageRackHandler.js");

__webpack_require__(/*! ./components/inputHandler */ "./resources/js/site/components/inputHandler.js");

__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/site/components/mapsHandler.js");

__webpack_require__(/*! ./components/navigationHandler */ "./resources/js/site/components/navigationHandler.js");

__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/site/components/scrollToHandler.js"); // require('./components/searchHandler');
// require('./components/shareButtonsHandler');


__webpack_require__(/*! ./components/slideProjectorHandler */ "./resources/js/site/components/slideProjectorHandler.js");

__webpack_require__(/*! ./components/clientReviewsHandler */ "./resources/js/site/components/clientReviewsHandler.js");

__webpack_require__(/*! ./components/uspImpressionsHandler */ "./resources/js/site/components/uspImpressionsHandler.js");

__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/site/components/youtubeHandler.js");

/***/ }),

/***/ "./resources/js/site/components/chocolateFactory.js":
/*!**********************************************************!*\
  !*** ./resources/js/site/components/chocolateFactory.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
 | Prevent Bots handler
 |
 | We named this chocolate factory and belonging confusing js hooks
 | to prevent smart bots from blocking these variable or functions.
 |
 ========================================================================== */
var ChocolateFactory = {
  bannedVisitor: [],

  /** Get all the chocolate factory and start
   *  Looping through those start flashing tickets
   */
  enter: function enter() {
    var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');

    if (isset(chocolateFactories)) {
      var amountOfChocolateFactories = chocolateFactories.length;

      for (var i = 0; i < amountOfChocolateFactories; i++) {
        var ChocolateBar = chocolateFactories[i];

        ChocolateFactory._flashTicket(ChocolateBar);
      }
    }
  },

  /**
   * If factory has a golden ticket
   * Then we can make them go on the tour if there has been click on the ticket
   *
   * @param chocolateBar
   * @private
   */
  _flashTicket: function _flashTicket(chocolateBar) {
    // Try get the ticket from the chocolateBar
    var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket

    if (isset(goldenTicket)) {
      goldenTicket.addEventListener('click', function () {
        ChocolateFactory.enjoyTheTour(chocolateBar);
      });
    } else {
      console.log('To bad, no golden tickets has been found.');
    }
  },

  /**
   * Start the tour through the factory
   * And get the names and properties of the members of the group
   * If there are members in the group of course
   *
   * @param chocolateFactory
   */
  enjoyTheTour: function enjoyTheTour(chocolateFactory) {
    // Ask for the tour group
    var tourGroup = chocolateFactory.querySelectorAll('input, textarea');

    if (isset(tourGroup)) {
      // For each visitor we want a belonging Oompa Loompa
      var oompaLoompas = {};
      var amountOfOompaLoompas = 0;
      var tourGroupSize = tourGroup.length;

      for (var i = 0; i < tourGroupSize; i++) {
        // Get the visitor from the group
        var visitor = tourGroup[i]; // Ask for its name

        var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned

        if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
        oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
        amountOfOompaLoompas++;
      } // Check for insurance that there are oompa loompas


      if (amountOfOompaLoompas === 0) return; // Send submit request

      ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
    } else {
      console.log('To bad, no members to visit this factory');
    }
  },

  /**
   * Check if the visitor name isn't allow
   *
   * @param visitorName
   * @returns {boolean}
   * @private
   */
  _isVisitorBanned: function _isVisitorBanned(visitorName) {
    if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
      return true;
    }

    return false;
  },

  /**
   * Most get visitor have a normal arrangement
   * But sometimes there are special cases
   * Like a Selector or checkbox
   *
   * @param visitor
   * @returns {*}
   * @private
   */
  _getArrangement: function _getArrangement(visitor) {
    var visitorType = visitor.nodeName;

    switch (visitorType) {
      default:
        return visitor.value;
    }
  },

  /**
   * Finish the tour
   * If successful show thanks message
   * Or show defined error message or fallback
   *
   * @param group
   * @param chocolateFactory
   * @returns {*|void}
   * @private
   */
  _finishTour: function _finishTour(group, chocolateFactory) {
    // Add willie to the group
    group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour

    var gate = '/contact/process';

    try {
      Ajax.post(gate, group, function (HttpRequest) {
        var response = JSON.parse(HttpRequest.response);

        switch (HttpRequest.status) {
          case 200:
            return ChocolateFactory._thanksForVisiting(response.redirectUrl);

          case 422:
            return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);

          default:
            break;
        }

        return ChocolateFactory._unknownGapInFactory(chocolateFactory);
      });
    } catch (e) {
      return ChocolateFactory._unknownGapInFactory(chocolateFactory);
    }
  },

  /**
   * Add willie wonka to the group
   * Ps... it actually the secret code!
   *
   * @param group
   * @returns {*}
   * @private
   */
  _addWillieWonka: function _addWillieWonka(group) {
    group._willie = 'wonka';
    return group;
  },

  /**
   * Add the feedback to the desired area.
   * Most likely to the visitor directly, but sometime to the factory desired feedback area
   *
   * @param errors
   * @param chocolateFactory
   * @private
   */
  _giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
    // Grab the factory feedback area
    var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html

    if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets

    ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);

    Object.keys(errors).forEach(function (visitor) {
      var jacket = null;
      var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element

      if (visitor !== '_honey' && visitor !== '_secretCode') {
        // Grab the visitor
        var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor

        jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area

        if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-element-error'); // Clear the current html

        if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
      } // Get the feedback for this visitor


      var visitorFeedback = errors[visitor]; // Spit out each line

      var visitorFeedbackAmount = visitorFeedback.length;

      for (var i = 0; i < visitorFeedbackAmount; i++) {
        var visitorFeedbackLine = visitorFeedback[i]; // Honey elements doesn't has a accessible element area

        if (visitor !== '_honey' && visitor !== '_secretCode') {
          // Mark the jacket
          if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined

          if (isset(visitorFeedbackArea)) {
            var currentFeedbackArea = visitorFeedbackArea.innerHTML;
            currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
            visitorFeedbackArea.innerHTML = currentFeedbackArea;
          }
        } // Append feedback to factory feedback area if defined


        if (isset(feedbackArea)) {
          var _currentFeedbackArea = feedbackArea.innerHTML;
          _currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
          feedbackArea.innerHTML = _currentFeedbackArea;
        }
      }
    });
  },

  /**
   * Clear the previous marked jackets
   *
   * @param chocolateFactory
   * @private
   */
  _clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
    var markedJackets = chocolateFactory.querySelectorAll('.has-error');
    var markedJacketsAmount = markedJackets.length;

    for (var i = 0; i < markedJacketsAmount; i++) {
      markedJackets[i].classList.remove('has-error');
    }
  },

  /**
   * Grab the jacket of the visitor
   *
   * @param visitor
   * @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
   * @private
   */
  _grabVisitorJacket: function _grabVisitorJacket(visitor) {
    // Check if visitor is defined
    if (!isset(visitor)) return null; // Do loop settings

    currentLayer = visitor;
    safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached

    do {
      safetyBreak++;
      currentLayer = currentLayer.parentNode;
      if (currentLayer.classList.contains('js-form-element')) return currentLayer;
    } while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);

    return null;
  },

  /**
   * Redirect the visitor to the thanks page
   *
   * @param nextStop
   * @private
   */
  _thanksForVisiting: function _thanksForVisiting(nextStop) {
    window.location = nextStop;
  },

  /**
   * Unknown error occurred, log the error
   *
   * @param chocolateFactory
   * @private
   */
  _unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
    console.log(chocolateFactory);
    console.log('ChocolateFactory: Unkown Error');
  }
};
ChocolateFactory.enter();

/***/ }),

/***/ "./resources/js/site/components/clientReviewsHandler.js":
/*!**************************************************************!*\
  !*** ./resources/js/site/components/clientReviewsHandler.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* Example

const headerImageSliderSetting = new SliderProjectorSetting({
    sliderProjectorId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    captions: '#header-image-slider .slider-navigation-labels .caption p',
    autoSlider: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();

 */
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

var ClientReviewsHandler = {
  init: function init() {
    var clientReviews = [];
    var clientReviewContainers = document.querySelectorAll('.js-client-reviews');
    var clientReviewContainersLength = clientReviewContainers.length;

    for (var i = 0; i < clientReviewContainersLength; i++) {
      var clientReview = clientReviewContainers[i];
      var clientReviewId = clientReview.getAttribute('id');

      if (clientReviewId !== null) {
        clientReviews.push(new ClientReview({
          clientReviewId: clientReviewId,
          slideQuery: '#' + clientReviewId + ' .js-client-review-slide',
          navigationButtons: '#' + clientReviewId + ' .js-client-reviews-button'
        }).init());
      } else console.log('An image slider has no id...');
    }
  }
};
ClientReviewsHandler.init();

function ClientReview(settings) {
  //Define SliderProjector object
  var self = this;
  this.clientReviewObject = ''; //SlideParameters

  this.activeSlideId = 0;
  this.previousSlideId = 0;
  this.nextSlideId = 0;
  this.availableSlides = 1;
  this.slides = [];
  this.settings = {};

  this.init = function () {
    //Append settings to self
    this.settings = settings; //Assign needed elements and calculations

    this.clientReviewObject = document.getElementById(this.settings.clientReviewId);
    this.slides = document.querySelectorAll(this.settings.slideQuery);
    this.availableSlides = this.slides.length;
    this.activeSlideId = 0; // Set active slide (and possible previous and next classes)

    this.setSlide(); // Swipe interaction

    var swipeGestures = new Hammer(this.clientReviewObject);
    swipeGestures.on('swipeleft', function () {
      self.nextSlide();
      self.setSlide();
    });
    swipeGestures.on('swiperight', function () {
      self.previousSlide();
      self.setSlide();
    });

    if (this.settings.navigationButtons !== '') {
      // Click interaction
      var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
      var navigationButtonsLength = navigationButtons.length;

      for (var i = 0; i < navigationButtonsLength; i++) {
        var navigationButton = navigationButtons[i];
        navigationButton.addEventListener('click', function () {
          self.clickNavigationButton(this);
        });
      }
    }
  };

  this.nextSlide = function () {
    this.activeSlideId++;
    if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.previousSlide = function () {
    this.activeSlideId--;
    if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.setPreviousAndNextSlide = function () {
    this.nextSlideId = this.activeSlideId + 1;
    if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
    this.previousSlideId = this.activeSlideId - 1;
    if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
  };

  this.setSlide = function () {
    // Loop through the form elements
    var slidesLength = self.slides.length;

    for (var i = 0; i < slidesLength; i++) {
      var slide = self.slides[i]; // Convert data set attribute to desired type

      var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides

      if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active'); // If we use the previous and next, also set those classes

      if (self.settings.definedPreviousNext) {
        if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
        if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
      }
    }
  };

  this.clickNavigationButton = function (navButton) {
    self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
    self.setPreviousAndNextSlide();
    self.setSlide();
    var next = document.querySelector(self.settings.navigationButtons + '.next');
    var previous = document.querySelector(self.settings.navigationButtons + '.previous');
    next.setAttribute('data-order', self.nextSlideId);
    previous.setAttribute('data-order', self.previousSlideId);
  };
}

/***/ }),

/***/ "./resources/js/site/components/cookieHandler.js":
/*!*******************************************************!*\
  !*** ./resources/js/site/components/cookieHandler.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Cookie handler
   - Primary usage for toggling the cookie message and/or switch
 ========================================================================== */
var CookieHandler = {
  cookieBar: null,
  cookieOverlay: null,
  cookieMessage: null,
  cookieSwitch: null,
  cookieFadeOutAnimationDuration: 400,
  acceptTracking: false,
  // Initialize cookie handler
  init: function init() {
    // Bind cookie bar or overlay to cookieMessage
    CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay'); // Bind cookie bar to cookieBar

    CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar

    if (isset(CookieHandler.cookieBar)) {
      CookieHandler.initCookieBar();
    } else {
      // Else try to connect cookie overlay with tracking to cookieOverlay
      CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay'); // If isset init the functions for cookie overlay

      if (isset(CookieHandler.cookieOverlay)) {
        CookieHandler.initCookieOverlay();
      }
    } // If either type of cookie has been found check if settings are defined


    if (isset(CookieHandler.cookieMessage)) {
      CookieHandler.checkForCookieSettings();
    } // Bind cookie switch to Handler


    CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch'); // If isset init the functions for cookie switch

    if (isset(CookieHandler.cookieSwitch)) {
      CookieHandler.initCookieSwitch();
    }
  },
  // Init the cookie bar actions
  initCookieBar: function initCookieBar() {
    var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');

    if (isset(closeButton)) {
      closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
    }
  },
  // Init the cookie overlay actions
  initCookieOverlay: function initCookieOverlay() {
    // Open the cookie settings event
    var openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');

    if (isset(openCookieSettingsButton)) {
      openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);
    } // Toggle of the tracking input


    var toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');

    if (isset(toggleTrackingInput)) {
      if (toggleTrackingInput.checked === true) {
        CookieHandler.acceptTracking = true;
      }

      toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
    } // Accept / Save cookies button event


    var acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');

    if (isset(acceptButton)) {
      acceptButton.addEventListener('click', CookieHandler.setCookieSettings);
    }
  },
  // Init the cookie switch actions
  initCookieSwitch: function initCookieSwitch() {
    // Toggle of the tracking input
    var toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');

    if (isset(toggleTrackingInput)) {
      // Force the state of the cookie switch input because the pop-up is forced on checked
      // while the switch checks by php if the cookie really exist or not
      if (toggleTrackingInput.checked === true) {
        CookieHandler.acceptTracking = true;
      } else {
        CookieHandler.acceptTracking = false;
      }

      toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
    } // Save cookies button event


    var saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');

    if (isset(saveButton)) {
      saveButton.addEventListener('click', function () {
        CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)

        CookieHandler.setCookieSettings();
      });
    }
  },
  checkForCookieSettings: function checkForCookieSettings() {
    if (Cookie.get('cookieMessage')) {
      CookieHandler.cookieMessage.classList.add('is-accepted');
    } else {
      CookieHandler.cookieMessage.classList.remove('is-accepted');
    }
  },
  closeCookieMessage: function closeCookieMessage() {
    Cookie.set('cookieMessage', true, 90);
    CookieHandler.cookieMessage.classList.add('fade-out');
  },
  openCookieSettings: function openCookieSettings() {
    CookieHandler.cookieOverlay.querySelector('.js-cookie-settings').classList.remove('is-hidden');
    CookieHandler.cookieOverlay.querySelector('.js-cookie-info').classList.add('is-hidden');
  },
  toggleTrackingSetting: function toggleTrackingSetting() {
    if (CookieHandler.acceptTracking) {
      CookieHandler.acceptTracking = false;
    } else {
      CookieHandler.acceptTracking = true;
    }
  },
  setCookieSettings: function setCookieSettings() {
    // Set tracking cookie or delete it if isset according to the desired settings
    if (CookieHandler.acceptTracking) {
      Cookie.set('trackingCookieAccepted', 'true', 90);
    } else {
      if (Cookie.get('trackingCookieAccepted')) {
        Cookie.erase('trackingCookieAccepted');
      }
    }

    CookieHandler.closeCookieMessage(); // Reload after animation to automatically trigger the tracking after accepting it

    setTimeout(function () {
      location.reload();
    }, CookieHandler.cookieFadeOutAnimationDuration);
  }
};
CookieHandler.init();

/***/ }),

/***/ "./resources/js/site/components/imageRackHandler.js":
/*!**********************************************************!*\
  !*** ./resources/js/site/components/imageRackHandler.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

var ImageRackHandler = {
  init: function init() {
    var imageRackElements = document.querySelectorAll('.js-image-rack');
    var imageRackElementsLength = imageRackElements.length;

    for (var i = 0; i < imageRackElementsLength; i++) {
      new ImageRack(imageRackElements[i]);
    }
  }
};

var ImageRack =
/*#__PURE__*/
function () {
  function ImageRack(imageRack) {
    _classCallCheck(this, ImageRack);

    var self = this;
    this.rack = imageRack;
    this.slideArea = this.rack.querySelector('.js-image-rack-slide');
    this.items = this.rack.querySelectorAll('.js-image-rack-item');
    this.direction = this.rack.getAttribute('data-direction');
    this.imageLoaded = false;
    this.currentItem = 0;
    this.maxItemPosition = this.items.length;
    this.maxTranslated = 0;
    this.steps = [];
    this.previousButton = this.rack.querySelector('.js-image-rack-button.previous');
    this.nextButton = this.rack.querySelector('.js-image-rack-button.next');
    this.calculateSteps();

    if (isset(this.previousButton)) {
      this.previousButton.addEventListener('click', function () {
        self.previousItem();
        self.setImageRack();
      });
    }

    if (isset(this.nextButton)) {
      this.nextButton.addEventListener('click', function () {
        self.nextItem();
        self.setImageRack();
      });
    } // Swipe interaction


    var swipeGestures = new Hammer(this.rack);
    swipeGestures.on('swipeleft', function () {
      console.log('swipe Left');
      self.swipeLeft();
      self.setImageRack();
    });
    swipeGestures.on('swiperight', function () {
      console.log('swipe Rith');
      self.swipeRight();
      self.setImageRack();
    });
    this.debounceTimeout = null;
    this.waitDebounce = 500; // Debounce Resize

    window.addEventListener('resize', function () {
      if (isset(self.debounceTimeout)) clearTimeout(self.debounceTimeout);
      self.debounceTimeout = setTimeout(function () {
        self.calculateSteps();
        self.setImageRack();
      }, self.waitDebounce);
    });
  }

  _createClass(ImageRack, [{
    key: "calculateSteps",
    value: function calculateSteps() {
      //Rest the steps array
      this.steps = []; // Calculated the offset of the whole rack to know how much we may translate at most

      var bodyOffset = window.bodyOffset(this.rack); // Calculated the available view area of the rack

      var availableViewArea;
      if (this.direction === 'ltr') availableViewArea = document.body.offsetWidth - bodyOffset.left;else availableViewArea = bodyOffset.left + this.rack.offsetWidth; // Get the racket Width

      var rackWidth;
      if (this.direction === 'ltr') rackWidth = this.items[this.items.length - 1].offsetLeft + this.items[this.items.length - 1].offsetWidth;else rackWidth = (this.items[this.items.length - 1].offsetLeft - this.rack.offsetWidth) * -1;
      this.maxTranslated = rackWidth - availableViewArea;
      var maxItemCalculated = false;
      var imagesLoaded = true; // Calculated for each item the offset in the rack

      for (var i = 0; i < this.items.length; i++) {
        var item = this.items[i];
        if (item.offsetWidth === 0) imagesLoaded = false;
        var offsetFromRightSide = void 0;
        var offsetFromLeftSide = void 0;

        if (this.direction === 'ltr') {
          offsetFromRightSide = item.offsetLeft + item.offsetWidth;
          offsetFromLeftSide = item.offsetLeft;
        } else {
          offsetFromRightSide = (this.rack.offsetWidth * -1 + (item.offsetLeft + item.offsetWidth)) * -1;
          offsetFromLeftSide = (this.rack.offsetWidth * -1 + item.offsetLeft) * -1;
        } // Append these offset to the offset position array


        this.steps.push({
          offsetFromLeftSide: offsetFromLeftSide,
          offsetFromRightSide: offsetFromRightSide
        }); // Define the compare variable
        // Else we have to create a complex if statement...

        var offsetCompareVariable = void 0;
        if (this.direction === 'ltr') offsetCompareVariable = offsetFromRightSide;else offsetCompareVariable = offsetFromLeftSide; // If the max translated is smaller and isn't already defined

        if (offsetCompareVariable > this.maxTranslated && !maxItemCalculated) {
          this.maxItemPosition = i + 1;
          maxItemCalculated = true;
        }
      } // Recalculated when the images aren't loaded


      if (imagesLoaded) this.imageLoaded = true;
      console.log(this.imageLoaded); // if(!imagesLoaded){
      //     console.warn("ImageRack: Recalculated width because images weren't loaded.");
      //     setTimeout(self.calculateSteps(), 4000);
      // }
    }
  }, {
    key: "nextItem",
    value: function nextItem() {
      this.currentItem++;
      if (this.currentItem >= this.maxItemPosition) this.currentItem = this.maxItemPosition;
    }
  }, {
    key: "previousItem",
    value: function previousItem() {
      this.currentItem--;
      if (this.currentItem < 0) this.currentItem = 0;
    } // We have to use these intervene functions to swap the function when the sliders as a different direction

  }, {
    key: "swipeLeft",
    value: function swipeLeft() {
      if (this.direction === 'ltr') this.nextItem();else this.previousItem();
    }
  }, {
    key: "swipeRight",
    value: function swipeRight() {
      if (this.direction === 'ltr') this.previousItem();else this.nextItem();
    }
  }, {
    key: "setImageRack",
    value: function setImageRack() {
      // Check if image are load when interaction
      if (!this.imageLoaded) {
        console.warn("ImageRack: Recalculated because images weren't loaded yet.");
        this.calculateSteps();
      }

      var nextOffsetPosition;
      if (this.direction === 'ltr') nextOffsetPosition = '-' + this.steps[this.currentItem].offsetFromLeftSide;else nextOffsetPosition = this.steps[this.currentItem].offsetFromRightSide;
      this.slideArea.style.transform = 'translateX(' + nextOffsetPosition + 'px)';
    }
  }]);

  return ImageRack;
}();

ImageRackHandler.init();

/***/ }),

/***/ "./resources/js/site/components/inputHandler.js":
/*!******************************************************!*\
  !*** ./resources/js/site/components/inputHandler.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Input handler

    This handler can be remove when the css support for :focus-within is better
 ========================================================================== */
var InputHandler = {
  inputFields: null,
  init: function init() {
    // Get the form inputs
    InputHandler.inputFields = document.querySelectorAll('form input, form textarea');
    var inputLength = InputHandler.inputFields.length;

    for (var i = 0; i < inputLength; i++) {
      var input = InputHandler.inputFields[i];
      var inputId = input.getAttribute('id'); // Check if there is an id on the input

      if (isset(inputId)) {
        var inputLabel = document.querySelector('form label[for="' + inputId + '"]'); // // And if there is a belonging label

        if (isset(inputLabel)) {
          InputHandler.addEventListenersToInput(input);
        }
      }
    }
  },
  addEventListenersToInput: function addEventListenersToInput(input) {
    // Add the fill class and trigger removeFocus so the input will be automatic be marked as filled or not
    parentElement = input.parentNode;
    parentElement.classList.add('filled');
    InputHandler.removeFocus(input);
    input.addEventListener('focus', function () {
      // We loop through the input elements because autocomplete (on chrome) triggers al the focus elements but none focus out
      var inputLength = InputHandler.inputFields.length;

      for (var i = 0; i < inputLength; i++) {
        var loopedInput = InputHandler.inputFields[i]; // Trigger add focus on this focused element

        if (loopedInput === input) {
          InputHandler.addFocus(this);
        } // Remove focus on all other input/textarea elements
        else {
            InputHandler.removeFocus(loopedInput);
          }
      }
    });
    input.addEventListener('focusout', function () {
      InputHandler.removeFocus(this);
    });
  },
  addFocus: function addFocus(input) {
    if (isset(input)) {
      var inputId = input.getAttribute('id');
      parentElement = input.parentNode;
      parentElement.classList.add('focused');
      parentElement.classList.add('filled'); // If there is a error message remove it on focus

      var errorMessage = document.querySelector('form .error-message#' + inputId + '-error');

      if (isset(errorMessage)) {
        errorMessage.classList.add('fade-out');
      }
    }
  },
  // Reset the label location only if the input is empty
  removeFocus: function removeFocus(input) {
    if (isset(input)) {
      var inputValue = input.value;
      parentElement = input.parentNode;
      parentElement.classList.remove('focused');

      if (!isset(inputValue) || inputValue === '') {
        parentElement.classList.remove('filled');
      }
    }
  }
};
InputHandler.init();

/***/ }),

/***/ "./resources/js/site/components/mapsHandler.js":
/*!*****************************************************!*\
  !*** ./resources/js/site/components/mapsHandler.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Google Maps handler
    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map
 ========================================================================== */
var MapsHandler = {
  map: '',
  key: 'AIzaSyBv6FJHn23Lz3S0j9T1DYWr57zTBU-T0oY',
  location: {
    lat: 51.2618222,
    lng: 5.5965538
  },
  styling: '',
  init: function init() {
    // Get map by id
    MapsHandler.map = document.getElementById('map'); // Check if a map is defined

    if (isset(MapsHandler.map)) {
      if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
      if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));
      MapsHandler.setCustomStyling(); // See if google variable exists

      if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
        // Load external script
        getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
      } else {
        MapsHandler.drawMap();
      }
    }
  },
  drawMap: function drawMap() {
    // Create a map
    var map = new google.maps.Map(MapsHandler.map, {
      zoom: 11,
      center: MapsHandler.location,
      disableDefaultUI: true,
      styles: MapsHandler.styling
    }); // Add a marker

    var marker = new google.maps.Marker({
      position: MapsHandler.location,
      map: map
    });
  },
  setCustomStyling: function setCustomStyling() {
    MapsHandler.styling = [{
      "featureType": "poi",
      "elementType": "labels.text.fill",
      "stylers": [{
        "color": "#747474"
      }, {
        "lightness": "23"
      }]
    }, {
      "featureType": "poi.attraction",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#f38eb0"
      }]
    }, {
      "featureType": "poi.government",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ced7db"
      }]
    }, {
      "featureType": "poi.medical",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffa5a8"
      }]
    }, {
      "featureType": "poi.park",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#c7e5c8"
      }]
    }, {
      "featureType": "poi.place_of_worship",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#d6cbc7"
      }]
    }, {
      "featureType": "poi.school",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#c4c9e8"
      }]
    }, {
      "featureType": "poi.sports_complex",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#b1eaf1"
      }]
    }, {
      "featureType": "road",
      "elementType": "geometry",
      "stylers": [{
        "lightness": "100"
      }]
    }, {
      "featureType": "road",
      "elementType": "labels",
      "stylers": [{
        "visibility": "off"
      }, {
        "lightness": "100"
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffd4a5"
      }]
    }, {
      "featureType": "road.arterial",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffe9d2"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "all",
      "stylers": [{
        "visibility": "simplified"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry.fill",
      "stylers": [{
        "weight": "3.00"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry.stroke",
      "stylers": [{
        "weight": "0.30"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text",
      "stylers": [{
        "visibility": "on"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text.fill",
      "stylers": [{
        "color": "#747474"
      }, {
        "lightness": "36"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text.stroke",
      "stylers": [{
        "color": "#e9e5dc"
      }, {
        "lightness": "30"
      }]
    }, {
      "featureType": "transit.line",
      "elementType": "geometry",
      "stylers": [{
        "visibility": "on"
      }, {
        "lightness": "100"
      }]
    }, {
      "featureType": "water",
      "elementType": "all",
      "stylers": [{
        "color": "#d2e7f7"
      }]
    }];
  }
};
MapsHandler.init();

/***/ }),

/***/ "./resources/js/site/components/navigationHandler.js":
/*!***********************************************************!*\
  !*** ./resources/js/site/components/navigationHandler.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Navigation handler
   - Handles the navigation component which has the proper classes.
 ========================================================================== */
var NavigationHandler = {
  navigationNode: null,
  scrolledLog: 0,
  isOpen: false,
  init: function init() {
    var navTriggers = document.querySelectorAll('.js-nav-trigger');
    var closeButton = document.querySelector('.js-close-overlay-nav');
    NavigationHandler.navigationNode = document.querySelector('.js-overlay-nav');

    if (isset(NavigationHandler.navigationNode)) {
      document.addEventListener('keydown', function (event) {
        if (event.code === 'Escape') NavigationHandler.closeNavigation();
      });

      for (var i = 0; i < navTriggers.length; i++) {
        NavigationHandler.initNavigation(navTriggers[i]);
      }

      closeButton.addEventListener('click', function () {
        NavigationHandler.closeNavigation();
      });
    }
  },
  initNavigation: function initNavigation(navTrigger) {
    navTrigger.addEventListener('click', NavigationHandler.toggleNavigation, false);
  },
  toggleNavigation: function toggleNavigation(event) {
    // Prevent default link behavior
    event.preventDefault();
    NavigationHandler.scrolled = window.pageYOffset; // If the nav is already active, collapse it and quit

    if (NavigationHandler.isOpen) NavigationHandler.closeNavigation();else NavigationHandler.openNavigation();
  },
  openNavigation: function openNavigation() {
    NavigationHandler.isOpen = true;
    NavigationHandler.scrolled = window.pageYOffset;
    document.body.classList.add('nav-is-active');
    setTimeout(function () {
      document.body.classList.add('scroll-lock');
    }, 400);
  },
  closeNavigation: function closeNavigation() {
    document.body.classList.remove('scroll-lock');
    window.pageYOffset = NavigationHandler.scrolled;
    document.body.classList.remove('nav-is-active');
    NavigationHandler.isOpen = false;
  }
};
NavigationHandler.init();

/***/ }),

/***/ "./resources/js/site/components/scrollToHandler.js":
/*!*********************************************************!*\
  !*** ./resources/js/site/components/scrollToHandler.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Scroll To Click handler
 ========================================================================== */
var ScrollToHandler = {
  // Animation settings
  offset: 60,
  //pixel
  duration: 1400,
  //ms
  // Animation variables
  body: null,
  start: 0,
  change: 0,
  currentTime: 0,
  allowAnimation: false,
  scrollToAnimation: null,
  // Watch the EasingFunction helper for the available methods
  easing: 'easeInOutQuad',
  init: function init() {
    var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
    var anchorLinksAmount = anchorLinks.length;

    for (var i = 0; i < anchorLinksAmount; i++) {
      var anchorLink = anchorLinks[i];
      anchorLink.addEventListener('click', function (event) {
        ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
        event.preventDefault();
      });
    }
  },

  /**
   * Prepare the Handler for the animation
   */
  prepareScrollTo: function prepareScrollTo(elementId) {
    // Get the scroll to element
    elementId = elementId.substr(elementId.indexOf('#') + 1);
    var scrollToElement = document.getElementById(elementId);
    var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables

    ScrollToHandler.body = document.documentElement;
    ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop

    ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
    ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
    ScrollToHandler.allowAnimation = true; // Trigger animation

    scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll

    window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
  },

  /*
   * Animate the scroll position
   */
  animateScroll: function animateScroll(timestamp) {
    // Calculate progress from 0 - 1
    var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
    if (progress < 0) progress = 0; // Convert progress with easing function

    progress = EasingFunctions[ScrollToHandler.easing](progress);
    var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
    ScrollToHandler.body.scrollTop = newScrollTop;
    if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop

    if (progress < 1 && ScrollToHandler.allowAnimation) {
      scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
    }
  },

  /*
   * Abort the scroll animation
   */
  abortScrollAnimation: function abortScrollAnimation(event) {
    ScrollToHandler.allowAnimation = false;
    cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
  }
};
ScrollToHandler.init();

/***/ }),

/***/ "./resources/js/site/components/slideProjectorHandler.js":
/*!***************************************************************!*\
  !*** ./resources/js/site/components/slideProjectorHandler.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* Example

const headerImageSliderSetting = new SliderProjectorSetting({
    sliderProjectorId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    captions: '#header-image-slider .slider-navigation-labels .caption p',
    autoSlider: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();

 */
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

var SliderProjectorHandler = {
  init: function init() {
    var slideProjectors = [];
    var slideProjectorContainers = document.querySelectorAll('.js-slide-projector');
    var slideProjectorContainersLength = slideProjectorContainers.length;

    for (var i = 0; i < slideProjectorContainersLength; i++) {
      var slideProjector = slideProjectorContainers[i];
      var slideProjectorId = slideProjector.getAttribute('id');
      var autoSlide = slideProjector.getAttribute('data-auto-slide');

      if (slideProjectorId !== null) {
        var slideProjectorSetting = new SliderProjectorSetting({
          sliderId: slideProjectorId,
          slideQuery: '#' + slideProjectorId + ' .js-slide-projector-slide',
          navigationButtons: '#' + slideProjectorId + ' .js-slide-projector-button',
          autoSlider: autoSlide,
          sliderInterval: 6000
        });
        slideProjectors.push(new SliderProjector(slideProjectorSetting.prepareParameters()).init());
      } else console.log('An image slider has no id...');
    }
  }
};
SliderProjectorHandler.init();

function SliderProjectorSetting(settingsObject) {
  var self = this;
  this.sliderId = '';
  this.definedPreviousNext = true;
  this.autoSlider = false;
  this.sliderInterval = 4000;
  this.navigationButtons = '';
  this.dots = '';
  this.captions = '';
  this.slideQuery = '';

  this.setSliderProjectorId = function (string) {
    this.sliderId = string;
    return this;
  };

  this.setDefinedPreviousNext = function (_boolean) {
    this.definedPreviousNext = _boolean;
    return this;
  };

  this.setAutoSlider = function (_boolean2) {
    this.autoSlider = _boolean2;
    return this;
  };

  this.setSliderInterval = function (integer) {
    this.sliderInterval = integer;
    return this;
  };

  this.setSlideQuery = function (string) {
    this.slideQuery = string;
    return this;
  };

  this.setNavigationButtons = function (string) {
    this.navigationButtons = string;
    return this;
  };

  this.setDots = function (string) {
    this.dots = string;
    return this;
  };

  this.setCaptions = function (string) {
    this.captions = string;
    return this;
  };

  this.getSliderProjectorId = function () {
    return this.sliderId;
  };

  this.getDefinedPreviousNext = function () {
    return this.definedPreviousNext;
  };

  this.getAutoSlider = function () {
    return this.autoSlider;
  };

  this.getSliderInterval = function () {
    return this.sliderInterval;
  };

  this.getSlideQuery = function () {
    return this.slideQuery;
  };

  this.getNavigationButtons = function () {
    return this.navigationButtons;
  };

  this.getDots = function () {
    return this.dots;
  };

  this.getCaptions = function () {
    return this.captions;
  }; // Invert setters to getters


  this.prepareParameters = function () {
    return {
      sliderId: self.getSliderProjectorId(),
      definedPreviousNext: self.getDefinedPreviousNext(),
      autoSlider: self.getAutoSlider(),
      sliderInterval: self.getSliderInterval(),
      navigationButtons: self.getNavigationButtons(),
      dots: self.getDots(),
      captions: self.getCaptions(),
      slideQuery: self.getSlideQuery()
    };
  }; // Mass assign settings


  this.fill = function () {
    // Object.keys(settingsObject).forEach(function (key) {
    //     self[key] = settingsObject[key];
    // });
    var settingsObjectKeys = Object.keys(settingsObject);
    var settingsObjectLength = settingsObjectKeys.length;

    for (var i = 0; i < settingsObjectLength; i++) {
      var key = settingsObjectKeys[i];
      self[key] = settingsObject[key];
    }
  };

  this.fill();
  return {
    sliderId: self.setSliderProjectorId,
    definedPreviousNext: self.setDefinedPreviousNext,
    autoSlider: self.setAutoSlider,
    sliderInterval: self.setSliderInterval,
    navigationButtons: self.setNavigationButtons,
    dots: self.setDots,
    captions: self.setCaptions,
    slideQuery: self.setSlideQuery,
    prepareParameters: self.prepareParameters
  };
}

function SliderProjector(settings) {
  //Define SliderProjector object
  var self = this;
  this.sliderObject = ''; //SlideParameters

  this.activeSlideId = 0;
  this.previousSlideId = 0;
  this.nextSlideId = 0;
  this.availableSlides = 1;
  this.slides = [];
  this.autoSliderInterval = null;
  this.settings = {};

  this.init = function () {
    //Append settings to self
    this.settings = settings; //Assign needed elements and calculations

    this.sliderObject = document.getElementById(this.settings.sliderId);
    this.slides = document.querySelectorAll(this.settings.slideQuery);
    this.availableSlides = this.slides.length;
    this.activeSlideId = 0; //Define previous and next if we want to use those

    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide(); // Set active slide (and possible previous and next classes)

    this.setSlide(); // Swipe interaction

    var swipeGestures = new Hammer(this.sliderObject);
    swipeGestures.on('swipeleft', function () {
      self.resetAutoSlider();
      self.nextSlide();
      self.setSlide();
    });
    swipeGestures.on('swiperight', function () {
      self.resetAutoSlider();
      self.previousSlide();
      self.setSlide();
    });

    if (this.settings.navigationButtons !== '') {
      // Click interaction
      var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
      var navigationButtonsLength = navigationButtons.length;

      for (var i = 0; i < navigationButtonsLength; i++) {
        var navigationButton = navigationButtons[i];
        navigationButton.addEventListener('click', function () {
          self.clickNavigationButton(this);
        });
      }
    }

    if (this.settings.dots !== '') {
      // Click interaction
      var dots = document.querySelectorAll(this.settings.dots);
      var dotsLength = dots.length; // console.log(this.settings.dots);
      // console.log(dots);

      for (var _i = 0; _i < dotsLength; _i++) {
        var dot = dots[_i]; // console.log('hier');

        dot.addEventListener('click', function () {
          self.clickDot(this);
        });
      }
    }

    self.autoSlider();
  };

  this.autoSlider = function () {
    if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);

    if (this.settings.autoSlider && Number.isInteger(this.settings.sliderInterval)) {
      this.autoSliderInterval = setInterval(function () {
        self.nextSlide();
        self.setSlide();
      }, this.settings.sliderInterval);
    }
  };

  this.resetAutoSlider = self.autoSlider;

  this.nextSlide = function () {
    this.activeSlideId++;
    if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.previousSlide = function () {
    this.activeSlideId--;
    if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.setPreviousAndNextSlide = function () {
    this.nextSlideId = this.activeSlideId + 1;
    if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
    this.previousSlideId = this.activeSlideId - 1;
    if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
  };

  this.setSlide = function () {
    // Loop through the form elements
    var slidesLength = self.slides.length;

    for (var i = 0; i < slidesLength; i++) {
      var slide = self.slides[i]; // Convert data set attribute to desired type

      var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides

      if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active'); // If we use the previous and next, also set those classes

      if (self.settings.definedPreviousNext) {
        if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
        if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
      }
    }

    if (self.settings.dots !== '') {
      self.setActiveDot();
    }

    if (self.settings.captions !== '') {
      self.setActiveCaption();
    }
  };

  this.clickNavigationButton = function (navButton) {
    self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
    if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();
    self.setSlide();
    var next = document.querySelector(self.settings.navigationButtons + '.next');
    var previous = document.querySelector(self.settings.navigationButtons + '.previous');
    next.setAttribute('data-order', self.nextSlideId);
    previous.setAttribute('data-order', self.previousSlideId);
    self.resetAutoSlider(); // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;
    // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;
  };

  this.clickDot = function (clickedDot) {
    self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
    self.setSlide();
    self.resetAutoSlider();
  };

  this.setActiveDot = function () {
    var dots = document.querySelectorAll(this.settings.dots);
    var dotsLength = dots.length;

    for (var i = 0; i < dotsLength; i++) {
      var dot = dots[i];
      dotOrder = parseInt(dot.getAttribute('data-order'));
      if (dotOrder !== self.activeSlideId) dot.classList.remove('is-active');else dot.classList.add('is-active');
    }
  };

  this.setActiveCaption = function () {
    var captions = document.querySelectorAll(this.settings.captions);
    var captionsLength = captions.length;

    for (var i = 0; i < captionsLength; i++) {
      var caption = captions[i];
      captionOrder = parseInt(caption.getAttribute('data-order'));
      if (captionOrder !== self.activeSlideId) caption.classList.remove('is-active');else caption.classList.add('is-active');
    }
  };
}

/***/ }),

/***/ "./resources/js/site/components/uspImpressionsHandler.js":
/*!***************************************************************!*\
  !*** ./resources/js/site/components/uspImpressionsHandler.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/* ==========================================================================
    Usp Impressions handler
 ========================================================================== */
var UspImpressionsHandler = {
  timeout: null,
  init: function init() {
    var uspImpressionsTrays = document.querySelectorAll('.js-usp-impressions');
    var uspImpressionsTraysLength = uspImpressionsTrays.length;

    for (var i = 0; i < uspImpressionsTraysLength; i++) {
      var uspImpressionsTray = uspImpressionsTrays[i];
      var uspImpressionSlider = new UspImpressionSlider(uspImpressionsTray);
      uspImpressionSlider.autoSlide();
    }
  }
};

var UspImpressionSlider =
/*#__PURE__*/
function () {
  function UspImpressionSlider(slider) {
    _classCallCheck(this, UspImpressionSlider);

    this.slider = slider;
    this.slides = this.slider.querySelectorAll('.js-usp-impression');
    this.currentSlide = 0;
    this.slideInterval = 4000;
  }

  _createClass(UspImpressionSlider, [{
    key: "autoSlide",
    value: function autoSlide() {
      var self = this;
      setTimeout(function () {
        self.nextSlide();
        self.autoSlide();
      }, this.slideInterval);
    }
  }, {
    key: "nextSlide",
    value: function nextSlide() {
      this.currentSlide++;
      if (this.currentSlide >= this.slides.length) this.currentSlide = 0;

      for (var i = 0; i < this.slides.length; i++) {
        var slide = this.slides[i];
        var slideId = slide.getAttribute('data-usp');

        if (slideId == this.currentSlide) {
          slide.classList.add('is-active');
        } else {
          slide.classList.remove('is-active');
        }
      }
    }
  }]);

  return UspImpressionSlider;
}();

UspImpressionsHandler.init();

/***/ }),

/***/ "./resources/js/site/components/youtubeHandler.js":
/*!********************************************************!*\
  !*** ./resources/js/site/components/youtubeHandler.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Youtube handler
 ========================================================================== */
var YoutubeHandler = {
  youtubeClass: '.js-youtube-player',
  players: [],
  init: function init() {
    // Get the youtube players containers
    var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
    var youtubePlayersAmount = youtubePlayers.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = youtubePlayers[i];
      var youtubePlayerId = youtubePlayer.getAttribute('id');

      if (youtubePlayerId !== null) {
        // Strip the necessary data from the html and create objects from it
        var youtubeElement = {
          id: youtubePlayer.getAttribute('id'),
          link: youtubePlayer.getAttribute('data-youtube-link'),
          autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
        };
        YoutubeHandler.players.push(youtubeElement);
      } else {
        console.log("Element not include because there isn't a id on the player");
        console.log(youtubePlayer);
      }
    }

    if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
  },

  /**
   * Check if external script is loaded
   *
   */
  initYoutube: function initYoutube() {
    // See if YT variable exists
    if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
      // Setup API ready function
      window.onYouTubePlayerAPIReady = function () {
        YoutubeHandler.loadPlayers();
      }; // Load external script


      getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
    } else {
      YoutubeHandler.loadPlayers();
    }
  },

  /**
   * Create the Youtube player(s) with parameters
   * And rewrite the players to key them by the element id
   *
   */
  loadPlayers: function loadPlayers() {
    var players = [];
    var youtubePlayersAmount = YoutubeHandler.players.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = YoutubeHandler.players[i]; // Load player

      youtubePlayer.player = new YT.Player(youtubePlayer.id, {
        height: 200,
        width: 200,
        videoId: youtubePlayer.link,
        host: 'https://www.youtube-nocookie.com',
        playerVars: {
          modestbranding: 0,
          rel: 0,
          disablekb: 1,
          autoplay: youtubePlayer.autoPlay
        },
        events: {
          // 'onReady': YoutubeHandler.onReady,
          'onStateChange': YoutubeHandler.onStateChange
        }
      });
      players[youtubePlayer.id] = youtubePlayer;
    }

    YoutubeHandler.players = players;
  },

  /**
   * When player is ready to play
   */
  onReady: function onReady(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player; // Show video
    // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
    // If not on tablet or mobile, play on high quality
    // player.mute();
    // player.playVideo();
    // player.setPlaybackQuality('hd1080');
  },

  /**
   * Listener for Youtube state change
   */
  onStateChange: function onStateChange(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player;
    var videoState = event.data; // Loop video

    if (event.data === YT.PlayerState.ENDED) {
      player.playVideo();
    }
  }
};
YoutubeHandler.init();

/***/ }),

/***/ "./resources/js/site/global/browserHandler.js":
/*!****************************************************!*\
  !*** ./resources/js/site/global/browserHandler.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Browser Handler
 ========================================================================== */
var BrowserHandler = {
  userAgent: '',
  browserInfo: '',
  init: function init() {
    BrowserHandler.userAgent = window.navigator.userAgent;
    BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
    BrowserHandler.handleIE();
    BrowserHandler.handleSafari();
  },
  handleIE: function handleIE() {
    // Detect versions below ie11
    var msie = BrowserHandler.userAgent.indexOf('MSIE ');
    var ielt11 = msie > 0; // Detect ie11

    var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer

    if (ielt11 || ie11) {
      // Default version
      var version = '11'; // Way to detect version < 11

      if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)

      document.body.classList.add('ie');
      document.body.classList.add('v' + version);
    }
  },
  // Fallback for older safari version
  handleSafari: function handleSafari() {
    if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
      document.getElementsByTagName('html')[0].classList.add('ie');
    }
  },
  getBrowserInfo: function getBrowserInfo() {
    var ua = navigator.userAgent,
        tem,
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
      tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
      return {
        name: 'IE ',
        version: tem[1] || ''
      };
    }

    if (M[1] === 'Chrome') {
      tem = ua.match(/\bOPR\/(\d+)/);

      if (tem != null) {
        return {
          name: 'Opera',
          version: tem[1]
        };
      }
    }

    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
      M.splice(1, 1, tem[1]);
    }

    return {
      name: M[0],
      version: M[1]
    };
  }
};
BrowserHandler.init();

/***/ }),

/***/ "./resources/js/site/global/helpers.js":
/*!*********************************************!*\
  !*** ./resources/js/site/global/helpers.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Helper functions
 ========================================================================== */

/*
 * Simple isset method for this does not exist in javascript
 */
window.isset = function (obj) {
  return typeof obj !== 'undefined' && obj !== null;
};
/*
 * Easing Functions - inspired from http://gizma.com/easing/
 * only considering the t value for the range [0, 1] => [0, 1]
 */


window.EasingFunctions = {
  // no easing, no acceleration
  linear: function linear(t) {
    return t;
  },
  // accelerating from zero velocity
  easeInQuad: function easeInQuad(t) {
    return t * t;
  },
  // decelerating to zero velocity
  easeOutQuad: function easeOutQuad(t) {
    return t * (2 - t);
  },
  // acceleration until halfway, then deceleration
  easeInOutQuad: function easeInOutQuad(t) {
    return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
  },
  // accelerating from zero velocity
  easeInCubic: function easeInCubic(t) {
    return t * t * t;
  },
  // decelerating to zero velocity
  easeOutCubic: function easeOutCubic(t) {
    return --t * t * t + 1;
  },
  // acceleration until halfway, then deceleration
  easeInOutCubic: function easeInOutCubic(t) {
    return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
  },
  // accelerating from zero velocity
  easeInQuart: function easeInQuart(t) {
    return t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuart: function easeOutQuart(t) {
    return 1 - --t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuart: function easeInOutQuart(t) {
    return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
  },
  // accelerating from zero velocity
  easeInQuint: function easeInQuint(t) {
    return t * t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuint: function easeOutQuint(t) {
    return 1 + --t * t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuint: function easeInOutQuint(t) {
    return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
  }
};
/*
 * Vanilla version of the $.getScript
 */

window.getScript = function (source, callback) {
  var script = document.createElement('script');
  script.async = 1;
  var scripts = document.getElementsByTagName('script');
  var prior = scripts[scripts.length - 1];

  script.onload = script.onreadystatechange = function (_, isAbort) {
    if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
      script.onload = script.onreadystatechange = null;
      script = undefined;

      if (!isAbort) {
        if (callback) callback();
      }
    }
  };

  script.src = source;
  prior.parentNode.insertBefore(script, prior);
};
/**
 * Returns a function, that, as long as it continues to be invoked, will not
 * be triggered. The function will be called after it stops being called for
 * N milliseconds. If `immediate` is passed, trigger the function on the
 * leading edge, instead of the trailing.
 * @param func
 * @param wait
 * @param immediate
 * @returns {Function}
 */


window.debounce = function (func, wait, immediate) {
  var timeout;
  return function () {
    var context = this,
        args = arguments;

    var later = function later() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };

    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
/*
 * Cookie helper class
 */


window.Cookie = {
  set: function set(name, value, days) {
    var domain, domainParts, date, expires, host;

    if (days) {
      date = new Date();
      date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
      expires = "; expires=" + date.toGMTString();
    } else {
      expires = "";
    }

    host = location.host;

    if (host.split('.').length === 1) {
      // no "." in a domain - it's localhost or something similar
      document.cookie = name + "=" + value + expires + "; path=/";
    } else {
      // Remember the cookie on all sub domains.
      //
      // Start with trying to set cookie to the top domain.
      // (example: if user is on foo.com, try to set
      //  cookie to domain ".com")
      //
      // If the cookie will not be set, it means ".com"
      // is a top level domain and we need to
      // set the cookie to ".foo.com"
      domainParts = host.split('.');
      domainParts.shift();
      domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
      // domain = '.komma.pro';

      document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
      // (otherwise it was a Top-Level Domain)

      if (Cookie.get(name) == null || Cookie.get(name) != value) {
        // append "." to current domain
        domain = '.' + host;
        document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
      }
    }
  },
  get: function get(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');

    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];

      while (c.charAt(0) === ' ') {
        c = c.substring(1, c.length);
      }

      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
    }

    return null;
  },
  erase: function erase(name) {
    Cookie.set(name, '', -1);
  }
};
/*
 * Javascript version of the number_format method of PHP
 */

window.number_format = function (number, decimals, dec_point, thousands_sep) {
  // Strip all characters but numerical ones.
  number = (number + '').replace(/[^0-9+\-Ee.]/g, '');

  var n = !isFinite(+number) ? 0 : +number,
      prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
      sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
      dec = typeof dec_point === 'undefined' ? '.' : dec_point,
      s = '',
      toFixedFix = function toFixedFix(n, prec) {
    var k = Math.pow(10, prec);
    return '' + Math.round(n * k) / k;
  }; // Fix for IE parseFloat(0.55).toFixed(0) = 0;


  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');

  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }

  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }

  return s.join(dec);
};
/**
 * Element.closest() polyfill
 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
 */


if (!Element.prototype.closest) {
  if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
  }

  Element.prototype.closest = function (s) {
    var el = this;
    var ancestor = this;
    if (!document.documentElement.contains(el)) return null;

    do {
      if (ancestor.matches(s)) return ancestor;
      ancestor = ancestor.parentElement;
    } while (ancestor !== null);

    return null;
  };
}

window.Ajax = {
  //TODO: Can we create a prepare request function ??
  get: function get(url, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('get', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send();
  },
  post: function post(url, data, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send(JSON.stringify(data));
  }
};
/**
 * Capitalize the first letter of the string
 * @param string
 * @returns {string}
 */

window.capitalizeFirstLetter = function (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
 * Convert snake case into camelcase
 *
 * @param string
 * @returns {*}
 */


window.snakeToCamel = function (string) {
  return string.replace(/(\-\w)/g, function (m) {
    return m[1].toUpperCase();
  });
};
/**
 * Get the index of an element inside its parent
 */


window.indexInParent = function (node) {
  var children = node.parentNode.childNodes;
  var num = 0;

  for (var i = 0; i < children.length; i++) {
    if (children[i] == node) return num;
    if (children[i].nodeType == 1) num++;
  }

  return -1;
};
/**
 * For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
 * The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
 * Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
 * Code from: https://stackoverflow.com/a/46981847
 */


window.copyToClipboard = function (el) {
  // resolve the element
  el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case

  if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
    // save current contentEditable/readOnly status
    var editable = el.contentEditable;
    var readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening

    el.contentEditable = true;
    el.readOnly = true; // create a selectable range

    var range = document.createRange();
    range.selectNodeContents(el); // select the range

    var selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
    el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state

    el.contentEditable = editable;
    el.readOnly = readOnly;
  } else {
    el.select();
  } // execute copy command


  document.execCommand('copy');
};
/**
 * Get the position of the element related to the body
 *
 * @param el
 * @returns {{top: number, left: number}}
 */


window.bodyOffset = function (el) {
  var rect = el.getBoundingClientRect(),
      scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
      scrollTop = window.pageYOffset || document.documentElement.scrollTop;
  return {
    top: rect.top + scrollTop,
    left: rect.left + scrollLeft
  };
};

/***/ }),

/***/ "./resources/sass/kms/styles.sass":
/*!****************************************!*\
  !*** ./resources/sass/kms/styles.sass ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ "./resources/sass/site/style.scss":
/*!****************************************!*\
  !*** ./resources/sass/site/style.scss ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ 0:
/*!**********************************************************************************************************!*\
  !*** multi ./resources/js/site/app.js ./resources/sass/site/style.scss ./resources/sass/kms/styles.sass ***!
  \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/js/site/app.js */"./resources/js/site/app.js");
__webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/sass/site/style.scss */"./resources/sass/site/style.scss");
module.exports = __webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/sass/kms/styles.sass */"./resources/sass/kms/styles.sass");


/***/ })

},[[0,"/js/site/manifest","/js/site/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL3BvbHlmaWxscy9ldmVudFBvbHlGaWxsLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL2lzSW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL3BvbHlmaWxscy9wcm9taXNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL3N5bWJvbC1lczYubWluLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2FwcC5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9jbGllbnRSZXZpZXdzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nvb2tpZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9pbWFnZVJhY2tIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvaW5wdXRIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvbWFwc0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9uYXZpZ2F0aW9uSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3Njcm9sbFRvSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3NsaWRlUHJvamVjdG9ySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3VzcEltcHJlc3Npb25zSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3lvdXR1YmVIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2dsb2JhbC9icm93c2VySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9nbG9iYWwvaGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9rbXMvc3R5bGVzLnNhc3MiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mvc2l0ZS9zdHlsZS5zY3NzIl0sIm5hbWVzIjpbImNyZWF0ZU5ld0V2ZW50IiwiZXZlbnROYW1lIiwiZXZlbnQiLCJFdmVudCIsImRvY3VtZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50Rm9yRWxlbWVudCIsImVsZW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiZmlyZUV2ZW50IiwiZXZlbnRUeXBlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwidmFsdWUiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdsb2JhbCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiZmluYWxseUNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJjb25zdHJ1Y3RvciIsInRoZW4iLCJyZXNvbHZlIiwicmVhc29uIiwicmVqZWN0Iiwic2V0VGltZW91dEZ1bmMiLCJzZXRUaW1lb3V0Iiwibm9vcCIsImJpbmQiLCJmbiIsInRoaXNBcmciLCJhcHBseSIsImFyZ3VtZW50cyIsIlByb21pc2UiLCJUeXBlRXJyb3IiLCJfc3RhdGUiLCJfaGFuZGxlZCIsIl92YWx1ZSIsInVuZGVmaW5lZCIsIl9kZWZlcnJlZHMiLCJkb1Jlc29sdmUiLCJoYW5kbGUiLCJzZWxmIiwiZGVmZXJyZWQiLCJwdXNoIiwiX2ltbWVkaWF0ZUZuIiwiY2IiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJwcm9taXNlIiwicmV0IiwiZSIsIm5ld1ZhbHVlIiwiZmluYWxlIiwibGVuZ3RoIiwiX3VuaGFuZGxlZFJlamVjdGlvbkZuIiwiaSIsImxlbiIsIkhhbmRsZXIiLCJkb25lIiwiZXgiLCJwcm90b3R5cGUiLCJwcm9tIiwiYWxsIiwiYXJyIiwiYXJncyIsIkFycmF5Iiwic2xpY2UiLCJjYWxsIiwicmVtYWluaW5nIiwicmVzIiwidmFsIiwicmFjZSIsInZhbHVlcyIsInNldEltbWVkaWF0ZSIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwiZ2xvYmFsTlMiLCJ3aW5kb3ciLCJFcnJvciIsImRlZmluZVByb3BlcnR5IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsInN5bWJvbEhpZGRlbkNvdW50ZXIiLCJnbG9iYWxTeW1ib2xSZWdpc3RyeSIsIkVTNiIsImlzQXJyYXkiLCJvYmplY3RUb1N0cmluZyIsInRvU3RyaW5nIiwiZW1wdHlGdW5jdGlvbiIsInNpbXBsZUZ1bmN0aW9uIiwiYXJnIiwiaXNDYWxsYWJsZSIsIkl0ZXJhdG9yIiwiQXJyYXlJdGVyYXRvciIsImFycmF5IiwiZmxhZyIsIl9hcnJheSIsIl9mbGFnIiwiX25leHRJbmRleCIsIlN0cmluZ0l0ZXJhdG9yIiwic3RyaW5nIiwiX3N0cmluZyIsImlzT2JqZWN0Iiwic2V0dXBTeW1ib2xJbnRlcm5hbHMiLCJzeW1ib2wiLCJkZXNjIiwiX2Rlc2NyaXB0aW9uIiwiX2lzU3ltYm9sIiwiX2lkIiwiYXBwZW5kQXJyYXkiLCJhcnJheTEiLCJhcnJheTIiLCJsZW5ndGgxIiwibGVuZ3RoMiIsImhhc093blByb3BlcnR5Iiwic2ltcGxlSW5oZXJpdGFuY2UiLCJjaGlsZCIsInBhcmVudCIsImNyZWF0ZSIsIlN5bWJvbCIsIlN0cmluZyIsImtleSIsInJlY29yZCIsInJlZ2lzdHJ5TGVuZ3RoIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJrZXlGb3IiLCJpc1N5bWJvbCIsImhhc0luc3RhbmNlIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwiaXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsInZhbHVlT2YiLCJuZXh0IiwibmV4dFZhbHVlIiwic3RyaW5nT2JqZWN0IiwiU3ByZWFkT3BlcmF0b3JJbXBsIiwidGFyZ2V0IiwiX3RhcmdldCIsIl92YWx1ZXMiLCJfdGhpc0FyZyIsInNwcmVhZCIsImZvckVhY2giLCJpdGVyYWJsZSIsImZvck9mIiwiYWRkIiwidGVtcCIsInJldHVyblZhbHVlIiwiaW5zdGFuY2VPZiIsIm9iamVjdCIsImhhc0luc3RhbmNlU3ltYm9sUHJvcCIsIml0ZXJhdGlvblJlc3VsdCIsInNwcmVhZE9wZXJhdG9yIiwiRnVuY3Rpb24iLCJpbnN0YW5jZSIsInRhcmdldHMiLCJvdXRwdXRzIiwidW5zaGlmdCIsImFycmF5TGlrZSIsIm1hcEZuIiwicmVxdWlyZSIsIkNob2NvbGF0ZUZhY3RvcnkiLCJiYW5uZWRWaXNpdG9yIiwiZW50ZXIiLCJjaG9jb2xhdGVGYWN0b3JpZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaXNzZXQiLCJhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllcyIsIkNob2NvbGF0ZUJhciIsIl9mbGFzaFRpY2tldCIsImNob2NvbGF0ZUJhciIsImdvbGRlblRpY2tldCIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZW5qb3lUaGVUb3VyIiwibG9nIiwiY2hvY29sYXRlRmFjdG9yeSIsInRvdXJHcm91cCIsIm9vbXBhTG9vbXBhcyIsImFtb3VudE9mT29tcGFMb29tcGFzIiwidG91ckdyb3VwU2l6ZSIsInZpc2l0b3IiLCJ2aXNpdG9yTmFtZSIsImdldEF0dHJpYnV0ZSIsIl9pc1Zpc2l0b3JCYW5uZWQiLCJfZ2V0QXJyYW5nZW1lbnQiLCJfZmluaXNoVG91ciIsImluZGV4T2YiLCJ2aXNpdG9yVHlwZSIsIm5vZGVOYW1lIiwiZ3JvdXAiLCJfYWRkV2lsbGllV29ua2EiLCJnYXRlIiwiQWpheCIsInBvc3QiLCJIdHRwUmVxdWVzdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic3RhdHVzIiwiX3RoYW5rc0ZvclZpc2l0aW5nIiwicmVkaXJlY3RVcmwiLCJfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzIiwiZXJyb3JzIiwiX3Vua25vd25HYXBJbkZhY3RvcnkiLCJfd2lsbGllIiwiZmVlZGJhY2tBcmVhIiwiaW5uZXJIVE1MIiwiX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzIiwia2V5cyIsImphY2tldCIsInZpc2l0b3JGZWVkYmFja0FyZWEiLCJ2aXNpdG9yTm9kZSIsIl9ncmFiVmlzaXRvckphY2tldCIsInZpc2l0b3JGZWVkYmFjayIsInZpc2l0b3JGZWVkYmFja0Ftb3VudCIsInZpc2l0b3JGZWVkYmFja0xpbmUiLCJjbGFzc0xpc3QiLCJjdXJyZW50RmVlZGJhY2tBcmVhIiwiY2FwaXRhbGl6ZUZpcnN0TGV0dGVyIiwibWFya2VkSmFja2V0cyIsIm1hcmtlZEphY2tldHNBbW91bnQiLCJyZW1vdmUiLCJjdXJyZW50TGF5ZXIiLCJzYWZldHlCcmVhayIsInBhcmVudE5vZGUiLCJjb250YWlucyIsInRhZ05hbWUiLCJuZXh0U3RvcCIsImxvY2F0aW9uIiwiQ2xpZW50UmV2aWV3c0hhbmRsZXIiLCJpbml0IiwiY2xpZW50UmV2aWV3cyIsImNsaWVudFJldmlld0NvbnRhaW5lcnMiLCJjbGllbnRSZXZpZXdDb250YWluZXJzTGVuZ3RoIiwiY2xpZW50UmV2aWV3IiwiY2xpZW50UmV2aWV3SWQiLCJDbGllbnRSZXZpZXciLCJzbGlkZVF1ZXJ5IiwibmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXR0aW5ncyIsImNsaWVudFJldmlld09iamVjdCIsImFjdGl2ZVNsaWRlSWQiLCJwcmV2aW91c1NsaWRlSWQiLCJuZXh0U2xpZGVJZCIsImF2YWlsYWJsZVNsaWRlcyIsInNsaWRlcyIsImdldEVsZW1lbnRCeUlkIiwic2V0U2xpZGUiLCJzd2lwZUdlc3R1cmVzIiwiSGFtbWVyIiwib24iLCJuZXh0U2xpZGUiLCJwcmV2aW91c1NsaWRlIiwibmF2aWdhdGlvbkJ1dHRvbnNMZW5ndGgiLCJuYXZpZ2F0aW9uQnV0dG9uIiwiY2xpY2tOYXZpZ2F0aW9uQnV0dG9uIiwiZGVmaW5lZFByZXZpb3VzTmV4dCIsInNldFByZXZpb3VzQW5kTmV4dFNsaWRlIiwic2xpZGVzTGVuZ3RoIiwic2xpZGUiLCJzbGlkZU9yZGVyIiwicGFyc2VJbnQiLCJuYXZCdXR0b24iLCJwcmV2aW91cyIsInNldEF0dHJpYnV0ZSIsIkNvb2tpZUhhbmRsZXIiLCJjb29raWVCYXIiLCJjb29raWVPdmVybGF5IiwiY29va2llTWVzc2FnZSIsImNvb2tpZVN3aXRjaCIsImNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiIsImFjY2VwdFRyYWNraW5nIiwiaW5pdENvb2tpZUJhciIsImluaXRDb29raWVPdmVybGF5IiwiY2hlY2tGb3JDb29raWVTZXR0aW5ncyIsImluaXRDb29raWVTd2l0Y2giLCJjbG9zZUJ1dHRvbiIsImNsb3NlQ29va2llTWVzc2FnZSIsIm9wZW5Db29raWVTZXR0aW5nc0J1dHRvbiIsIm9wZW5Db29raWVTZXR0aW5ncyIsInRvZ2dsZVRyYWNraW5nSW5wdXQiLCJjaGVja2VkIiwidG9nZ2xlVHJhY2tpbmdTZXR0aW5nIiwiYWNjZXB0QnV0dG9uIiwic2V0Q29va2llU2V0dGluZ3MiLCJzYXZlQnV0dG9uIiwiQ29va2llIiwiZ2V0Iiwic2V0IiwiZXJhc2UiLCJyZWxvYWQiLCJJbWFnZVJhY2tIYW5kbGVyIiwiaW1hZ2VSYWNrRWxlbWVudHMiLCJpbWFnZVJhY2tFbGVtZW50c0xlbmd0aCIsIkltYWdlUmFjayIsImltYWdlUmFjayIsInJhY2siLCJzbGlkZUFyZWEiLCJpdGVtcyIsImRpcmVjdGlvbiIsImltYWdlTG9hZGVkIiwiY3VycmVudEl0ZW0iLCJtYXhJdGVtUG9zaXRpb24iLCJtYXhUcmFuc2xhdGVkIiwic3RlcHMiLCJwcmV2aW91c0J1dHRvbiIsIm5leHRCdXR0b24iLCJjYWxjdWxhdGVTdGVwcyIsInByZXZpb3VzSXRlbSIsInNldEltYWdlUmFjayIsIm5leHRJdGVtIiwic3dpcGVMZWZ0Iiwic3dpcGVSaWdodCIsImRlYm91bmNlVGltZW91dCIsIndhaXREZWJvdW5jZSIsImNsZWFyVGltZW91dCIsImJvZHlPZmZzZXQiLCJhdmFpbGFibGVWaWV3QXJlYSIsImJvZHkiLCJvZmZzZXRXaWR0aCIsImxlZnQiLCJyYWNrV2lkdGgiLCJvZmZzZXRMZWZ0IiwibWF4SXRlbUNhbGN1bGF0ZWQiLCJpbWFnZXNMb2FkZWQiLCJpdGVtIiwib2Zmc2V0RnJvbVJpZ2h0U2lkZSIsIm9mZnNldEZyb21MZWZ0U2lkZSIsIm9mZnNldENvbXBhcmVWYXJpYWJsZSIsIm5leHRPZmZzZXRQb3NpdGlvbiIsInN0eWxlIiwidHJhbnNmb3JtIiwiSW5wdXRIYW5kbGVyIiwiaW5wdXRGaWVsZHMiLCJpbnB1dExlbmd0aCIsImlucHV0IiwiaW5wdXRJZCIsImlucHV0TGFiZWwiLCJhZGRFdmVudExpc3RlbmVyc1RvSW5wdXQiLCJwYXJlbnRFbGVtZW50IiwicmVtb3ZlRm9jdXMiLCJsb29wZWRJbnB1dCIsImFkZEZvY3VzIiwiZXJyb3JNZXNzYWdlIiwiaW5wdXRWYWx1ZSIsIk1hcHNIYW5kbGVyIiwibWFwIiwibGF0IiwibG5nIiwic3R5bGluZyIsImhhc0F0dHJpYnV0ZSIsInBhcnNlRmxvYXQiLCJzZXRDdXN0b21TdHlsaW5nIiwiZ29vZ2xlIiwibWFwcyIsImdldFNjcmlwdCIsImRyYXdNYXAiLCJNYXAiLCJ6b29tIiwiY2VudGVyIiwiZGlzYWJsZURlZmF1bHRVSSIsInN0eWxlcyIsIm1hcmtlciIsIk1hcmtlciIsInBvc2l0aW9uIiwiTmF2aWdhdGlvbkhhbmRsZXIiLCJuYXZpZ2F0aW9uTm9kZSIsInNjcm9sbGVkTG9nIiwiaXNPcGVuIiwibmF2VHJpZ2dlcnMiLCJjb2RlIiwiY2xvc2VOYXZpZ2F0aW9uIiwiaW5pdE5hdmlnYXRpb24iLCJuYXZUcmlnZ2VyIiwidG9nZ2xlTmF2aWdhdGlvbiIsInByZXZlbnREZWZhdWx0Iiwic2Nyb2xsZWQiLCJwYWdlWU9mZnNldCIsIm9wZW5OYXZpZ2F0aW9uIiwiU2Nyb2xsVG9IYW5kbGVyIiwib2Zmc2V0IiwiZHVyYXRpb24iLCJzdGFydCIsImNoYW5nZSIsImN1cnJlbnRUaW1lIiwiYWxsb3dBbmltYXRpb24iLCJzY3JvbGxUb0FuaW1hdGlvbiIsImVhc2luZyIsImFuY2hvckxpbmtzIiwiYW5jaG9yTGlua3NBbW91bnQiLCJhbmNob3JMaW5rIiwicHJlcGFyZVNjcm9sbFRvIiwiZWxlbWVudElkIiwic3Vic3RyIiwic2Nyb2xsVG9FbGVtZW50Iiwic2Nyb2xsVG9FbGVtZW50UG9zaXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJkb2N1bWVudEVsZW1lbnQiLCJtYXgiLCJzY3JvbGxUb3AiLCJ0b3AiLCJzdGFydFRpbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbCIsImFib3J0U2Nyb2xsQW5pbWF0aW9uIiwidGltZXN0YW1wIiwicHJvZ3Jlc3MiLCJtaW4iLCJFYXNpbmdGdW5jdGlvbnMiLCJuZXdTY3JvbGxUb3AiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIlNsaWRlclByb2plY3RvckhhbmRsZXIiLCJzbGlkZVByb2plY3RvcnMiLCJzbGlkZVByb2plY3RvckNvbnRhaW5lcnMiLCJzbGlkZVByb2plY3RvckNvbnRhaW5lcnNMZW5ndGgiLCJzbGlkZVByb2plY3RvciIsInNsaWRlUHJvamVjdG9ySWQiLCJhdXRvU2xpZGUiLCJzbGlkZVByb2plY3RvclNldHRpbmciLCJTbGlkZXJQcm9qZWN0b3JTZXR0aW5nIiwic2xpZGVySWQiLCJhdXRvU2xpZGVyIiwic2xpZGVySW50ZXJ2YWwiLCJTbGlkZXJQcm9qZWN0b3IiLCJwcmVwYXJlUGFyYW1ldGVycyIsInNldHRpbmdzT2JqZWN0IiwiZG90cyIsImNhcHRpb25zIiwic2V0U2xpZGVyUHJvamVjdG9ySWQiLCJzZXREZWZpbmVkUHJldmlvdXNOZXh0IiwiYm9vbGVhbiIsInNldEF1dG9TbGlkZXIiLCJzZXRTbGlkZXJJbnRlcnZhbCIsImludGVnZXIiLCJzZXRTbGlkZVF1ZXJ5Iiwic2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXREb3RzIiwic2V0Q2FwdGlvbnMiLCJnZXRTbGlkZXJQcm9qZWN0b3JJZCIsImdldERlZmluZWRQcmV2aW91c05leHQiLCJnZXRBdXRvU2xpZGVyIiwiZ2V0U2xpZGVySW50ZXJ2YWwiLCJnZXRTbGlkZVF1ZXJ5IiwiZ2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJnZXREb3RzIiwiZ2V0Q2FwdGlvbnMiLCJmaWxsIiwic2V0dGluZ3NPYmplY3RLZXlzIiwic2V0dGluZ3NPYmplY3RMZW5ndGgiLCJzbGlkZXJPYmplY3QiLCJhdXRvU2xpZGVySW50ZXJ2YWwiLCJyZXNldEF1dG9TbGlkZXIiLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzZXRBY3RpdmVEb3QiLCJzZXRBY3RpdmVDYXB0aW9uIiwiY2xpY2tlZERvdCIsImRvdE9yZGVyIiwiY2FwdGlvbnNMZW5ndGgiLCJjYXB0aW9uIiwiY2FwdGlvbk9yZGVyIiwiVXNwSW1wcmVzc2lvbnNIYW5kbGVyIiwidGltZW91dCIsInVzcEltcHJlc3Npb25zVHJheXMiLCJ1c3BJbXByZXNzaW9uc1RyYXlzTGVuZ3RoIiwidXNwSW1wcmVzc2lvbnNUcmF5IiwidXNwSW1wcmVzc2lvblNsaWRlciIsIlVzcEltcHJlc3Npb25TbGlkZXIiLCJzbGlkZXIiLCJjdXJyZW50U2xpZGUiLCJzbGlkZUludGVydmFsIiwic2xpZGVJZCIsIllvdXR1YmVIYW5kbGVyIiwieW91dHViZUNsYXNzIiwicGxheWVycyIsInlvdXR1YmVQbGF5ZXJzIiwieW91dHViZVBsYXllcnNBbW91bnQiLCJ5b3V0dWJlUGxheWVyIiwieW91dHViZVBsYXllcklkIiwieW91dHViZUVsZW1lbnQiLCJpZCIsImxpbmsiLCJhdXRvUGxheSIsImluaXRZb3V0dWJlIiwiWVQiLCJQbGF5ZXIiLCJvbllvdVR1YmVQbGF5ZXJBUElSZWFkeSIsImxvYWRQbGF5ZXJzIiwicGxheWVyIiwiaGVpZ2h0Iiwid2lkdGgiLCJ2aWRlb0lkIiwiaG9zdCIsInBsYXllclZhcnMiLCJtb2Rlc3RicmFuZGluZyIsInJlbCIsImRpc2FibGVrYiIsImF1dG9wbGF5IiwiZXZlbnRzIiwib25TdGF0ZUNoYW5nZSIsIm9uUmVhZHkiLCJwbGF5ZXJDb250YWluZXJJZCIsImdldElmcmFtZSIsInZpZGVvU3RhdGUiLCJkYXRhIiwiUGxheWVyU3RhdGUiLCJFTkRFRCIsInBsYXlWaWRlbyIsIkJyb3dzZXJIYW5kbGVyIiwidXNlckFnZW50IiwiYnJvd3NlckluZm8iLCJuYXZpZ2F0b3IiLCJnZXRCcm93c2VySW5mbyIsImhhbmRsZUlFIiwiaGFuZGxlU2FmYXJpIiwibXNpZSIsImllbHQxMSIsImllMTEiLCJtYXRjaCIsInZlcnNpb24iLCJzdWJzdHJpbmciLCJuYW1lIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ1YSIsInRlbSIsIk0iLCJ0ZXN0IiwiZXhlYyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwic3BsaWNlIiwib2JqIiwibGluZWFyIiwidCIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblF1aW50IiwiZWFzZU91dFF1aW50IiwiZWFzZUluT3V0UXVpbnQiLCJzb3VyY2UiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwiY29udGV4dCIsImxhdGVyIiwiY2FsbE5vdyIsImRheXMiLCJkb21haW4iLCJkb21haW5QYXJ0cyIsImRhdGUiLCJleHBpcmVzIiwic2V0VGltZSIsInRvR01UU3RyaW5nIiwic3BsaXQiLCJjb29raWUiLCJzaGlmdCIsImpvaW4iLCJuYW1lRVEiLCJjYSIsImMiLCJjaGFyQXQiLCJudW1iZXJfZm9ybWF0IiwibnVtYmVyIiwiZGVjaW1hbHMiLCJkZWNfcG9pbnQiLCJ0aG91c2FuZHNfc2VwIiwicmVwbGFjZSIsIm4iLCJwcmVjIiwiYWJzIiwic2VwIiwiZGVjIiwicyIsInRvRml4ZWRGaXgiLCJrIiwicG93Iiwicm91bmQiLCJFbGVtZW50IiwiY2xvc2VzdCIsIm1hdGNoZXMiLCJtc01hdGNoZXNTZWxlY3RvciIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsImVsIiwiYW5jZXN0b3IiLCJ1cmwiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwiY29udGVudCIsIm9wZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInRvVXBwZXJDYXNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJub2RlIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInJlY3QiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LFFBQU0yQixTQUFTLEdBQUdoakIsTUFBTSxDQUFDaWpCLFlBQVAsRUFBbEI7QUFDQUQsYUFBUyxDQUFDRSxlQUFWO0FBQ0FGLGFBQVMsQ0FBQ0csUUFBVixDQUFtQk4sS0FBbkI7QUFDQXhCLE1BQUUsQ0FBQytCLGlCQUFILENBQXFCLENBQXJCLEVBQXdCLE1BQXhCLEVBbEJnRCxDQW9CaEQ7O0FBQ0EvQixNQUFFLENBQUNzQixlQUFILEdBQXFCRCxRQUFyQjtBQUNBckIsTUFBRSxDQUFDdUIsUUFBSCxHQUFjQSxRQUFkO0FBQ0gsR0F2QkQsTUF3Qks7QUFDRHZCLE1BQUUsQ0FBQ2dDLE1BQUg7QUFDSCxHQWhDa0MsQ0FrQ25DOzs7QUFDQXJvQixVQUFRLENBQUNzb0IsV0FBVCxDQUFxQixNQUFyQjtBQUNILENBcENEO0FBc0NBOzs7Ozs7OztBQU1BdGpCLE1BQU0sQ0FBQ2dQLFVBQVAsR0FBb0IsVUFBVXFTLEVBQVYsRUFBYztBQUM5QixNQUFNa0MsSUFBSSxHQUFHbEMsRUFBRSxDQUFDck4scUJBQUgsRUFBYjtBQUFBLE1BQ0l3UCxVQUFVLEdBQUd4akIsTUFBTSxDQUFDeWpCLFdBQVAsSUFBc0J6b0IsUUFBUSxDQUFDaVosZUFBVCxDQUF5QnVQLFVBRGhFO0FBQUEsTUFFSXJQLFNBQVMsR0FBR25VLE1BQU0sQ0FBQzZTLFdBQVAsSUFBc0I3WCxRQUFRLENBQUNpWixlQUFULENBQXlCRSxTQUYvRDtBQUdBLFNBQU87QUFBRUMsT0FBRyxFQUFFbVAsSUFBSSxDQUFDblAsR0FBTCxHQUFXRCxTQUFsQjtBQUE2Qi9FLFFBQUksRUFBRW1VLElBQUksQ0FBQ25VLElBQUwsR0FBWW9VO0FBQS9DLEdBQVA7QUFDSCxDQUxELEM7Ozs7Ozs7Ozs7O0FDcFdBLHlDOzs7Ozs7Ozs7OztBQ0FBLHlDIiwiZmlsZSI6Ii9qcy9zaXRlL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qKlxuICogRXZlbnQgc2VtaSBwb2x5ZmlsbC4gSUUgZG9lcyBub3Qgc3VwcG9ydCBuZXcgZXZlbnQuIEJ1dCBkb2VzIHN1cHBvcnQgZG9jdW1lbnQuY3JlYXRlRXZlbnQuXG4gKiBTYW1lIHRoaW5nIGZvciBkaXNwYXRjaGluZyBldmVudHMuIEJ1dCB0aGVuIHdpdGggY3JlYXRlRXZlbnQgYW5kIGZpcmVFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld0V2ZW50KGV2ZW50TmFtZSkge1xuICAgIGxldCBldmVudDtcbiAgICBpZiAodHlwZW9mKEV2ZW50KSA9PT0gJ2Z1bmN0aW9uJykgeyAvL09uIGllIGl0IGlzIHR5cGVPZiBvYmplY3QuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50TmFtZSk7IC8vTm9uLWllXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTsgLy9pZVxuICAgICAgICBldmVudC5pbml0RXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yRWxlbWVudChlbGVtZW50LCBldmVudClcbntcbiAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmZpcmVFdmVudChcIm9uXCIgKyBldmVudC5ldmVudFR5cGUsIGV2ZW50KTtcbiAgICB9XG59XG5cbiIsIk51bWJlci5pc0ludGVnZXIgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICBpc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufTsiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoKSA6XG4gICAgICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgICAgICAgICAoZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyoqXG4gICAgICogQHRoaXMge1Byb21pc2V9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluYWxseUNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAgICAgICBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4vLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBwcm9taXNlLXBvbHlmaWxsIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG4gICAgdmFyIHNldFRpbWVvdXRGdW5jID0gc2V0VGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG4vLyBQb2x5ZmlsbCBmb3IgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiAgICBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQcm9taXNlKGZuKSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAvKiogQHR5cGUgeyFudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICAgICAgLyoqIEB0eXBlIHshYm9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAvKiogQHR5cGUge1Byb21pc2V8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXk8IUZ1bmN0aW9uPn0gKi9cbiAgICAgICAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgICAgICAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGUoc2VsZiwgZGVmZXJyZWQpIHtcbiAgICAgICAgd2hpbGUgKHNlbGYuX3N0YXRlID09PSAzKSB7XG4gICAgICAgICAgICBzZWxmID0gc2VsZi5fdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSAwKSB7XG4gICAgICAgICAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5faGFuZGxlZCA9IHRydWU7XG4gICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNiID0gc2VsZi5fc3RhdGUgPT09IDEgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAoc2VsZi5fc3RhdGUgPT09IDEgPyByZXNvbHZlIDogcmVqZWN0KShkZWZlcnJlZC5wcm9taXNlLCBzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGRlZmVycmVkLnByb21pc2UsIHJldCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmUoc2VsZiwgbmV3VmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHNlbGYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhciB0aGVuID0gbmV3VmFsdWUudGhlbjtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gMztcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAxO1xuICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0KHNlbGYsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHNlbGYuX3N0YXRlID0gMjtcbiAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaGFuZGxlKHNlbGYsIHNlbGYuX2RlZmVycmVkc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5fZGVmZXJyZWRzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9taXNlKSB7XG4gICAgICAgIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gICAgICAgIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nID8gb25SZWplY3RlZCA6IG51bGw7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZSBhIHBvdGVudGlhbGx5IG1pc2JlaGF2aW5nIHJlc29sdmVyIGZ1bmN0aW9uIGFuZCBtYWtlIHN1cmVcbiAgICAgKiBvbkZ1bGZpbGxlZCBhbmQgb25SZWplY3RlZCBhcmUgb25seSBjYWxsZWQgb25jZS5cbiAgICAgKlxuICAgICAqIE1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgYXN5bmNocm9ueS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuKFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGYsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHNlbGYsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLCBleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBQcm9taXNlLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdmFyIHByb20gPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICAgICAgICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTtcbiAgICAgICAgcmV0dXJuIHByb207XG4gICAgfTtcblxuICAgIFByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gPSBmaW5hbGx5Q29uc3RydWN0b3I7XG5cbiAgICBQcm9taXNlLmFsbCA9IGZ1bmN0aW9uKGFycikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyciB8fCB0eXBlb2YgYXJyLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheScpO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gYXJncy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhpLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzKGksIGFyZ3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVqZWN0KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFByb21pc2UucmFjZSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzW2ldLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuLy8gVXNlIHBvbHlmaWxsIGZvciBzZXRJbW1lZGlhdGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zXG4gICAgUHJvbWlzZS5faW1tZWRpYXRlRm4gPVxuICAgICAgICAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pO1xuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXRGdW5jKGZuLCAwKTtcbiAgICAgICAgfTtcblxuICAgIFByb21pc2UuX3VuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3VuaGFuZGxlZFJlamVjdGlvbkZuKGVycikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOicsIGVycik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBAc3VwcHJlc3Mge3VuZGVmaW5lZFZhcnN9ICovXG4gICAgdmFyIGdsb2JhbE5TID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB0aGUgb25seSByZWxpYWJsZSBtZWFucyB0byBnZXQgdGhlIGdsb2JhbCBvYmplY3QgaXNcbiAgICAgICAgLy8gYEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKClgXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIENTUCB2aW9sYXRpb25zIGluIENocm9tZSBhcHBzLlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG4gICAgfSkoKTtcblxuICAgIGlmICghKCdQcm9taXNlJyBpbiBnbG9iYWxOUykpIHtcbiAgICAgICAgZ2xvYmFsTlNbJ1Byb21pc2UnXSA9IFByb21pc2U7XG4gICAgfSBlbHNlIGlmICghZ2xvYmFsTlMuUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSkge1xuICAgICAgICBnbG9iYWxOUy5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddID0gZmluYWxseUNvbnN0cnVjdG9yO1xuICAgIH1cblxufSkpKTsiLCIhZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe1widXNlIHN0cmljdFwiO1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1mYWN0b3J5KGdsb2JhbCk6ZmFjdG9yeShnbG9iYWwpfShcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpnbG9iYWwsZnVuY3Rpb24oZ2xvYmFsKXtcInVzZSBzdHJpY3RcIjt2YXIgZGVmaW5lUHJvcGVydHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGRlZmluZVByb3BlcnRpZXM9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsc3ltYm9sSGlkZGVuQ291bnRlcj0wLGdsb2JhbFN5bWJvbFJlZ2lzdHJ5PVtdLHNsaWNlPUFycmF5LnByb3RvdHlwZS5zbGljZSxFUzY9XCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbC5FUzY/Z2xvYmFsLkVTNjpnbG9iYWwuRVM2PXt9LGlzQXJyYXk9QXJyYXkuaXNBcnJheSxvYmplY3RUb1N0cmluZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHB1c2g9QXJyYXkucHJvdG90eXBlLnB1c2gsZW1wdHlGdW5jdGlvbj1mdW5jdGlvbigpe30sc2ltcGxlRnVuY3Rpb249ZnVuY3Rpb24oYXJnKXtyZXR1cm4gYXJnfSxpc0NhbGxhYmxlPWZ1bmN0aW9uKGZuKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBmbn0sSXRlcmF0b3I9ZnVuY3Rpb24oKXt9LEFycmF5SXRlcmF0b3I9ZnVuY3Rpb24oYXJyYXksZmxhZyl7dGhpcy5fYXJyYXk9YXJyYXksdGhpcy5fZmxhZz1mbGFnLHRoaXMuX25leHRJbmRleD0wfSxTdHJpbmdJdGVyYXRvcj1mdW5jdGlvbihzdHJpbmcsZmxhZyl7dGhpcy5fc3RyaW5nPXN0cmluZyx0aGlzLl9mbGFnPWZsYWcsdGhpcy5fbmV4dEluZGV4PTB9LGlzT2JqZWN0PWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gbnVsbCE9PXZhbHVlJiYoXCJvYmplY3RcIj09dHlwZW9mIHZhbHVlfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiB2YWx1ZSl9LHNldHVwU3ltYm9sSW50ZXJuYWxzPWZ1bmN0aW9uKHN5bWJvbCxkZXNjKXtyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW1ib2wse19kZXNjcmlwdGlvbjp7dmFsdWU6ZGVzY30sX2lzU3ltYm9sOnt2YWx1ZTohMH0sX2lkOnt2YWx1ZTpzeW1ib2xIaWRkZW5Db3VudGVyKyt9fSksc3ltYm9sfSxhcHBlbmRBcnJheT1mdW5jdGlvbihhcnJheTEsYXJyYXkyKXtpZihcIm51bWJlclwiPT10eXBlb2YgYXJyYXkxLmxlbmd0aCYmYXJyYXkxLmxlbmd0aD49MCYmXCJudW1iZXJcIj09dHlwZW9mIGFycmF5Mi5sZW5ndGgmJmFycmF5Mi5sZW5ndGg+PTApe3ZhciBsZW5ndGgxPU1hdGguZmxvb3IoYXJyYXkxLmxlbmd0aCksbGVuZ3RoMj1NYXRoLmZsb29yKGFycmF5Mi5sZW5ndGgpLGk9MDtmb3IoYXJyYXkxLmxlbmd0aD1sZW5ndGgxK2xlbmd0aDI7aTxsZW5ndGgyOysraSlhcnJheTIuaGFzT3duUHJvcGVydHkoaSkmJihhcnJheTFbbGVuZ3RoMStpXT1hcnJheTJbaV0pfX0sc2ltcGxlSW5oZXJpdGFuY2U9ZnVuY3Rpb24oY2hpbGQscGFyZW50KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBjaGlsZHx8XCJmdW5jdGlvblwiIT10eXBlb2YgcGFyZW50KXRocm93IG5ldyBUeXBlRXJyb3IoXCJDaGlsZCBhbmQgUGFyZW50IG11c3QgYmUgZnVuY3Rpb24gdHlwZVwiKTtjaGlsZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKSxjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2hpbGR9LFN5bWJvbD1mdW5jdGlvbiBTeW1ib2woZGVzYyl7aWYoZGVzYz12b2lkIDA9PT1kZXNjP1wiXCI6U3RyaW5nKGRlc2MpLHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTtyZXR1cm4gc2V0dXBTeW1ib2xJbnRlcm5hbHMoT2JqZWN0LmNyZWF0ZShTeW1ib2wucHJvdG90eXBlKSxkZXNjKX07ZGVmaW5lUHJvcGVydGllcyhTeW1ib2wse2Zvcjp7dmFsdWU6ZnVuY3Rpb24oa2V5KXtrZXk9U3RyaW5nKGtleSk7Zm9yKHZhciByZWNvcmQscmVnaXN0cnlMZW5ndGg9Z2xvYmFsU3ltYm9sUmVnaXN0cnkubGVuZ3RoLGk9MDtpPHJlZ2lzdHJ5TGVuZ3RoOysraSlpZigocmVjb3JkPWdsb2JhbFN5bWJvbFJlZ2lzdHJ5W2ldKS5rZXk9PT1rZXkpcmV0dXJuIHJlY29yZC5zeW1ib2w7cmV0dXJuIHJlY29yZD17a2V5OmtleSxzeW1ib2w6U3ltYm9sKGtleSl9LGdsb2JhbFN5bWJvbFJlZ2lzdHJ5LnB1c2gocmVjb3JkKSxyZWNvcmQuc3ltYm9sfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9LGtleUZvcjp7dmFsdWU6ZnVuY3Rpb24oc3ltYm9sKXtpZighRVM2LmlzU3ltYm9sKHN5bWJvbCkpdGhyb3cgbmV3IFR5cGVFcnJvcihTdHJpbmcoc3ltYm9sKStcIiBpcyBub3QgYSBzeW1ib2xcIik7Zm9yKHZhciByZWNvcmQscmVnaXN0cnlMZW5ndGg9Z2xvYmFsU3ltYm9sUmVnaXN0cnkubGVuZ3RoLGk9MDtpPHJlZ2lzdHJ5TGVuZ3RoOysraSlpZigocmVjb3JkPWdsb2JhbFN5bWJvbFJlZ2lzdHJ5W2ldKS5zeW1ib2w9PT1zeW1ib2wpcmV0dXJuIHJlY29yZC5rZXl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saGFzSW5zdGFuY2U6e3ZhbHVlOlN5bWJvbChcIlN5bWJvbC5oYXNJbnN0YW5jZVwiKX0saXNDb25jYXRTcHJlYWRhYmxlOnt2YWx1ZTpTeW1ib2woXCJTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlXCIpfSxpdGVyYXRvcjp7dmFsdWU6U3ltYm9sKFwiU3ltYm9sLml0ZXJhdG9yXCIpfSx0b1N0cmluZ1RhZzp7dmFsdWU6U3ltYm9sKFwiU3ltYm9sLnRvU3RyaW5nVGFnXCIpfX0pLFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkBAX19fX19cIit0aGlzLl9pZCtcIl9fX19fXCJ9LFN5bWJvbC5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxkZWZpbmVQcm9wZXJ0eShJdGVyYXRvci5wcm90b3R5cGUsU3ltYm9sLml0ZXJhdG9yLnRvU3RyaW5nKCkse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHNpbXBsZUluaGVyaXRhbmNlKEFycmF5SXRlcmF0b3IsSXRlcmF0b3IpLHNpbXBsZUluaGVyaXRhbmNlKFN0cmluZ0l0ZXJhdG9yLEl0ZXJhdG9yKSxkZWZpbmVQcm9wZXJ0eShBcnJheUl0ZXJhdG9yLnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcudG9TdHJpbmcoKSx7dmFsdWU6XCJBcnJheSBJdGVyYXRvclwiLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcudG9TdHJpbmcoKSx7dmFsdWU6XCJTdHJpbmcgSXRlcmF0b3JcIixjb25maWd1cmFibGU6ITB9KSxBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgQXJyYXlJdGVyYXRvcikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1ldGhvZCBBcnJheSBJdGVyYXRvci5wcm90b3R5cGUubmV4dCBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiK1N0cmluZyh0aGlzKSk7dmFyIG5leHRWYWx1ZTtyZXR1cm4tMT09PXRoaXMuX25leHRJbmRleD97ZG9uZTohMCx2YWx1ZTp2b2lkIDB9OlwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9hcnJheS5sZW5ndGgmJnRoaXMuX2FycmF5Lmxlbmd0aD49MCYmdGhpcy5fbmV4dEluZGV4PE1hdGguZmxvb3IodGhpcy5fYXJyYXkubGVuZ3RoKT8oMT09PXRoaXMuX2ZsYWc/bmV4dFZhbHVlPVt0aGlzLl9uZXh0SW5kZXgsdGhpcy5fYXJyYXlbdGhpcy5fbmV4dEluZGV4XV06Mj09PXRoaXMuX2ZsYWc/bmV4dFZhbHVlPXRoaXMuX2FycmF5W3RoaXMuX25leHRJbmRleF06Mz09PXRoaXMuX2ZsYWcmJihuZXh0VmFsdWU9dGhpcy5fbmV4dEluZGV4KSx0aGlzLl9uZXh0SW5kZXgrKyx7ZG9uZTohMSx2YWx1ZTpuZXh0VmFsdWV9KToodGhpcy5fbmV4dEluZGV4PS0xLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pfSxTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFN0cmluZ0l0ZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWV0aG9kIFN0cmluZyBJdGVyYXRvci5wcm90b3R5cGUubmV4dCBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiK1N0cmluZyh0aGlzKSk7dmFyIG5leHRWYWx1ZSxzdHJpbmdPYmplY3Q9bmV3IFN0cmluZyh0aGlzLl9zdHJpbmcpO3JldHVybi0xPT09dGhpcy5fbmV4dEluZGV4P3tkb25lOiEwLHZhbHVlOnZvaWQgMH06dGhpcy5fbmV4dEluZGV4PHN0cmluZ09iamVjdC5sZW5ndGg/KG5leHRWYWx1ZT1zdHJpbmdPYmplY3RbdGhpcy5fbmV4dEluZGV4XSx0aGlzLl9uZXh0SW5kZXgrKyx7ZG9uZTohMSx2YWx1ZTpuZXh0VmFsdWV9KToodGhpcy5fbmV4dEluZGV4PS0xLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pfTt2YXIgU3ByZWFkT3BlcmF0b3JJbXBsPWZ1bmN0aW9uKHRhcmdldCx0aGlzQXJnKXt0aGlzLl90YXJnZXQ9dGFyZ2V0LHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl90aGlzQXJnPXRoaXNBcmd9O1NwcmVhZE9wZXJhdG9ySW1wbC5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gc2xpY2UuY2FsbChhcmd1bWVudHMpLmZvckVhY2goZnVuY3Rpb24oaXRlcmFibGUpe0VTNi5mb3JPZihpdGVyYWJsZSxmdW5jdGlvbih2YWx1ZSl7c2VsZi5fdmFsdWVzLnB1c2godmFsdWUpfSl9KSxzZWxmfSxTcHJlYWRPcGVyYXRvckltcGwucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIHNsaWNlLmNhbGwoYXJndW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtzZWxmLl92YWx1ZXMucHVzaCh2YWx1ZSl9KSxzZWxmfSxTcHJlYWRPcGVyYXRvckltcGwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odGhpc0FyZyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpcy5fdGFyZ2V0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJUYXJnZXQgaXMgbm90IGEgZnVuY3Rpb25cIik7cmV0dXJuIHRoaXNBcmc9YXJndW1lbnRzLmxlbmd0aDw9MD90aGlzLl90aGlzQXJnOnRoaXNBcmcsdGhpcy5fdGFyZ2V0LmFwcGx5KHRoaXNBcmcsdGhpcy5fdmFsdWVzKX0sU3ByZWFkT3BlcmF0b3JJbXBsLnByb3RvdHlwZS5uZXc9ZnVuY3Rpb24oKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzLl90YXJnZXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRhcmdldCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTt2YXIgdGVtcCxyZXR1cm5WYWx1ZTtyZXR1cm4gdGVtcD1PYmplY3QuY3JlYXRlKHRoaXMuX3RhcmdldC5wcm90b3R5cGUpLHJldHVyblZhbHVlPXRoaXMuX3RhcmdldC5hcHBseSh0ZW1wLHRoaXMuX3ZhbHVlcyksaXNPYmplY3QocmV0dXJuVmFsdWUpP3JldHVyblZhbHVlOnRlbXB9LFNwcmVhZE9wZXJhdG9ySW1wbC5wcm90b3R5cGUuYXJyYXk9ZnVuY3Rpb24oKXtpZighaXNBcnJheSh0aGlzLl90YXJnZXQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUYXJnZXQgaXMgbm90IGEgYXJyYXlcIik7cmV0dXJuIHB1c2guYXBwbHkodGhpcy5fdGFyZ2V0LHRoaXMuX3ZhbHVlcyksdGhpcy5fdGFyZ2V0fTtyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhFUzYse2lzU3ltYm9sOnt2YWx1ZTpmdW5jdGlvbihzeW1ib2wpe3JldHVybiBzeW1ib2wgaW5zdGFuY2VvZiBTeW1ib2wmJmZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuITA9PT1zeW1ib2wuX2lzU3ltYm9sJiZcIm51bWJlclwiPT10eXBlb2Ygc3ltYm9sLl9pZCYmXCJzdHJpbmdcIj09dHlwZW9mIHN5bWJvbC5fZGVzY3JpcHRpb259KHN5bWJvbCl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPZjp7dmFsdWU6ZnVuY3Rpb24ob2JqZWN0LGNvbnN0cnVjdG9yKXtpZighaXNPYmplY3QoY29uc3RydWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJSaWdodC1oYW5kIHNpZGUgb2YgJ2luc3RhbmNlb2YnIGlzIG5vdCBhbiBvYmplY3RcIik7dmFyIGhhc0luc3RhbmNlU3ltYm9sUHJvcD1jb25zdHJ1Y3RvcltTeW1ib2wuaGFzSW5zdGFuY2VdO2lmKHZvaWQgMD09PWhhc0luc3RhbmNlU3ltYm9sUHJvcClyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgaGFzSW5zdGFuY2VTeW1ib2xQcm9wKXRocm93IG5ldyBUeXBlRXJyb3IodHlwZW9mIGhhc0luc3RhbmNlU3ltYm9sUHJvcCtcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtyZXR1cm4gaGFzSW5zdGFuY2VTeW1ib2xQcm9wLmNhbGwoY29uc3RydWN0b3Isb2JqZWN0KX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxmb3JPZjp7dmFsdWU6ZnVuY3Rpb24oaXRlcmFibGUsY2FsbGJhY2ssdGhpc0FyZyl7aWYoY2FsbGJhY2s9XCJmdW5jdGlvblwiIT10eXBlb2YgY2FsbGJhY2s/ZW1wdHlGdW5jdGlvbjpjYWxsYmFjayxcImZ1bmN0aW9uXCIhPXR5cGVvZiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO3ZhciBpdGVyYXRpb25SZXN1bHQsaXRlcmF0b3I9aXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGl0ZXJhdG9yLm5leHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIi5pdGVyYXRvci5uZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCIpO2Zvcig7Oyl7aWYoaXRlcmF0aW9uUmVzdWx0PWl0ZXJhdG9yLm5leHQoKSwhaXNPYmplY3QoaXRlcmF0aW9uUmVzdWx0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSXRlcmF0b3IgcmVzdWx0IFwiK2l0ZXJhdGlvblJlc3VsdCtcIiBpcyBub3QgYW4gb2JqZWN0XCIpO2lmKGl0ZXJhdGlvblJlc3VsdC5kb25lKWJyZWFrO2NhbGxiYWNrLmNhbGwodGhpc0FyZyxpdGVyYXRpb25SZXN1bHQudmFsdWUpfX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxzcHJlYWRPcGVyYXRvcjp7dmFsdWU6ZnVuY3Rpb24odGFyZ2V0LHRoaXNBcmcpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRhcmdldCYmIWlzQXJyYXkodGFyZ2V0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ByZWFkIG9wZXJhdG9yIG9ubHkgc3VwcG9ydHMgb24gYXJyYXkgYW5kIGZ1bmN0aW9uIG9iamVjdHMgYXQgdGhpcyBtb21lbnRcIik7cmV0dXJuIG5ldyBTcHJlYWRPcGVyYXRvckltcGwodGFyZ2V0LHRoaXNBcmcpfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZGVmaW5lUHJvcGVydHkoZ2xvYmFsLFwiU3ltYm9sXCIse3ZhbHVlOlN5bWJvbCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxkZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsU3ltYm9sLmhhc0luc3RhbmNlLnRvU3RyaW5nKCkse3ZhbHVlOmZ1bmN0aW9uKGluc3RhbmNlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzJiZpbnN0YW5jZSBpbnN0YW5jZW9mIHRoaXN9fSksZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLFwiY29uY2F0XCIse3ZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5LnByb3RvdHlwZS5jb25jYXQgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkXCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKSx0YXJnZXRzPXNsaWNlLmNhbGwoYXJndW1lbnRzKSxvdXRwdXRzPVtdO3JldHVybiB0YXJnZXRzLnVuc2hpZnQoc2VsZiksdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHRhcmdldCl7aXNPYmplY3QodGFyZ2V0KT92b2lkIDAhPT10YXJnZXRbU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV0/dGFyZ2V0W1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVdP2FwcGVuZEFycmF5KG91dHB1dHMsdGFyZ2V0KTpvdXRwdXRzLnB1c2godGFyZ2V0KTppc0FycmF5KHRhcmdldCk/YXBwZW5kQXJyYXkob3V0cHV0cyx0YXJnZXQpOm91dHB1dHMucHVzaCh0YXJnZXQpOm91dHB1dHMucHVzaCh0YXJnZXQpfSksb3V0cHV0c30sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSxcInRvU3RyaW5nXCIse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXN8fG51bGw9PT10aGlzP29iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk6XCJzdHJpbmdcIj09dHlwZW9mIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXT9cIltvYmplY3QgXCIrdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddK1wiXVwiOm9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxTeW1ib2wuaXRlcmF0b3IudG9TdHJpbmcoKSx7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0XCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKTtyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Ioc2VsZiwyKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoQXJyYXksXCJmcm9tXCIse3ZhbHVlOmZ1bmN0aW9uKGFycmF5TGlrZSxtYXBGbix0aGlzQXJnKXt2YXIgY29uc3RydWN0b3IsbGVuZ3RoLG91dHB1dHMsaT0wO2lmKGNvbnN0cnVjdG9yPWlzQ2FsbGFibGUodGhpcyk/dGhpczpBcnJheSx2b2lkIDA9PT1hcnJheUxpa2V8fG51bGw9PT1hcnJheUxpa2UpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtpZihhcnJheUxpa2U9T2JqZWN0KGFycmF5TGlrZSksdm9pZCAwPT09bWFwRm4pbWFwRm49c2ltcGxlRnVuY3Rpb247ZWxzZSBpZighaXNDYWxsYWJsZShtYXBGbikpdGhyb3cgbmV3IFR5cGVFcnJvcihtYXBGbitcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtpZih2b2lkIDA9PT1hcnJheUxpa2VbU3ltYm9sLml0ZXJhdG9yXSl7aWYoIShcIm51bWJlclwiPT10eXBlb2YgYXJyYXlMaWtlLmxlbmd0aCYmYXJyYXlMaWtlLmxlbmd0aD49MCkpcmV0dXJuKG91dHB1dHM9bmV3IGNvbnN0cnVjdG9yKDApKS5sZW5ndGg9MCxvdXRwdXRzO2ZvcihsZW5ndGg9TWF0aC5mbG9vcihhcnJheUxpa2UubGVuZ3RoKSwob3V0cHV0cz1uZXcgY29uc3RydWN0b3IobGVuZ3RoKSkubGVuZ3RoPWxlbmd0aDtpPGxlbmd0aDsrK2kpb3V0cHV0c1tpXT1tYXBGbi5jYWxsKHRoaXNBcmcsYXJyYXlMaWtlW2ldKX1lbHNlKG91dHB1dHM9bmV3IGNvbnN0cnVjdG9yKS5sZW5ndGg9MCxFUzYuZm9yT2YoYXJyYXlMaWtlLGZ1bmN0aW9uKHZhbHVlKXtvdXRwdXRzLmxlbmd0aCsrLG91dHB1dHNbb3V0cHV0cy5sZW5ndGgtMV09bWFwRm4uY2FsbCh0aGlzQXJnLHZhbHVlKX0pO3JldHVybiBvdXRwdXRzfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxkZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsXCJlbnRyaWVzXCIse3ZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTt2YXIgc2VsZj1PYmplY3QodGhpcyk7cmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHNlbGYsMSl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxcImtleXNcIix7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0XCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKTtyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Ioc2VsZiwzKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSxTeW1ib2wuaXRlcmF0b3IudG9TdHJpbmcoKSx7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZFwiKTtyZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKFN0cmluZyh0aGlzKSwwKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksRVM2fSk7IiwiLyoqXG4gKiBKYXZhU2NyaXB0IGRlcGVuZGVuY2llc1xuICovXG5cbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbnJlcXVpcmUoJ2hhbW1lcmpzJyk7XG4vLyByZXF1aXJlKCdwamF4Jyk7XG5yZXF1aXJlKCdvYmplY3RGaXRQb2x5ZmlsbCcpO1xuXG4vKipcbiAqIEdsb2JhbCBjdXN0b20gZGVwZW5kZW5jaWVzXG4gKi9cbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9ldmVudFBvbHlGaWxsJyk7XG5yZXF1aXJlKCcuLy4uL2dsb2JhbC9wb2x5ZmlsbHMvaXNJbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLy4uL2dsb2JhbC9wb2x5ZmlsbHMvcHJvbWlzZScpO1xucmVxdWlyZSgnLi8uLi9nbG9iYWwvcG9seWZpbGxzL3N5bWJvbC1lczYubWluJyk7XG5cblxuLyoqXG4gKiAgU2l0ZSB3aWRlIGZ1bmN0aW9uYWxpdHlcbiAqL1xucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpO1xucmVxdWlyZSgnLi9nbG9iYWwvYnJvd3NlckhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vZ2xvYmFsL3BhZ2V0cmFuc2l0aW9uSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9nbG9iYWwvcmVzaXplSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9nbG9iYWwvc2Nyb2xsSGFuZGxlcicpO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbiAqL1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnknKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jb29raWVIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvaW1hZ2VSYWNrSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2lucHV0SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL21hcHNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvbmF2aWdhdGlvbkhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zY3JvbGxUb0hhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy9zZWFyY2hIYW5kbGVyJyk7XG4vLyByZXF1aXJlKCcuL2NvbXBvbmVudHMvc2hhcmVCdXR0b25zSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3NsaWRlUHJvamVjdG9ySGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NsaWVudFJldmlld3NIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdXNwSW1wcmVzc2lvbnNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXInKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIHwgUHJldmVudCBCb3RzIGhhbmRsZXJcbiB8XG4gfCBXZSBuYW1lZCB0aGlzIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBiZWxvbmdpbmcgY29uZnVzaW5nIGpzIGhvb2tzXG4gfCB0byBwcmV2ZW50IHNtYXJ0IGJvdHMgZnJvbSBibG9ja2luZyB0aGVzZSB2YXJpYWJsZSBvciBmdW5jdGlvbnMuXG4gfFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENob2NvbGF0ZUZhY3RvcnkgPSB7XG5cbiAgICBiYW5uZWRWaXNpdG9yOiBbXSxcblxuICAgIC8qKiBHZXQgYWxsIHRoZSBjaG9jb2xhdGUgZmFjdG9yeSBhbmQgc3RhcnRcbiAgICAgKiAgTG9vcGluZyB0aHJvdWdoIHRob3NlIHN0YXJ0IGZsYXNoaW5nIHRpY2tldHNcbiAgICAgKi9cbiAgICBlbnRlcjogZnVuY3Rpb24oKVxuICAgIHtcblxuICAgICAgICBjb25zdCBjaG9jb2xhdGVGYWN0b3JpZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2hvY29sYXRlLWZhY3RvcnknKTtcblxuICAgICAgICBpZihpc3NldChjaG9jb2xhdGVGYWN0b3JpZXMpKXtcblxuICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXMgPSBjaG9jb2xhdGVGYWN0b3JpZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzOyBpKyspe1xuXG4gICAgICAgICAgICAgICAgY29uc3QgQ2hvY29sYXRlQmFyID0gY2hvY29sYXRlRmFjdG9yaWVzW2ldO1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2ZsYXNoVGlja2V0KENob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgZmFjdG9yeSBoYXMgYSBnb2xkZW4gdGlja2V0XG4gICAgICogVGhlbiB3ZSBjYW4gbWFrZSB0aGVtIGdvIG9uIHRoZSB0b3VyIGlmIHRoZXJlIGhhcyBiZWVuIGNsaWNrIG9uIHRoZSB0aWNrZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVCYXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9mbGFzaFRpY2tldDogZnVuY3Rpb24gKGNob2NvbGF0ZUJhcikge1xuXG4gICAgICAgIC8vIFRyeSBnZXQgdGhlIHRpY2tldCBmcm9tIHRoZSBjaG9jb2xhdGVCYXJcbiAgICAgICAgY29uc3QgZ29sZGVuVGlja2V0ID0gY2hvY29sYXRlQmFyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1nb2xkZW4tdGlja2V0Jyk7XG5cbiAgICAgICAgLy8gT25seSBjb250aW51ZSBpZiBjaG9jb2xhdGUgYmFyIGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgICAgaWYoaXNzZXQoZ29sZGVuVGlja2V0KSl7XG5cbiAgICAgICAgICAgIGdvbGRlblRpY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5LmVuam95VGhlVG91cihjaG9jb2xhdGVCYXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIGdvbGRlbiB0aWNrZXRzIGhhcyBiZWVuIGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSB0b3VyIHRocm91Z2ggdGhlIGZhY3RvcnlcbiAgICAgKiBBbmQgZ2V0IHRoZSBuYW1lcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXBcbiAgICAgKiBJZiB0aGVyZSBhcmUgbWVtYmVycyBpbiB0aGUgZ3JvdXAgb2YgY291cnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqL1xuICAgIGVuam95VGhlVG91cihjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBBc2sgZm9yIHRoZSB0b3VyIGdyb3VwXG4gICAgICAgIGNvbnN0IHRvdXJHcm91cCA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHRleHRhcmVhJyk7XG5cbiAgICAgICAgaWYoaXNzZXQodG91ckdyb3VwKSl7XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHZpc2l0b3Igd2Ugd2FudCBhIGJlbG9uZ2luZyBPb21wYSBMb29tcGFcbiAgICAgICAgICAgIGxldCBvb21wYUxvb21wYXMgPSB7fTtcbiAgICAgICAgICAgIGxldCBhbW91bnRPZk9vbXBhTG9vbXBhcyA9IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvdXJHcm91cFNpemUgPSB0b3VyR3JvdXAubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRvdXJHcm91cFNpemU7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHZpc2l0b3IgZnJvbSB0aGUgZ3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yID0gdG91ckdyb3VwW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gQXNrIGZvciBpdHMgbmFtZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOYW1lID0gdmlzaXRvci5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2aXNpdG9yIGlzIGJhbm5lZFxuICAgICAgICAgICAgICAgIGlmKCBDaG9jb2xhdGVGYWN0b3J5Ll9pc1Zpc2l0b3JCYW5uZWQodmlzaXRvck5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIG9vbXBhTG9vbXBhc1sgdmlzaXRvck5hbWUgXSA9IENob2NvbGF0ZUZhY3RvcnkuX2dldEFycmFuZ2VtZW50KHZpc2l0b3IpO1xuICAgICAgICAgICAgICAgIGFtb3VudE9mT29tcGFMb29tcGFzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnN1cmFuY2UgdGhhdCB0aGVyZSBhcmUgb29tcGEgbG9vbXBhc1xuICAgICAgICAgICAgaWYoYW1vdW50T2ZPb21wYUxvb21wYXMgPT09IDApIHJldHVybjtcblxuICAgICAgICAgICAgLy8gU2VuZCBzdWJtaXQgcmVxdWVzdFxuICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmluaXNoVG91cihvb21wYUxvb21wYXMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVG8gYmFkLCBubyBtZW1iZXJzIHRvIHZpc2l0IHRoaXMgZmFjdG9yeScpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHZpc2l0b3IgbmFtZSBpc24ndCBhbGxvd1xuICAgICAqXG4gICAgICogQHBhcmFtIHZpc2l0b3JOYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNWaXNpdG9yQmFubmVkOiBmdW5jdGlvbih2aXNpdG9yTmFtZSl7XG4gICAgICAgIGlmKENob2NvbGF0ZUZhY3RvcnkuYmFubmVkVmlzaXRvci5pbmRleE9mKHZpc2l0b3JOYW1lKSAhPT0gLTEpe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb3N0IGdldCB2aXNpdG9yIGhhdmUgYSBub3JtYWwgYXJyYW5nZW1lbnRcbiAgICAgKiBCdXQgc29tZXRpbWVzIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzXG4gICAgICogTGlrZSBhIFNlbGVjdG9yIG9yIGNoZWNrYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldEFycmFuZ2VtZW50OiBmdW5jdGlvbih2aXNpdG9yKVxuICAgIHtcblxuICAgICAgICBjb25zdCB2aXNpdG9yVHlwZSA9IHZpc2l0b3Iubm9kZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoICh2aXNpdG9yVHlwZSkge1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGhlIHRvdXJcbiAgICAgKiBJZiBzdWNjZXNzZnVsIHNob3cgdGhhbmtzIG1lc3NhZ2VcbiAgICAgKiBPciBzaG93IGRlZmluZWQgZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFja1xuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcmV0dXJucyB7Knx2b2lkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZpbmlzaFRvdXI6IGZ1bmN0aW9uKGdyb3VwLCBjaG9jb2xhdGVGYWN0b3J5KVxuICAgIHtcbiAgICAgICAgLy8gQWRkIHdpbGxpZSB0byB0aGUgZ3JvdXBcbiAgICAgICAgZ3JvdXAgPSBDaG9jb2xhdGVGYWN0b3J5Ll9hZGRXaWxsaWVXb25rYShncm91cCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBnYXRlIGZvciBmaW5pc2ggdGhlIHRvdXJcbiAgICAgICAgY29uc3QgZ2F0ZSA9ICcvY29udGFjdC9wcm9jZXNzJztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgQWpheC5wb3N0KGdhdGUsIGdyb3VwLCBmdW5jdGlvbiAoSHR0cFJlcXVlc3QpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShIdHRwUmVxdWVzdC5yZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEh0dHBSZXF1ZXN0LnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll90aGFua3NGb3JWaXNpdGluZyhyZXNwb25zZS5yZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX2dpdmVGZWVkYmFja1RvTWVtYmVycyhyZXNwb25zZS5lcnJvcnMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIHdpbGxpZSB3b25rYSB0byB0aGUgZ3JvdXBcbiAgICAgKiBQcy4uLiBpdCBhY3R1YWxseSB0aGUgc2VjcmV0IGNvZGUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRXaWxsaWVXb25rYTogZnVuY3Rpb24oZ3JvdXApe1xuICAgICAgICBncm91cC5fd2lsbGllID0gJ3dvbmthJztcbiAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIGZlZWRiYWNrIHRvIHRoZSBkZXNpcmVkIGFyZWEuXG4gICAgICogTW9zdCBsaWtlbHkgdG8gdGhlIHZpc2l0b3IgZGlyZWN0bHksIGJ1dCBzb21ldGltZSB0byB0aGUgZmFjdG9yeSBkZXNpcmVkIGZlZWRiYWNrIGFyZWFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvcnNcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dpdmVGZWVkYmFja1RvTWVtYmVyczogZnVuY3Rpb24oZXJyb3JzLCBjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBHcmFiIHRoZSBmYWN0b3J5IGZlZWRiYWNrIGFyZWFcbiAgICAgICAgY29uc3QgZmVlZGJhY2tBcmVhID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcuanMtZXJyb3ItYXJlYScpO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGh0bWxcbiAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSkgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBwcmV2aW91cyBtYXJrZWQgamFja2V0c1xuICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyhjaG9jb2xhdGVGYWN0b3J5KTtcblxuICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goZnVuY3Rpb24odmlzaXRvcikge1xuXG4gICAgICAgICAgICBsZXQgamFja2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB2aXNpdG9yRmVlZGJhY2tBcmVhID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSG9uZXkgZWxlbWVudHMgZG9lc24ndCBoYXMgYSBhY2Nlc3NpYmxlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmKHZpc2l0b3IgIT09ICdfaG9uZXknICYmIHZpc2l0b3IgIT09ICdfc2VjcmV0Q29kZScpIHtcblxuICAgICAgICAgICAgICAgIC8vIEdyYWIgdGhlIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yTm9kZSA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvcignIycgKyB2aXNpdG9yKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGphY2tldCBvZiBhIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBqYWNrZXQgPSBDaG9jb2xhdGVGYWN0b3J5Ll9ncmFiVmlzaXRvckphY2tldCh2aXNpdG9yTm9kZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBmb3VuZCBnZXQgdGhlIGRlc2lyZWQgYXJlYVxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIHZpc2l0b3JGZWVkYmFja0FyZWEgPSBqYWNrZXQucXVlcnlTZWxlY3RvcignLmpzLWZvcm0tZWxlbWVudC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpKSB2aXNpdG9yRmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZmVlZGJhY2sgZm9yIHRoaXMgdmlzaXRvclxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrID0gZXJyb3JzW3Zpc2l0b3JdO1xuXG4gICAgICAgICAgICAvLyBTcGl0IG91dCBlYWNoIGxpbmVcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0Ftb3VudCA9IHZpc2l0b3JGZWVkYmFjay5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmlzaXRvckZlZWRiYWNrQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0xpbmUgPSB2aXNpdG9yRmVlZGJhY2tbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudCBhcmVhXG4gICAgICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIGphY2tldFxuICAgICAgICAgICAgICAgICAgICBpZihpc3NldChqYWNrZXQpKSBqYWNrZXQuY2xhc3NMaXN0LmFkZCgnaGFzLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIHZpc2l0b3IgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPHNwYW4+JyArIGNhcGl0YWxpemVGaXJzdExldHRlcih2aXNpdG9yRmVlZGJhY2tMaW5lKSArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBmZWVkYmFjayB0byBmYWN0b3J5IGZlZWRiYWNrIGFyZWEgaWYgZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGZlZWRiYWNrQXJlYSkpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IGZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGZWVkYmFja0FyZWEgKz0gJzxsaT4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvbGk+JztcbiAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9IGN1cnJlbnRGZWVkYmFja0FyZWE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpIHtcblxuICAgICAgICBjb25zdCBtYXJrZWRKYWNrZXRzID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWVycm9yJyk7XG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHNBbW91bnQgPSBtYXJrZWRKYWNrZXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbWFya2VkSmFja2V0c0Ftb3VudDsgaSsrKXtcbiAgICAgICAgICAgIG1hcmtlZEphY2tldHNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR3JhYiB0aGUgamFja2V0IG9mIHRoZSB2aXNpdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHtudWxsfCp8KCgpID0+IChOb2RlIHwgbnVsbCkpfEFjdGl2ZVguSVhNTERPTU5vZGV8KE5vZGUgJiBQYXJlbnROb2RlKX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9ncmFiVmlzaXRvckphY2tldDogZnVuY3Rpb24odmlzaXRvcil7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdmlzaXRvciBpcyBkZWZpbmVkXG4gICAgICAgIGlmICghaXNzZXQodmlzaXRvcikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvIGxvb3Agc2V0dGluZ3NcbiAgICAgICAgY3VycmVudExheWVyID0gdmlzaXRvcjtcbiAgICAgICAgc2FmZXR5QnJlYWsgPSAwO1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIG5leHQgbGF5ZXIgdGlsbCBpdCBpcyB0aGUgamFja2V0IChvciBzYWZldHlCcmVhayBoYXMgYmVlbiByZWFjaGVkXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNhZmV0eUJyZWFrKys7XG4gICAgICAgICAgICBjdXJyZW50TGF5ZXIgPSBjdXJyZW50TGF5ZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmKGN1cnJlbnRMYXllci5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLWZvcm0tZWxlbWVudCcpKSByZXR1cm4gY3VycmVudExheWVyO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50TGF5ZXIudGFnTmFtZSAhPT0gJ0JPRFknICYmIHNhZmV0eUJyZWFrIDw9IDEwKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVkaXJlY3QgdGhlIHZpc2l0b3IgdG8gdGhlIHRoYW5rcyBwYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFN0b3BcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90aGFua3NGb3JWaXNpdGluZzogZnVuY3Rpb24gKG5leHRTdG9wKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG5leHRTdG9wO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmtub3duIGVycm9yIG9jY3VycmVkLCBsb2cgdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Vua25vd25HYXBJbkZhY3Rvcnk6IGZ1bmN0aW9uIChjaG9jb2xhdGVGYWN0b3J5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hvY29sYXRlRmFjdG9yeTogVW5rb3duIEVycm9yJyk7XG4gICAgfSxcbn07XG5cbkNob2NvbGF0ZUZhY3RvcnkuZW50ZXIoKTsiLCIvKiBFeGFtcGxlXG5cbmNvbnN0IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IG5ldyBTbGlkZXJQcm9qZWN0b3JTZXR0aW5nKHtcbiAgICBzbGlkZXJQcm9qZWN0b3JJZDogJ2hlYWRlci1pbWFnZS1zbGlkZXInLFxuICAgIHNsaWRlUXVlcnk6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAucGxhY2Vob2xkZXIgZmlndXJlJyxcbiAgICBkb3RzOiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnNsaWRlci1uYXZpZ2F0aW9uLWxhYmVscyAubmF2aWdhdGlvbiBzcGFuJyxcbiAgICBjYXB0aW9uczogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5zbGlkZXItbmF2aWdhdGlvbi1sYWJlbHMgLmNhcHRpb24gcCcsXG4gICAgYXV0b1NsaWRlcjogdHJ1ZSxcbiAgICBzbGlkZXJJbnRlcnZhbDogNDAwMFxufSk7XG5oZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKTtcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXIgPSBuZXcgU2xpZGVyUHJvamVjdG9yKGhlYWRlckltYWdlU2xpZGVyU2V0dGluZykuaW5pdCgpO1xuXG4gKi9cblxucmVxdWlyZSgnaGFtbWVyanMnKTtcblxuY29uc3QgQ2xpZW50UmV2aWV3c0hhbmRsZXIgPSB7XG5cbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGNsaWVudFJldmlld3MgPSBbXTtcblxuICAgICAgY29uc3QgY2xpZW50UmV2aWV3Q29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1jbGllbnQtcmV2aWV3cycpO1xuICAgICAgY29uc3QgY2xpZW50UmV2aWV3Q29udGFpbmVyc0xlbmd0aCA9IGNsaWVudFJldmlld0NvbnRhaW5lcnMubGVuZ3RoO1xuXG4gICAgICBmb3IobGV0IGkgPTA7IGkgPCBjbGllbnRSZXZpZXdDb250YWluZXJzTGVuZ3RoOyBpKyspe1xuXG4gICAgICAgICAgY29uc3QgY2xpZW50UmV2aWV3ID0gY2xpZW50UmV2aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgICAgICBjb25zdCBjbGllbnRSZXZpZXdJZCA9IGNsaWVudFJldmlldy5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgICAgICBpZihjbGllbnRSZXZpZXdJZCAhPT0gbnVsbCl7XG5cbiAgICAgICAgICAgICAgY2xpZW50UmV2aWV3cy5wdXNoKCBuZXcgQ2xpZW50UmV2aWV3KCB7XG4gICAgICAgICAgICAgICAgICBjbGllbnRSZXZpZXdJZDogY2xpZW50UmV2aWV3SWQsXG4gICAgICAgICAgICAgICAgICBzbGlkZVF1ZXJ5OiAnIycgKyBjbGllbnRSZXZpZXdJZCArJyAuanMtY2xpZW50LXJldmlldy1zbGlkZScsXG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogJyMnICsgY2xpZW50UmV2aWV3SWQgKycgLmpzLWNsaWVudC1yZXZpZXdzLWJ1dHRvbicgLFxuICAgICAgICAgICAgICB9ICkuaW5pdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBjb25zb2xlLmxvZygnQW4gaW1hZ2Ugc2xpZGVyIGhhcyBubyBpZC4uLicpO1xuICAgICAgfVxuICB9XG59O1xuXG5DbGllbnRSZXZpZXdzSGFuZGxlci5pbml0KCk7XG5cbmZ1bmN0aW9uIENsaWVudFJldmlldyhzZXR0aW5ncykge1xuXG4gICAgLy9EZWZpbmUgU2xpZGVyUHJvamVjdG9yIG9iamVjdFxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0ID0gJyc7XG5cbiAgICAvL1NsaWRlUGFyYW1ldGVyc1xuICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSAwO1xuICAgIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gMTtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IHt9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vQXBwZW5kIHNldHRpbmdzIHRvIHNlbGZcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgICAgIC8vQXNzaWduIG5lZWRlZCBlbGVtZW50cyBhbmQgY2FsY3VsYXRpb25zXG4gICAgICAgIHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5jbGllbnRSZXZpZXdJZCk7XG4gICAgICAgIHRoaXMuc2xpZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLnNsaWRlUXVlcnkpO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICAvLyBTZXQgYWN0aXZlIHNsaWRlIChhbmQgcG9zc2libGUgcHJldmlvdXMgYW5kIG5leHQgY2xhc3NlcylcbiAgICAgICAgdGhpcy5zZXRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFN3aXBlIGludGVyYWN0aW9uXG4gICAgICAgIGNvbnN0IHN3aXBlR2VzdHVyZXMgPSBuZXcgSGFtbWVyKHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnByZXZpb3VzU2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgIT09ICcnKSB7XG5cbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyk7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCA9IG5hdmlnYXRpb25CdXR0b25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uID0gbmF2aWdhdGlvbkJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja05hdmlnYXRpb25CdXR0b24odGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIHRoaXMubmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQrKztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA+PSB0aGlzLmF2YWlsYWJsZVNsaWRlcykgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgfTtcblxuICAgIHRoaXMucHJldmlvdXNTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkLS07XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPCAwKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5leHRTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkICsgMTtcbiAgICAgICAgaWYgKHRoaXMubmV4dFNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkIC0gMTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNTbGlkZUlkIDwgMCkgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmb3JtIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHNlbGYuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gc2VsZi5zbGlkZXNbaV07XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBzZXQgYXR0cmlidXRlIHRvIGRlc2lyZWQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgc2xpZGVPcmRlciA9IHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFuZCBzZXQgYWN0aXZlIGZvciBhbGwgc2xpZGVzXG4gICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSBzbGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgcHJldmlvdXMgYW5kIG5leHQsIGFsc28gc2V0IHRob3NlIGNsYXNzZXNcbiAgICAgICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzbGlkZU9yZGVyICE9PSBzZWxmLnByZXZpb3VzU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgncHJldmlvdXMnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ3ByZXZpb3VzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5uZXh0U2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnbmV4dCcpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnbmV4dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uID0gZnVuY3Rpb24gKG5hdkJ1dHRvbikge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChuYXZCdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuICAgICAgICBzZWxmLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcblxuICAgICAgICBjb25zdCBuZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5uZXh0Jyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5wcmV2aW91cycpO1xuXG4gICAgICAgIG5leHQuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5uZXh0U2xpZGVJZCk7XG4gICAgICAgIHByZXZpb3VzLnNldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicsIHNlbGYucHJldmlvdXNTbGlkZUlkKTtcbiAgICB9O1xufSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDb29raWUgaGFuZGxlclxuICAgLSBQcmltYXJ5IHVzYWdlIGZvciB0b2dnbGluZyB0aGUgY29va2llIG1lc3NhZ2UgYW5kL29yIHN3aXRjaFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENvb2tpZUhhbmRsZXIgPSB7XG5cbiAgICBjb29raWVCYXIgOiBudWxsLFxuICAgIGNvb2tpZU92ZXJsYXkgOiBudWxsLFxuICAgIGNvb2tpZU1lc3NhZ2UgOiBudWxsLFxuXG4gICAgY29va2llU3dpdGNoIDogbnVsbCxcblxuICAgIGNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiA6IDQwMCxcbiAgICBhY2NlcHRUcmFja2luZyA6IGZhbHNlLFxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb29raWUgaGFuZGxlclxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgb3Igb3ZlcmxheSB0byBjb29raWVNZXNzYWdlXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyLCAuanMtY29va2llLW92ZXJsYXknKTtcblxuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llQmFyXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBiYXJcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVCYXIpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZUJhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICAvLyBFbHNlIHRyeSB0byBjb25uZWN0IGNvb2tpZSBvdmVybGF5IHdpdGggdHJhY2tpbmcgdG8gY29va2llT3ZlcmxheVxuICAgICAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIC8vIElmIGlzc2V0IGluaXQgdGhlIGZ1bmN0aW9ucyBmb3IgY29va2llIG92ZXJsYXlcbiAgICAgICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llT3ZlcmxheSkpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGVpdGhlciB0eXBlIG9mIGNvb2tpZSBoYXMgYmVlbiBmb3VuZCBjaGVjayBpZiBzZXR0aW5ncyBhcmUgZGVmaW5lZFxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY2hlY2tGb3JDb29raWVTZXR0aW5ncygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBjb29raWUgc3dpdGNoIHRvIEhhbmRsZXJcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLXN3aXRjaCcpO1xuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBzd2l0Y2hcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZVN3aXRjaCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBiYXIgYWN0aW9uc1xuICAgIGluaXRDb29raWVCYXI6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVCYXIucXVlcnlTZWxlY3RvcignLmpzLWRpc2FibGUtY29va2llLWJhcicpO1xuICAgICAgICBpZihpc3NldChjbG9zZUJ1dHRvbikpe1xuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLmNsb3NlQ29va2llTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgY29va2llIG92ZXJsYXkgYWN0aW9uc1xuICAgIGluaXRDb29raWVPdmVybGF5OiBmdW5jdGlvbigpe1xuXG4gICAgICAgIC8vIE9wZW4gdGhlIGNvb2tpZSBzZXR0aW5ncyBldmVudFxuICAgICAgICBjb25zdCBvcGVuQ29va2llU2V0dGluZ3NCdXR0b24gPSBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLWNoYW5nZS1jb29raWVzLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KG9wZW5Db29raWVTZXR0aW5nc0J1dHRvbikpe1xuICAgICAgICAgICAgb3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgQ29va2llSGFuZGxlci5vcGVuQ29va2llU2V0dGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlLnF1ZXJ5U2VsZWN0b3IoJy5jLWNvb2tpZS10eXBlX19pbnB1dC0tdHJhY2tpbmcnKTtcbiAgICAgICAgaWYoaXNzZXQodG9nZ2xlVHJhY2tpbmdJbnB1dCkpe1xuXG4gICAgICAgICAgICBpZih0b2dnbGVUcmFja2luZ0lucHV0LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9nZ2xlVHJhY2tpbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBDb29raWVIYW5kbGVyLnRvZ2dsZVRyYWNraW5nU2V0dGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBY2NlcHQgLyBTYXZlIGNvb2tpZXMgYnV0dG9uIGV2ZW50XG4gICAgICAgIGNvbnN0IGFjY2VwdEJ1dHRvbiA9IENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5xdWVyeVNlbGVjdG9yKCcuanMtYWNjZXB0LWNvb2tpZXMnKTtcbiAgICAgICAgaWYoaXNzZXQoYWNjZXB0QnV0dG9uKSl7XG4gICAgICAgICAgICBhY2NlcHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLnNldENvb2tpZVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBzd2l0Y2ggYWN0aW9uc1xuICAgIGluaXRDb29raWVTd2l0Y2g6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmMtY29va2llLXR5cGVfX2lucHV0LS10cmFja2luZycpO1xuICAgICAgICBpZihpc3NldCh0b2dnbGVUcmFja2luZ0lucHV0KSl7XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIHN3aXRjaCBpbnB1dCBiZWNhdXNlIHRoZSBwb3AtdXAgaXMgZm9yY2VkIG9uIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIHdoaWxlIHRoZSBzd2l0Y2ggY2hlY2tzIGJ5IHBocCBpZiB0aGUgY29va2llIHJlYWxseSBleGlzdCBvciBub3RcbiAgICAgICAgICAgIGlmKHRvZ2dsZVRyYWNraW5nSW5wdXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvZ2dsZVRyYWNraW5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgQ29va2llSGFuZGxlci50b2dnbGVUcmFja2luZ1NldHRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBjb29raWVzIGJ1dHRvbiBldmVudFxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmpzLXNhdmUtY29va2llLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KHNhdmVCdXR0b24pKXtcbiAgICAgICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uID0gMDsgLy8gT24gdGhlIHN3aXRjaCBjbGljayB3ZSB3YW50IG5vIGRlbGF5IDopXG4gICAgICAgICAgICAgICAgQ29va2llSGFuZGxlci5zZXRDb29raWVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBjaGVja0ZvckNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoQ29va2llLmdldCgnY29va2llTWVzc2FnZScpKSB7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY2NlcHRlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsb3NlQ29va2llTWVzc2FnZTogZnVuY3Rpb24gKCl7XG4gICAgICAgIENvb2tpZS5zZXQoJ2Nvb2tpZU1lc3NhZ2UnLCB0cnVlLCA5MCk7XG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QuYWRkKCdmYWRlLW91dCcpO1xuICAgIH0sXG5cbiAgICBvcGVuQ29va2llU2V0dGluZ3M6IGZ1bmN0aW9uICgpe1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU92ZXJsYXkucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1zZXR0aW5ncycpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWhpZGRlbicpO1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU92ZXJsYXkucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1pbmZvJykuY2xhc3NMaXN0LmFkZCgnaXMtaGlkZGVuJyk7XG4gICAgfSxcblxuICAgIHRvZ2dsZVRyYWNraW5nU2V0dGluZzogZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoQ29va2llSGFuZGxlci5hY2NlcHRUcmFja2luZyl7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldENvb2tpZVNldHRpbmdzOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gU2V0IHRyYWNraW5nIGNvb2tpZSBvciBkZWxldGUgaXQgaWYgaXNzZXQgYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIHNldHRpbmdzXG4gICAgICAgIGlmKENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcpe1xuICAgICAgICAgICAgQ29va2llLnNldCgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcsICd0cnVlJywgOTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBpZihDb29raWUuZ2V0KCd0cmFja2luZ0Nvb2tpZUFjY2VwdGVkJykpe1xuICAgICAgICAgICAgICAgIENvb2tpZS5lcmFzZSgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQ29va2llSGFuZGxlci5jbG9zZUNvb2tpZU1lc3NhZ2UoKTtcblxuICAgICAgICAvLyBSZWxvYWQgYWZ0ZXIgYW5pbWF0aW9uIHRvIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgdHJhY2tpbmcgYWZ0ZXIgYWNjZXB0aW5nIGl0XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgIH0sIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICB9LFxuXG59O1xuXG5Db29raWVIYW5kbGVyLmluaXQoKTsiLCJyZXF1aXJlKCdoYW1tZXJqcycpO1xuXG5jb25zdCBJbWFnZVJhY2tIYW5kbGVyID0ge1xuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbWFnZVJhY2tFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1pbWFnZS1yYWNrJyk7XG4gICAgICAgIGNvbnN0IGltYWdlUmFja0VsZW1lbnRzTGVuZ3RoID0gaW1hZ2VSYWNrRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbWFnZVJhY2tFbGVtZW50c0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIG5ldyBJbWFnZVJhY2soaW1hZ2VSYWNrRWxlbWVudHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5jbGFzcyBJbWFnZVJhY2sge1xuXG4gICAgY29uc3RydWN0b3IoaW1hZ2VSYWNrKSB7XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5yYWNrID0gaW1hZ2VSYWNrO1xuICAgICAgICB0aGlzLnNsaWRlQXJlYSA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2UtcmFjay1zbGlkZScpO1xuICAgICAgICB0aGlzLml0ZW1zICA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaW1hZ2UtcmFjay1pdGVtJyk7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLnJhY2suZ2V0QXR0cmlidXRlKCdkYXRhLWRpcmVjdGlvbicpO1xuICAgICAgICB0aGlzLmltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IDA7XG4gICAgICAgIHRoaXMubWF4SXRlbVBvc2l0aW9uID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubWF4VHJhbnNsYXRlZCA9IDA7XG5cbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24gPSB0aGlzLnJhY2sucXVlcnlTZWxlY3RvcignLmpzLWltYWdlLXJhY2stYnV0dG9uLnByZXZpb3VzJyk7XG4gICAgICAgIHRoaXMubmV4dEJ1dHRvbiA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2UtcmFjay1idXR0b24ubmV4dCcpO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlU3RlcHMoKTtcblxuICAgICAgICBpZihpc3NldCh0aGlzLnByZXZpb3VzQnV0dG9uKSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnByZXZpb3VzSXRlbSgpO1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGlzc2V0KHRoaXMubmV4dEJ1dHRvbikpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm5leHRJdGVtKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRJbWFnZVJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5yYWNrKTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3N3aXBlIExlZnQnKTtcbiAgICAgICAgICAgIHNlbGYuc3dpcGVMZWZ0KCk7XG4gICAgICAgICAgICBzZWxmLnNldEltYWdlUmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2lwZSBSaXRoJyk7XG4gICAgICAgICAgICBzZWxmLnN3aXBlUmlnaHQoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy53YWl0RGVib3VuY2UgPSA1MDA7XG5cbiAgICAgICAgLy8gRGVib3VuY2UgUmVzaXplXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZihpc3NldChzZWxmLmRlYm91bmNlVGltZW91dCkpIGNsZWFyVGltZW91dChzZWxmLmRlYm91bmNlVGltZW91dCk7XG4gICAgICAgICAgICBzZWxmLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5jYWxjdWxhdGVTdGVwcygpO1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgICAgICB9LCBzZWxmLndhaXREZWJvdW5jZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVN0ZXBzKCkge1xuXG4gICAgICAgIC8vUmVzdCB0aGUgc3RlcHMgYXJyYXlcbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZWQgdGhlIG9mZnNldCBvZiB0aGUgd2hvbGUgcmFjayB0byBrbm93IGhvdyBtdWNoIHdlIG1heSB0cmFuc2xhdGUgYXQgbW9zdFxuICAgICAgICBjb25zdCBib2R5T2Zmc2V0ID0gd2luZG93LmJvZHlPZmZzZXQodGhpcy5yYWNrKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGVkIHRoZSBhdmFpbGFibGUgdmlldyBhcmVhIG9mIHRoZSByYWNrXG4gICAgICAgIGxldCBhdmFpbGFibGVWaWV3QXJlYTtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSBhdmFpbGFibGVWaWV3QXJlYSA9IGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSBib2R5T2Zmc2V0LmxlZnQ7XG4gICAgICAgIGVsc2UgYXZhaWxhYmxlVmlld0FyZWEgPSBib2R5T2Zmc2V0LmxlZnQgKyB0aGlzLnJhY2sub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgLy8gR2V0IHRoZSByYWNrZXQgV2lkdGhcbiAgICAgICAgbGV0IHJhY2tXaWR0aDtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSByYWNrV2lkdGggPSB0aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoIC0gMV0ub2Zmc2V0TGVmdCArIHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAxXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgZWxzZSByYWNrV2lkdGggPSAodGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aCAtIDFdLm9mZnNldExlZnQgLSB0aGlzLnJhY2sub2Zmc2V0V2lkdGgpICogLTE7XG4gICAgICAgIHRoaXMubWF4VHJhbnNsYXRlZCA9IHJhY2tXaWR0aCAtIGF2YWlsYWJsZVZpZXdBcmVhO1xuXG4gICAgICAgIGxldCBtYXhJdGVtQ2FsY3VsYXRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW1hZ2VzTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGVkIGZvciBlYWNoIGl0ZW0gdGhlIG9mZnNldCBpbiB0aGUgcmFja1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG5cbiAgICAgICAgICAgIGlmKGl0ZW0ub2Zmc2V0V2lkdGggPT09IDApIGltYWdlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBsZXQgb2Zmc2V0RnJvbVJpZ2h0U2lkZTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRGcm9tTGVmdFNpZGU7XG5cbiAgICAgICAgICAgIGlmKHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykge1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21SaWdodFNpZGUgPSBpdGVtLm9mZnNldExlZnQgKyBpdGVtLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21MZWZ0U2lkZSA9IGl0ZW0ub2Zmc2V0TGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21SaWdodFNpZGUgPSAoKHRoaXMucmFjay5vZmZzZXRXaWR0aCAqIC0gMSkgKyAoaXRlbS5vZmZzZXRMZWZ0ICsgaXRlbS5vZmZzZXRXaWR0aCkpICogLTE7XG4gICAgICAgICAgICAgICAgb2Zmc2V0RnJvbUxlZnRTaWRlID0gKCh0aGlzLnJhY2sub2Zmc2V0V2lkdGggKiAtIDEpICsgaXRlbS5vZmZzZXRMZWZ0KSAqIC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlc2Ugb2Zmc2V0IHRvIHRoZSBvZmZzZXQgcG9zaXRpb24gYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEZyb21MZWZ0U2lkZTogb2Zmc2V0RnJvbUxlZnRTaWRlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRGcm9tUmlnaHRTaWRlOiBvZmZzZXRGcm9tUmlnaHRTaWRlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gRGVmaW5lIHRoZSBjb21wYXJlIHZhcmlhYmxlXG4gICAgICAgICAgICAvLyBFbHNlIHdlIGhhdmUgdG8gY3JlYXRlIGEgY29tcGxleCBpZiBzdGF0ZW1lbnQuLi5cbiAgICAgICAgICAgIGxldCBvZmZzZXRDb21wYXJlVmFyaWFibGU7XG4gICAgICAgICAgICBpZih0aGlzLmRpcmVjdGlvbiA9PT0gJ2x0cicpIG9mZnNldENvbXBhcmVWYXJpYWJsZSA9IG9mZnNldEZyb21SaWdodFNpZGU7XG4gICAgICAgICAgICBlbHNlIG9mZnNldENvbXBhcmVWYXJpYWJsZSA9IG9mZnNldEZyb21MZWZ0U2lkZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG1heCB0cmFuc2xhdGVkIGlzIHNtYWxsZXIgYW5kIGlzbid0IGFscmVhZHkgZGVmaW5lZFxuICAgICAgICAgICAgaWYob2Zmc2V0Q29tcGFyZVZhcmlhYmxlID4gdGhpcy5tYXhUcmFuc2xhdGVkICYmICFtYXhJdGVtQ2FsY3VsYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4SXRlbVBvc2l0aW9uID0gKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBtYXhJdGVtQ2FsY3VsYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNhbGN1bGF0ZWQgd2hlbiB0aGUgaW1hZ2VzIGFyZW4ndCBsb2FkZWRcbiAgICAgICAgaWYoaW1hZ2VzTG9hZGVkKSB0aGlzLmltYWdlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmltYWdlTG9hZGVkKTtcblxuICAgICAgICAvLyBpZighaW1hZ2VzTG9hZGVkKXtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUud2FybihcIkltYWdlUmFjazogUmVjYWxjdWxhdGVkIHdpZHRoIGJlY2F1c2UgaW1hZ2VzIHdlcmVuJ3QgbG9hZGVkLlwiKTtcbiAgICAgICAgLy8gICAgIHNldFRpbWVvdXQoc2VsZi5jYWxjdWxhdGVTdGVwcygpLCA0MDAwKTtcbiAgICAgICAgLy8gfVxuXG4gICAgfVxuXG4gICAgbmV4dEl0ZW0oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0rKztcbiAgICAgICAgaWYodGhpcy5jdXJyZW50SXRlbSA+PSB0aGlzLm1heEl0ZW1Qb3NpdGlvbikgIHRoaXMuY3VycmVudEl0ZW0gPSB0aGlzLm1heEl0ZW1Qb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwcmV2aW91c0l0ZW0oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0tLTtcbiAgICAgICAgaWYodGhpcy5jdXJyZW50SXRlbSA8IDApIHRoaXMuY3VycmVudEl0ZW0gPSAwO1xuICAgIH1cblxuICAgIC8vIFdlIGhhdmUgdG8gdXNlIHRoZXNlIGludGVydmVuZSBmdW5jdGlvbnMgdG8gc3dhcCB0aGUgZnVuY3Rpb24gd2hlbiB0aGUgc2xpZGVycyBhcyBhIGRpZmZlcmVudCBkaXJlY3Rpb25cbiAgICBzd2lwZUxlZnQoKSB7XG4gICAgICAgIGlmKHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykgdGhpcy5uZXh0SXRlbSgpO1xuICAgICAgICBlbHNlIHRoaXMucHJldmlvdXNJdGVtKCk7XG4gICAgfVxuXG4gICAgc3dpcGVSaWdodCgpIHtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSB0aGlzLnByZXZpb3VzSXRlbSgpO1xuICAgICAgICBlbHNlIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZVJhY2soKSB7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaW1hZ2UgYXJlIGxvYWQgd2hlbiBpbnRlcmFjdGlvblxuICAgICAgICBpZighdGhpcy5pbWFnZUxvYWRlZCl7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJJbWFnZVJhY2s6IFJlY2FsY3VsYXRlZCBiZWNhdXNlIGltYWdlcyB3ZXJlbid0IGxvYWRlZCB5ZXQuXCIpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVTdGVwcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRQb3NpdGlvbjtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSBuZXh0T2Zmc2V0UG9zaXRpb24gPSAnLScgKyB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudEl0ZW1dLm9mZnNldEZyb21MZWZ0U2lkZTtcbiAgICAgICAgZWxzZSBuZXh0T2Zmc2V0UG9zaXRpb24gPSB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudEl0ZW1dLm9mZnNldEZyb21SaWdodFNpZGU7XG5cbiAgICAgICAgdGhpcy5zbGlkZUFyZWEuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArIG5leHRPZmZzZXRQb3NpdGlvbiArICdweCknO1xuICAgIH1cbn1cblxuSW1hZ2VSYWNrSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBJbnB1dCBoYW5kbGVyXG5cbiAgICBUaGlzIGhhbmRsZXIgY2FuIGJlIHJlbW92ZSB3aGVuIHRoZSBjc3Mgc3VwcG9ydCBmb3IgOmZvY3VzLXdpdGhpbiBpcyBiZXR0ZXJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBJbnB1dEhhbmRsZXIgPSB7XG5cbiAgICBpbnB1dEZpZWxkczogbnVsbCxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIGZvcm0gaW5wdXRzXG4gICAgICAgIElucHV0SGFuZGxlci5pbnB1dEZpZWxkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0gaW5wdXQsIGZvcm0gdGV4dGFyZWEnKTtcblxuICAgICAgICBjb25zdCBpbnB1dExlbmd0aCA9IElucHV0SGFuZGxlci5pbnB1dEZpZWxkcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKXtcblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBJbnB1dEhhbmRsZXIuaW5wdXRGaWVsZHNbaV07XG4gICAgICAgICAgICBjb25zdCBpbnB1dElkID0gaW5wdXQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBpZCBvbiB0aGUgaW5wdXRcbiAgICAgICAgICAgIGlmKGlzc2V0KGlucHV0SWQpKXtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGFiZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtIGxhYmVsW2Zvcj1cIicraW5wdXRJZCsnXCJdJyk7XG5cbiAgICAgICAgICAgICAgICAvLyAvLyBBbmQgaWYgdGhlcmUgaXMgYSBiZWxvbmdpbmcgbGFiZWxcbiAgICAgICAgICAgICAgICBpZihpc3NldChpbnB1dExhYmVsKSl7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5hZGRFdmVudExpc3RlbmVyc1RvSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXJzVG9JbnB1dCA6IGZ1bmN0aW9uKGlucHV0KVxuICAgIHtcbiAgICAgICAgLy8gQWRkIHRoZSBmaWxsIGNsYXNzIGFuZCB0cmlnZ2VyIHJlbW92ZUZvY3VzIHNvIHRoZSBpbnB1dCB3aWxsIGJlIGF1dG9tYXRpYyBiZSBtYXJrZWQgYXMgZmlsbGVkIG9yIG5vdFxuICAgICAgICBwYXJlbnRFbGVtZW50ID0gaW5wdXQucGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWxsZWQnKTtcbiAgICAgICAgSW5wdXRIYW5kbGVyLnJlbW92ZUZvY3VzKGlucHV0KTtcblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgLy8gV2UgbG9vcCB0aHJvdWdoIHRoZSBpbnB1dCBlbGVtZW50cyBiZWNhdXNlIGF1dG9jb21wbGV0ZSAob24gY2hyb21lKSB0cmlnZ2VycyBhbCB0aGUgZm9jdXMgZWxlbWVudHMgYnV0IG5vbmUgZm9jdXMgb3V0XG4gICAgICAgICAgICBjb25zdCBpbnB1dExlbmd0aCA9IElucHV0SGFuZGxlci5pbnB1dEZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9vcGVkSW5wdXQgPSBJbnB1dEhhbmRsZXIuaW5wdXRGaWVsZHNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGFkZCBmb2N1cyBvbiB0aGlzIGZvY3VzZWQgZWxlbWVudFxuICAgICAgICAgICAgICAgIGlmKGxvb3BlZElucHV0ID09PSBpbnB1dCl7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5hZGRGb2N1cyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGZvY3VzIG9uIGFsbCBvdGhlciBpbnB1dC90ZXh0YXJlYSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5yZW1vdmVGb2N1cyhsb29wZWRJbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgSW5wdXRIYW5kbGVyLnJlbW92ZUZvY3VzKHRoaXMpO1xuICAgICAgICB9KTtcblxuICAgIH0sXG5cbiAgICBhZGRGb2N1cyAgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgaWYoaXNzZXQoaW5wdXQpKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0SWQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBpbnB1dC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZpbGxlZCcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGVycm9yIG1lc3NhZ2UgcmVtb3ZlIGl0IG9uIGZvY3VzXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtIC5lcnJvci1tZXNzYWdlIycgKyBpbnB1dElkICsgJy1lcnJvcicpO1xuICAgICAgICAgICAgaWYgKGlzc2V0KGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnZmFkZS1vdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIFJlc2V0IHRoZSBsYWJlbCBsb2NhdGlvbiBvbmx5IGlmIHRoZSBpbnB1dCBpcyBlbXB0eVxuICAgIHJlbW92ZUZvY3VzIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmKGlzc2V0KGlucHV0KSl7XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IGlucHV0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcblxuICAgICAgICAgICAgaWYoIWlzc2V0KGlucHV0VmFsdWUpIHx8IGlucHV0VmFsdWUgPT09ICcnKXtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxufTtcblxuSW5wdXRIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEdvb2dsZSBNYXBzIGhhbmRsZXJcbiAgICAtIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L2FkZGluZy1hLWdvb2dsZS1tYXBcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBNYXBzSGFuZGxlciA9IHtcblxuICAgIG1hcDogJycsXG4gICAga2V5OiAnQUl6YVN5QnY2RkpIbjIzTHozUzBqOVQxRFlXcjU3elRCVS1UMG9ZJyxcbiAgICBsb2NhdGlvbjoge2xhdDogNTEuMjYxODIyMiwgbG5nOiA1LjU5NjU1Mzh9LFxuICAgIHN0eWxpbmc6ICcnLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBHZXQgbWFwIGJ5IGlkXG4gICAgICAgIE1hcHNIYW5kbGVyLm1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXAnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIG1hcCBpcyBkZWZpbmVkXG4gICAgICAgIGlmIChpc3NldChNYXBzSGFuZGxlci5tYXApKSB7XG5cbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sYXQgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKTtcbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sbmcgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKTtcblxuICAgICAgICAgICAgTWFwc0hhbmRsZXIuc2V0Q3VzdG9tU3R5bGluZygpO1xuXG4gICAgICAgICAgICAvLyBTZWUgaWYgZ29vZ2xlIHZhcmlhYmxlIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHR5cGVvZihnb29nbGUpID09ICd1bmRlZmluZWQnIHx8IHR5cGVvZihnb29nbGUubWFwcykgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgTWFwc0hhbmRsZXIua2V5LCBNYXBzSGFuZGxlci5kcmF3TWFwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTWFwc0hhbmRsZXIuZHJhd01hcCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3TWFwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG1hcFxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKE1hcHNIYW5kbGVyLm1hcCwge1xuICAgICAgICAgICAgem9vbTogMTEsXG4gICAgICAgICAgICBjZW50ZXI6IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZURlZmF1bHRVSTogdHJ1ZSxcbiAgICAgICAgICAgIHN0eWxlczogTWFwc0hhbmRsZXIuc3R5bGluZ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWRkIGEgbWFya2VyXG4gICAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICAgICAgcG9zaXRpb246IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgbWFwOiBtYXBcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHNldEN1c3RvbVN0eWxpbmc6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBNYXBzSGFuZGxlci5zdHlsaW5nID1cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2lcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiIzc0NzQ3NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kuYXR0cmFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZjM4ZWIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLmdvdmVybm1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2NlZDdkYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5tZWRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmE1YThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kucGFya1wiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYzdlNWM4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnBsYWNlX29mX3dvcnNoaXBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2Q2Y2JjN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5zY2hvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2M0YzllOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5zcG9ydHNfY29tcGxleFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYjFlYWYxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVsc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5oaWdod2F5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmQ0YTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmFydGVyaWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmU5ZDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJzaW1wbGlmaWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IFwiMy4wMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LnN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IFwiMC4zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiM3NDc0NzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNlOWU1ZGNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwidHJhbnNpdC5saW5lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ3YXRlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNkMmU3ZjdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICB9XG59O1xuXG5NYXBzSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE5hdmlnYXRpb24gaGFuZGxlclxuICAgLSBIYW5kbGVzIHRoZSBuYXZpZ2F0aW9uIGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IE5hdmlnYXRpb25IYW5kbGVyID0ge1xuXG4gICAgbmF2aWdhdGlvbk5vZGU6IG51bGwsXG4gICAgc2Nyb2xsZWRMb2c6IDAsXG4gICAgaXNPcGVuOiBmYWxzZSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBuYXZUcmlnZ2VycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1uYXYtdHJpZ2dlcicpO1xuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jbG9zZS1vdmVybGF5LW5hdicpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0aW9uTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW5hdicpO1xuXG4gICAgICAgIGlmKGlzc2V0KE5hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRpb25Ob2RlKSl7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSBOYXZpZ2F0aW9uSGFuZGxlci5jbG9zZU5hdmlnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbmF2VHJpZ2dlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5pbml0TmF2aWdhdGlvbihuYXZUcmlnZ2Vyc1tpXSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuY2xvc2VOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXROYXZpZ2F0aW9uOiBmdW5jdGlvbiAobmF2VHJpZ2dlcikge1xuICAgICAgICBuYXZUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgTmF2aWdhdGlvbkhhbmRsZXIudG9nZ2xlTmF2aWdhdGlvbiwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVOYXZpZ2F0aW9uOiBmdW5jdGlvbiAoZXZlbnQpIHtcblxuICAgICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgbGluayBiZWhhdmlvclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5zY3JvbGxlZCA9IHdpbmRvdy5wYWdlWU9mZnNldDtcblxuICAgICAgICAvLyBJZiB0aGUgbmF2IGlzIGFscmVhZHkgYWN0aXZlLCBjb2xsYXBzZSBpdCBhbmQgcXVpdFxuICAgICAgICBpZiAoTmF2aWdhdGlvbkhhbmRsZXIuaXNPcGVuKSBOYXZpZ2F0aW9uSGFuZGxlci5jbG9zZU5hdmlnYXRpb24oKTtcbiAgICAgICAgZWxzZSBOYXZpZ2F0aW9uSGFuZGxlci5vcGVuTmF2aWdhdGlvbigpO1xuXG4gICAgfSxcblxuICAgIG9wZW5OYXZpZ2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuc2Nyb2xsZWQgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCduYXYtaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIH0sIDQwMCk7XG4gICAgfSxcblxuICAgIGNsb3NlTmF2aWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCA9IE5hdmlnYXRpb25IYW5kbGVyLnNjcm9sbGVkO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbmF2LWlzLWFjdGl2ZScpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG59O1xuXG5OYXZpZ2F0aW9uSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBTY3JvbGwgVG8gQ2xpY2sgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbFRvSGFuZGxlciA9IHtcblxuICAgIC8vIEFuaW1hdGlvbiBzZXR0aW5nc1xuICAgIG9mZnNldCA6IDYwLCAvL3BpeGVsXG4gICAgZHVyYXRpb24gOiAxNDAwLCAvL21zXG5cbiAgICAvLyBBbmltYXRpb24gdmFyaWFibGVzXG4gICAgYm9keSA6IG51bGwsXG4gICAgc3RhcnQgOiAwLFxuICAgIGNoYW5nZSA6IDAsXG4gICAgY3VycmVudFRpbWUgOiAwLFxuICAgIGFsbG93QW5pbWF0aW9uIDogZmFsc2UsXG4gICAgc2Nyb2xsVG9BbmltYXRpb24gOiBudWxsLFxuXG4gICAgLy8gV2F0Y2ggdGhlIEVhc2luZ0Z1bmN0aW9uIGhlbHBlciBmb3IgdGhlIGF2YWlsYWJsZSBtZXRob2RzXG4gICAgZWFzaW5nOiAnZWFzZUluT3V0UXVhZCcsXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKXtcblxuICAgICAgICBjb25zdCBhbmNob3JMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zY3JvbGwtdG8tdGFyZ2V0Jyk7XG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzQW1vdW50ID0gYW5jaG9yTGlua3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbmNob3JMaW5rc0Ftb3VudDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckxpbmsgPSBhbmNob3JMaW5rc1tpXTtcblxuICAgICAgICAgICAgYW5jaG9yTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbFRvSGFuZGxlci5wcmVwYXJlU2Nyb2xsVG8odGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIEhhbmRsZXIgZm9yIHRoZSBhbmltYXRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlU2Nyb2xsVG8gOiBmdW5jdGlvbihlbGVtZW50SWQpe1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2Nyb2xsIHRvIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudElkID0gZWxlbWVudElkLnN1YnN0cihlbGVtZW50SWQuaW5kZXhPZignIycpKzEpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiA9IHNjcm9sbFRvRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBSZXNldCBvciBkZWZpbmUgdGhlIEhhbmRsZXIgdmFyaWFibGVzXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgPSBNYXRoLm1heChTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLCB3aW5kb3cucGFnZVlPZmZzZXQpOyAvL1VzZSBNYXRoLm1heCBiZWNhdXNlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlID0gKChzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbi50b3AgKyBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5vZmZzZXQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUgPSAnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcblxuICAgICAgICAvLyBTdG9wIG9uIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFuaW1hdGUgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAqL1xuICAgIGFuaW1hdGVTY3JvbGwgOiBmdW5jdGlvbiAodGltZXN0YW1wKSB7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHByb2dyZXNzIGZyb20gMCAtIDFcbiAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKHRpbWVzdGFtcCAtICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lKSAvIFNjcm9sbFRvSGFuZGxlci5kdXJhdGlvbik7XG4gICAgICAgIGlmKHByb2dyZXNzIDwgMCkgcHJvZ3Jlc3MgPSAwO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcHJvZ3Jlc3Mgd2l0aCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgICAgcHJvZ3Jlc3MgPSBFYXNpbmdGdW5jdGlvbnNbU2Nyb2xsVG9IYW5kbGVyLmVhc2luZ10ocHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbFRvcCA9IFNjcm9sbFRvSGFuZGxlci5zdGFydCArICggU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSAqIHByb2dyZXNzICk7XG5cbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgICAgICBpZiggU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID09PSAwICkgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7IC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgc28gaWYgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wIGlzIDAgZm9yY2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvdWdoIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG5cbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAxICYmIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbil7XG4gICAgICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFib3J0IHRoZSBzY3JvbGwgYW5pbWF0aW9uXG4gICAgICovXG4gICAgYWJvcnRTY3JvbGxBbmltYXRpb24gOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5zY3JvbGxUb0FuaW1hdGlvbik7XG4gICAgfVxuXG59O1xuXG5TY3JvbGxUb0hhbmRsZXIuaW5pdCgpOyIsIi8qIEV4YW1wbGVcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nID0gbmV3IFNsaWRlclByb2plY3RvclNldHRpbmcoe1xuICAgIHNsaWRlclByb2plY3RvcklkOiAnaGVhZGVyLWltYWdlLXNsaWRlcicsXG4gICAgc2xpZGVRdWVyeTogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5wbGFjZWhvbGRlciBmaWd1cmUnLFxuICAgIGRvdHM6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAuc2xpZGVyLW5hdmlnYXRpb24tbGFiZWxzIC5uYXZpZ2F0aW9uIHNwYW4nLFxuICAgIGNhcHRpb25zOiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnNsaWRlci1uYXZpZ2F0aW9uLWxhYmVscyAuY2FwdGlvbiBwJyxcbiAgICBhdXRvU2xpZGVyOiB0cnVlLFxuICAgIHNsaWRlckludGVydmFsOiA0MDAwXG59KTtcbmhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZy5wcmVwYXJlUGFyYW1ldGVycygpO1xuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlciA9IG5ldyBTbGlkZXJQcm9qZWN0b3IoaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nKS5pbml0KCk7XG5cbiAqL1xuXG5yZXF1aXJlKCdoYW1tZXJqcycpO1xuXG5jb25zdCBTbGlkZXJQcm9qZWN0b3JIYW5kbGVyID0ge1xuXG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBzbGlkZVByb2plY3RvcnMgPSBbXTtcblxuICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXNsaWRlLXByb2plY3RvcicpO1xuICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzTGVuZ3RoID0gc2xpZGVQcm9qZWN0b3JDb250YWluZXJzLmxlbmd0aDtcblxuICAgICAgZm9yKGxldCBpID0wOyBpIDwgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzTGVuZ3RoOyBpKyspe1xuXG4gICAgICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3IgPSBzbGlkZVByb2plY3RvckNvbnRhaW5lcnNbaV07XG4gICAgICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JJZCA9IHNsaWRlUHJvamVjdG9yLmdldEF0dHJpYnV0ZSgnaWQnKTtcblxuICAgICAgICAgIGNvbnN0IGF1dG9TbGlkZSA9IHNsaWRlUHJvamVjdG9yLmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvLXNsaWRlJyk7XG5cbiAgICAgICAgICBpZihzbGlkZVByb2plY3RvcklkICE9PSBudWxsKXtcblxuICAgICAgICAgICAgICBjb25zdCBzbGlkZVByb2plY3RvclNldHRpbmcgPSBuZXcgU2xpZGVyUHJvamVjdG9yU2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICBzbGlkZXJJZDogc2xpZGVQcm9qZWN0b3JJZCxcbiAgICAgICAgICAgICAgICAgIHNsaWRlUXVlcnk6ICcjJyArIHNsaWRlUHJvamVjdG9ySWQgKycgLmpzLXNsaWRlLXByb2plY3Rvci1zbGlkZScsXG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogJyMnICsgc2xpZGVQcm9qZWN0b3JJZCArJyAuanMtc2xpZGUtcHJvamVjdG9yLWJ1dHRvbicgLFxuICAgICAgICAgICAgICAgICAgYXV0b1NsaWRlcjogYXV0b1NsaWRlLFxuICAgICAgICAgICAgICAgICAgc2xpZGVySW50ZXJ2YWw6IDYwMDBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgc2xpZGVQcm9qZWN0b3JzLnB1c2goIG5ldyBTbGlkZXJQcm9qZWN0b3Ioc2xpZGVQcm9qZWN0b3JTZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCkpLmluaXQoKSApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGNvbnNvbGUubG9nKCdBbiBpbWFnZSBzbGlkZXIgaGFzIG5vIGlkLi4uJyk7XG4gICAgICB9XG4gIH1cbn07XG5cblNsaWRlclByb2plY3RvckhhbmRsZXIuaW5pdCgpO1xuXG5mdW5jdGlvbiBTbGlkZXJQcm9qZWN0b3JTZXR0aW5nKHNldHRpbmdzT2JqZWN0KSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuc2xpZGVySWQgPSAnJztcbiAgICB0aGlzLmRlZmluZWRQcmV2aW91c05leHQgPSB0cnVlO1xuICAgIHRoaXMuYXV0b1NsaWRlciA9IGZhbHNlO1xuICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSA0MDAwO1xuICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSAnJztcbiAgICB0aGlzLmRvdHMgPSAnJztcbiAgICB0aGlzLmNhcHRpb25zID0gJyc7XG4gICAgdGhpcy5zbGlkZVF1ZXJ5ID0gJyc7XG5cbiAgICB0aGlzLnNldFNsaWRlclByb2plY3RvcklkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlcklkID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uIChib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dCA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hdXRvU2xpZGVyID0gYm9vbGVhbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICAgICAgdGhpcy5zbGlkZXJJbnRlcnZhbCA9IGludGVnZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZVF1ZXJ5ID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlUXVlcnkgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uQnV0dG9ucyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldERvdHMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZG90cyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldENhcHRpb25zID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLmNhcHRpb25zID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVyUHJvamVjdG9ySWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlcklkO1xuICAgIH07XG4gICAgdGhpcy5nZXREZWZpbmVkUHJldmlvdXNOZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbmVkUHJldmlvdXNOZXh0O1xuICAgIH07XG4gICAgdGhpcy5nZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2xpZGVyO1xuICAgIH07XG4gICAgdGhpcy5nZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVySW50ZXJ2YWw7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlUXVlcnk7XG4gICAgfTtcbiAgICB0aGlzLmdldE5hdmlnYXRpb25CdXR0b25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucztcbiAgICB9O1xuICAgIHRoaXMuZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG90cztcbiAgICB9O1xuICAgIHRoaXMuZ2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcHRpb25zO1xuICAgIH07XG5cblxuICAgIC8vIEludmVydCBzZXR0ZXJzIHRvIGdldHRlcnNcbiAgICB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzbGlkZXJJZDogc2VsZi5nZXRTbGlkZXJQcm9qZWN0b3JJZCgpLFxuICAgICAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5nZXREZWZpbmVkUHJldmlvdXNOZXh0KCksXG4gICAgICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLmdldEF1dG9TbGlkZXIoKSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLmdldFNsaWRlckludGVydmFsKCksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5nZXROYXZpZ2F0aW9uQnV0dG9ucygpLFxuICAgICAgICAgICAgZG90czogc2VsZi5nZXREb3RzKCksXG4gICAgICAgICAgICBjYXB0aW9uczogc2VsZi5nZXRDYXB0aW9ucygpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5nZXRTbGlkZVF1ZXJ5KClcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8vIE1hc3MgYXNzaWduIHNldHRpbmdzXG4gICAgdGhpcy5maWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdEtleXMgPSBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0TGVuZ3RoID0gc2V0dGluZ3NPYmplY3RLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NPYmplY3RMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzZXR0aW5nc09iamVjdEtleXNbaV07XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdGhpcy5maWxsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzbGlkZXJJZDogc2VsZi5zZXRTbGlkZXJQcm9qZWN0b3JJZCxcbiAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5zZXREZWZpbmVkUHJldmlvdXNOZXh0LFxuICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLnNldEF1dG9TbGlkZXIsXG4gICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLnNldFNsaWRlckludGVydmFsLFxuICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5zZXROYXZpZ2F0aW9uQnV0dG9ucyxcbiAgICAgICAgZG90czogc2VsZi5zZXREb3RzLFxuICAgICAgICBjYXB0aW9uczogc2VsZi5zZXRDYXB0aW9ucyxcbiAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5zZXRTbGlkZVF1ZXJ5LFxuICAgICAgICBwcmVwYXJlUGFyYW1ldGVyczogc2VsZi5wcmVwYXJlUGFyYW1ldGVyc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIFNsaWRlclByb2plY3RvcihzZXR0aW5ncykge1xuXG4gICAgLy9EZWZpbmUgU2xpZGVyUHJvamVjdG9yIG9iamVjdFxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc2xpZGVyT2JqZWN0ID0gJyc7XG5cbiAgICAvL1NsaWRlUGFyYW1ldGVyc1xuICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSAwO1xuICAgIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gMTtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL0FwcGVuZCBzZXR0aW5ncyB0byBzZWxmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICAvL0Fzc2lnbiBuZWVkZWQgZWxlbWVudHMgYW5kIGNhbGN1bGF0aW9uc1xuICAgICAgICB0aGlzLnNsaWRlck9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2xpZGVySWQpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5zbGlkZVF1ZXJ5KTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgLy9EZWZpbmUgcHJldmlvdXMgYW5kIG5leHQgaWYgd2Ugd2FudCB0byB1c2UgdGhvc2VcbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc2xpZGUgKGFuZCBwb3NzaWJsZSBwcmV2aW91cyBhbmQgbmV4dCBjbGFzc2VzKVxuICAgICAgICB0aGlzLnNldFNsaWRlKCk7XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5zbGlkZXJPYmplY3QpO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5wcmV2aW91c1NsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIH0pO1xuXG5cblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyAhPT0gJycpIHtcblxuICAgICAgICAgICAgLy8gQ2xpY2sgaW50ZXJhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zKTtcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoID0gbmF2aWdhdGlvbkJ1dHRvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b24gPSBuYXZpZ2F0aW9uQnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWNrTmF2aWdhdGlvbkJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZG90cyAhPT0gJycpIHtcbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICAgICAgY29uc3QgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRvdHMpO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRvdHNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaGllcicpO1xuICAgICAgICAgICAgICAgIGRvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja0RvdCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5hdXRvU2xpZGVyKCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5hdXRvU2xpZGVyID0gZnVuY3Rpb24gKCl7XG5cbiAgICAgICAgaWYodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwgIT09IG51bGwpIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwpO1xuXG4gICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuYXV0b1NsaWRlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuc2V0dGluZ3Muc2xpZGVySW50ZXJ2YWwpICl7XG5cbiAgICAgICAgICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubmV4dFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnNldHRpbmdzLnNsaWRlckludGVydmFsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXRBdXRvU2xpZGVyID0gc2VsZi5hdXRvU2xpZGVyO1xuXG5cbiAgICB0aGlzLm5leHRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkKys7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnByZXZpb3VzU2xpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZC0tO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZUlkIDwgMCkgdGhpcy5hY3RpdmVTbGlkZUlkID0gdGhpcy5hdmFpbGFibGVTbGlkZXMgLSAxO1xuXG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHRoaXMuc2V0UHJldmlvdXNBbmROZXh0U2xpZGUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5uZXh0U2xpZGVJZCA9IHRoaXMuYWN0aXZlU2xpZGVJZCArIDE7XG4gICAgICAgIGlmICh0aGlzLm5leHRTbGlkZUlkID49IHRoaXMuYXZhaWxhYmxlU2xpZGVzKSB0aGlzLm5leHRTbGlkZUlkID0gMDtcblxuICAgICAgICB0aGlzLnByZXZpb3VzU2xpZGVJZCA9IHRoaXMuYWN0aXZlU2xpZGVJZCAtIDE7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzU2xpZGVJZCA8IDApIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hdmFpbGFibGVTbGlkZXMgLSAxO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFNsaWRlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZm9ybSBlbGVtZW50c1xuICAgICAgICBjb25zdCBzbGlkZXNMZW5ndGggPSBzZWxmLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzbGlkZXNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBzbGlkZSA9IHNlbGYuc2xpZGVzW2ldO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgc2V0IGF0dHJpYnV0ZSB0byBkZXNpcmVkIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlT3JkZXIgPSBwYXJzZUludChzbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbmQgc2V0IGFjdGl2ZSBmb3IgYWxsIHNsaWRlc1xuICAgICAgICAgICAgaWYgKHNsaWRlT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdGhlIHByZXZpb3VzIGFuZCBuZXh0LCBhbHNvIHNldCB0aG9zZSBjbGFzc2VzXG4gICAgICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5wcmV2aW91c1NsaWRlSWQpIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ3ByZXZpb3VzJyk7XG4gICAgICAgICAgICAgICAgZWxzZSBzbGlkZS5jbGFzc0xpc3QuYWRkKCdwcmV2aW91cycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNsaWRlT3JkZXIgIT09IHNlbGYubmV4dFNsaWRlSWQpIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ25leHQnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ25leHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7IHNlbGYuc2V0QWN0aXZlRG90KCk7IH1cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuY2FwdGlvbnMgIT09ICcnKSB7IHNlbGYuc2V0QWN0aXZlQ2FwdGlvbigpOyB9XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uID0gZnVuY3Rpb24gKG5hdkJ1dHRvbikge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChuYXZCdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSBzZWxmLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcblxuICAgICAgICBjb25zdCBuZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5uZXh0Jyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5wcmV2aW91cycpO1xuXG4gICAgICAgIG5leHQuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5uZXh0U2xpZGVJZCk7XG4gICAgICAgIHByZXZpb3VzLnNldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicsIHNlbGYucHJldmlvdXNTbGlkZUlkKTtcblxuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuXG4gICAgICAgIC8vIG5leHQucXVlcnlTZWxlY3RvcigncCcpLmlubmVySFRNTCA9IHNlbGYuc2xpZGVzW3NlbGYubmV4dFNsaWRlSWRdLmRhdGFzZXQubmFtZTtcbiAgICAgICAgLy8gcHJldmlvdXMucXVlcnlTZWxlY3RvcigncCcpLmlubmVySFRNTCA9IHNlbGYuc2xpZGVzW3NlbGYucHJldmlvdXNTbGlkZUlkXS5kYXRhc2V0Lm5hbWU7XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tEb3QgPSBmdW5jdGlvbiAoY2xpY2tlZERvdCkge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChjbGlja2VkRG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldEFjdGl2ZURvdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgIGRvdE9yZGVyID0gcGFyc2VJbnQoZG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgaWYoZG90T3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWxzZSBkb3QuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBY3RpdmVDYXB0aW9uID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmNhcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdGlvbnNMZW5ndGggPSBjYXB0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjYXB0aW9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSBjYXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGNhcHRpb25PcmRlciA9IHBhcnNlSW50KGNhcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICBpZihjYXB0aW9uT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgY2FwdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2UgY2FwdGlvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH07XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBVc3AgSW1wcmVzc2lvbnMgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFVzcEltcHJlc3Npb25zSGFuZGxlciA9IHtcblxuICAgIHRpbWVvdXQ6IG51bGwsXG5cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXlzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXVzcC1pbXByZXNzaW9ucycpO1xuICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXlzTGVuZ3RoID0gdXNwSW1wcmVzc2lvbnNUcmF5cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHVzcEltcHJlc3Npb25zVHJheXNMZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXkgPSB1c3BJbXByZXNzaW9uc1RyYXlzW2ldO1xuXG4gICAgICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uU2xpZGVyID0gbmV3IFVzcEltcHJlc3Npb25TbGlkZXIodXNwSW1wcmVzc2lvbnNUcmF5KTtcbiAgICAgICAgICAgIHVzcEltcHJlc3Npb25TbGlkZXIuYXV0b1NsaWRlKCk7XG5cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5jbGFzcyBVc3BJbXByZXNzaW9uU2xpZGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHNsaWRlcikge1xuICAgICAgICB0aGlzLnNsaWRlciA9IHNsaWRlcjtcbiAgICAgICAgdGhpcy5zbGlkZXMgID0gdGhpcy5zbGlkZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLXVzcC1pbXByZXNzaW9uJyk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuICAgICAgICB0aGlzLnNsaWRlSW50ZXJ2YWwgPSA0MDAwO1xuICAgIH1cblxuICAgIGF1dG9TbGlkZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5hdXRvU2xpZGUoKTtcbiAgICAgICAgfSwgdGhpcy5zbGlkZUludGVydmFsKTtcbiAgICB9XG5cbiAgICBuZXh0U2xpZGUoKSB7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgKys7XG4gICAgICAgIGlmKHRoaXMuY3VycmVudFNsaWRlID49IHRoaXMuc2xpZGVzLmxlbmd0aCkgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWRlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBjb25zdCBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2xpZGVJZCA9IHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS11c3AnKTtcblxuICAgICAgICAgICAgaWYoIHNsaWRlSWQgPT0gdGhpcy5jdXJyZW50U2xpZGUgKSB7XG4gICAgICAgICAgICAgICAgc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5Vc3BJbXByZXNzaW9uc0hhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgWW91dHViZSBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgWW91dHViZUhhbmRsZXIgPSB7XG5cbiAgICB5b3V0dWJlQ2xhc3MgOiAnLmpzLXlvdXR1YmUtcGxheWVyJyxcbiAgICBwbGF5ZXJzOiBbXSxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHlvdXR1YmUgcGxheWVycyBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChZb3V0dWJlSGFuZGxlci55b3V0dWJlQ2xhc3MpO1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IHlvdXR1YmVQbGF5ZXJzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXIgPSB5b3V0dWJlUGxheWVyc1tpXTtcblxuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVySWQgPSB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJJZCAhPT0gbnVsbCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGh0bWwgYW5kIGNyZWF0ZSBvYmplY3RzIGZyb20gaXRcbiAgICAgICAgICAgICAgICBjb25zdCB5b3V0dWJlRWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS15b3V0dWJlLWxpbmsnKSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXk6IHBhcnNlSW50KHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tcGxheScpKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycy5wdXNoKHlvdXR1YmVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50IG5vdCBpbmNsdWRlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBpZCBvbiB0aGUgcGxheWVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHlvdXR1YmVQbGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoeW91dHViZVBsYXllcnNBbW91bnQgPj0gMSkgWW91dHViZUhhbmRsZXIuaW5pdFlvdXR1YmUoKTtcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICpcbiAgICAgKi9cbiAgICBpbml0WW91dHViZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFNlZSBpZiBZVCB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZihZVCkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKFlULlBsYXllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFNldHVwIEFQSSByZWFkeSBmdW5jdGlvblxuICAgICAgICAgICAgd2luZG93Lm9uWW91VHViZVBsYXllckFQSVJlYWR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJyk7XG4gICAgICAgICAgICAvLyBJZiBZVCBhbHJlYWR5IGV4aXN0cyBsb2FkIHBsYXllclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIFlvdXR1YmUgcGxheWVyKHMpIHdpdGggcGFyYW1ldGVyc1xuICAgICAqIEFuZCByZXdyaXRlIHRoZSBwbGF5ZXJzIHRvIGtleSB0aGVtIGJ5IHRoZSBlbGVtZW50IGlkXG4gICAgICpcbiAgICAgKi9cbiAgICBsb2FkUGxheWVyczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTtcblxuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGxldCB5b3V0dWJlUGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1tpXTtcblxuICAgICAgICAgICAgLy8gTG9hZCBwbGF5ZXJcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5ZXIucGxheWVyID0gbmV3IFlULlBsYXllcih5b3V0dWJlUGxheWVyLmlkLHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHlvdXR1YmVQbGF5ZXIubGluayxcbiAgICAgICAgICAgICAgICBob3N0OiAnaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20nLFxuICAgICAgICAgICAgICAgIHBsYXllclZhcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlbDogMCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWtiOiAxLFxuICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogeW91dHViZVBsYXllci5hdXRvUGxheVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdvblJlYWR5JzogWW91dHViZUhhbmRsZXIub25SZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgJ29uU3RhdGVDaGFuZ2UnOiBZb3V0dWJlSGFuZGxlci5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBsYXllcnNbeW91dHViZVBsYXllci5pZF0gPSB5b3V0dWJlUGxheWVyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzID0gcGxheWVycztcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBsYXllciBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgb25SZWFkeSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAvLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoJyMnICsgcGxheWVyQ29udGFpbmVySWQpLnN0b3AoKS5hbmltYXRlKHsgb3BhY2l0eTogMSB9LDEwMDApIH0sODAwKTtcblxuICAgICAgICAvLyBJZiBub3Qgb24gdGFibGV0IG9yIG1vYmlsZSwgcGxheSBvbiBoaWdoIHF1YWxpdHlcbiAgICAgICAgLy8gcGxheWVyLm11dGUoKTtcbiAgICAgICAgLy8gcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAvLyBwbGF5ZXIuc2V0UGxheWJhY2tRdWFsaXR5KCdoZDEwODAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIFlvdXR1YmUgc3RhdGUgY2hhbmdlXG4gICAgICovXG4gICAgb25TdGF0ZUNoYW5nZSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgdmlkZW9TdGF0ZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy8gTG9vcCB2aWRlb1xuICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gWVQuUGxheWVyU3RhdGUuRU5ERUQgKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5Zb3V0dWJlSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJyb3dzZXIgSGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IEJyb3dzZXJIYW5kbGVyID0ge1xuXG4gICAgdXNlckFnZW50OiAnJyxcbiAgICBicm93c2VySW5mbzogJycsXG5cblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvID0gQnJvd3NlckhhbmRsZXIuZ2V0QnJvd3NlckluZm8oKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlSUUoKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlU2FmYXJpKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZUlFOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHZlcnNpb25zIGJlbG93IGllMTFcbiAgICAgICAgbGV0IG1zaWUgPSBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAnKTtcbiAgICAgICAgY29uc3QgaWVsdDExID0gbXNpZSA+IDA7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGllMTFcbiAgICAgICAgY29uc3QgaWUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgICAgIC8vIElmIEludGVybmV0IEV4cGxvcmVyXG4gICAgICAgIGlmIChpZWx0MTEgfHwgaWUxMSkge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9ICcxMSc7XG5cbiAgICAgICAgICAgIC8vIFdheSB0byBkZXRlY3QgdmVyc2lvbiA8IDExXG4gICAgICAgICAgICBpZiAoaWVsdDExKSB2ZXJzaW9uID0gcGFyc2VJbnQoQnJvd3NlckhhbmRsZXIudXNlckFnZW50LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBtc2llICsgNSxcbiAgICAgICAgICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZihcIi5cIiwgbXNpZSlcbiAgICAgICAgICAgICkpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgY2xhc3NlcyB0byBIVE1MICh3ZSBoYXZlIHRvIGRvIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIGVsc2UgaWUgd2lsbCBmYWlsKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2Jyt2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBzYWZhcmkgdmVyc2lvblxuICAgIGhhbmRsZVNhZmFyaTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmKEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLm5hbWUgPT09ICdTYWZhcmknICYmIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLnZlcnNpb24gPD0gMTApe1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0QnJvd3NlckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQsdGVtLE09dWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pKSB8fCBbXTtcbiAgICAgICAgaWYoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKXtcbiAgICAgICAgICAgIHRlbT0vXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHtuYW1lOidJRSAnLHZlcnNpb246KHRlbVsxXXx8JycpfTtcbiAgICAgICAgfVxuICAgICAgICBpZihNWzFdPT09J0Nocm9tZScpe1xuICAgICAgICAgICAgdGVtPXVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKVxuICAgICAgICAgICAgaWYodGVtIT1udWxsKSAgIHtyZXR1cm4ge25hbWU6J09wZXJhJywgdmVyc2lvbjp0ZW1bMV19O31cbiAgICAgICAgfVxuICAgICAgICBNPU1bMl0/IFtNWzFdLCBNWzJdXTogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgIGlmKCh0ZW09dWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpIT1udWxsKSB7TS5zcGxpY2UoMSwxLHRlbVsxXSk7fVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogTVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IE1bMV1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5Ccm93c2VySGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBIZWxwZXIgZnVuY3Rpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIFNpbXBsZSBpc3NldCBtZXRob2QgZm9yIHRoaXMgZG9lcyBub3QgZXhpc3QgaW4gamF2YXNjcmlwdFxuICovXG53aW5kb3cuaXNzZXQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIG9iaiAhPT0gbnVsbDtcbn07XG5cbi8qXG4gKiBFYXNpbmcgRnVuY3Rpb25zIC0gaW5zcGlyZWQgZnJvbSBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbiAqIG9ubHkgY29uc2lkZXJpbmcgdGhlIHQgdmFsdWUgZm9yIHRoZSByYW5nZSBbMCwgMV0gPT4gWzAsIDFdXG4gKi9cbndpbmRvdy5FYXNpbmdGdW5jdGlvbnMgPSB7XG4gICAgLy8gbm8gZWFzaW5nLCBubyBhY2NlbGVyYXRpb25cbiAgICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqICgyIC0gdClcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJbkN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICgtLXQpICogdCAqIHQgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSAtICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSArICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfVxufTtcblxuLypcbiAqIFZhbmlsbGEgdmVyc2lvbiBvZiB0aGUgJC5nZXRTY3JpcHRcbiAqL1xud2luZG93LmdldFNjcmlwdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5hc3luYyA9IDE7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgIGxldCBwcmlvciA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTtcblxuICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKF8sIGlzQWJvcnQpIHtcbiAgICAgICAgaWYgKGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qoc2NyaXB0LnJlYWR5U3RhdGUpKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuc3JjID0gc291cmNlO1xuICAgIHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgcHJpb3IpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gKiBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gKiBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAqIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gKiBAcGFyYW0gZnVuY1xuICogQHBhcmFtIHdhaXRcbiAqIEBwYXJhbSBpbW1lZGlhdGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xud2luZG93LmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29va2llIGhlbHBlciBjbGFzc1xuICovXG53aW5kb3cuQ29va2llID0ge1xuICAgIHNldDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7XG4gICAgICAgIGxldCBkb21haW4sIGRvbWFpblBhcnRzLCBkYXRlLCBleHBpcmVzLCBob3N0O1xuXG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b0dNVFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBob3N0ID0gbG9jYXRpb24uaG9zdDtcbiAgICAgICAgaWYgKGhvc3Quc3BsaXQoJy4nKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIG5vIFwiLlwiIGluIGEgZG9tYWluIC0gaXQncyBsb2NhbGhvc3Qgb3Igc29tZXRoaW5nIHNpbWlsYXJcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjb29raWUgb24gYWxsIHN1YiBkb21haW5zLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIHNldCBjb29raWUgdG8gdGhlIHRvcCBkb21haW4uXG4gICAgICAgICAgICAvLyAoZXhhbXBsZTogaWYgdXNlciBpcyBvbiBmb28uY29tLCB0cnkgdG8gc2V0XG4gICAgICAgICAgICAvLyAgY29va2llIHRvIGRvbWFpbiBcIi5jb21cIilcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29va2llIHdpbGwgbm90IGJlIHNldCwgaXQgbWVhbnMgXCIuY29tXCJcbiAgICAgICAgICAgIC8vIGlzIGEgdG9wIGxldmVsIGRvbWFpbiBhbmQgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBjb29raWUgdG8gXCIuZm9vLmNvbVwiXG4gICAgICAgICAgICBkb21haW5QYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkb21haW4gPSAnLicgKyBkb21haW5QYXJ0cy5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgIC8vIEZvciBkZXZlbG9wbWVudCBwdXJwb3NlLCByZW1vdmUgdGhpcyB3aGVuIG1vdmluZyB0byBwcm9kdWN0aW9uXG4gICAgICAgICAgICAvLyBkb21haW4gPSAnLmtvbW1hLnBybyc7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29va2llIHdhcyBzdWNjZXNzZnVseSBzZXQgdG8gdGhlIGdpdmVuIGRvbWFpblxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSBpdCB3YXMgYSBUb3AtTGV2ZWwgRG9tYWluKVxuICAgICAgICAgICAgaWYgKENvb2tpZS5nZXQobmFtZSkgPT0gbnVsbCB8fCBDb29raWUuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kIFwiLlwiIHRvIGN1cnJlbnQgZG9tYWluXG4gICAgICAgICAgICAgICAgZG9tYWluID0gJy4nICsgaG9zdDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBjb25zdCBuYW1lRVEgPSBuYW1lICsgXCI9XCI7XG4gICAgICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIENvb2tpZS5zZXQobmFtZSwgJycsIC0xKTtcbiAgICB9XG59O1xuXG4vKlxuICogSmF2YXNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBudW1iZXJfZm9ybWF0IG1ldGhvZCBvZiBQSFBcbiAqL1xud2luZG93Lm51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbiAobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwKSB7XG4gICAgLy8gU3RyaXAgYWxsIGNoYXJhY3RlcnMgYnV0IG51bWVyaWNhbCBvbmVzLlxuICAgIG51bWJlciA9IChudW1iZXIgKyAnJykucmVwbGFjZSgvW14wLTkrXFwtRWUuXS9nLCAnJyk7XG4gICAgbGV0IG4gPSAhaXNGaW5pdGUoK251bWJlcikgPyAwIDogK251bWJlcixcbiAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICAgICAgc2VwID0gKHR5cGVvZiB0aG91c2FuZHNfc2VwID09PSAndW5kZWZpbmVkJykgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgICAgICBkZWMgPSAodHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcpID8gJy4nIDogZGVjX3BvaW50LFxuICAgICAgICBzID0gJycsXG4gICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKG4gKiBrKSAvIGs7XG4gICAgICAgIH07XG4gICAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICAgIHMgPSAocHJlYyA/IHRvRml4ZWRGaXgobiwgcHJlYykgOiAnJyArIE1hdGgucm91bmQobikpLnNwbGl0KCcuJyk7XG4gICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuICAgICAgICBzWzBdID0gc1swXS5yZXBsYWNlKC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCk7XG4gICAgfVxuICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuICAgICAgICBzWzFdID0gc1sxXSB8fCAnJztcbiAgICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbignMCcpO1xuICAgIH1cbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XG59O1xuXG5cbi8qKlxuICogRWxlbWVudC5jbG9zZXN0KCkgcG9seWZpbGxcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3QjUG9seWZpbGxcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gICAgaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgICAgIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHJldHVybiBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbndpbmRvdy5BamF4ID0ge1xuXG4gICAgLy9UT0RPOiBDYW4gd2UgY3JlYXRlIGEgcHJlcGFyZSByZXF1ZXN0IGZ1bmN0aW9uID8/XG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSxcblxuICAgIHBvc3Q6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCggSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbndpbmRvdy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBzbmFrZSBjYXNlIGludG8gY2FtZWxjYXNlXG4gKlxuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbndpbmRvdy5zbmFrZVRvQ2FtZWwgPSBmdW5jdGlvbiAoc3RyaW5nKXtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhcXC1cXHcpL2csIGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IGluc2lkZSBpdHMgcGFyZW50XG4gKi9cbndpbmRvdy5pbmRleEluUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEZvciBzZWN1cml0eSByZWFzb25zIGlPUyBTYWZhcmkgb25seSBhbGxvd3MgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSBmb3IgdGV4dCB3aXRoaW4gYSBjb250ZW50RWRpdGFibGUgY29udGFpbmVyLlxuICogVGhlIHdvcmthcm91bmQgaXMgdG8gZGV0ZWN0IGlPUyBTYWZhcmkgYW5kIHF1aWNrbHkgdG9nZ2xlIGNvbnRlbnRFZGl0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykuXG4gKiBXaGViIGlucHV0IG9yIHRleHRhcmVhIGlzIFJFQURPTkxZIHlvdSBjYW4gcHJldmVudCB0aGUgdW53YW50ZWQgcG9wdXAgd2l0aCBjb3B5L3Bhc3RlIGZ1bmN0aW9ucyBhbmQgdGhlIGlucHV0IGtleWJvYXJkXG4gKiBDb2RlIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80Njk4MTg0N1xuICovXG53aW5kb3cuY29weVRvQ2xpcGJvYXJkID0gZnVuY3Rpb24gKGVsKSB7XG5cbiAgICAvLyByZXNvbHZlIHRoZSBlbGVtZW50XG4gICAgZWwgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKSA6IGVsO1xuXG4gICAgLy8gaGFuZGxlIGlPUyBhcyBhIHNwZWNpYWwgY2FzZVxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pcGFkfGlwb2R8aXBob25lL2kpKSB7XG5cbiAgICAgICAgLy8gc2F2ZSBjdXJyZW50IGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSBzdGF0dXNcbiAgICAgICAgY29uc3QgZWRpdGFibGUgPSBlbC5jb250ZW50RWRpdGFibGU7XG4gICAgICAgIGNvbnN0IHJlYWRPbmx5ID0gZWwucmVhZE9ubHk7XG5cbiAgICAgICAgLy8gY29udmVydCB0byBlZGl0YWJsZSB3aXRoIHJlYWRvbmx5IHRvIHN0b3AgaU9TIGtleWJvYXJkIG9wZW5pbmdcbiAgICAgICAgZWwuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHNlbGVjdGFibGUgcmFuZ2VcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcblxuICAgICAgICAvLyBzZWxlY3QgdGhlIHJhbmdlXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCA5OTk5OTkpO1xuXG4gICAgICAgIC8vIHJlc3RvcmUgY29udGVudEVkaXRhYmxlL3JlYWRPbmx5IHRvIG9yaWdpbmFsIHN0YXRlXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IGVkaXRhYmxlO1xuICAgICAgICBlbC5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZWwuc2VsZWN0KCk7XG4gICAgfVxuXG4gICAgLy8gZXhlY3V0ZSBjb3B5IGNvbW1hbmRcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgcmVsYXRlZCB0byB0aGUgYm9keVxuICpcbiAqIEBwYXJhbSBlbFxuICogQHJldHVybnMge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfX1cbiAqL1xud2luZG93LmJvZHlPZmZzZXQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHNjcm9sbExlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBzY3JvbGxUb3AsIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbExlZnQgfVxufSIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9